推进 INI 面板 workflow overview embedding display view-model

This commit is contained in:
2026-06-15 18:06:33 +08:00
parent 7095690869
commit 4fdbadd60c
12 changed files with 189 additions and 10 deletions

View File

@@ -1311,3 +1311,91 @@ host_wasm_opfs_browser_smokes=ok
`createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel()` 或等价 helper把 embedding `createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel()` 或等价 helper把 embedding
report 压成稳定 `title/statusText/detailText/rows`,供 launch 页面、workflow overview 页面或外部 report 压成稳定 `title/statusText/detailText/rows`,供 launch 页面、workflow overview 页面或外部
shell 直接渲染该 report仍保持只读不新增控制按钮不解析 G-code。 shell 直接渲染该 report仍保持只读不新增控制按钮不解析 G-code。
十二、2026-06-15 继续执行记录INI panel workflow overview embedding display view-model
本轮按 `text13.txt` 执行,不扩展 `text12.txt`。继续推进 browser/UI workflow新增只读
workflow-overview embedding display view-model把 embedding report 压成稳定
`title/statusText/detailText/rows`,便于 launch 页面、workflow overview 页面和外部 shell
直接渲染 report。
完成内容:
- `ui-shell.js` 新增 `createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel()`
- display view-model 输出:
- `phase: "ready" | "blocked"`
- `title: "Workflow overview embedding"`
- `statusText: "Ready" | "Blocked"`
- `detailText`
- `rows`
- `createIniPanelLaunchApiManifest().methods` 新增
`getWorkflowOverviewEmbeddingDisplayViewModel`
- `launch.html` 的 `window.linuxCncIniPanelLaunchApi` 新增真实 browser 入口
`getWorkflowOverviewEmbeddingDisplayViewModel()`
- `workflow-overview.html` 的 `window.linuxCncIniPanelWorkflowOverviewApi` 新增
`getWorkflowOverviewEmbeddingDisplayViewModel()`
- `verify_ini_panel_ui_shell.mjs` 覆盖 display view-model 的 blocked shape 与 view-model helper
聚合关系;
- `verify_ini_panel_launch_api_manifest.mjs` 覆盖 launch manifest 与 launch 页面真实 API
- `verify_ini_panel_shell_integration_manifest.mjs` 覆盖 helper export、默认 display view-model、
launch method count 与文档记录;
- `verify_ini_panel_entry_docs.mjs` 与 `docs/panel-entry.md` 同步记录新 helper/API
- `ini_panel_workflow_overview_smoke.html` 校验 workflow overview iframe 自身 display view-model API
- `ini_panel_launch_smoke.html` 校验真实 launch iframe 读取真实 workflow overview iframe 的
embedding display view-model
- `ini_panel_shell_integration_workflow_smoke.html` 校验外部 shell workflow 读取同一 display
view-model
- 未新增控制按钮;
- 未执行 action-plan
- 未解析 G-code
- 未解释 canonical events
- 未新增 JS CNC 语义;
- 未改变 OPFS/session persistence、LinuxCNC interpreter、tool、parameter、planner 或
LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
wasm-port/tests/ui/node/verify_ini_panel_ui_shell.sh
wasm-port/tests/ui/node/verify_ini_panel_launch_api_manifest.sh
wasm-port/tests/ui/node/verify_ini_panel_shell_integration_manifest.sh
wasm-port/tests/ui/node/verify_ini_panel_entry_docs.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_ini_panel_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
ini_panel_ui_shell_node_smoke=ok
ini_panel_launch_api_manifest_node_smoke=ok
ini_panel_shell_integration_manifest_node_smoke=ok
ini_panel_entry_docs_node_smoke=ok
ui_node_smokes=ok
browser_ini_opfs_smoke=ok
browser_ini_control_page_smoke=ok
browser_ini_launch_smoke=ok
browser_ini_workflow_overview_smoke=ok
browser_ini_shell_integration_workflow_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
下一步建议:
继续推进 browser/UI workflow。下一批建议新增只读
`createIniPanelShellWorkflowOverviewEmbeddingRenderState()` 或等价 helper把 embedding display
view-model 压成稳定 `statusLine/dataset/rows`,供 launch 页面或外部 shell 用同一 DOM renderer
显示 overview embedding report仍保持只读不新增控制按钮不解析 G-code。

View File

@@ -42,6 +42,7 @@ import {
createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewContract,
createIniPanelShellWorkflowOverviewReadiness, createIniPanelShellWorkflowOverviewReadiness,
createIniPanelShellWorkflowOverviewEmbeddingReport, createIniPanelShellWorkflowOverviewEmbeddingReport,
createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel,
mountIniPanelShellWorkflowOverviewEmbedding, mountIniPanelShellWorkflowOverviewEmbedding,
renderIniPanelShellSessionHandoffWorkflowState, renderIniPanelShellSessionHandoffWorkflowState,
mountIniPanelShellSessionHandoffWorkflow, mountIniPanelShellSessionHandoffWorkflow,
@@ -310,7 +311,13 @@ shell needs display-ready diagnostics for overview API readiness, missing
methods, embedding readiness, mount phase, render row count, and embedding methods, embedding readiness, mount phase, render row count, and embedding
errors. The workflow overview page also exposes errors. The workflow overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingReport()` for `linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingReport()` for
the same report shape. the same report shape. Use
`createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel()` or
`linuxCncIniPanelLaunchApi.getWorkflowOverviewEmbeddingDisplayViewModel()` when
an outer shell needs that report compressed into stable `title`, `statusText`,
`detailText`, and read-only label/value rows for direct rendering. The workflow
overview page also exposes
`linuxCncIniPanelWorkflowOverviewApi.getWorkflowOverviewEmbeddingDisplayViewModel()`.
Use Use
`renderIniPanelShellSessionHandoffMountState()` or `renderIniPanelShellSessionHandoffMountState()` or
`linuxCncIniPanelLaunchApi.renderShellSessionHandoffMountState()` when an outer `linuxCncIniPanelLaunchApi.renderShellSessionHandoffMountState()` when an outer

View File

@@ -282,6 +282,9 @@
getWorkflowOverviewEmbeddingReport: (embeddingResult, contract) => ( getWorkflowOverviewEmbeddingReport: (embeddingResult, contract) => (
shellViewModel.createWorkflowOverviewEmbeddingReport(embeddingResult, contract) shellViewModel.createWorkflowOverviewEmbeddingReport(embeddingResult, contract)
), ),
getWorkflowOverviewEmbeddingDisplayViewModel: (report) => (
shellViewModel.createWorkflowOverviewEmbeddingDisplayViewModel(report)
),
isSupportedShellSessionHandoffPackage: shellViewModel.isSupportedShellSessionHandoffPackage, isSupportedShellSessionHandoffPackage: shellViewModel.isSupportedShellSessionHandoffPackage,
getLauncherLinks: () => shellViewModel.launcherLinks, getLauncherLinks: () => shellViewModel.launcherLinks,
getControlPageApiMethods: () => shellViewModel.controlPage.browserApiMethods, getControlPageApiMethods: () => shellViewModel.controlPage.browserApiMethods,

View File

@@ -160,6 +160,7 @@ export function createIniPanelLaunchApiManifest(entries = getVisibleIniPanelEntr
"getWorkflowOverviewReadiness", "getWorkflowOverviewReadiness",
"mountWorkflowOverviewEmbedding", "mountWorkflowOverviewEmbedding",
"getWorkflowOverviewEmbeddingReport", "getWorkflowOverviewEmbeddingReport",
"getWorkflowOverviewEmbeddingDisplayViewModel",
"isSupportedShellSessionHandoffPackage", "isSupportedShellSessionHandoffPackage",
"getLauncherLinks", "getLauncherLinks",
"getControlPageApiMethods", "getControlPageApiMethods",
@@ -1888,6 +1889,26 @@ export function createIniPanelShellWorkflowOverviewEmbeddingReport(
}; };
} }
export function createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel(
report = createIniPanelShellWorkflowOverviewEmbeddingReport(),
) {
const blockingReasons = Array.isArray(report?.blockingReasons) ? report.blockingReasons : [];
const rows = Array.isArray(report?.rows)
? report.rows.map(({ id, label, value }) => ({
id,
label,
value: value == null ? "" : String(value),
}))
: [];
return {
phase: report?.phase === "ready" ? "ready" : "blocked",
title: "Workflow overview embedding",
statusText: report?.ready ? "Ready" : "Blocked",
detailText: blockingReasons.length === 0 ? "No blocking reasons" : blockingReasons.join(", "),
rows,
};
}
export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries()) { export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries()) {
const shellIntegrationManifest = createIniPanelShellIntegrationManifest(entries); const shellIntegrationManifest = createIniPanelShellIntegrationManifest(entries);
const shellIntegrationReadiness = createIniPanelShellIntegrationReadiness(shellIntegrationManifest); const shellIntegrationReadiness = createIniPanelShellIntegrationReadiness(shellIntegrationManifest);
@@ -2047,6 +2068,7 @@ export function createIniPanelShellViewModel(entries = getVisibleIniPanelEntries
createWorkflowOverviewReadiness: createIniPanelShellWorkflowOverviewReadiness, createWorkflowOverviewReadiness: createIniPanelShellWorkflowOverviewReadiness,
mountWorkflowOverviewEmbedding: mountIniPanelShellWorkflowOverviewEmbedding, mountWorkflowOverviewEmbedding: mountIniPanelShellWorkflowOverviewEmbedding,
createWorkflowOverviewEmbeddingReport: createIniPanelShellWorkflowOverviewEmbeddingReport, createWorkflowOverviewEmbeddingReport: createIniPanelShellWorkflowOverviewEmbeddingReport,
createWorkflowOverviewEmbeddingDisplayViewModel: createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel,
isSupportedShellSessionHandoffPackage: isSupportedIniPanelShellSessionHandoffPackage, isSupportedShellSessionHandoffPackage: isSupportedIniPanelShellSessionHandoffPackage,
controlPage: { controlPage: {
browserApiSchema: createControlPageBrowserApiSchema(), browserApiSchema: createControlPageBrowserApiSchema(),

View File

@@ -90,6 +90,7 @@
createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewContract,
createIniPanelShellWorkflowOverviewReadiness, createIniPanelShellWorkflowOverviewReadiness,
createIniPanelShellWorkflowOverviewEmbeddingReport, createIniPanelShellWorkflowOverviewEmbeddingReport,
createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel,
mountIniPanelShellWorkflowOverviewEmbedding, mountIniPanelShellWorkflowOverviewEmbedding,
renderIniPanelShellSessionHandoffWorkflowState, renderIniPanelShellSessionHandoffWorkflowState,
mountIniPanelShellSessionHandoffWorkflow, mountIniPanelShellSessionHandoffWorkflow,
@@ -135,6 +136,9 @@
getWorkflowOverviewEmbeddingReport: (embeddingResult, contract) => ( getWorkflowOverviewEmbeddingReport: (embeddingResult, contract) => (
createIniPanelShellWorkflowOverviewEmbeddingReport(embeddingResult, contract) createIniPanelShellWorkflowOverviewEmbeddingReport(embeddingResult, contract)
), ),
getWorkflowOverviewEmbeddingDisplayViewModel: (report) => (
createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel(report)
),
}; };
</script> </script>
</body> </body>

View File

@@ -104,6 +104,7 @@
!launchApi?.getWorkflowOverviewReadiness || !launchApi?.getWorkflowOverviewReadiness ||
!launchApi?.mountWorkflowOverviewEmbedding || !launchApi?.mountWorkflowOverviewEmbedding ||
!launchApi?.getWorkflowOverviewEmbeddingReport || !launchApi?.getWorkflowOverviewEmbeddingReport ||
!launchApi?.getWorkflowOverviewEmbeddingDisplayViewModel ||
!launchApi?.isSupportedShellSessionHandoffPackage || !launchApi?.isSupportedShellSessionHandoffPackage ||
!launchApi?.getLauncherLinks || !launchApi?.getLauncherLinks ||
!launchApi?.getControlPageApiMethods !launchApi?.getControlPageApiMethods
@@ -629,7 +630,8 @@
!workflowOverviewApi?.getWorkflowOverviewContract || !workflowOverviewApi?.getWorkflowOverviewContract ||
!workflowOverviewApi?.getWorkflowOverviewReadinessFromApi || !workflowOverviewApi?.getWorkflowOverviewReadinessFromApi ||
!workflowOverviewApi?.mountWorkflowOverviewEmbedding || !workflowOverviewApi?.mountWorkflowOverviewEmbedding ||
!workflowOverviewApi?.getWorkflowOverviewEmbeddingReport !workflowOverviewApi?.getWorkflowOverviewEmbeddingReport ||
!workflowOverviewApi?.getWorkflowOverviewEmbeddingDisplayViewModel
) { ) {
throw new Error("workflow overview API namespace did not expose shell helpers"); throw new Error("workflow overview API namespace did not expose shell helpers");
} }
@@ -642,6 +644,9 @@
const workflowOverviewEmbeddingReport = launchApi.getWorkflowOverviewEmbeddingReport( const workflowOverviewEmbeddingReport = launchApi.getWorkflowOverviewEmbeddingReport(
workflowOverviewEmbedding, workflowOverviewEmbedding,
); );
const workflowOverviewEmbeddingDisplay = launchApi.getWorkflowOverviewEmbeddingDisplayViewModel(
workflowOverviewEmbeddingReport,
);
assertEqual(workflowOverviewApi.getWorkflowOverviewContract().pageHref, "./workflow-overview.html", "workflow overview page contract"); assertEqual(workflowOverviewApi.getWorkflowOverviewContract().pageHref, "./workflow-overview.html", "workflow overview page contract");
assertEqual(workflowOverviewReadiness.ready, true, "workflow overview readiness"); assertEqual(workflowOverviewReadiness.ready, true, "workflow overview readiness");
assertEqual(workflowOverviewReadiness.missing.join(","), "", "workflow overview readiness missing"); assertEqual(workflowOverviewReadiness.missing.join(","), "", "workflow overview readiness missing");
@@ -657,10 +662,15 @@
assertEqual(workflowOverviewEmbeddingReport.missingMethods.join(","), "", "workflow overview embedding report missing methods"); assertEqual(workflowOverviewEmbeddingReport.missingMethods.join(","), "", "workflow overview embedding report missing methods");
assertEqual(workflowOverviewEmbeddingReport.renderRowCount, 5, "workflow overview embedding report row count"); assertEqual(workflowOverviewEmbeddingReport.renderRowCount, 5, "workflow overview embedding report row count");
assertEqual(workflowOverviewEmbeddingReport.rows.length, 6, "workflow overview embedding report rows"); assertEqual(workflowOverviewEmbeddingReport.rows.length, 6, "workflow overview embedding report rows");
assertEqual(workflowOverviewEmbeddingDisplay.title, "Workflow overview embedding", "workflow overview embedding display title");
assertEqual(workflowOverviewEmbeddingDisplay.statusText, "Blocked", "workflow overview embedding display status");
assertEqual(workflowOverviewEmbeddingDisplay.rows.length, 6, "workflow overview embedding display rows");
assertEqual( assertEqual(
workflowOverviewApi.getWorkflowOverviewEmbeddingReport(workflowOverviewEmbedding).renderRowCount, workflowOverviewApi.getWorkflowOverviewEmbeddingDisplayViewModel(
workflowOverviewEmbeddingReport.renderRowCount, workflowOverviewApi.getWorkflowOverviewEmbeddingReport(workflowOverviewEmbedding),
"workflow overview self embedding report", ).rows.length,
workflowOverviewEmbeddingDisplay.rows.length,
"workflow overview self embedding display",
); );
status.textContent = "browser_ini_launch_smoke=ok"; status.textContent = "browser_ini_launch_smoke=ok";
console.log("browser_ini_launch_smoke=ok"); console.log("browser_ini_launch_smoke=ok");

View File

@@ -106,6 +106,7 @@ TOOL_TABLE = browser-shell-tool.tbl
!launchApi?.getWorkflowOverviewReadiness || !launchApi?.getWorkflowOverviewReadiness ||
!launchApi?.mountWorkflowOverviewEmbedding || !launchApi?.mountWorkflowOverviewEmbedding ||
!launchApi?.getWorkflowOverviewEmbeddingReport || !launchApi?.getWorkflowOverviewEmbeddingReport ||
!launchApi?.getWorkflowOverviewEmbeddingDisplayViewModel ||
!launchApi?.isSupportedShellSessionHandoffPackage !launchApi?.isSupportedShellSessionHandoffPackage
) { ) {
throw new Error("launch API namespace did not expose shell integration helpers"); throw new Error("launch API namespace did not expose shell integration helpers");
@@ -292,6 +293,9 @@ TOOL_TABLE = browser-shell-tool.tbl
const workflowOverviewEmbeddingReport = launchApi.getWorkflowOverviewEmbeddingReport( const workflowOverviewEmbeddingReport = launchApi.getWorkflowOverviewEmbeddingReport(
workflowOverviewEmbedding, workflowOverviewEmbedding,
); );
const workflowOverviewEmbeddingDisplay = launchApi.getWorkflowOverviewEmbeddingDisplayViewModel(
workflowOverviewEmbeddingReport,
);
assertEqual(workflowOverviewReadiness.ready, true, "shell workflow overview iframe readiness"); assertEqual(workflowOverviewReadiness.ready, true, "shell workflow overview iframe readiness");
assertEqual(workflowOverviewReadiness.missing.join(","), "", "shell workflow overview iframe missing methods"); assertEqual(workflowOverviewReadiness.missing.join(","), "", "shell workflow overview iframe missing methods");
assertEqual(workflowOverviewEmbedding.apiName, "ini-panel-shell-workflow-overview-embedding", "shell workflow overview embedding API"); assertEqual(workflowOverviewEmbedding.apiName, "ini-panel-shell-workflow-overview-embedding", "shell workflow overview embedding API");
@@ -302,6 +306,8 @@ TOOL_TABLE = browser-shell-tool.tbl
assertEqual(workflowOverviewEmbeddingReport.rows.length, 6, "shell workflow overview embedding report rows"); assertEqual(workflowOverviewEmbeddingReport.rows.length, 6, "shell workflow overview embedding report rows");
assertEqual(workflowOverviewEmbeddingReport.renderRowCount, 5, "shell workflow overview embedding report row count"); assertEqual(workflowOverviewEmbeddingReport.renderRowCount, 5, "shell workflow overview embedding report row count");
assertEqual(workflowOverviewEmbeddingReport.error, null, "shell workflow overview embedding report error"); assertEqual(workflowOverviewEmbeddingReport.error, null, "shell workflow overview embedding report error");
assertEqual(workflowOverviewEmbeddingDisplay.statusText, "Blocked", "shell workflow overview embedding display status");
assertEqual(workflowOverviewEmbeddingDisplay.rows.length, 6, "shell workflow overview embedding display rows");
const controlDoc = await loadFrame(`../../runtime/ui/ini-panel/${controlTarget.href.slice(2)}`); const controlDoc = await loadFrame(`../../runtime/ui/ini-panel/${controlTarget.href.slice(2)}`);
const controlPageApi = controlDoc.defaultView.linuxCncIniPanelControlPageApi; const controlPageApi = controlDoc.defaultView.linuxCncIniPanelControlPageApi;

View File

@@ -36,7 +36,8 @@
!workflowApi?.renderWorkflowOverview || !workflowApi?.renderWorkflowOverview ||
!workflowApi?.mountWorkflowOverview || !workflowApi?.mountWorkflowOverview ||
!workflowApi?.createWorkflowOverviewRenderState || !workflowApi?.createWorkflowOverviewRenderState ||
!workflowApi?.getWorkflowOverviewEmbeddingReport !workflowApi?.getWorkflowOverviewEmbeddingReport ||
!workflowApi?.getWorkflowOverviewEmbeddingDisplayViewModel
) { ) {
throw new Error("workflow overview API namespace did not expose overview helpers"); throw new Error("workflow overview API namespace did not expose overview helpers");
} }
@@ -60,6 +61,7 @@
mountResult, mountResult,
error: null, error: null,
}); });
const embeddingDisplay = workflowApi.getWorkflowOverviewEmbeddingDisplayViewModel(embeddingReport);
assertEqual(summary.summaryVersion, 1, "workflow overview summary version"); assertEqual(summary.summaryVersion, 1, "workflow overview summary version");
assertEqual(displayViewModel.title, "Shell handoff workflow", "workflow overview display title"); assertEqual(displayViewModel.title, "Shell handoff workflow", "workflow overview display title");
@@ -75,6 +77,9 @@
assertEqual(embeddingReport.ready, false, "workflow overview embedding report readiness"); assertEqual(embeddingReport.ready, false, "workflow overview embedding report readiness");
assertEqual(embeddingReport.renderRowCount, 5, "workflow overview embedding report row count"); assertEqual(embeddingReport.renderRowCount, 5, "workflow overview embedding report row count");
assertEqual(embeddingReport.rows.length, 6, "workflow overview embedding report rows"); assertEqual(embeddingReport.rows.length, 6, "workflow overview embedding report rows");
assertEqual(embeddingDisplay.title, "Workflow overview embedding", "workflow overview embedding display title");
assertEqual(embeddingDisplay.statusText, "Blocked", "workflow overview embedding display status");
assertEqual(embeddingDisplay.rows.length, 6, "workflow overview embedding display rows");
assertEqual( assertEqual(
workflowDoc.querySelector("[data-handoff-workflow]").dataset.handoffScope, workflowDoc.querySelector("[data-handoff-workflow]").dataset.handoffScope,
"workflow", "workflow",

View File

@@ -40,6 +40,7 @@ import {
createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewContract,
createIniPanelShellWorkflowOverviewReadiness, createIniPanelShellWorkflowOverviewReadiness,
createIniPanelShellWorkflowOverviewEmbeddingReport, createIniPanelShellWorkflowOverviewEmbeddingReport,
createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel,
mountIniPanelShellWorkflowOverviewEmbedding, mountIniPanelShellWorkflowOverviewEmbedding,
renderIniPanelShellSessionHandoffWorkflowState, renderIniPanelShellSessionHandoffWorkflowState,
mountIniPanelShellSessionHandoffWorkflow, mountIniPanelShellSessionHandoffWorkflow,
@@ -122,6 +123,7 @@ const requiredShellExports = [
"createIniPanelShellWorkflowOverviewContract", "createIniPanelShellWorkflowOverviewContract",
"createIniPanelShellWorkflowOverviewReadiness", "createIniPanelShellWorkflowOverviewReadiness",
"createIniPanelShellWorkflowOverviewEmbeddingReport", "createIniPanelShellWorkflowOverviewEmbeddingReport",
"createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel",
"mountIniPanelShellWorkflowOverviewEmbedding", "mountIniPanelShellWorkflowOverviewEmbedding",
"renderIniPanelShellSessionHandoffWorkflowState", "renderIniPanelShellSessionHandoffWorkflowState",
"mountIniPanelShellSessionHandoffWorkflow", "mountIniPanelShellSessionHandoffWorkflow",
@@ -423,6 +425,7 @@ assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffSnap
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffSummary\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffSummary\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffSummarySchema\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffSummarySchema\b/);
assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingReport\b/); assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingReport\b/);
assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel\b/);
assert.match(shellText, /\bexport function isSupportedIniPanelControlPageApiManifest\b/); assert.match(shellText, /\bexport function isSupportedIniPanelControlPageApiManifest\b/);
assert.match(shellText, /\bexport function isSupportedIniPanelLaunchApiManifest\b/); assert.match(shellText, /\bexport function isSupportedIniPanelLaunchApiManifest\b/);
assert.match(shellText, /\bexport function isSupportedIniPanelShellIntegrationManifest\b/); assert.match(shellText, /\bexport function isSupportedIniPanelShellIntegrationManifest\b/);
@@ -452,6 +455,7 @@ assert.match(launchText, /\bgetShellSessionHandoffPackageSchema\b/);
assert.match(launchText, /\bgetShellSessionHandoffPackage\b/); assert.match(launchText, /\bgetShellSessionHandoffPackage\b/);
assert.match(launchText, /\bgetShellSessionHandoffPackageReport\b/); assert.match(launchText, /\bgetShellSessionHandoffPackageReport\b/);
assert.match(launchText, /\bgetWorkflowOverviewEmbeddingReport\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingReport\b/);
assert.match(launchText, /\bgetWorkflowOverviewEmbeddingDisplayViewModel\b/);
assert.match(launchText, /\bisSupportedShellSessionHandoffPackage\b/); assert.match(launchText, /\bisSupportedShellSessionHandoffPackage\b/);
assert.match(launchText, /\bdata-handoff-shell\b/); assert.match(launchText, /\bdata-handoff-shell\b/);
assert.match(launchText, /\bdata-handoff-status\b/); assert.match(launchText, /\bdata-handoff-status\b/);
@@ -486,6 +490,7 @@ assert.match(docText, /\bcreateIniPanelShellSessionHandoffSnapshot\b/);
assert.match(docText, /\bcreateIniPanelShellSessionHandoffSummary\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffSummary\b/);
assert.match(docText, /\bcreateIniPanelShellSessionHandoffSummarySchema\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffSummarySchema\b/);
assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingReport\b/); assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingReport\b/);
assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel\b/);
assert.match(docText, /\bisSupportedIniPanelControlPageApiManifest\b/); assert.match(docText, /\bisSupportedIniPanelControlPageApiManifest\b/);
assert.match(docText, /\bisSupportedIniPanelLaunchApiManifest\b/); assert.match(docText, /\bisSupportedIniPanelLaunchApiManifest\b/);
assert.match(docText, /\bisSupportedIniPanelShellIntegrationManifest\b/); assert.match(docText, /\bisSupportedIniPanelShellIntegrationManifest\b/);
@@ -510,6 +515,7 @@ assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getShellSessionHandoffPackag
assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getShellSessionHandoffPackage\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getShellSessionHandoffPackage\b/);
assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getShellSessionHandoffPackageReport\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getShellSessionHandoffPackageReport\b/);
assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbeddingReport\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbeddingReport\b/);
assert.match(docText, /\blinuxCncIniPanelLaunchApi\.getWorkflowOverviewEmbeddingDisplayViewModel\b/);
assert.match(docText, /\blinuxCncIniPanelLaunchApi\.isSupportedShellSessionHandoffPackage\b/); assert.match(docText, /\blinuxCncIniPanelLaunchApi\.isSupportedShellSessionHandoffPackage\b/);
assert.match(docText, /\bdata-handoff-shell\b/); assert.match(docText, /\bdata-handoff-shell\b/);
assert.match(docText, /\bdata-handoff-status\b/); assert.match(docText, /\bdata-handoff-status\b/);

View File

@@ -80,6 +80,7 @@ assert.deepEqual(manifest, {
"getWorkflowOverviewReadiness", "getWorkflowOverviewReadiness",
"mountWorkflowOverviewEmbedding", "mountWorkflowOverviewEmbedding",
"getWorkflowOverviewEmbeddingReport", "getWorkflowOverviewEmbeddingReport",
"getWorkflowOverviewEmbeddingDisplayViewModel",
"isSupportedShellSessionHandoffPackage", "isSupportedShellSessionHandoffPackage",
"getLauncherLinks", "getLauncherLinks",
"getControlPageApiMethods", "getControlPageApiMethods",
@@ -224,6 +225,7 @@ assert.match(launchText, /\bgetWorkflowOverviewContract\b/);
assert.match(launchText, /\bgetWorkflowOverviewReadiness\b/); assert.match(launchText, /\bgetWorkflowOverviewReadiness\b/);
assert.match(launchText, /\bmountWorkflowOverviewEmbedding\b/); assert.match(launchText, /\bmountWorkflowOverviewEmbedding\b/);
assert.match(launchText, /\bgetWorkflowOverviewEmbeddingReport\b/); assert.match(launchText, /\bgetWorkflowOverviewEmbeddingReport\b/);
assert.match(launchText, /\bgetWorkflowOverviewEmbeddingDisplayViewModel\b/);
assert.match(launchText, /\bisSupportedShellSessionHandoffPackage\b/); assert.match(launchText, /\bisSupportedShellSessionHandoffPackage\b/);
assert.match(launchText, /\bdata-handoff-workflow\b/); assert.match(launchText, /\bdata-handoff-workflow\b/);
assert.match(launchText, /\bdata-handoff-workflow-status\b/); assert.match(launchText, /\bdata-handoff-workflow-status\b/);

View File

@@ -36,6 +36,7 @@ import {
createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewContract,
createIniPanelShellWorkflowOverviewReadiness, createIniPanelShellWorkflowOverviewReadiness,
createIniPanelShellWorkflowOverviewEmbeddingReport, createIniPanelShellWorkflowOverviewEmbeddingReport,
createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel,
mountIniPanelShellWorkflowOverviewEmbedding, mountIniPanelShellWorkflowOverviewEmbedding,
renderIniPanelShellSessionHandoffWorkflowState, renderIniPanelShellSessionHandoffWorkflowState,
mountIniPanelShellSessionHandoffWorkflow, mountIniPanelShellSessionHandoffWorkflow,
@@ -165,7 +166,7 @@ assert.deepEqual(readiness, {
counts: { counts: {
pages: 3, pages: 3,
launcherLinks: 3, launcherLinks: 3,
launchMethods: 43, launchMethods: 44,
controlPageMethods: 11, controlPageMethods: 11,
persistenceCapabilities: 3, persistenceCapabilities: 3,
}, },
@@ -227,7 +228,7 @@ assert.deepEqual(handoffSummary, {
counts: { counts: {
pages: 3, pages: 3,
launcherLinks: 3, launcherLinks: 3,
launchMethods: 43, launchMethods: 44,
controlPageMethods: 11, controlPageMethods: 11,
persistenceCapabilities: 3, persistenceCapabilities: 3,
}, },
@@ -769,6 +770,12 @@ assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), {
assert.equal(createIniPanelShellWorkflowOverviewReadiness().ready, false); assert.equal(createIniPanelShellWorkflowOverviewReadiness().ready, false);
assert.equal(createIniPanelShellWorkflowOverviewEmbeddingReport().ready, false); assert.equal(createIniPanelShellWorkflowOverviewEmbeddingReport().ready, false);
assert.equal(createIniPanelShellWorkflowOverviewEmbeddingReport().rows.length, 6); assert.equal(createIniPanelShellWorkflowOverviewEmbeddingReport().rows.length, 6);
assert.equal(
createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel(
createIniPanelShellWorkflowOverviewEmbeddingReport(),
).title,
"Workflow overview embedding",
);
assert.deepEqual( assert.deepEqual(
createIniPanelShellWorkflowOverviewReadiness({ createIniPanelShellWorkflowOverviewReadiness({
overviewApi: { overviewApi: {
@@ -1197,7 +1204,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), {
counts: { counts: {
pages: 3, pages: 3,
launcherLinks: 3, launcherLinks: 3,
launchMethods: 43, launchMethods: 44,
controlPageMethods: 11, controlPageMethods: 11,
persistenceCapabilities: 3, persistenceCapabilities: 3,
}, },
@@ -1380,6 +1387,7 @@ assert.match(shellText, /\bexport function renderIniPanelShellSessionHandoffWork
assert.match(shellText, /\bexport function mountIniPanelShellSessionHandoffWorkflow\b/); assert.match(shellText, /\bexport function mountIniPanelShellSessionHandoffWorkflow\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageReport\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageReport\b/);
assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingReport\b/); assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingReport\b/);
assert.match(shellText, /\bexport function createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageRenderState\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageRenderState\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageSchema\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffPackageSchema\b/);
assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffRenderState\b/); assert.match(shellText, /\bexport function createIniPanelShellSessionHandoffRenderState\b/);
@@ -1418,6 +1426,7 @@ assert.match(docText, /\brenderIniPanelShellSessionHandoffWorkflowState\b/);
assert.match(docText, /\bmountIniPanelShellSessionHandoffWorkflow\b/); assert.match(docText, /\bmountIniPanelShellSessionHandoffWorkflow\b/);
assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageReport\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageReport\b/);
assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingReport\b/); assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingReport\b/);
assert.match(docText, /\bcreateIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel\b/);
assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageRenderState\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageRenderState\b/);
assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageSchema\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffPackageSchema\b/);
assert.match(docText, /\bcreateIniPanelShellSessionHandoffRenderState\b/); assert.match(docText, /\bcreateIniPanelShellSessionHandoffRenderState\b/);

View File

@@ -36,6 +36,7 @@ import {
createIniPanelShellWorkflowOverviewContract, createIniPanelShellWorkflowOverviewContract,
createIniPanelShellWorkflowOverviewReadiness, createIniPanelShellWorkflowOverviewReadiness,
createIniPanelShellWorkflowOverviewEmbeddingReport, createIniPanelShellWorkflowOverviewEmbeddingReport,
createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel,
mountIniPanelShellWorkflowOverviewEmbedding, mountIniPanelShellWorkflowOverviewEmbedding,
renderIniPanelShellSessionHandoffWorkflowState, renderIniPanelShellSessionHandoffWorkflowState,
mountIniPanelShellSessionHandoffWorkflow, mountIniPanelShellSessionHandoffWorkflow,
@@ -123,6 +124,7 @@ assert.equal(typeof createIniPanelShellSessionHandoffWorkflowDomReadiness, "func
assert.equal(typeof createIniPanelShellWorkflowOverviewContract, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewContract, "function");
assert.equal(typeof createIniPanelShellWorkflowOverviewReadiness, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewReadiness, "function");
assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingReport, "function"); assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingReport, "function");
assert.equal(typeof createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel, "function");
assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbedding, "function"); assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbedding, "function");
assert.equal(typeof renderIniPanelShellSessionHandoffWorkflowState, "function"); assert.equal(typeof renderIniPanelShellSessionHandoffWorkflowState, "function");
assert.equal(typeof mountIniPanelShellSessionHandoffWorkflow, "function"); assert.equal(typeof mountIniPanelShellSessionHandoffWorkflow, "function");
@@ -793,6 +795,10 @@ assert.equal(shellViewModel.createWorkflowOverviewContract, createIniPanelShellW
assert.equal(shellViewModel.createWorkflowOverviewReadiness, createIniPanelShellWorkflowOverviewReadiness); assert.equal(shellViewModel.createWorkflowOverviewReadiness, createIniPanelShellWorkflowOverviewReadiness);
assert.equal(shellViewModel.mountWorkflowOverviewEmbedding, mountIniPanelShellWorkflowOverviewEmbedding); assert.equal(shellViewModel.mountWorkflowOverviewEmbedding, mountIniPanelShellWorkflowOverviewEmbedding);
assert.equal(shellViewModel.createWorkflowOverviewEmbeddingReport, createIniPanelShellWorkflowOverviewEmbeddingReport); assert.equal(shellViewModel.createWorkflowOverviewEmbeddingReport, createIniPanelShellWorkflowOverviewEmbeddingReport);
assert.equal(
shellViewModel.createWorkflowOverviewEmbeddingDisplayViewModel,
createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel,
);
assert.equal(shellViewModel.createShellSessionHandoffPackageReport, createIniPanelShellSessionHandoffPackageReport); assert.equal(shellViewModel.createShellSessionHandoffPackageReport, createIniPanelShellSessionHandoffPackageReport);
assert.equal(shellViewModel.createShellSessionHandoffPackageSchema, createIniPanelShellSessionHandoffPackageSchema); assert.equal(shellViewModel.createShellSessionHandoffPackageSchema, createIniPanelShellSessionHandoffPackageSchema);
assert.equal(shellViewModel.isSupportedShellSessionHandoffPackage, isSupportedIniPanelShellSessionHandoffPackage); assert.equal(shellViewModel.isSupportedShellSessionHandoffPackage, isSupportedIniPanelShellSessionHandoffPackage);
@@ -1179,7 +1185,8 @@ assert.equal(workflowOverviewEmbedding.ready, false);
assert.equal(workflowOverviewEmbedding.renderState.statusLine, "Blocked: mount:blocked"); assert.equal(workflowOverviewEmbedding.renderState.statusLine, "Blocked: mount:blocked");
assert.equal(workflowOverviewEmbedding.mountResult.renderResult.rowCount, 5); assert.equal(workflowOverviewEmbedding.mountResult.renderResult.rowCount, 5);
assert.equal(workflowOverviewEmbedding.error, null); assert.equal(workflowOverviewEmbedding.error, null);
assert.deepEqual(createIniPanelShellWorkflowOverviewEmbeddingReport(workflowOverviewEmbedding), { const workflowOverviewEmbeddingReport = createIniPanelShellWorkflowOverviewEmbeddingReport(workflowOverviewEmbedding);
assert.deepEqual(workflowOverviewEmbeddingReport, {
apiName: "ini-panel-shell-workflow-overview-embedding-report", apiName: "ini-panel-shell-workflow-overview-embedding-report",
reportVersion: 1, reportVersion: 1,
phase: "blocked", phase: "blocked",
@@ -1228,6 +1235,16 @@ assert.deepEqual(createIniPanelShellWorkflowOverviewEmbeddingReport(workflowOver
}, },
], ],
}); });
assert.deepEqual(
createIniPanelShellWorkflowOverviewEmbeddingDisplayViewModel(workflowOverviewEmbeddingReport),
{
phase: "blocked",
title: "Workflow overview embedding",
statusText: "Blocked",
detailText: "embedding:blocked, mount:blocked",
rows: workflowOverviewEmbeddingReport.rows,
},
);
assert.deepEqual( assert.deepEqual(
mountIniPanelShellWorkflowOverviewEmbedding({ overviewApi: null }).readiness.missing, mountIniPanelShellWorkflowOverviewEmbedding({ overviewApi: null }).readiness.missing,
shellViewModel.shellWorkflowOverviewContract.methodNames, shellViewModel.shellWorkflowOverviewContract.methodNames,