@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.
@@ -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, topologicalOrder, MemoCache, FlowCycleError, DEFAULT_MAX_CROSS } from './scheduler.js';
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
@@ -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,gBAAgB,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACzG,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"}
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, topologicalOrder, MemoCache, FlowCycleError, DEFAULT_MAX_CROSS } from './scheduler.js';
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,gBAAgB,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
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"}
@@ -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"}
@@ -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. */
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAmH/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"}
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"}
@@ -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
- export type NodeStatus = 'ok' | 'memo' | 'noop' | 'skipped' | 'error';
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
@@ -1 +1 @@
1
- {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
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
- report({ status: 'noop', lanes: 0, laneErrors: 0, missing: {}, warnings: avail.reasons });
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
- report({ status: 'memo', lanes: 0, laneErrors: 0, missing: {}, warnings: [] });
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
- return { ok: failed.size === 0 && !opts.signal?.aborted, writes: writesThisRun, outputs, graphOutputs, reports, log };
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