@ifc-lite/flow 0.5.0 → 0.6.0
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/README.md +6 -0
- package/dist/checkpoint-file.d.ts +13 -0
- package/dist/checkpoint-file.d.ts.map +1 -0
- package/dist/checkpoint-file.js +92 -0
- package/dist/checkpoint-file.js.map +1 -0
- package/dist/checkpoint-record.d.ts +97 -0
- package/dist/checkpoint-record.d.ts.map +1 -0
- package/dist/checkpoint-record.js +255 -0
- package/dist/checkpoint-record.js.map +1 -0
- package/dist/checkpoint-state.d.ts +53 -0
- package/dist/checkpoint-state.d.ts.map +1 -0
- package/dist/checkpoint-state.js +190 -0
- package/dist/checkpoint-state.js.map +1 -0
- package/dist/checkpoint.d.ts +10 -0
- package/dist/checkpoint.d.ts.map +1 -0
- package/dist/checkpoint.js +11 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/order.d.ts +9 -0
- package/dist/order.d.ts.map +1 -0
- package/dist/order.js +37 -0
- package/dist/order.js.map +1 -0
- package/dist/registry.d.ts +7 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js.map +1 -1
- package/dist/scheduler.d.ts +15 -19
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +30 -37
- package/dist/scheduler.js.map +1 -1
- package/package.json +13 -3
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* Review checkpoint lifecycle (#6923):
|
|
6
|
+
*
|
|
7
|
+
* prepared ──approve(digest)──▶ reviewed ──claim──▶ applying ──finish──▶ completed
|
|
8
|
+
* │ │ └─finish(failed)─▶ partially-committed
|
|
9
|
+
* └──reject──▶ rejected └─lease expired (recover)─▶ partially-committed
|
|
10
|
+
*
|
|
11
|
+
* Every transition is a pure function that throws a `CheckpointError` when
|
|
12
|
+
* the record is not in the state it requires. `updateCheckpoint` applies one
|
|
13
|
+
* through a store's compare-and-swap write and re-applies it to the fresh
|
|
14
|
+
* record on a conflict, so two tabs or processes racing to claim the same
|
|
15
|
+
* reviewed checkpoint cannot both win: the loser re-reads `applying` and is
|
|
16
|
+
* refused. A claim also re-checks the graph and source digests, so a resume
|
|
17
|
+
* never applies a proposal to a graph or model that changed after review.
|
|
18
|
+
*
|
|
19
|
+
* A checkpoint whose owner vanished mid-resume is not handed to anyone else:
|
|
20
|
+
* the effects it may have committed are unknown, so recovery marks it
|
|
21
|
+
* `partially-committed`, which blocks any further resume until the user runs
|
|
22
|
+
* the graph again as a new root.
|
|
23
|
+
*/
|
|
24
|
+
import { digest } from './digest.js';
|
|
25
|
+
import { CHECKPOINT_VERSION, registerOwnedClaim, nonPortable, proposalDigestOf, validPortableOutputs } from './checkpoint-record.js';
|
|
26
|
+
export class CheckpointError extends Error {
|
|
27
|
+
code;
|
|
28
|
+
constructor(code, message) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.code = code;
|
|
31
|
+
this.name = 'CheckpointError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const STATES = ['prepared', 'reviewed', 'rejected', 'applying', 'partially-committed', 'completed'];
|
|
35
|
+
function isRecord(v) {
|
|
36
|
+
return !!v && typeof v === 'object' && !Array.isArray(v);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validate an untrusted checkpoint (a file handed to a headless host, a
|
|
40
|
+
* stored row). The proposal digest is recomputed from the stored outputs, so
|
|
41
|
+
* a bundle whose values were edited after review no longer matches its
|
|
42
|
+
* approval and cannot be claimed.
|
|
43
|
+
*/
|
|
44
|
+
export function parseCheckpoint(value) {
|
|
45
|
+
const bad = (why) => { throw new CheckpointError('invalid', `not a Flow review checkpoint: ${why}`); };
|
|
46
|
+
if (!isRecord(value))
|
|
47
|
+
return bad('must be an object');
|
|
48
|
+
if (value.version !== CHECKPOINT_VERSION)
|
|
49
|
+
bad(`unsupported version ${String(value.version)}`);
|
|
50
|
+
for (const key of ['id', 'graphId', 'graphName', 'graphDigest', 'sourceDigest', 'proposalDigest']) {
|
|
51
|
+
if (typeof value[key] !== 'string')
|
|
52
|
+
bad(`"${key}" must be a string`);
|
|
53
|
+
}
|
|
54
|
+
if (!STATES.includes(value.state))
|
|
55
|
+
bad(`unknown state "${String(value.state)}"`);
|
|
56
|
+
if (!Array.isArray(value.reviewNodes) || value.reviewNodes.length === 0 || !value.reviewNodes.every((n) => typeof n === 'string'))
|
|
57
|
+
bad('"reviewNodes" must list node ids');
|
|
58
|
+
if (!isRecord(value.outputs) || !Object.values(value.outputs).every(isRecord))
|
|
59
|
+
bad('"outputs" must map node ids to ports');
|
|
60
|
+
if (typeof value.createdAt !== 'number' || typeof value.updatedAt !== 'number')
|
|
61
|
+
bad('timestamps must be numbers');
|
|
62
|
+
if (!validPortableOutputs(value.outputs))
|
|
63
|
+
bad('outputs contain malformed or non-portable flow data');
|
|
64
|
+
if (!Number.isFinite(value.createdAt) || !Number.isFinite(value.updatedAt))
|
|
65
|
+
bad('timestamps must be finite');
|
|
66
|
+
if (value.claim !== undefined && (!isRecord(value.claim) || typeof value.claim.owner !== 'string' || !value.claim.owner.trim()
|
|
67
|
+
|| !Number.isFinite(value.claim.leaseUntil) || !Number.isFinite(value.claim.at)))
|
|
68
|
+
bad('invalid claim');
|
|
69
|
+
if (value.review !== undefined && (!isRecord(value.review) || !['approved', 'rejected'].includes(String(value.review.decision))
|
|
70
|
+
|| typeof value.review.proposalDigest !== 'string' || !Number.isFinite(value.review.at)))
|
|
71
|
+
bad('invalid review');
|
|
72
|
+
const problems = [];
|
|
73
|
+
if (value.budget !== undefined)
|
|
74
|
+
nonPortable(value.budget, 'budget', problems);
|
|
75
|
+
if (problems.length)
|
|
76
|
+
bad('budget must be plain JSON');
|
|
77
|
+
const checkpoint = value;
|
|
78
|
+
if (proposalDigestOf(checkpoint.outputs, checkpoint.reviewNodes, checkpoint.budget) !== checkpoint.proposalDigest) {
|
|
79
|
+
bad('the proposal values do not match the proposal digest');
|
|
80
|
+
}
|
|
81
|
+
return checkpoint;
|
|
82
|
+
}
|
|
83
|
+
function requireState(checkpoint, state, code) {
|
|
84
|
+
if (checkpoint.state !== state)
|
|
85
|
+
throw new CheckpointError(code, `the checkpoint is ${checkpoint.state}, not ${state}`);
|
|
86
|
+
}
|
|
87
|
+
function assertTimestamp(now) {
|
|
88
|
+
if (!Number.isFinite(now))
|
|
89
|
+
throw new CheckpointError('invalid', 'the checkpoint timestamp must be finite');
|
|
90
|
+
}
|
|
91
|
+
/** Approve exactly the proposal the reviewer saw, named by its digest. */
|
|
92
|
+
export function approveCheckpoint(checkpoint, proposalDigest, now = Date.now()) {
|
|
93
|
+
assertTimestamp(now);
|
|
94
|
+
requireState(checkpoint, 'prepared', 'not-prepared');
|
|
95
|
+
if (proposalDigest !== checkpoint.proposalDigest) {
|
|
96
|
+
throw new CheckpointError('digest-mismatch', 'the approval names a different proposal than the one awaiting review');
|
|
97
|
+
}
|
|
98
|
+
return { ...checkpoint, state: 'reviewed', updatedAt: now, review: { decision: 'approved', proposalDigest, at: now } };
|
|
99
|
+
}
|
|
100
|
+
export function rejectCheckpoint(checkpoint, now = Date.now()) {
|
|
101
|
+
assertTimestamp(now);
|
|
102
|
+
requireState(checkpoint, 'prepared', 'not-prepared');
|
|
103
|
+
return { ...checkpoint, state: 'rejected', updatedAt: now, review: { decision: 'rejected', proposalDigest: checkpoint.proposalDigest, at: now } };
|
|
104
|
+
}
|
|
105
|
+
const validatedClaims = new WeakMap();
|
|
106
|
+
/** Take single ownership of a reviewed checkpoint for one resume. */
|
|
107
|
+
export function claimCheckpoint(checkpoint, input) {
|
|
108
|
+
requireState(checkpoint, 'reviewed', 'not-reviewed');
|
|
109
|
+
if (!input.owner.trim())
|
|
110
|
+
throw new CheckpointError('invalid', 'the claim owner must be nonempty');
|
|
111
|
+
parseCheckpoint(checkpoint);
|
|
112
|
+
if (checkpoint.review?.decision !== 'approved' || checkpoint.review.proposalDigest !== checkpoint.proposalDigest) {
|
|
113
|
+
throw new CheckpointError('digest-mismatch', 'the approval does not name this proposal');
|
|
114
|
+
}
|
|
115
|
+
if (input.graphDigest !== checkpoint.graphDigest) {
|
|
116
|
+
throw new CheckpointError('graph-changed', 'the graph or its Player inputs changed after review; run it again for a new review');
|
|
117
|
+
}
|
|
118
|
+
if (input.sourceDigest !== checkpoint.sourceDigest) {
|
|
119
|
+
throw new CheckpointError('sources-changed', 'the models or files the run read changed after review; run it again for a new review');
|
|
120
|
+
}
|
|
121
|
+
const now = input.now ?? Date.now();
|
|
122
|
+
if (!Number.isFinite(input.leaseMs) || input.leaseMs <= 0 || !Number.isFinite(now)
|
|
123
|
+
|| !Number.isFinite(now + input.leaseMs) || now + input.leaseMs <= now) {
|
|
124
|
+
throw new CheckpointError('invalid', 'the claim needs a finite positive lease and timestamp');
|
|
125
|
+
}
|
|
126
|
+
const next = { ...checkpoint, state: 'applying', updatedAt: now, claim: { owner: input.owner, leaseUntil: now + input.leaseMs, at: now } };
|
|
127
|
+
validatedClaims.set(next, { before: digest(checkpoint), after: digest(next) });
|
|
128
|
+
return next;
|
|
129
|
+
}
|
|
130
|
+
/** Record how the owner's resume ended. A failed resume may have committed some effects. */
|
|
131
|
+
export function finishCheckpoint(checkpoint, owner, outcome, now = Date.now()) {
|
|
132
|
+
assertTimestamp(now);
|
|
133
|
+
requireState(checkpoint, 'applying', 'not-owner');
|
|
134
|
+
if (checkpoint.claim?.owner !== owner)
|
|
135
|
+
throw new CheckpointError('not-owner', 'another owner holds this checkpoint');
|
|
136
|
+
return {
|
|
137
|
+
...checkpoint,
|
|
138
|
+
state: outcome.ok ? 'completed' : 'partially-committed',
|
|
139
|
+
updatedAt: now,
|
|
140
|
+
outcome: { ok: outcome.ok, at: now, ...(outcome.message ? { message: outcome.message } : {}) },
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/** A claim whose lease ran out without a finish: its effects are unknown, so it can never be applied again. */
|
|
144
|
+
export function recoverCheckpoint(checkpoint, now = Date.now()) {
|
|
145
|
+
assertTimestamp(now);
|
|
146
|
+
if (checkpoint.state !== 'applying' || (checkpoint.claim && checkpoint.claim.leaseUntil > now))
|
|
147
|
+
return null;
|
|
148
|
+
return {
|
|
149
|
+
...checkpoint,
|
|
150
|
+
state: 'partially-committed',
|
|
151
|
+
updatedAt: now,
|
|
152
|
+
outcome: { ok: false, at: now, message: 'the resume stopped before it finished; downstream effects may be partial' },
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const CAS_ATTEMPTS = 5;
|
|
156
|
+
/** Apply one transition through the store's CAS, re-applying it to the fresh record on conflict. */
|
|
157
|
+
export async function updateCheckpoint(store, id, change) {
|
|
158
|
+
for (let attempt = 0; attempt < CAS_ATTEMPTS; attempt++) {
|
|
159
|
+
const stored = await store.read(id);
|
|
160
|
+
if (!stored)
|
|
161
|
+
throw new CheckpointError('invalid', `no checkpoint ${id}`);
|
|
162
|
+
const before = digest(stored.checkpoint);
|
|
163
|
+
const next = change(stored.checkpoint);
|
|
164
|
+
if (await store.write(next, stored.revision)) {
|
|
165
|
+
const validated = validatedClaims.get(next);
|
|
166
|
+
if (validated?.before === before && validated.after === digest(next)) {
|
|
167
|
+
validatedClaims.delete(next);
|
|
168
|
+
registerOwnedClaim(next);
|
|
169
|
+
}
|
|
170
|
+
return next;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
throw new CheckpointError('conflict', 'the checkpoint kept changing while it was being updated');
|
|
174
|
+
}
|
|
175
|
+
/** An in-process store, for tests and single-process hosts. */
|
|
176
|
+
export class MemoryCheckpointStore {
|
|
177
|
+
rows = new Map();
|
|
178
|
+
async read(id) {
|
|
179
|
+
const row = this.rows.get(id);
|
|
180
|
+
return row ? structuredClone(row) : null;
|
|
181
|
+
}
|
|
182
|
+
async write(checkpoint, expected) {
|
|
183
|
+
const current = this.rows.get(checkpoint.id);
|
|
184
|
+
if ((current?.revision ?? null) !== expected)
|
|
185
|
+
return false;
|
|
186
|
+
this.rows.set(checkpoint.id, { checkpoint: structuredClone(checkpoint), revision: (current?.revision ?? 0) + 1 });
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=checkpoint-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint-state.js","sourceRoot":"","sources":["../src/checkpoint-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@ifc-lite/flow/checkpoint`: review checkpoints for runs that paused at a
|
|
3
|
+
* node declaring `review: 'required'` (#6923). A separate entry, so a host
|
|
4
|
+
* that only runs graphs does not load the checkpoint lifecycle.
|
|
5
|
+
*/
|
|
6
|
+
export { checkpointProposal, createCheckpoint, graphDigest, resumeOutputs } from './checkpoint-record.js';
|
|
7
|
+
export type { CheckpointState, CreateCheckpointInput, FlowCheckpoint, PortableFlowData, PortableOutputs } from './checkpoint-record.js';
|
|
8
|
+
export { approveCheckpoint, CheckpointError, claimCheckpoint, finishCheckpoint, parseCheckpoint, recoverCheckpoint, rejectCheckpoint, updateCheckpoint, } from './checkpoint-state.js';
|
|
9
|
+
export type { CheckpointErrorCode, CheckpointStore, ClaimInput, StoredCheckpoint } from './checkpoint-state.js';
|
|
10
|
+
//# sourceMappingURL=checkpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint.d.ts","sourceRoot":"","sources":["../src/checkpoint.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC1G,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxI,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* `@ifc-lite/flow/checkpoint`: review checkpoints for runs that paused at a
|
|
6
|
+
* node declaring `review: 'required'` (#6923). A separate entry, so a host
|
|
7
|
+
* that only runs graphs does not load the checkpoint lifecycle.
|
|
8
|
+
*/
|
|
9
|
+
export { checkpointProposal, createCheckpoint, graphDigest, resumeOutputs } from './checkpoint-record.js';
|
|
10
|
+
export { approveCheckpoint, CheckpointError, claimCheckpoint, finishCheckpoint, parseCheckpoint, recoverCheckpoint, rejectCheckpoint, updateCheckpoint, } from './checkpoint-state.js';
|
|
11
|
+
//# sourceMappingURL=checkpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../src/checkpoint.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE1G,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -17,7 +17,8 @@ export type { FlowIO, FlowInputInfo, FlowOutputInfo } from './introspect.js';
|
|
|
17
17
|
export { nodeAvailability, checkAvailability } from './availability.js';
|
|
18
18
|
export type { HostFeatures, AvailabilityStatus, NodeAvailability } from './availability.js';
|
|
19
19
|
export { referencedSecrets, replaceSecretRefs } from './secret-refs.js';
|
|
20
|
-
export { runFlow,
|
|
20
|
+
export { runFlow, MemoCache, DEFAULT_MAX_CROSS } from './scheduler.js';
|
|
21
|
+
export { topologicalOrder, FlowCycleError } from './order.js';
|
|
21
22
|
export { trackingKeyOf, ORPHAN_NODE_ID } from './orphans.js';
|
|
22
23
|
export type { RunOptions, RunResult, RunLogEntry, NodeReport, NodeStatus, GraphOutputValue } from './scheduler.js';
|
|
23
24
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EACP,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,MAAM,EACN,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,SAAS,EACT,OAAO,EACP,SAAS,EACT,QAAQ,GACT,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC3F,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAElG,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEhI,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACrE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC3G,YAAY,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,YAAY,EACZ,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEzH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC5G,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAExE,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EACP,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,MAAM,EACN,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,SAAS,EACT,OAAO,EACP,SAAS,EACT,QAAQ,GACT,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC3F,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAElG,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEhI,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACrE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAC3G,YAAY,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,YAAY,EACZ,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAEzH,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC5G,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACxE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAExE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -12,6 +12,7 @@ export { validateFlowWiring } from './wiring.js';
|
|
|
12
12
|
export { describeFlowIO, declaredInputKeys, resolveDeclaredParam, unknownInputKeys } from './introspect.js';
|
|
13
13
|
export { nodeAvailability, checkAvailability } from './availability.js';
|
|
14
14
|
export { referencedSecrets, replaceSecretRefs } from './secret-refs.js';
|
|
15
|
-
export { runFlow,
|
|
15
|
+
export { runFlow, MemoCache, DEFAULT_MAX_CROSS } from './scheduler.js';
|
|
16
|
+
export { topologicalOrder, FlowCycleError } from './order.js';
|
|
16
17
|
export { trackingKeyOf, ORPHAN_NODE_ID } from './orphans.js';
|
|
17
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EACP,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AAgBrB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAG3F,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAa3G,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,YAAY,EACZ,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE5G,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAExE,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,OAAO,EACP,OAAO,EACP,UAAU,EACV,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AAgBrB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAG3F,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG5D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAGrE,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAa3G,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,YAAY,EACZ,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE5G,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAExE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAExE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/order.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Evaluation order of a document's nodes. */
|
|
2
|
+
import type { FlowDocument } from './document.js';
|
|
3
|
+
export declare class FlowCycleError extends Error {
|
|
4
|
+
readonly nodeIds: readonly string[];
|
|
5
|
+
constructor(nodeIds: readonly string[]);
|
|
6
|
+
}
|
|
7
|
+
/** Kahn's algorithm; stable with respect to document node order. */
|
|
8
|
+
export declare function topologicalOrder(doc: FlowDocument): string[];
|
|
9
|
+
//# sourceMappingURL=order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order.d.ts","sourceRoot":"","sources":["../src/order.ts"],"names":[],"mappings":"AAIA,8CAA8C;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,qBAAa,cAAe,SAAQ,KAAK;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE;gBAA1B,OAAO,EAAE,SAAS,MAAM,EAAE;CAIhD;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,EAAE,CAsB5D"}
|
package/dist/order.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
export class FlowCycleError extends Error {
|
|
5
|
+
nodeIds;
|
|
6
|
+
constructor(nodeIds) {
|
|
7
|
+
super(`flow has a cycle through ${nodeIds.join(' → ')}`);
|
|
8
|
+
this.nodeIds = nodeIds;
|
|
9
|
+
this.name = 'FlowCycleError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/** Kahn's algorithm; stable with respect to document node order. */
|
|
13
|
+
export function topologicalOrder(doc) {
|
|
14
|
+
const indegree = new Map(doc.nodes.map((n) => [n.id, 0]));
|
|
15
|
+
const out = new Map(doc.nodes.map((n) => [n.id, []]));
|
|
16
|
+
for (const e of doc.edges) {
|
|
17
|
+
out.get(e.from[0]).push(e.to[0]);
|
|
18
|
+
indegree.set(e.to[0], (indegree.get(e.to[0]) ?? 0) + 1);
|
|
19
|
+
}
|
|
20
|
+
const ready = doc.nodes.filter((n) => indegree.get(n.id) === 0).map((n) => n.id);
|
|
21
|
+
const order = [];
|
|
22
|
+
while (ready.length > 0) {
|
|
23
|
+
const id = ready.shift();
|
|
24
|
+
order.push(id);
|
|
25
|
+
for (const next of out.get(id)) {
|
|
26
|
+
const d = indegree.get(next) - 1;
|
|
27
|
+
indegree.set(next, d);
|
|
28
|
+
if (d === 0)
|
|
29
|
+
ready.push(next);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (order.length !== doc.nodes.length) {
|
|
33
|
+
throw new FlowCycleError(doc.nodes.map((n) => n.id).filter((id) => !order.includes(id)));
|
|
34
|
+
}
|
|
35
|
+
return order;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order.js","sourceRoot":"","sources":["../src/order.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAM/D,MAAM,OAAO,cAAe,SAAQ,KAAK;IAClB;IAArB,YAAqB,OAA0B;QAC7C,KAAK,CAAC,4BAA4B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QADtC,YAAO,GAAP,OAAO,CAAmB;QAE7C,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,GAAiB;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAiB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAmB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACxE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC1B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,GAAG,CAAC,CAAC;YAClC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/registry.d.ts
CHANGED
|
@@ -82,6 +82,13 @@ export interface NodeDef<H = unknown, P = Readonly<Record<string, unknown>>> {
|
|
|
82
82
|
* that only sometimes reaches out calls `ctx.markVolatile()` instead.
|
|
83
83
|
*/
|
|
84
84
|
readonly volatile?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* The node's outputs are a proposal: a run stops downstream of it (status
|
|
87
|
+
* `review`, dependants `paused`) until the caller resumes with the
|
|
88
|
+
* reviewed outputs (`RunOptions.resume`). Nothing downstream of an
|
|
89
|
+
* unreviewed proposal ever runs.
|
|
90
|
+
*/
|
|
91
|
+
readonly review?: 'required';
|
|
85
92
|
/** Headless behaviour when a required backend feature is absent: `noop` runs as no-op. */
|
|
86
93
|
readonly headless?: 'run' | 'noop';
|
|
87
94
|
/** Host prerequisites the availability check tests for. */
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAU,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE9D,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,gGAAgG;IAChG,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,iFAAiF;IACjF,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnF,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEjD,2EAA2E;AAC3E,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC9C,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IAClC,gGAAgG;IAChG,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C;;;;;;;OAOG;IACH,YAAY,CAAC,IAAI,IAAI,CAAC;CACvB;AAED,wFAAwF;AACxF,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE5D,MAAM,WAAW,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzE,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,CAAC;IACrC,yFAAyF;IACzF,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,kFAAkF;IAClF,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,0FAA0F;IAC1F,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACnC,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KACtC,CAAC;IACF,4GAA4G;IAC5G,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACvH;AAED,qBAAa,YAAY,CAAC,CAAC,GAAG,OAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiC;IAEtD,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAO/B,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAK7C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS;IAIzC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,IAAI,IAAI,SAAS,OAAO,CAAC,CAAC,CAAC,EAAE;CAG9B;AAUD,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOlI"}
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;+DAE+D;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AA0H/D,MAAM,OAAO,YAAY;IACN,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEtD,QAAQ,CAAC,GAAe;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,IAAI,yBAAyB,CAAC,CAAC;QAC9F,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;YAAE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3E,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW,CAAC,IAA0B;QACpC,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,CAAC;CACF;AAED,MAAM,MAAM,GAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5D,SAAS,YAAY,CAAC,IAAY,EAAE,IAAa;IAC/C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,WAAW,IAAI,CAAC,IAAI,yBAAyB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzG,CAAC;AACH,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,aAAa,CAAC,GAAqB,EAAE,KAAoD;IACvG,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/scheduler.d.ts
CHANGED
|
@@ -1,15 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Evaluation: topological order, per-node memoisation, lifting, and a
|
|
3
|
-
* structured run log. Nothing here touches a model; the host services
|
|
4
|
-
* object is passed through to nodes untouched.
|
|
5
|
-
*
|
|
6
|
-
* Memo keys cover the node type, resolved params, lacing, every input's
|
|
7
|
-
* content digest and — for nodes that declare `reads: 'model'` — the
|
|
8
|
-
* per-model revisions the caller supplies. The caller owns those revisions:
|
|
9
|
-
* it bumps one when the graph's own write nodes touch a model, and when the
|
|
10
|
-
* host reports an external change. Write nodes are never memoised, nor are
|
|
11
|
-
* volatile ones, nor a run in which any lane called `ctx.markVolatile()`.
|
|
12
|
-
*/
|
|
13
1
|
import { type HostFeatures } from './availability.js';
|
|
14
2
|
import type { FlowDocument } from './document.js';
|
|
15
3
|
import { type LogLevel, type NodeRegistry } from './registry.js';
|
|
@@ -22,7 +10,12 @@ export interface RunLogEntry {
|
|
|
22
10
|
readonly level: LogLevel;
|
|
23
11
|
readonly message: string;
|
|
24
12
|
}
|
|
25
|
-
|
|
13
|
+
/**
|
|
14
|
+
* `review`: the node produced a proposal that awaits review; `paused`: not run
|
|
15
|
+
* because an upstream proposal awaits review; `restored`: not run, its outputs
|
|
16
|
+
* came from `RunOptions.resume`.
|
|
17
|
+
*/
|
|
18
|
+
export type NodeStatus = 'ok' | 'memo' | 'noop' | 'skipped' | 'error' | 'review' | 'paused' | 'restored';
|
|
26
19
|
export interface NodeReport {
|
|
27
20
|
readonly nodeId: string;
|
|
28
21
|
readonly status: NodeStatus;
|
|
@@ -56,6 +49,8 @@ export interface RunResult {
|
|
|
56
49
|
readonly graphOutputs: readonly GraphOutputValue[];
|
|
57
50
|
readonly reports: readonly NodeReport[];
|
|
58
51
|
readonly log: readonly RunLogEntry[];
|
|
52
|
+
/** Nodes whose proposals await review (`NodeDef.review`); everything downstream of them is `paused`. */
|
|
53
|
+
readonly review: readonly string[];
|
|
59
54
|
}
|
|
60
55
|
/** Reusable across runs of the same document; keyed by node id. */
|
|
61
56
|
export declare class MemoCache {
|
|
@@ -81,12 +76,13 @@ export interface RunOptions<H> {
|
|
|
81
76
|
/** Where tracked nodes read and persist their element sets; absent = every lane is a fresh create. */
|
|
82
77
|
readonly tracking?: TrackingStore;
|
|
83
78
|
readonly signal?: AbortSignal;
|
|
79
|
+
/**
|
|
80
|
+
* Resume after a review: outputs of the nodes that completed before the
|
|
81
|
+
* pause, obtained only from `resumeOutputs` for an approved, claimed
|
|
82
|
+
* checkpoint. Raw outputs and altered or reused resume maps are refused. These nodes are not executed again, so an effect
|
|
83
|
+
* that ran before the pause is never repeated.
|
|
84
|
+
*/
|
|
85
|
+
readonly resume?: ReadonlyMap<string, ReadonlyMap<string, FlowData>>;
|
|
84
86
|
}
|
|
85
|
-
export declare class FlowCycleError extends Error {
|
|
86
|
-
readonly nodeIds: readonly string[];
|
|
87
|
-
constructor(nodeIds: readonly string[]);
|
|
88
|
-
}
|
|
89
|
-
/** Kahn's algorithm; stable with respect to document node order. */
|
|
90
|
-
export declare function topologicalOrder(doc: FlowDocument): string[];
|
|
91
87
|
export declare function runFlow<H>(doc: FlowDocument, opts: RunOptions<H>): Promise<RunResult>;
|
|
92
88
|
//# sourceMappingURL=scheduler.d.ts.map
|
package/dist/scheduler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
|
package/dist/scheduler.js
CHANGED
|
@@ -13,8 +13,10 @@
|
|
|
13
13
|
* host reports an external change. Write nodes are never memoised, nor are
|
|
14
14
|
* volatile ones, nor a run in which any lane called `ctx.markVolatile()`.
|
|
15
15
|
*/
|
|
16
|
+
import { consumeReviewedResume, graphDigest, registerPausedRun } from './checkpoint-record.js';
|
|
16
17
|
import { nodeAvailability } from './availability.js';
|
|
17
18
|
import { digest, digestFlowData } from './digest.js';
|
|
19
|
+
import { topologicalOrder } from './order.js';
|
|
18
20
|
import { assemble, planLift } from './lift.js';
|
|
19
21
|
import { resolveParams } from './registry.js';
|
|
20
22
|
import { ORPHAN_NODE_ID, removeOrphanedSets, removeSet, trackingKeyOf } from './orphans.js';
|
|
@@ -46,46 +48,16 @@ export class MemoCache {
|
|
|
46
48
|
this.entries.delete(nodeId);
|
|
47
49
|
}
|
|
48
50
|
}
|
|
49
|
-
export class FlowCycleError extends Error {
|
|
50
|
-
nodeIds;
|
|
51
|
-
constructor(nodeIds) {
|
|
52
|
-
super(`flow has a cycle through ${nodeIds.join(' → ')}`);
|
|
53
|
-
this.nodeIds = nodeIds;
|
|
54
|
-
this.name = 'FlowCycleError';
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/** Kahn's algorithm; stable with respect to document node order. */
|
|
58
|
-
export function topologicalOrder(doc) {
|
|
59
|
-
const indegree = new Map(doc.nodes.map((n) => [n.id, 0]));
|
|
60
|
-
const out = new Map(doc.nodes.map((n) => [n.id, []]));
|
|
61
|
-
for (const e of doc.edges) {
|
|
62
|
-
out.get(e.from[0]).push(e.to[0]);
|
|
63
|
-
indegree.set(e.to[0], (indegree.get(e.to[0]) ?? 0) + 1);
|
|
64
|
-
}
|
|
65
|
-
const ready = doc.nodes.filter((n) => indegree.get(n.id) === 0).map((n) => n.id);
|
|
66
|
-
const order = [];
|
|
67
|
-
while (ready.length > 0) {
|
|
68
|
-
const id = ready.shift();
|
|
69
|
-
order.push(id);
|
|
70
|
-
for (const next of out.get(id)) {
|
|
71
|
-
const d = indegree.get(next) - 1;
|
|
72
|
-
indegree.set(next, d);
|
|
73
|
-
if (d === 0)
|
|
74
|
-
ready.push(next);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (order.length !== doc.nodes.length) {
|
|
78
|
-
throw new FlowCycleError(doc.nodes.map((n) => n.id).filter((id) => !order.includes(id)));
|
|
79
|
-
}
|
|
80
|
-
return order;
|
|
81
|
-
}
|
|
82
51
|
export async function runFlow(doc, opts) {
|
|
83
52
|
const registry = opts.registry;
|
|
53
|
+
const runGraphDigest = graphDigest(doc, opts.inputs ?? {}, registry);
|
|
54
|
+
const resume = opts.resume ? consumeReviewedResume(opts.resume, doc, opts.inputs ?? {}, registry) : undefined;
|
|
84
55
|
const order = topologicalOrder(doc);
|
|
85
56
|
const outputs = new Map();
|
|
86
57
|
const reports = [];
|
|
87
58
|
const log = [];
|
|
88
59
|
const failed = new Set();
|
|
60
|
+
const paused = new Set();
|
|
89
61
|
const nodesById = new Map(doc.nodes.map((n) => [n.id, n]));
|
|
90
62
|
const maxCross = doc.maxCross ?? DEFAULT_MAX_CROSS;
|
|
91
63
|
let writesThisRun = 0;
|
|
@@ -102,6 +74,18 @@ export async function runFlow(doc, opts) {
|
|
|
102
74
|
fail('aborted');
|
|
103
75
|
continue;
|
|
104
76
|
}
|
|
77
|
+
const quiet = { lanes: 0, laneErrors: 0, missing: {}, warnings: [] };
|
|
78
|
+
const restored = resume?.get(nodeId);
|
|
79
|
+
if (restored) {
|
|
80
|
+
outputs.set(nodeId, new Map(restored));
|
|
81
|
+
report({ status: 'restored', ...quiet });
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (doc.edges.some((e) => e.to[0] === nodeId && paused.has(e.from[0]))) {
|
|
85
|
+
paused.add(nodeId);
|
|
86
|
+
report({ status: 'paused', ...quiet });
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
105
89
|
const def = registry.get(node.type);
|
|
106
90
|
if (!def) {
|
|
107
91
|
fail(`unknown node type "${node.type}"`);
|
|
@@ -133,7 +117,9 @@ export async function runFlow(doc, opts) {
|
|
|
133
117
|
}
|
|
134
118
|
if (avail.status === 'noop') {
|
|
135
119
|
outputs.set(nodeId, noopOutputs(def, inputs));
|
|
136
|
-
|
|
120
|
+
if (def.review)
|
|
121
|
+
paused.add(nodeId);
|
|
122
|
+
report({ status: def.review ? 'review' : 'noop', lanes: 0, laneErrors: 0, missing: {}, warnings: avail.reasons });
|
|
137
123
|
continue;
|
|
138
124
|
}
|
|
139
125
|
}
|
|
@@ -150,7 +136,9 @@ export async function runFlow(doc, opts) {
|
|
|
150
136
|
const hit = opts.cache.get(nodeId, memoKey);
|
|
151
137
|
if (hit) {
|
|
152
138
|
outputs.set(nodeId, new Map(hit));
|
|
153
|
-
|
|
139
|
+
if (def.review)
|
|
140
|
+
paused.add(nodeId);
|
|
141
|
+
report({ status: def.review ? 'review' : 'memo', lanes: 0, laneErrors: 0, missing: {}, warnings: [] });
|
|
154
142
|
continue;
|
|
155
143
|
}
|
|
156
144
|
}
|
|
@@ -329,8 +317,10 @@ export async function runFlow(doc, opts) {
|
|
|
329
317
|
else
|
|
330
318
|
opts.cache.set(nodeId, memoKey, assembled);
|
|
331
319
|
}
|
|
320
|
+
if (def.review)
|
|
321
|
+
paused.add(nodeId);
|
|
332
322
|
report({
|
|
333
|
-
status: 'ok',
|
|
323
|
+
status: def.review ? 'review' : 'ok',
|
|
334
324
|
lanes: plan.lanes.length,
|
|
335
325
|
laneErrors: laneErrors + removeErrors,
|
|
336
326
|
missing: plan.missing,
|
|
@@ -349,6 +339,9 @@ export async function runFlow(doc, opts) {
|
|
|
349
339
|
opts.cache.writeGeneration += 1;
|
|
350
340
|
}
|
|
351
341
|
const graphOutputs = doc.outputs.map((o) => ({ label: o.label, nodeId: o.nodeId, port: o.port, data: outputs.get(o.nodeId)?.get(o.port) }));
|
|
352
|
-
|
|
342
|
+
const review = reports.filter((r) => r.status === 'review').map((r) => r.nodeId);
|
|
343
|
+
const result = { ok: failed.size === 0 && !opts.signal?.aborted, writes: writesThisRun, outputs, graphOutputs, reports, log, review };
|
|
344
|
+
registerPausedRun(result, runGraphDigest);
|
|
345
|
+
return result;
|
|
353
346
|
}
|
|
354
347
|
//# sourceMappingURL=scheduler.js.map
|