推进 INI 面板 workflow overview embedding contract

This commit is contained in:
2026-06-15 17:51:21 +08:00
parent b61e7e980d
commit 766f630dfb
11 changed files with 442 additions and 5 deletions

View File

@@ -37,6 +37,9 @@ import {
createIniPanelShellSessionHandoffWorkflowRenderState,
createIniPanelShellSessionHandoffWorkflowDomContract,
createIniPanelShellSessionHandoffWorkflowDomReadiness,
createIniPanelShellWorkflowOverviewContract,
createIniPanelShellWorkflowOverviewReadiness,
mountIniPanelShellWorkflowOverviewEmbedding,
renderIniPanelShellSessionHandoffWorkflowState,
mountIniPanelShellSessionHandoffWorkflow,
renderIniPanelShellSessionHandoffMountState,
@@ -115,6 +118,9 @@ const requiredShellExports = [
"createIniPanelShellSessionHandoffWorkflowRenderState",
"createIniPanelShellSessionHandoffWorkflowDomContract",
"createIniPanelShellSessionHandoffWorkflowDomReadiness",
"createIniPanelShellWorkflowOverviewContract",
"createIniPanelShellWorkflowOverviewReadiness",
"mountIniPanelShellWorkflowOverviewEmbedding",
"renderIniPanelShellSessionHandoffWorkflowState",
"mountIniPanelShellSessionHandoffWorkflow",
"renderIniPanelShellSessionHandoffMountState",

View File

@@ -76,6 +76,9 @@ assert.deepEqual(manifest, {
"getShellSessionHandoffWorkflowDomReadiness",
"renderShellSessionHandoffWorkflowState",
"mountShellSessionHandoffWorkflow",
"getWorkflowOverviewContract",
"getWorkflowOverviewReadiness",
"mountWorkflowOverviewEmbedding",
"isSupportedShellSessionHandoffPackage",
"getLauncherLinks",
"getControlPageApiMethods",
@@ -216,6 +219,9 @@ assert.match(launchText, /\bgetShellSessionHandoffWorkflowDomContract\b/);
assert.match(launchText, /\bgetShellSessionHandoffWorkflowDomReadiness\b/);
assert.match(launchText, /\brenderShellSessionHandoffWorkflowState\b/);
assert.match(launchText, /\bmountShellSessionHandoffWorkflow\b/);
assert.match(launchText, /\bgetWorkflowOverviewContract\b/);
assert.match(launchText, /\bgetWorkflowOverviewReadiness\b/);
assert.match(launchText, /\bmountWorkflowOverviewEmbedding\b/);
assert.match(launchText, /\bisSupportedShellSessionHandoffPackage\b/);
assert.match(launchText, /\bdata-handoff-workflow\b/);
assert.match(launchText, /\bdata-handoff-workflow-status\b/);

View File

@@ -33,6 +33,9 @@ import {
createIniPanelShellSessionHandoffWorkflowRenderState,
createIniPanelShellSessionHandoffWorkflowDomContract,
createIniPanelShellSessionHandoffWorkflowDomReadiness,
createIniPanelShellWorkflowOverviewContract,
createIniPanelShellWorkflowOverviewReadiness,
mountIniPanelShellWorkflowOverviewEmbedding,
renderIniPanelShellSessionHandoffWorkflowState,
mountIniPanelShellSessionHandoffWorkflow,
createIniPanelShellSessionHandoffPackageReport,
@@ -161,7 +164,7 @@ assert.deepEqual(readiness, {
counts: {
pages: 3,
launcherLinks: 3,
launchMethods: 39,
launchMethods: 42,
controlPageMethods: 11,
persistenceCapabilities: 3,
},
@@ -223,7 +226,7 @@ assert.deepEqual(handoffSummary, {
counts: {
pages: 3,
launcherLinks: 3,
launchMethods: 39,
launchMethods: 42,
controlPageMethods: 11,
persistenceCapabilities: 3,
},
@@ -747,6 +750,39 @@ assert.equal(
mountIniPanelShellSessionHandoffWorkflow().phase,
"blocked",
);
assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), {
pageHref: "./workflow-overview.html",
entryId: "workflow-overview",
apiName: "linuxCncIniPanelWorkflowOverviewApi",
methodNames: [
"getWorkflowOverviewRenderState",
"getWorkflowOverviewDisplayViewModel",
"getWorkflowOverviewSummary",
"getWorkflowOverviewDomContract",
"getWorkflowOverviewDomReadiness",
"renderWorkflowOverview",
"mountWorkflowOverview",
"createWorkflowOverviewRenderState",
],
});
assert.equal(createIniPanelShellWorkflowOverviewReadiness().ready, false);
assert.deepEqual(
createIniPanelShellWorkflowOverviewReadiness({
overviewApi: {
getWorkflowOverviewRenderState: () => handoffPackageRenderState,
},
}).missing,
[
"getWorkflowOverviewDisplayViewModel",
"getWorkflowOverviewSummary",
"getWorkflowOverviewDomContract",
"getWorkflowOverviewDomReadiness",
"renderWorkflowOverview",
"mountWorkflowOverview",
"createWorkflowOverviewRenderState",
],
);
assert.equal(mountIniPanelShellWorkflowOverviewEmbedding().phase, "blocked");
assert.deepEqual(
createIniPanelShellSessionHandoffPackageMountState({
handoffPackage,
@@ -1158,7 +1194,7 @@ assert.deepEqual(createIniPanelShellIntegrationReadiness(blockedManifest), {
counts: {
pages: 3,
launcherLinks: 3,
launchMethods: 39,
launchMethods: 42,
controlPageMethods: 11,
persistenceCapabilities: 3,
},

View File

@@ -33,6 +33,9 @@ import {
createIniPanelShellSessionHandoffWorkflowRenderState,
createIniPanelShellSessionHandoffWorkflowDomContract,
createIniPanelShellSessionHandoffWorkflowDomReadiness,
createIniPanelShellWorkflowOverviewContract,
createIniPanelShellWorkflowOverviewReadiness,
mountIniPanelShellWorkflowOverviewEmbedding,
renderIniPanelShellSessionHandoffWorkflowState,
mountIniPanelShellSessionHandoffWorkflow,
renderIniPanelShellSessionHandoffMountState,
@@ -116,6 +119,9 @@ assert.equal(typeof createIniPanelShellSessionHandoffWorkflowDisplayViewModel, "
assert.equal(typeof createIniPanelShellSessionHandoffWorkflowRenderState, "function");
assert.equal(typeof createIniPanelShellSessionHandoffWorkflowDomContract, "function");
assert.equal(typeof createIniPanelShellSessionHandoffWorkflowDomReadiness, "function");
assert.equal(typeof createIniPanelShellWorkflowOverviewContract, "function");
assert.equal(typeof createIniPanelShellWorkflowOverviewReadiness, "function");
assert.equal(typeof mountIniPanelShellWorkflowOverviewEmbedding, "function");
assert.equal(typeof renderIniPanelShellSessionHandoffWorkflowState, "function");
assert.equal(typeof mountIniPanelShellSessionHandoffWorkflow, "function");
assert.equal(typeof renderIniPanelShellSessionHandoffMountState, "function");
@@ -621,6 +627,21 @@ assert.deepEqual(shellViewModel.shellSessionHandoffMountDomContract, {
},
renderResultFields: ["rendered", "statusLine", "rowCount", "rowIds", "dataset"],
});
assert.deepEqual(shellViewModel.shellWorkflowOverviewContract, {
pageHref: "./workflow-overview.html",
entryId: "workflow-overview",
apiName: "linuxCncIniPanelWorkflowOverviewApi",
methodNames: [
"getWorkflowOverviewRenderState",
"getWorkflowOverviewDisplayViewModel",
"getWorkflowOverviewSummary",
"getWorkflowOverviewDomContract",
"getWorkflowOverviewDomReadiness",
"renderWorkflowOverview",
"mountWorkflowOverview",
"createWorkflowOverviewRenderState",
],
});
assert.equal(
createIniPanelShellSessionHandoffPackageMountState({
handoffPackage: shellViewModel.shellSessionHandoffPackage,
@@ -766,6 +787,9 @@ assert.equal(
shellViewModel.mountShellSessionHandoffWorkflow,
mountIniPanelShellSessionHandoffWorkflow,
);
assert.equal(shellViewModel.createWorkflowOverviewContract, createIniPanelShellWorkflowOverviewContract);
assert.equal(shellViewModel.createWorkflowOverviewReadiness, createIniPanelShellWorkflowOverviewReadiness);
assert.equal(shellViewModel.mountWorkflowOverviewEmbedding, mountIniPanelShellWorkflowOverviewEmbedding);
assert.equal(shellViewModel.createShellSessionHandoffPackageReport, createIniPanelShellSessionHandoffPackageReport);
assert.equal(shellViewModel.createShellSessionHandoffPackageSchema, createIniPanelShellSessionHandoffPackageSchema);
assert.equal(shellViewModel.isSupportedShellSessionHandoffPackage, isSupportedIniPanelShellSessionHandoffPackage);
@@ -1105,6 +1129,68 @@ assert.equal(workflowDomMountResult.phase, "blocked");
assert.equal(workflowDomMountResult.ready, false);
assert.equal(workflowDomMountResult.renderResult.rowCount, 5);
assert.equal(workflowDomMountResult.renderResult.dataset.handoffScope, "workflow");
assert.deepEqual(createIniPanelShellWorkflowOverviewContract(), shellViewModel.shellWorkflowOverviewContract);
assert.deepEqual(createIniPanelShellWorkflowOverviewReadiness(), {
apiName: "ini-panel-shell-workflow-overview-readiness",
readinessVersion: 1,
phase: "blocked",
ready: false,
missing: shellViewModel.shellWorkflowOverviewContract.methodNames,
contract: shellViewModel.shellWorkflowOverviewContract,
});
const workflowOverviewApi = {
getWorkflowOverviewRenderState: () => workflowRenderState,
getWorkflowOverviewDisplayViewModel: () => workflowDisplayViewModel,
getWorkflowOverviewSummary: () => workflowSummaryResult,
getWorkflowOverviewDomContract: createIniPanelShellSessionHandoffWorkflowDomContract,
getWorkflowOverviewDomReadiness: createIniPanelShellSessionHandoffWorkflowDomReadiness,
renderWorkflowOverview: renderIniPanelShellSessionHandoffWorkflowState,
mountWorkflowOverview: (options) => mountIniPanelShellSessionHandoffWorkflow({
renderState: workflowRenderState,
...options,
}),
createWorkflowOverviewRenderState: createIniPanelShellSessionHandoffWorkflowRenderState,
};
assert.deepEqual(createIniPanelShellWorkflowOverviewReadiness({
overviewApi: workflowOverviewApi,
}), {
apiName: "ini-panel-shell-workflow-overview-readiness",
readinessVersion: 1,
phase: "ready",
ready: true,
missing: [],
contract: shellViewModel.shellWorkflowOverviewContract,
});
const workflowOverviewEmbedding = mountIniPanelShellWorkflowOverviewEmbedding({
overviewApi: workflowOverviewApi,
mountOptions: {
documentRef: mountDocument,
mountNode,
statusNode: mountStatusNode,
rowsNode: mountRowsNode,
},
});
assert.equal(workflowOverviewEmbedding.apiName, "ini-panel-shell-workflow-overview-embedding");
assert.equal(workflowOverviewEmbedding.embeddingVersion, 1);
assert.equal(workflowOverviewEmbedding.ready, false);
assert.equal(workflowOverviewEmbedding.renderState.statusLine, "Blocked: mount:blocked");
assert.equal(workflowOverviewEmbedding.mountResult.renderResult.rowCount, 5);
assert.equal(workflowOverviewEmbedding.error, null);
assert.deepEqual(
mountIniPanelShellWorkflowOverviewEmbedding({ overviewApi: null }).readiness.missing,
shellViewModel.shellWorkflowOverviewContract.methodNames,
);
assert.equal(
mountIniPanelShellWorkflowOverviewEmbedding({
overviewApi: {
...workflowOverviewApi,
mountWorkflowOverview: () => {
throw new Error("mount failed");
},
},
}).error,
"mount failed",
);
assert.equal(
mountIniPanelShellSessionHandoffWorkflow({ documentRef: mountDocument }).renderResult,
null,