@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,109 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ResourceJson,
|
|
3
|
+
ResourceMissingJson,
|
|
4
|
+
ResourceInputPotentialJson,
|
|
5
|
+
ResourceOutputPotentialJson,
|
|
6
|
+
CreationContextJson,
|
|
7
|
+
StrategyStateJson,
|
|
8
|
+
} from '@toolproof-core/schema';
|
|
9
|
+
import { resolveResourceChain } from './resourceChain.js';
|
|
10
|
+
|
|
11
|
+
export function bindInputResInStrategyState(
|
|
12
|
+
strategyState: StrategyStateJson,
|
|
13
|
+
target: CreationContextJson,
|
|
14
|
+
resource: ResourceJson
|
|
15
|
+
): StrategyStateJson {
|
|
16
|
+
const bucket = strategyState[target.jobStepHandle] ?? {};
|
|
17
|
+
return {
|
|
18
|
+
...strategyState,
|
|
19
|
+
[target.jobStepHandle]: {
|
|
20
|
+
...bucket,
|
|
21
|
+
[target.resourceRoleHandle]: resource,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function bindInputRefInStrategyState(
|
|
27
|
+
strategyState: StrategyStateJson,
|
|
28
|
+
target: CreationContextJson,
|
|
29
|
+
source: CreationContextJson
|
|
30
|
+
): StrategyStateJson {
|
|
31
|
+
const sourceEntry = strategyState?.[source.jobStepHandle]?.[source.resourceRoleHandle] as (
|
|
32
|
+
| ResourceJson
|
|
33
|
+
| ResourceMissingJson
|
|
34
|
+
| ResourceInputPotentialJson
|
|
35
|
+
| ResourceOutputPotentialJson
|
|
36
|
+
| undefined
|
|
37
|
+
);
|
|
38
|
+
if (!sourceEntry) {
|
|
39
|
+
throw new Error(`resourceEntry not found for source (${source.jobStepHandle}, ${source.resourceRoleHandle})`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const result = resolveResourceChain(strategyState, source);
|
|
43
|
+
const bucket = strategyState[target.jobStepHandle] ?? {};
|
|
44
|
+
|
|
45
|
+
if (result.status === 'materialized') {
|
|
46
|
+
return {
|
|
47
|
+
...strategyState,
|
|
48
|
+
[target.jobStepHandle]: {
|
|
49
|
+
...bucket,
|
|
50
|
+
[target.resourceRoleHandle]: result.entry,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (result.status === 'missing') {
|
|
56
|
+
const missing = result.entry;
|
|
57
|
+
const reusedMissing: ResourceMissingJson = {
|
|
58
|
+
identity: missing.identity,
|
|
59
|
+
resourceTypeHandle: missing.resourceTypeHandle,
|
|
60
|
+
resourceShellKind: 'missing',
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
...strategyState,
|
|
65
|
+
[target.jobStepHandle]: {
|
|
66
|
+
...bucket,
|
|
67
|
+
[target.resourceRoleHandle]: reusedMissing,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (result.status === 'outputPotential') {
|
|
73
|
+
const potentialInput: ResourceInputPotentialJson = {
|
|
74
|
+
identity: sourceEntry.identity,
|
|
75
|
+
resourceTypeHandle: sourceEntry.resourceTypeHandle,
|
|
76
|
+
creationContext: {
|
|
77
|
+
jobStepHandle: source.jobStepHandle,
|
|
78
|
+
resourceRoleHandle: source.resourceRoleHandle,
|
|
79
|
+
},
|
|
80
|
+
resourceShellKind: 'inputPotential',
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
return {
|
|
84
|
+
...strategyState,
|
|
85
|
+
[target.jobStepHandle]: {
|
|
86
|
+
...bucket,
|
|
87
|
+
[target.resourceRoleHandle]: potentialInput,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
throw new Error(`Failed to resolve resource chain: ${result.reason}`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function clearInputBindingInStrategyState(
|
|
96
|
+
strategyState: StrategyStateJson,
|
|
97
|
+
target: CreationContextJson
|
|
98
|
+
): StrategyStateJson {
|
|
99
|
+
const bucket = strategyState?.[target.jobStepHandle];
|
|
100
|
+
if (!bucket?.[target.resourceRoleHandle]) return strategyState;
|
|
101
|
+
|
|
102
|
+
const nextBucket = { ...bucket } as Record<string, unknown>;
|
|
103
|
+
delete nextBucket[target.resourceRoleHandle];
|
|
104
|
+
|
|
105
|
+
return {
|
|
106
|
+
...strategyState,
|
|
107
|
+
[target.jobStepHandle]: nextBucket as any,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
RawStrategyJson,
|
|
3
|
+
RunnableStrategyIdentityJson,
|
|
4
|
+
RunnableStrategyJson,
|
|
5
|
+
RunnableStrategyStatusJson,
|
|
6
|
+
StepJson,
|
|
7
|
+
StrategyThreadIdentityJson,
|
|
8
|
+
} from '@toolproof-core/schema';
|
|
9
|
+
import type { IdentityName } from '../types/types.js';
|
|
10
|
+
import { getIndependentThreads } from './parallelization.js';
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
export type GetNewIdentity = (identityName: IdentityName) => string | Promise<string>;
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
export async function createRunnableStrategy(
|
|
17
|
+
rawStrategy: RawStrategyJson,
|
|
18
|
+
opts: {
|
|
19
|
+
getNewIdentity: GetNewIdentity;
|
|
20
|
+
status?: RunnableStrategyStatusJson;
|
|
21
|
+
}
|
|
22
|
+
): Promise<RunnableStrategyJson> {
|
|
23
|
+
if (!opts?.getNewIdentity) {
|
|
24
|
+
throw new Error('createRunnableStrategy: opts.getNewIdentity is required');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const runnableStrategyIdentity = (await opts.getNewIdentity('RunnableStrategyIdentity')) as RunnableStrategyIdentityJson;
|
|
28
|
+
const steps = (rawStrategy.steps ?? []) as StepJson[];
|
|
29
|
+
const strategyState = (rawStrategy.strategyState ?? {}) as RunnableStrategyJson['strategyState'];
|
|
30
|
+
|
|
31
|
+
const threadStepGroups = getIndependentThreads(steps, strategyState);
|
|
32
|
+
const strategyThreadDict: Record<StrategyThreadIdentityJson, StepJson[]> = {} as any;
|
|
33
|
+
|
|
34
|
+
for (const group of threadStepGroups) {
|
|
35
|
+
const threadIdentity = (await opts.getNewIdentity('StrategyThreadIdentity')) as StrategyThreadIdentityJson;
|
|
36
|
+
strategyThreadDict[threadIdentity] = group;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
identity: runnableStrategyIdentity,
|
|
41
|
+
runnableStrategyContext: {
|
|
42
|
+
status: opts.status ?? 'running',
|
|
43
|
+
},
|
|
44
|
+
strategyThreadDict,
|
|
45
|
+
strategyState,
|
|
46
|
+
} as RunnableStrategyJson;
|
|
47
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
BranchStepJson,
|
|
3
|
+
ConditionalJson,
|
|
4
|
+
ForStepJson,
|
|
5
|
+
JobJson,
|
|
6
|
+
JobStepJson,
|
|
7
|
+
ResourceRoleIdentityJson,
|
|
8
|
+
WhileStepJson,
|
|
9
|
+
} from '@toolproof-core/schema';
|
|
10
|
+
import { getNewStepIdentity } from '../firebase/firebaseAdminHelpers.js';
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
function assertNonEmpty<T>(arr: T[], msg: string): asserts arr is [T, ...T[]] {
|
|
14
|
+
if (arr.length === 0) throw new Error(msg);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
export async function createJobStepFromJob(job: JobJson): Promise<JobStepJson> {
|
|
19
|
+
const inputBindings = Object.keys(job.roles.inputDict ?? {}) as ResourceRoleIdentityJson[];
|
|
20
|
+
const outputBindings = Object.keys(job.roles.outputDict ?? {}) as ResourceRoleIdentityJson[];
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
identity: getNewStepIdentity('job'),
|
|
24
|
+
stepKind: 'job',
|
|
25
|
+
jobHandle: job.identity,
|
|
26
|
+
roleBindings: {
|
|
27
|
+
inputBindings,
|
|
28
|
+
outputBindings,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
export async function createLoopStepFromJobs(
|
|
35
|
+
whatJob: JobJson,
|
|
36
|
+
whenJob: JobJson,
|
|
37
|
+
stepKind: 'for' | 'while'
|
|
38
|
+
): Promise<ForStepJson | WhileStepJson> {
|
|
39
|
+
const what = await createJobStepFromJob(whatJob);
|
|
40
|
+
const when = await createJobStepFromJob(whenJob);
|
|
41
|
+
|
|
42
|
+
if (stepKind === 'for') {
|
|
43
|
+
return {
|
|
44
|
+
identity: getNewStepIdentity('for'),
|
|
45
|
+
stepKind: 'for',
|
|
46
|
+
case: { what, when },
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
identity: getNewStepIdentity('while'),
|
|
52
|
+
stepKind: 'while',
|
|
53
|
+
case: { what, when },
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
export async function createBranchStepFromJobPairs(
|
|
59
|
+
cases: Array<{ whatJob: JobJson; whenJob: JobJson }>
|
|
60
|
+
): Promise<BranchStepJson> {
|
|
61
|
+
const resolved = await Promise.all(
|
|
62
|
+
cases.map(async ({ whatJob, whenJob }) => {
|
|
63
|
+
const what = await createJobStepFromJob(whatJob);
|
|
64
|
+
const when = await createJobStepFromJob(whenJob);
|
|
65
|
+
return { what, when } satisfies ConditionalJson;
|
|
66
|
+
})
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
assertNonEmpty(resolved, 'createBranchStepFromJobPairs requires at least one case');
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
identity: getNewStepIdentity('branch'),
|
|
73
|
+
stepKind: 'branch',
|
|
74
|
+
cases: resolved,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
export function cloneForStep(forStep: ForStepJson): ForStepJson {
|
|
80
|
+
return {
|
|
81
|
+
identity: getNewStepIdentity('for'),
|
|
82
|
+
stepKind: 'for',
|
|
83
|
+
case: {
|
|
84
|
+
what: {
|
|
85
|
+
...forStep.case.what,
|
|
86
|
+
identity: getNewStepIdentity('job'),
|
|
87
|
+
},
|
|
88
|
+
when: {
|
|
89
|
+
...forStep.case.when,
|
|
90
|
+
identity: getNewStepIdentity('job'),
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
export function cloneWhileStep(whileStep: WhileStepJson): WhileStepJson {
|
|
98
|
+
return {
|
|
99
|
+
identity: getNewStepIdentity('while'),
|
|
100
|
+
stepKind: 'while',
|
|
101
|
+
case: {
|
|
102
|
+
what: {
|
|
103
|
+
...whileStep.case.what,
|
|
104
|
+
identity: getNewStepIdentity('job'),
|
|
105
|
+
},
|
|
106
|
+
when: {
|
|
107
|
+
...whileStep.case.when,
|
|
108
|
+
identity: getNewStepIdentity('job'),
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
package/tsconfig.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../tsconfig.base.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"rootDir": "./src",
|
|
5
|
-
"outDir": "./dist",
|
|
6
|
-
"types": ["node"]
|
|
7
|
-
},
|
|
8
|
-
"include": [
|
|
9
|
-
"src"
|
|
10
|
-
],
|
|
11
|
-
"exclude": [
|
|
12
|
-
"dist",
|
|
13
|
-
"node_modules"
|
|
14
|
-
]
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"rootDir": "./src",
|
|
5
|
+
"outDir": "./dist",
|
|
6
|
+
"types": ["node"]
|
|
7
|
+
},
|
|
8
|
+
"include": [
|
|
9
|
+
"src"
|
|
10
|
+
],
|
|
11
|
+
"exclude": [
|
|
12
|
+
"dist",
|
|
13
|
+
"node_modules"
|
|
14
|
+
]
|
|
15
15
|
}
|
package/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["./src/_lib/setup/
|
|
1
|
+
{"root":["./src/shared.ts","./src/_lib/setup/firebaseadmininit.ts","./src/artifacts/artifacts.ts","./src/firebase/firebaseadminhelpers.ts","./src/types/types.ts","./src/utils/extractfrom.ts","./src/utils/extractfromresourcesbyresourcetypehandle.ts","./src/utils/generatefrom.ts","./src/utils/parallelization.ts","./src/utils/resourcechain.ts","./src/utils/roleresourcebinding.ts","./src/utils/runnablestrategycreation.ts","./src/utils/stepcreation.ts"],"version":"5.9.3"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
ResourceIdentityJson,
|
|
3
|
-
ResourceTypeIdentityJson,
|
|
4
|
-
ResourceJson,
|
|
5
|
-
} from '@toolproof-core/schema';
|
|
6
|
-
import type { ResourceMap } from '../types/types.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export function extractResourcesByType<TResource extends ResourceJson = ResourceJson>(
|
|
10
|
-
resourceMap: ResourceMap,
|
|
11
|
-
resourceTypeHandle: ResourceTypeIdentityJson
|
|
12
|
-
): Record<ResourceIdentityJson, TResource> {
|
|
13
|
-
const resources = (resourceMap[resourceTypeHandle] ?? []) as TResource[];
|
|
14
|
-
const result: Record<ResourceIdentityJson, TResource> = {} as Record<ResourceIdentityJson, TResource>;
|
|
15
|
-
|
|
16
|
-
for (const resource of resources) {
|
|
17
|
-
result[resource.identity] = resource;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
return result;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
*/
|
|
26
|
-
export function extractNucleusMap<
|
|
27
|
-
TKey extends string = string,
|
|
28
|
-
TNucleus extends { identity: string | number | boolean } = { identity: string | number | boolean },
|
|
29
|
-
TResource extends ResourceJson = ResourceJson
|
|
30
|
-
>(
|
|
31
|
-
resourceMap: ResourceMap,
|
|
32
|
-
resourceTypeHandle: ResourceTypeIdentityJson,
|
|
33
|
-
): Map<TKey, TNucleus> {
|
|
34
|
-
const resources = extractResourcesByType<TResource>(resourceMap, resourceTypeHandle);
|
|
35
|
-
const out = new Map<TKey, TNucleus>();
|
|
36
|
-
|
|
37
|
-
for (const resource of Object.values(resources)) {
|
|
38
|
-
const data = (resource as any).nucleus as unknown;
|
|
39
|
-
|
|
40
|
-
const value = data as TNucleus;
|
|
41
|
-
const key = String(value.identity) as TKey;
|
|
42
|
-
|
|
43
|
-
out.set(key, value);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return out;
|
|
47
|
-
}
|