@toolproof-core/lib 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/artifacts/artifacts.d.ts +4 -3
- package/dist/artifacts/artifacts.d.ts.map +1 -1
- package/dist/firebase/firebaseAdminHelpers.d.ts +2 -2
- package/dist/firebase/firebaseAdminHelpers.d.ts.map +1 -1
- package/dist/firebase/firebaseAdminHelpers.js.map +1 -1
- package/dist/shared.d.ts +33 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +67 -0
- package/dist/shared.js.map +1 -0
- package/dist/types/types.d.ts +2 -5
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js.map +1 -1
- package/dist/utils/extractFrom.d.ts +5 -0
- package/dist/utils/extractFrom.d.ts.map +1 -0
- package/dist/utils/extractFrom.js +72 -0
- package/dist/utils/extractFrom.js.map +1 -0
- package/dist/utils/extractFromCosmosData.d.ts +9 -0
- package/dist/utils/extractFromCosmosData.d.ts.map +1 -0
- package/dist/utils/extractFromCosmosData.js +20 -0
- package/dist/utils/extractFromCosmosData.js.map +1 -0
- package/dist/utils/extractFromResourceDict.d.ts +12 -0
- package/dist/utils/extractFromResourceDict.d.ts.map +1 -0
- package/dist/utils/extractFromResourceDict.js +23 -0
- package/dist/utils/extractFromResourceDict.js.map +1 -0
- package/dist/utils/extractFromResourceMap.d.ts +12 -0
- package/dist/utils/extractFromResourceMap.d.ts.map +1 -0
- package/dist/utils/extractFromResourceMap.js +23 -0
- package/dist/utils/extractFromResourceMap.js.map +1 -0
- package/dist/utils/extractFromResourcesByResourceTypeHandle.d.ts +8 -0
- package/dist/utils/extractFromResourcesByResourceTypeHandle.d.ts.map +1 -0
- package/dist/utils/extractFromResourcesByResourceTypeHandle.js +31 -0
- package/dist/utils/extractFromResourcesByResourceTypeHandle.js.map +1 -0
- package/dist/utils/extractFromStrategy.d.ts +5 -0
- package/dist/utils/extractFromStrategy.d.ts.map +1 -0
- package/dist/utils/extractFromStrategy.js +72 -0
- package/dist/utils/extractFromStrategy.js.map +1 -0
- package/dist/utils/extraction.d.ts +12 -0
- package/dist/utils/extraction.d.ts.map +1 -0
- package/dist/utils/extraction.js +27 -0
- package/dist/utils/extraction.js.map +1 -0
- package/dist/utils/generateFrom.d.ts +4 -0
- package/dist/utils/generateFrom.d.ts.map +1 -0
- package/dist/utils/generateFrom.js +18 -0
- package/dist/utils/generateFrom.js.map +1 -0
- package/dist/utils/generateFromTo.d.ts +4 -0
- package/dist/utils/generateFromTo.d.ts.map +1 -0
- package/dist/utils/generateFromTo.js +18 -0
- package/dist/utils/generateFromTo.js.map +1 -0
- package/dist/utils/parallelization.d.ts +3 -0
- package/dist/utils/parallelization.d.ts.map +1 -0
- package/dist/utils/parallelization.js +136 -0
- package/dist/utils/parallelization.js.map +1 -0
- package/dist/utils/resourceChain.d.ts +22 -0
- package/dist/utils/resourceChain.d.ts.map +1 -0
- package/dist/utils/resourceChain.js +38 -0
- package/dist/utils/resourceChain.js.map +1 -0
- package/dist/utils/roleResourceBinding.d.ts +5 -0
- package/dist/utils/roleResourceBinding.d.ts.map +1 -0
- package/dist/utils/roleResourceBinding.js +74 -0
- package/dist/utils/roleResourceBinding.js.map +1 -0
- package/dist/utils/runnableStrategyCreation.d.ts +8 -0
- package/dist/utils/runnableStrategyCreation.d.ts.map +1 -0
- package/dist/utils/runnableStrategyCreation.js +24 -0
- package/dist/utils/runnableStrategyCreation.js.map +1 -0
- package/dist/utils/stepCreation.d.ts +10 -0
- package/dist/utils/stepCreation.d.ts.map +1 -0
- package/dist/utils/stepCreation.js +80 -0
- package/dist/utils/stepCreation.js.map +1 -0
- package/package.json +48 -41
- package/src/_lib/setup/firebaseAdminInit.ts +38 -38
- package/src/artifacts/artifacts.ts +40 -40
- package/src/firebase/firebaseAdminHelpers.ts +157 -157
- package/src/shared.ts +126 -0
- package/src/types/types.ts +20 -24
- package/src/utils/extractFrom.ts +93 -0
- package/src/utils/extractFromResourcesByResourceTypeHandle.ts +55 -0
- package/src/utils/{creation.ts → generateFrom.ts} +26 -26
- package/src/utils/parallelization.ts +177 -0
- package/src/utils/resourceChain.ts +66 -0
- package/src/utils/roleResourceBinding.ts +109 -0
- package/src/utils/runnableStrategyCreation.ts +47 -0
- package/src/utils/stepCreation.ts +112 -0
- package/tsconfig.json +14 -14
- package/tsconfig.tsbuildinfo +1 -1
- package/src/utils/resourceMapExtraction.ts +0 -47
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export function extractResourcesByType(resourceMap, resourceTypeHandle) {
|
|
2
|
+
const resources = (resourceMap[resourceTypeHandle] ?? []);
|
|
3
|
+
const result = {};
|
|
4
|
+
for (const resource of resources) {
|
|
5
|
+
result[resource.identity] = resource;
|
|
6
|
+
}
|
|
7
|
+
return result;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
|
|
11
|
+
*/
|
|
12
|
+
export function extractNucleusMap(resourceMap, resourceTypeHandle) {
|
|
13
|
+
const resources = extractResourcesByType(resourceMap, resourceTypeHandle);
|
|
14
|
+
const out = new Map();
|
|
15
|
+
for (const resource of Object.values(resources)) {
|
|
16
|
+
const data = resource.nucleus;
|
|
17
|
+
const value = data;
|
|
18
|
+
const key = String(value.identity);
|
|
19
|
+
out.set(key, value);
|
|
20
|
+
}
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
/* // ATTENTION: Should be retired in favor of extractNucleusMap
|
|
24
|
+
export function extractJobMap(resourceMap: ResourceMap) {
|
|
25
|
+
return extractNucleusMap<JobIdentityJson, JobJson, Resource_JobJson>(resourceMap, 'TYPE-Job');
|
|
26
|
+
} */
|
|
27
|
+
//# sourceMappingURL=extraction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction.js","sourceRoot":"","sources":["../../src/utils/extraction.ts"],"names":[],"mappings":"AAUA,MAAM,UAAU,sBAAsB,CAClC,WAAwB,EACxB,kBAA4C;IAE5C,MAAM,SAAS,GAAG,CAAC,WAAW,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAgB,CAAC;IACzE,MAAM,MAAM,GAA4C,EAA6C,CAAC;IAEtG,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;IACzC,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAK7B,WAAwB,EACxB,kBAA4C;IAE5C,MAAM,SAAS,GAAG,sBAAsB,CAAY,WAAW,EAAE,kBAAkB,CAAC,CAAC;IACrF,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEtC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAI,QAAgB,CAAC,OAAkB,CAAC;QAElD,MAAM,KAAK,GAAG,IAAgB,CAAC;QAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAS,CAAC;QAE3C,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;;IAGI"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ResourceIdentityJson, ResourceTypeIdentityJson, ResourceJson, ResourceOutputPotentialJson } from '@toolproof-core/schema';
|
|
2
|
+
export declare function generatePath(resourceTypeHandle: ResourceTypeIdentityJson, identity: ResourceIdentityJson): string;
|
|
3
|
+
export declare function generateMaterializedFromOutputPotential(outputPotential: ResourceOutputPotentialJson, nucleus: unknown, timestamp?: string): ResourceJson;
|
|
4
|
+
//# sourceMappingURL=generateFrom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateFrom.d.ts","sourceRoot":"","sources":["../../src/utils/generateFrom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAGxI,wBAAgB,YAAY,CAAC,kBAAkB,EAAE,wBAAwB,EAAE,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAEjH;AAED,wBAAgB,uCAAuC,CACnD,eAAe,EAAE,2BAA2B,EAC5C,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,MAAM,GACnB,YAAY,CAed"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function generatePath(resourceTypeHandle, identity) {
|
|
2
|
+
return `${resourceTypeHandle}/${identity}.json`;
|
|
3
|
+
}
|
|
4
|
+
export function generateMaterializedFromOutputPotential(outputPotential, nucleus, timestamp) {
|
|
5
|
+
const { identity, resourceTypeHandle, creationContext } = outputPotential;
|
|
6
|
+
const path = generatePath(resourceTypeHandle, identity);
|
|
7
|
+
return {
|
|
8
|
+
identity,
|
|
9
|
+
resourceTypeHandle,
|
|
10
|
+
creationContext,
|
|
11
|
+
resourceShellKind: 'materialized',
|
|
12
|
+
version: 1,
|
|
13
|
+
timestamp: timestamp ?? new Date().toISOString(), // Preserve original timestamp when copying
|
|
14
|
+
path,
|
|
15
|
+
nucleus,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=generateFrom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateFrom.js","sourceRoot":"","sources":["../../src/utils/generateFrom.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAAC,kBAA4C,EAAE,QAA8B;IACrG,OAAO,GAAG,kBAAkB,IAAI,QAAQ,OAAO,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,uCAAuC,CACnD,eAA4C,EAC5C,OAAgB,EAChB,SAAkB;IAElB,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,eAAe,EAAE,GAAG,eAAe,CAAC;IAE1E,MAAM,IAAI,GAAG,YAAY,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IAExD,OAAO;QACH,QAAQ;QACR,kBAAkB;QAClB,eAAe;QACf,iBAAiB,EAAE,cAAc;QACjC,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,2CAA2C;QAC7F,IAAI;QACJ,OAAO;KACV,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ResourceIdentityJson, ResourceTypeIdentityJson, ResourceJson, ResourceOutputPotentialJson } from '@toolproof-core/schema';
|
|
2
|
+
export declare function generatePath(resourceTypeHandle: ResourceTypeIdentityJson, identity: ResourceIdentityJson): string;
|
|
3
|
+
export declare function fromOutputPotentialToMaterialized(outputPotential: ResourceOutputPotentialJson, nucleus: unknown, timestamp?: string): ResourceJson;
|
|
4
|
+
//# sourceMappingURL=generateFromTo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateFromTo.d.ts","sourceRoot":"","sources":["../../src/utils/generateFromTo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,YAAY,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAGxI,wBAAgB,YAAY,CAAC,kBAAkB,EAAE,wBAAwB,EAAE,QAAQ,EAAE,oBAAoB,GAAG,MAAM,CAEjH;AAED,wBAAgB,iCAAiC,CAC7C,eAAe,EAAE,2BAA2B,EAC5C,OAAO,EAAE,OAAO,EAChB,SAAS,CAAC,EAAE,MAAM,GACnB,YAAY,CAed"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export function generatePath(resourceTypeHandle, identity) {
|
|
2
|
+
return `${resourceTypeHandle}/${identity}.json`;
|
|
3
|
+
}
|
|
4
|
+
export function fromOutputPotentialToMaterialized(outputPotential, nucleus, timestamp) {
|
|
5
|
+
const { identity, resourceTypeHandle, creationContext } = outputPotential;
|
|
6
|
+
const path = generatePath(resourceTypeHandle, identity);
|
|
7
|
+
return {
|
|
8
|
+
identity,
|
|
9
|
+
resourceTypeHandle,
|
|
10
|
+
creationContext,
|
|
11
|
+
resourceShellKind: 'materialized',
|
|
12
|
+
version: 1,
|
|
13
|
+
timestamp: timestamp ?? new Date().toISOString(), // Preserve original timestamp when copying
|
|
14
|
+
path,
|
|
15
|
+
nucleus,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=generateFromTo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generateFromTo.js","sourceRoot":"","sources":["../../src/utils/generateFromTo.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAAC,kBAA4C,EAAE,QAA8B;IACrG,OAAO,GAAG,kBAAkB,IAAI,QAAQ,OAAO,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC7C,eAA4C,EAC5C,OAAgB,EAChB,SAAkB;IAElB,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,eAAe,EAAE,GAAG,eAAe,CAAC;IAE1E,MAAM,IAAI,GAAG,YAAY,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IAExD,OAAO;QACH,QAAQ;QACR,kBAAkB;QAClB,eAAe;QACf,iBAAiB,EAAE,cAAc;QACjC,OAAO,EAAE,CAAC;QACV,SAAS,EAAE,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,2CAA2C;QAC7F,IAAI;QACJ,OAAO;KACV,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallelization.d.ts","sourceRoot":"","sources":["../../src/utils/parallelization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAMR,QAAQ,EACR,iBAAiB,EAEpB,MAAM,wBAAwB,CAAC;AAGhC,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,iBAAiB,GAAG,QAAQ,EAAE,EAAE,CAoKvG"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
export function getIndependentThreads(steps, strategyState) {
|
|
2
|
+
const getOwnerLabel = (ownerIndex) => {
|
|
3
|
+
const step = steps[ownerIndex];
|
|
4
|
+
return `steps[${ownerIndex}] stepKind=${step?.stepKind ?? 'unknown'}`;
|
|
5
|
+
};
|
|
6
|
+
// Map each jobStep.identity (including macro-nested job steps) to owning top-level step index.
|
|
7
|
+
const jobStepIdToOwner = new Map();
|
|
8
|
+
const ownerToJobStepIds = new Map();
|
|
9
|
+
const jobStepById = new Map();
|
|
10
|
+
const addJobStep = (jobStep, ownerIndex) => {
|
|
11
|
+
if (!jobStep?.identity)
|
|
12
|
+
return;
|
|
13
|
+
const existingOwner = jobStepIdToOwner.get(jobStep.identity);
|
|
14
|
+
if (existingOwner !== undefined) {
|
|
15
|
+
throw new Error(`Duplicate jobStep.identity '${jobStep.identity}' found in ${getOwnerLabel(ownerIndex)} and ${getOwnerLabel(existingOwner)}`);
|
|
16
|
+
}
|
|
17
|
+
jobStepIdToOwner.set(jobStep.identity, ownerIndex);
|
|
18
|
+
jobStepById.set(jobStep.identity, jobStep);
|
|
19
|
+
const bucket = ownerToJobStepIds.get(ownerIndex) ?? [];
|
|
20
|
+
bucket.push(jobStep.identity);
|
|
21
|
+
ownerToJobStepIds.set(ownerIndex, bucket);
|
|
22
|
+
};
|
|
23
|
+
steps.forEach((step, ownerIndex) => {
|
|
24
|
+
if (step.stepKind === 'job') {
|
|
25
|
+
addJobStep(step, ownerIndex);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (step.stepKind === 'for') {
|
|
29
|
+
const loop = step;
|
|
30
|
+
addJobStep(loop.case?.what, ownerIndex);
|
|
31
|
+
addJobStep(loop.case?.when, ownerIndex);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (step.stepKind === 'while') {
|
|
35
|
+
const loop = step;
|
|
36
|
+
addJobStep(loop.case?.what, ownerIndex);
|
|
37
|
+
addJobStep(loop.case?.when, ownerIndex);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (step.stepKind === 'branch') {
|
|
41
|
+
const branch = step;
|
|
42
|
+
for (const caseItem of branch.cases ?? []) {
|
|
43
|
+
addJobStep(caseItem?.what, ownerIndex);
|
|
44
|
+
addJobStep(caseItem?.when, ownerIndex);
|
|
45
|
+
}
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
// Undirected adjacency used for connected components (thread groups).
|
|
50
|
+
const ownerAdj = new Map();
|
|
51
|
+
// Directed dependencies used for strict ordering validation: owner -> producers it depends on.
|
|
52
|
+
const ownerDeps = new Map();
|
|
53
|
+
const ensureOwner = (ownerIndex) => {
|
|
54
|
+
if (!ownerAdj.has(ownerIndex))
|
|
55
|
+
ownerAdj.set(ownerIndex, new Set());
|
|
56
|
+
if (!ownerDeps.has(ownerIndex))
|
|
57
|
+
ownerDeps.set(ownerIndex, new Set());
|
|
58
|
+
};
|
|
59
|
+
for (let i = 0; i < steps.length; i++) {
|
|
60
|
+
ensureOwner(i);
|
|
61
|
+
}
|
|
62
|
+
// Discover dependencies from strategyState.
|
|
63
|
+
for (const [jobStepId, ownerIndex] of jobStepIdToOwner) {
|
|
64
|
+
ensureOwner(ownerIndex);
|
|
65
|
+
const jobStep = jobStepById.get(jobStepId);
|
|
66
|
+
const inputBindings = jobStep?.roleBindings?.inputBindings ?? [];
|
|
67
|
+
const bucket = strategyState?.[jobStepId] ?? {};
|
|
68
|
+
for (const inputRoleHandle of inputBindings) {
|
|
69
|
+
const entry = bucket?.[inputRoleHandle];
|
|
70
|
+
if (!entry || entry.resourceShellKind !== 'inputPotential')
|
|
71
|
+
continue;
|
|
72
|
+
const creatorJobStepHandle = entry?.creationContext?.jobStepHandle;
|
|
73
|
+
if (!creatorJobStepHandle) {
|
|
74
|
+
throw new Error(`Unresolvable inputPotential in jobStep '${jobStepId}' (${getOwnerLabel(ownerIndex)}): missing creationContext.jobStepHandle for role '${inputRoleHandle}'`);
|
|
75
|
+
}
|
|
76
|
+
const producerOwner = jobStepIdToOwner.get(creatorJobStepHandle);
|
|
77
|
+
if (producerOwner === undefined) {
|
|
78
|
+
throw new Error(`Unresolvable inputPotential in jobStep '${jobStepId}' (${getOwnerLabel(ownerIndex)}): creator jobStepHandle '${creatorJobStepHandle}' not found in strategy steps`);
|
|
79
|
+
}
|
|
80
|
+
ensureOwner(producerOwner);
|
|
81
|
+
ownerAdj.get(ownerIndex).add(producerOwner);
|
|
82
|
+
ownerAdj.get(producerOwner).add(ownerIndex);
|
|
83
|
+
ownerDeps.get(ownerIndex).add(producerOwner);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Connected components over owners.
|
|
87
|
+
const visited = new Set();
|
|
88
|
+
const components = [];
|
|
89
|
+
for (let ownerIndex = 0; ownerIndex < steps.length; ownerIndex++) {
|
|
90
|
+
if (visited.has(ownerIndex))
|
|
91
|
+
continue;
|
|
92
|
+
const component = [];
|
|
93
|
+
const queue = [ownerIndex];
|
|
94
|
+
visited.add(ownerIndex);
|
|
95
|
+
while (queue.length > 0) {
|
|
96
|
+
const node = queue.shift();
|
|
97
|
+
component.push(node);
|
|
98
|
+
for (const neighbor of ownerAdj.get(node) ?? []) {
|
|
99
|
+
if (!visited.has(neighbor)) {
|
|
100
|
+
visited.add(neighbor);
|
|
101
|
+
queue.push(neighbor);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
components.push(component);
|
|
106
|
+
}
|
|
107
|
+
// Strict validation: within a thread, the linear order must not contain forward refs.
|
|
108
|
+
for (const comp of components) {
|
|
109
|
+
const compSet = new Set(comp);
|
|
110
|
+
const ownersInOrder = steps.map((_, i) => i).filter((i) => compSet.has(i));
|
|
111
|
+
const position = new Map();
|
|
112
|
+
ownersInOrder.forEach((owner, idx) => position.set(owner, idx));
|
|
113
|
+
for (const consumerOwner of ownersInOrder) {
|
|
114
|
+
const deps = ownerDeps.get(consumerOwner);
|
|
115
|
+
if (!deps || deps.size === 0)
|
|
116
|
+
continue;
|
|
117
|
+
const consumerPos = position.get(consumerOwner);
|
|
118
|
+
for (const producerOwner of deps) {
|
|
119
|
+
const producerPos = position.get(producerOwner);
|
|
120
|
+
if (producerPos === undefined) {
|
|
121
|
+
throw new Error(`Internal error: dependency producer ${getOwnerLabel(producerOwner)} missing from computed thread for ${getOwnerLabel(consumerOwner)}`);
|
|
122
|
+
}
|
|
123
|
+
if (producerPos >= consumerPos) {
|
|
124
|
+
throw new Error(`Invalid step order in thread: ${getOwnerLabel(consumerOwner)} depends on ${getOwnerLabel(producerOwner)}, but producer is not scheduled before consumer`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return components
|
|
130
|
+
.map((compOwners) => {
|
|
131
|
+
const ownerSet = new Set(compOwners);
|
|
132
|
+
return steps.filter((_, i) => ownerSet.has(i));
|
|
133
|
+
})
|
|
134
|
+
.filter((group) => group.length > 0);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=parallelization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parallelization.js","sourceRoot":"","sources":["../../src/utils/parallelization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { CreationContextJson, ResourceJson, ResourceMissingJson, ResourceOutputPotentialJson, StrategyStateJson } from '@toolproof-core/schema';
|
|
2
|
+
export type ResolveResult = {
|
|
3
|
+
status: 'materialized';
|
|
4
|
+
entry: ResourceJson;
|
|
5
|
+
path: CreationContextJson[];
|
|
6
|
+
} | {
|
|
7
|
+
status: 'missing';
|
|
8
|
+
entry: ResourceMissingJson;
|
|
9
|
+
path: CreationContextJson[];
|
|
10
|
+
} | {
|
|
11
|
+
status: 'outputPotential';
|
|
12
|
+
entry: ResourceOutputPotentialJson;
|
|
13
|
+
path: CreationContextJson[];
|
|
14
|
+
} | {
|
|
15
|
+
status: 'unresolved';
|
|
16
|
+
reason: 'not-found' | 'cycle' | 'depth-exceeded';
|
|
17
|
+
path: CreationContextJson[];
|
|
18
|
+
};
|
|
19
|
+
export declare function resolveResourceChain(strategyState: StrategyStateJson, start: CreationContextJson, opts?: {
|
|
20
|
+
maxDepth?: number;
|
|
21
|
+
}): ResolveResult;
|
|
22
|
+
//# sourceMappingURL=resourceChain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceChain.d.ts","sourceRoot":"","sources":["../../src/utils/resourceChain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,mBAAmB,EACnB,YAAY,EACZ,mBAAmB,EAEnB,2BAA2B,EAC3B,iBAAiB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,MAAM,aAAa,GACnB;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,mBAAmB,EAAE,CAAA;CAAE,GAC5E;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAC;IAAC,IAAI,EAAE,mBAAmB,EAAE,CAAA;CAAE,GAC9E;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,2BAA2B,CAAC;IAAC,IAAI,EAAE,mBAAmB,EAAE,CAAA;CAAE,GAC9F;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,OAAO,GAAG,gBAAgB,CAAC;IAAC,IAAI,EAAE,mBAAmB,EAAE,CAAA;CAAE,CAAC;AAE9G,wBAAgB,oBAAoB,CAChC,aAAa,EAAE,iBAAiB,EAChC,KAAK,EAAE,mBAAmB,EAC1B,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,aAAa,CA8Cf"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export function resolveResourceChain(strategyState, start, opts) {
|
|
2
|
+
const maxDepth = opts?.maxDepth ?? 50;
|
|
3
|
+
const visited = new Set();
|
|
4
|
+
const path = [];
|
|
5
|
+
let current = start;
|
|
6
|
+
for (let depth = 0; depth <= maxDepth; depth++) {
|
|
7
|
+
path.push(current);
|
|
8
|
+
const visitKey = `${current.jobStepHandle}::${current.resourceRoleHandle}`;
|
|
9
|
+
if (visited.has(visitKey)) {
|
|
10
|
+
return { status: 'unresolved', reason: 'cycle', path };
|
|
11
|
+
}
|
|
12
|
+
visited.add(visitKey);
|
|
13
|
+
const bucket = strategyState[current.jobStepHandle];
|
|
14
|
+
if (!bucket)
|
|
15
|
+
return { status: 'unresolved', reason: 'not-found', path };
|
|
16
|
+
const entry = bucket[current.resourceRoleHandle];
|
|
17
|
+
if (!entry)
|
|
18
|
+
return { status: 'unresolved', reason: 'not-found', path };
|
|
19
|
+
if (entry.resourceShellKind === 'materialized') {
|
|
20
|
+
return { status: 'materialized', entry: entry, path };
|
|
21
|
+
}
|
|
22
|
+
if (entry.resourceShellKind === 'missing') {
|
|
23
|
+
return { status: 'missing', entry: entry, path };
|
|
24
|
+
}
|
|
25
|
+
if (entry.resourceShellKind === 'outputPotential') {
|
|
26
|
+
return { status: 'outputPotential', entry: entry, path };
|
|
27
|
+
}
|
|
28
|
+
// inputPotential: follow ref backwards
|
|
29
|
+
if (entry.resourceShellKind === 'inputPotential') {
|
|
30
|
+
current = entry.creationContext;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// Unknown case
|
|
34
|
+
return { status: 'unresolved', reason: 'not-found', path };
|
|
35
|
+
}
|
|
36
|
+
return { status: 'unresolved', reason: 'depth-exceeded', path };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=resourceChain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceChain.js","sourceRoot":"","sources":["../../src/utils/resourceChain.ts"],"names":[],"mappings":"AAeA,MAAM,UAAU,oBAAoB,CAChC,aAAgC,EAChC,KAA0B,EAC1B,IAA4B;IAE5B,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,IAAI,GAA0B,EAAE,CAAC;IACvC,IAAI,OAAO,GAAwB,KAAK,CAAC;IAEzC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnB,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,aAAa,KAAK,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAC3E,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3D,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEtB,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACxE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAM9C,CAAC;QACF,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAEvE,IAAI,KAAK,CAAC,iBAAiB,KAAK,cAAc,EAAE,CAAC;YAC7C,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,KAAqB,EAAE,IAAI,EAAE,CAAC;QAC1E,CAAC;QACD,IAAI,KAAK,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAA4B,EAAE,IAAI,EAAE,CAAC;QAC5E,CAAC;QACD,IAAI,KAAK,CAAC,iBAAiB,KAAK,iBAAiB,EAAE,CAAC;YAChD,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAoC,EAAE,IAAI,EAAE,CAAC;QAC5F,CAAC;QAED,uCAAuC;QACvC,IAAI,KAAK,CAAC,iBAAiB,KAAK,gBAAgB,EAAE,CAAC;YAC/C,OAAO,GAAI,KAAoC,CAAC,eAAe,CAAC;YAChE,SAAS;QACb,CAAC;QAED,eAAe;QACf,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/D,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ResourceJson, CreationContextJson, StrategyStateJson } from '@toolproof-core/schema';
|
|
2
|
+
export declare function bindInputResInStrategyState(strategyState: StrategyStateJson, target: CreationContextJson, resource: ResourceJson): StrategyStateJson;
|
|
3
|
+
export declare function bindInputRefInStrategyState(strategyState: StrategyStateJson, target: CreationContextJson, source: CreationContextJson): StrategyStateJson;
|
|
4
|
+
export declare function clearInputBindingInStrategyState(strategyState: StrategyStateJson, target: CreationContextJson): StrategyStateJson;
|
|
5
|
+
//# sourceMappingURL=roleResourceBinding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roleResourceBinding.d.ts","sourceRoot":"","sources":["../../src/utils/roleResourceBinding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,YAAY,EAIZ,mBAAmB,EACnB,iBAAiB,EACpB,MAAM,wBAAwB,CAAC;AAGhC,wBAAgB,2BAA2B,CACvC,aAAa,EAAE,iBAAiB,EAChC,MAAM,EAAE,mBAAmB,EAC3B,QAAQ,EAAE,YAAY,GACvB,iBAAiB,CASnB;AAED,wBAAgB,2BAA2B,CACvC,aAAa,EAAE,iBAAiB,EAChC,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,mBAAmB,GAC5B,iBAAiB,CA+DnB;AAED,wBAAgB,gCAAgC,CAC5C,aAAa,EAAE,iBAAiB,EAChC,MAAM,EAAE,mBAAmB,GAC5B,iBAAiB,CAWnB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { resolveResourceChain } from './resourceChain.js';
|
|
2
|
+
export function bindInputResInStrategyState(strategyState, target, resource) {
|
|
3
|
+
const bucket = strategyState[target.jobStepHandle] ?? {};
|
|
4
|
+
return {
|
|
5
|
+
...strategyState,
|
|
6
|
+
[target.jobStepHandle]: {
|
|
7
|
+
...bucket,
|
|
8
|
+
[target.resourceRoleHandle]: resource,
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export function bindInputRefInStrategyState(strategyState, target, source) {
|
|
13
|
+
const sourceEntry = strategyState?.[source.jobStepHandle]?.[source.resourceRoleHandle];
|
|
14
|
+
if (!sourceEntry) {
|
|
15
|
+
throw new Error(`resourceEntry not found for source (${source.jobStepHandle}, ${source.resourceRoleHandle})`);
|
|
16
|
+
}
|
|
17
|
+
const result = resolveResourceChain(strategyState, source);
|
|
18
|
+
const bucket = strategyState[target.jobStepHandle] ?? {};
|
|
19
|
+
if (result.status === 'materialized') {
|
|
20
|
+
return {
|
|
21
|
+
...strategyState,
|
|
22
|
+
[target.jobStepHandle]: {
|
|
23
|
+
...bucket,
|
|
24
|
+
[target.resourceRoleHandle]: result.entry,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (result.status === 'missing') {
|
|
29
|
+
const missing = result.entry;
|
|
30
|
+
const reusedMissing = {
|
|
31
|
+
identity: missing.identity,
|
|
32
|
+
resourceTypeHandle: missing.resourceTypeHandle,
|
|
33
|
+
resourceShellKind: 'missing',
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
...strategyState,
|
|
37
|
+
[target.jobStepHandle]: {
|
|
38
|
+
...bucket,
|
|
39
|
+
[target.resourceRoleHandle]: reusedMissing,
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (result.status === 'outputPotential') {
|
|
44
|
+
const potentialInput = {
|
|
45
|
+
identity: sourceEntry.identity,
|
|
46
|
+
resourceTypeHandle: sourceEntry.resourceTypeHandle,
|
|
47
|
+
creationContext: {
|
|
48
|
+
jobStepHandle: source.jobStepHandle,
|
|
49
|
+
resourceRoleHandle: source.resourceRoleHandle,
|
|
50
|
+
},
|
|
51
|
+
resourceShellKind: 'inputPotential',
|
|
52
|
+
};
|
|
53
|
+
return {
|
|
54
|
+
...strategyState,
|
|
55
|
+
[target.jobStepHandle]: {
|
|
56
|
+
...bucket,
|
|
57
|
+
[target.resourceRoleHandle]: potentialInput,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
throw new Error(`Failed to resolve resource chain: ${result.reason}`);
|
|
62
|
+
}
|
|
63
|
+
export function clearInputBindingInStrategyState(strategyState, target) {
|
|
64
|
+
const bucket = strategyState?.[target.jobStepHandle];
|
|
65
|
+
if (!bucket?.[target.resourceRoleHandle])
|
|
66
|
+
return strategyState;
|
|
67
|
+
const nextBucket = { ...bucket };
|
|
68
|
+
delete nextBucket[target.resourceRoleHandle];
|
|
69
|
+
return {
|
|
70
|
+
...strategyState,
|
|
71
|
+
[target.jobStepHandle]: nextBucket,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=roleResourceBinding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roleResourceBinding.js","sourceRoot":"","sources":["../../src/utils/roleResourceBinding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RawStrategyJson, RunnableStrategyJson, RunnableStrategyStatusJson } from '@toolproof-core/schema';
|
|
2
|
+
import type { IdentityName } from '../types/types.js';
|
|
3
|
+
export type GetNewIdentity = (identityName: IdentityName) => string | Promise<string>;
|
|
4
|
+
export declare function createRunnableStrategy(rawStrategy: RawStrategyJson, opts: {
|
|
5
|
+
getNewIdentity: GetNewIdentity;
|
|
6
|
+
status?: RunnableStrategyStatusJson;
|
|
7
|
+
}): Promise<RunnableStrategyJson>;
|
|
8
|
+
//# sourceMappingURL=runnableStrategyCreation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runnableStrategyCreation.d.ts","sourceRoot":"","sources":["../../src/utils/runnableStrategyCreation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,eAAe,EAEf,oBAAoB,EACpB,0BAA0B,EAG7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,MAAM,MAAM,cAAc,GAAG,CAAC,YAAY,EAAE,YAAY,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAGtF,wBAAsB,sBAAsB,CACxC,WAAW,EAAE,eAAe,EAC5B,IAAI,EAAE;IACF,cAAc,EAAE,cAAc,CAAC;IAC/B,MAAM,CAAC,EAAE,0BAA0B,CAAC;CACvC,GACF,OAAO,CAAC,oBAAoB,CAAC,CAyB/B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { getIndependentThreads } from './parallelization.js';
|
|
2
|
+
export async function createRunnableStrategy(rawStrategy, opts) {
|
|
3
|
+
if (!opts?.getNewIdentity) {
|
|
4
|
+
throw new Error('createRunnableStrategy: opts.getNewIdentity is required');
|
|
5
|
+
}
|
|
6
|
+
const runnableStrategyIdentity = (await opts.getNewIdentity('RunnableStrategyIdentity'));
|
|
7
|
+
const steps = (rawStrategy.steps ?? []);
|
|
8
|
+
const strategyState = (rawStrategy.strategyState ?? {});
|
|
9
|
+
const threadStepGroups = getIndependentThreads(steps, strategyState);
|
|
10
|
+
const strategyThreadDict = {};
|
|
11
|
+
for (const group of threadStepGroups) {
|
|
12
|
+
const threadIdentity = (await opts.getNewIdentity('StrategyThreadIdentity'));
|
|
13
|
+
strategyThreadDict[threadIdentity] = group;
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
identity: runnableStrategyIdentity,
|
|
17
|
+
runnableStrategyContext: {
|
|
18
|
+
status: opts.status ?? 'running',
|
|
19
|
+
},
|
|
20
|
+
strategyThreadDict,
|
|
21
|
+
strategyState,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=runnableStrategyCreation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runnableStrategyCreation.js","sourceRoot":"","sources":["../../src/utils/runnableStrategyCreation.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAM7D,MAAM,CAAC,KAAK,UAAU,sBAAsB,CACxC,WAA4B,EAC5B,IAGC;IAED,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC/E,CAAC;IAED,MAAM,wBAAwB,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,0BAA0B,CAAC,CAAiC,CAAC;IACzH,MAAM,KAAK,GAAG,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE,CAAe,CAAC;IACtD,MAAM,aAAa,GAAG,CAAC,WAAW,CAAC,aAAa,IAAI,EAAE,CAA0C,CAAC;IAEjG,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACrE,MAAM,kBAAkB,GAAmD,EAAS,CAAC;IAErF,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACnC,MAAM,cAAc,GAAG,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAA+B,CAAC;QAC3G,kBAAkB,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC;IAC/C,CAAC;IAED,OAAO;QACH,QAAQ,EAAE,wBAAwB;QAClC,uBAAuB,EAAE;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS;SACnC;QACD,kBAAkB;QAClB,aAAa;KACQ,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BranchStepJson, ForStepJson, JobJson, JobStepJson, WhileStepJson } from '@toolproof-core/schema';
|
|
2
|
+
export declare function createJobStepFromJob(job: JobJson): Promise<JobStepJson>;
|
|
3
|
+
export declare function createLoopStepFromJobs(whatJob: JobJson, whenJob: JobJson, stepKind: 'for' | 'while'): Promise<ForStepJson | WhileStepJson>;
|
|
4
|
+
export declare function createBranchStepFromJobPairs(cases: Array<{
|
|
5
|
+
whatJob: JobJson;
|
|
6
|
+
whenJob: JobJson;
|
|
7
|
+
}>): Promise<BranchStepJson>;
|
|
8
|
+
export declare function cloneForStep(forStep: ForStepJson): ForStepJson;
|
|
9
|
+
export declare function cloneWhileStep(whileStep: WhileStepJson): WhileStepJson;
|
|
10
|
+
//# sourceMappingURL=stepCreation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepCreation.d.ts","sourceRoot":"","sources":["../../src/utils/stepCreation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,cAAc,EAEd,WAAW,EACX,OAAO,EACP,WAAW,EAEX,aAAa,EAChB,MAAM,wBAAwB,CAAC;AAShC,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAa7E;AAGD,wBAAsB,sBAAsB,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,KAAK,GAAG,OAAO,GAC1B,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC,CAiBtC;AAGD,wBAAsB,4BAA4B,CAC9C,KAAK,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,GACrD,OAAO,CAAC,cAAc,CAAC,CAgBzB;AAGD,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAe9D;AAGD,wBAAgB,cAAc,CAAC,SAAS,EAAE,aAAa,GAAG,aAAa,CAetE"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { getNewStepIdentity } from '../firebase/firebaseAdminHelpers.js';
|
|
2
|
+
function assertNonEmpty(arr, msg) {
|
|
3
|
+
if (arr.length === 0)
|
|
4
|
+
throw new Error(msg);
|
|
5
|
+
}
|
|
6
|
+
export async function createJobStepFromJob(job) {
|
|
7
|
+
const inputBindings = Object.keys(job.roles.inputDict ?? {});
|
|
8
|
+
const outputBindings = Object.keys(job.roles.outputDict ?? {});
|
|
9
|
+
return {
|
|
10
|
+
identity: getNewStepIdentity('job'),
|
|
11
|
+
stepKind: 'job',
|
|
12
|
+
jobHandle: job.identity,
|
|
13
|
+
roleBindings: {
|
|
14
|
+
inputBindings,
|
|
15
|
+
outputBindings,
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export async function createLoopStepFromJobs(whatJob, whenJob, stepKind) {
|
|
20
|
+
const what = await createJobStepFromJob(whatJob);
|
|
21
|
+
const when = await createJobStepFromJob(whenJob);
|
|
22
|
+
if (stepKind === 'for') {
|
|
23
|
+
return {
|
|
24
|
+
identity: getNewStepIdentity('for'),
|
|
25
|
+
stepKind: 'for',
|
|
26
|
+
case: { what, when },
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
identity: getNewStepIdentity('while'),
|
|
31
|
+
stepKind: 'while',
|
|
32
|
+
case: { what, when },
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export async function createBranchStepFromJobPairs(cases) {
|
|
36
|
+
const resolved = await Promise.all(cases.map(async ({ whatJob, whenJob }) => {
|
|
37
|
+
const what = await createJobStepFromJob(whatJob);
|
|
38
|
+
const when = await createJobStepFromJob(whenJob);
|
|
39
|
+
return { what, when };
|
|
40
|
+
}));
|
|
41
|
+
assertNonEmpty(resolved, 'createBranchStepFromJobPairs requires at least one case');
|
|
42
|
+
return {
|
|
43
|
+
identity: getNewStepIdentity('branch'),
|
|
44
|
+
stepKind: 'branch',
|
|
45
|
+
cases: resolved,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function cloneForStep(forStep) {
|
|
49
|
+
return {
|
|
50
|
+
identity: getNewStepIdentity('for'),
|
|
51
|
+
stepKind: 'for',
|
|
52
|
+
case: {
|
|
53
|
+
what: {
|
|
54
|
+
...forStep.case.what,
|
|
55
|
+
identity: getNewStepIdentity('job'),
|
|
56
|
+
},
|
|
57
|
+
when: {
|
|
58
|
+
...forStep.case.when,
|
|
59
|
+
identity: getNewStepIdentity('job'),
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function cloneWhileStep(whileStep) {
|
|
65
|
+
return {
|
|
66
|
+
identity: getNewStepIdentity('while'),
|
|
67
|
+
stepKind: 'while',
|
|
68
|
+
case: {
|
|
69
|
+
what: {
|
|
70
|
+
...whileStep.case.what,
|
|
71
|
+
identity: getNewStepIdentity('job'),
|
|
72
|
+
},
|
|
73
|
+
when: {
|
|
74
|
+
...whileStep.case.when,
|
|
75
|
+
identity: getNewStepIdentity('job'),
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=stepCreation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stepCreation.js","sourceRoot":"","sources":["../../src/utils/stepCreation.ts"],"names":[],"mappings":"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"}
|