@ifc-lite/flow 0.2.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/LICENSE +373 -0
- package/README.md +63 -0
- package/dist/availability.d.ts +28 -0
- package/dist/availability.d.ts.map +1 -0
- package/dist/availability.js +37 -0
- package/dist/availability.js.map +1 -0
- package/dist/digest.d.ts +14 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +73 -0
- package/dist/digest.js.map +1 -0
- package/dist/document.d.ts +73 -0
- package/dist/document.d.ts.map +1 -0
- package/dist/document.js +158 -0
- package/dist/document.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/introspect.d.ts +61 -0
- package/dist/introspect.d.ts.map +1 -0
- package/dist/introspect.js +51 -0
- package/dist/introspect.js.map +1 -0
- package/dist/lift.d.ts +58 -0
- package/dist/lift.d.ts.map +1 -0
- package/dist/lift.js +213 -0
- package/dist/lift.js.map +1 -0
- package/dist/orphans.d.ts +32 -0
- package/dist/orphans.d.ts.map +1 -0
- package/dist/orphans.js +73 -0
- package/dist/orphans.js.map +1 -0
- package/dist/prepare.d.ts +13 -0
- package/dist/prepare.d.ts.map +1 -0
- package/dist/prepare.js +40 -0
- package/dist/prepare.js.map +1 -0
- package/dist/registry.d.ts +99 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +44 -0
- package/dist/registry.js.map +1 -0
- package/dist/scheduler.d.ts +91 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +341 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/table.d.ts +64 -0
- package/dist/table.d.ts.map +1 -0
- package/dist/table.js +132 -0
- package/dist/table.js.map +1 -0
- package/dist/tracking.d.ts +86 -0
- package/dist/tracking.d.ts.map +1 -0
- package/dist/tracking.js +136 -0
- package/dist/tracking.js.map +1 -0
- package/dist/values.d.ts +102 -0
- package/dist/values.d.ts.map +1 -0
- package/dist/values.js +64 -0
- package/dist/values.js.map +1 -0
- package/dist/wiring.d.ts +20 -0
- package/dist/wiring.d.ts.map +1 -0
- package/dist/wiring.js +56 -0
- package/dist/wiring.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,91 @@
|
|
|
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.
|
|
11
|
+
*/
|
|
12
|
+
import { type HostFeatures } from './availability.js';
|
|
13
|
+
import type { FlowDocument } from './document.js';
|
|
14
|
+
import { type LogLevel, type NodeRegistry } from './registry.js';
|
|
15
|
+
import { type TrackingStore } from './tracking.js';
|
|
16
|
+
import type { FlowData } from './values.js';
|
|
17
|
+
export declare const DEFAULT_MAX_CROSS = 100000;
|
|
18
|
+
export interface RunLogEntry {
|
|
19
|
+
readonly nodeId: string;
|
|
20
|
+
readonly laneKey: string | null;
|
|
21
|
+
readonly level: LogLevel;
|
|
22
|
+
readonly message: string;
|
|
23
|
+
}
|
|
24
|
+
export type NodeStatus = 'ok' | 'memo' | 'noop' | 'skipped' | 'error';
|
|
25
|
+
export interface NodeReport {
|
|
26
|
+
readonly nodeId: string;
|
|
27
|
+
readonly status: NodeStatus;
|
|
28
|
+
readonly durationMs: number;
|
|
29
|
+
readonly lanes: number;
|
|
30
|
+
readonly laneErrors: number;
|
|
31
|
+
readonly missing: Readonly<Record<string, readonly string[]>>;
|
|
32
|
+
readonly warnings: readonly string[];
|
|
33
|
+
readonly error?: string;
|
|
34
|
+
/** Tracked nodes: what the run did to the node's element set. */
|
|
35
|
+
readonly tracking?: {
|
|
36
|
+
readonly created: number;
|
|
37
|
+
readonly updated: number;
|
|
38
|
+
readonly kept: number;
|
|
39
|
+
readonly removed: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export interface GraphOutputValue {
|
|
43
|
+
readonly label: string;
|
|
44
|
+
readonly nodeId: string;
|
|
45
|
+
readonly port: string;
|
|
46
|
+
readonly data: FlowData | undefined;
|
|
47
|
+
}
|
|
48
|
+
export interface RunResult {
|
|
49
|
+
readonly ok: boolean;
|
|
50
|
+
/** Number of write nodes that ran; the caller bumps its model revision when non-zero. */
|
|
51
|
+
readonly writes: number;
|
|
52
|
+
/** Every node's outputs by port, for inspectors. */
|
|
53
|
+
readonly outputs: ReadonlyMap<string, ReadonlyMap<string, FlowData>>;
|
|
54
|
+
/** The document's declared outputs, in order. */
|
|
55
|
+
readonly graphOutputs: readonly GraphOutputValue[];
|
|
56
|
+
readonly reports: readonly NodeReport[];
|
|
57
|
+
readonly log: readonly RunLogEntry[];
|
|
58
|
+
}
|
|
59
|
+
/** Reusable across runs of the same document; keyed by node id. */
|
|
60
|
+
export declare class MemoCache {
|
|
61
|
+
private readonly entries;
|
|
62
|
+
/**
|
|
63
|
+
* Bumped by the scheduler after every write node, and part of every
|
|
64
|
+
* model-reading memo key: a read behind a write in the same run, and any
|
|
65
|
+
* read in a later run, sees a model that changed and recomputes.
|
|
66
|
+
*/
|
|
67
|
+
writeGeneration: number;
|
|
68
|
+
get(nodeId: string, key: string): ReadonlyMap<string, FlowData> | undefined;
|
|
69
|
+
set(nodeId: string, key: string, outputs: ReadonlyMap<string, FlowData>): void;
|
|
70
|
+
invalidate(nodeId?: string): void;
|
|
71
|
+
}
|
|
72
|
+
export interface RunOptions<H> {
|
|
73
|
+
readonly host: H;
|
|
74
|
+
readonly registry: NodeRegistry<H>;
|
|
75
|
+
/** Player overrides keyed `${nodeId}.${param}`. */
|
|
76
|
+
readonly inputs?: Readonly<Record<string, unknown>>;
|
|
77
|
+
readonly modelRevisions?: Readonly<Record<string, number>>;
|
|
78
|
+
readonly features?: HostFeatures;
|
|
79
|
+
readonly cache?: MemoCache;
|
|
80
|
+
/** Where tracked nodes read and persist their element sets; absent = every lane is a fresh create. */
|
|
81
|
+
readonly tracking?: TrackingStore;
|
|
82
|
+
readonly signal?: AbortSignal;
|
|
83
|
+
}
|
|
84
|
+
export declare class FlowCycleError extends Error {
|
|
85
|
+
readonly nodeIds: readonly string[];
|
|
86
|
+
constructor(nodeIds: readonly string[]);
|
|
87
|
+
}
|
|
88
|
+
/** Kahn's algorithm; stable with respect to document node order. */
|
|
89
|
+
export declare function topologicalOrder(doc: FlowDocument): string[];
|
|
90
|
+
export declare function runFlow<H>(doc: FlowDocument, opts: RunOptions<H>): Promise<RunResult>;
|
|
91
|
+
//# sourceMappingURL=scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,341 @@
|
|
|
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
|
+
* Evaluation: topological order, per-node memoisation, lifting, and a
|
|
6
|
+
* structured run log. Nothing here touches a model; the host services
|
|
7
|
+
* object is passed through to nodes untouched.
|
|
8
|
+
*
|
|
9
|
+
* Memo keys cover the node type, resolved params, lacing, every input's
|
|
10
|
+
* content digest and — for nodes that declare `reads: 'model'` — the
|
|
11
|
+
* per-model revisions the caller supplies. The caller owns those revisions:
|
|
12
|
+
* it bumps one when the graph's own write nodes touch a model, and when the
|
|
13
|
+
* host reports an external change. Write nodes are never memoised.
|
|
14
|
+
*/
|
|
15
|
+
import { nodeAvailability } from './availability.js';
|
|
16
|
+
import { digest, digestFlowData } from './digest.js';
|
|
17
|
+
import { assemble, planLift } from './lift.js';
|
|
18
|
+
import { resolveParams } from './registry.js';
|
|
19
|
+
import { ORPHAN_NODE_ID, removeOrphanedSets, removeSet, trackingKeyOf } from './orphans.js';
|
|
20
|
+
import { noopOutputs, prepareInputs } from './prepare.js';
|
|
21
|
+
import { emptyTrackedSet, planTracking } from './tracking.js';
|
|
22
|
+
export const DEFAULT_MAX_CROSS = 100_000;
|
|
23
|
+
/** Reusable across runs of the same document; keyed by node id. */
|
|
24
|
+
export class MemoCache {
|
|
25
|
+
entries = new Map();
|
|
26
|
+
/**
|
|
27
|
+
* Bumped by the scheduler after every write node, and part of every
|
|
28
|
+
* model-reading memo key: a read behind a write in the same run, and any
|
|
29
|
+
* read in a later run, sees a model that changed and recomputes.
|
|
30
|
+
*/
|
|
31
|
+
writeGeneration = 0;
|
|
32
|
+
get(nodeId, key) {
|
|
33
|
+
const e = this.entries.get(nodeId);
|
|
34
|
+
return e && e.key === key ? e.outputs : undefined;
|
|
35
|
+
}
|
|
36
|
+
set(nodeId, key, outputs) {
|
|
37
|
+
this.entries.set(nodeId, { key, outputs });
|
|
38
|
+
}
|
|
39
|
+
invalidate(nodeId) {
|
|
40
|
+
if (nodeId === undefined)
|
|
41
|
+
this.entries.clear();
|
|
42
|
+
else
|
|
43
|
+
this.entries.delete(nodeId);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export class FlowCycleError extends Error {
|
|
47
|
+
nodeIds;
|
|
48
|
+
constructor(nodeIds) {
|
|
49
|
+
super(`flow has a cycle through ${nodeIds.join(' → ')}`);
|
|
50
|
+
this.nodeIds = nodeIds;
|
|
51
|
+
this.name = 'FlowCycleError';
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Kahn's algorithm; stable with respect to document node order. */
|
|
55
|
+
export function topologicalOrder(doc) {
|
|
56
|
+
const indegree = new Map(doc.nodes.map((n) => [n.id, 0]));
|
|
57
|
+
const out = new Map(doc.nodes.map((n) => [n.id, []]));
|
|
58
|
+
for (const e of doc.edges) {
|
|
59
|
+
out.get(e.from[0]).push(e.to[0]);
|
|
60
|
+
indegree.set(e.to[0], (indegree.get(e.to[0]) ?? 0) + 1);
|
|
61
|
+
}
|
|
62
|
+
const ready = doc.nodes.filter((n) => indegree.get(n.id) === 0).map((n) => n.id);
|
|
63
|
+
const order = [];
|
|
64
|
+
while (ready.length > 0) {
|
|
65
|
+
const id = ready.shift();
|
|
66
|
+
order.push(id);
|
|
67
|
+
for (const next of out.get(id)) {
|
|
68
|
+
const d = indegree.get(next) - 1;
|
|
69
|
+
indegree.set(next, d);
|
|
70
|
+
if (d === 0)
|
|
71
|
+
ready.push(next);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (order.length !== doc.nodes.length) {
|
|
75
|
+
throw new FlowCycleError(doc.nodes.map((n) => n.id).filter((id) => !order.includes(id)));
|
|
76
|
+
}
|
|
77
|
+
return order;
|
|
78
|
+
}
|
|
79
|
+
export async function runFlow(doc, opts) {
|
|
80
|
+
const registry = opts.registry;
|
|
81
|
+
const order = topologicalOrder(doc);
|
|
82
|
+
const outputs = new Map();
|
|
83
|
+
const reports = [];
|
|
84
|
+
const log = [];
|
|
85
|
+
const failed = new Set();
|
|
86
|
+
const nodesById = new Map(doc.nodes.map((n) => [n.id, n]));
|
|
87
|
+
const maxCross = doc.maxCross ?? DEFAULT_MAX_CROSS;
|
|
88
|
+
let writesThisRun = 0;
|
|
89
|
+
for (const nodeId of order) {
|
|
90
|
+
const node = nodesById.get(nodeId);
|
|
91
|
+
const started = Date.now();
|
|
92
|
+
const report = (partial) => reports.push({ nodeId, durationMs: Date.now() - started, ...partial });
|
|
93
|
+
const fail = (error, lanes = 0) => {
|
|
94
|
+
failed.add(nodeId);
|
|
95
|
+
log.push({ nodeId, laneKey: null, level: 'error', message: error });
|
|
96
|
+
report({ status: 'error', lanes, laneErrors: 0, missing: {}, warnings: [], error });
|
|
97
|
+
};
|
|
98
|
+
const def = registry.get(node.type);
|
|
99
|
+
if (!def) {
|
|
100
|
+
fail(`unknown node type "${node.type}"`);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const { inputs, problems, skipped } = prepareInputs(doc, node, def, registry, outputs, failed);
|
|
104
|
+
if (skipped) {
|
|
105
|
+
failed.add(nodeId);
|
|
106
|
+
report({ status: 'skipped', lanes: 0, laneErrors: 0, missing: {}, warnings: [], error: 'an upstream node failed' });
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (problems.length > 0) {
|
|
110
|
+
fail(problems.join('; '));
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const overrides = {};
|
|
114
|
+
for (const p of def.params) {
|
|
115
|
+
const v = opts.inputs?.[`${nodeId}.${p.name}`];
|
|
116
|
+
if (v !== undefined)
|
|
117
|
+
overrides[p.name] = v;
|
|
118
|
+
}
|
|
119
|
+
const params = resolveParams(def, { ...node.params, ...overrides });
|
|
120
|
+
const lacing = node.lacing ?? 'shortest';
|
|
121
|
+
if (opts.features) {
|
|
122
|
+
const avail = nodeAvailability(def, node.type, opts.features);
|
|
123
|
+
if (avail.status === 'unavailable') {
|
|
124
|
+
fail(avail.reasons.join('; '));
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (avail.status === 'noop') {
|
|
128
|
+
outputs.set(nodeId, noopOutputs(def, inputs));
|
|
129
|
+
report({ status: 'noop', lanes: 0, laneErrors: 0, missing: {}, warnings: avail.reasons });
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const memoKey = def.writes
|
|
134
|
+
? undefined
|
|
135
|
+
: digest({
|
|
136
|
+
type: def.type,
|
|
137
|
+
params,
|
|
138
|
+
lacing,
|
|
139
|
+
inputs: inputs.map((i) => (i.data ? digestFlowData(i.data) : null)),
|
|
140
|
+
rev: def.reads === 'model' ? { ...opts.modelRevisions, '': opts.cache?.writeGeneration ?? 0 } : undefined,
|
|
141
|
+
});
|
|
142
|
+
if (memoKey && opts.cache) {
|
|
143
|
+
const hit = opts.cache.get(nodeId, memoKey);
|
|
144
|
+
if (hit) {
|
|
145
|
+
outputs.set(nodeId, new Map(hit));
|
|
146
|
+
report({ status: 'memo', lanes: 0, laneErrors: 0, missing: {}, warnings: [] });
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
let plan;
|
|
151
|
+
try {
|
|
152
|
+
plan = planLift(inputs, { lacing, maxCross, laneKeyPort: def.laneKeyPort });
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
fail(err.message);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
for (const w of plan.warnings)
|
|
159
|
+
log.push({ nodeId, laneKey: null, level: 'warn', message: w });
|
|
160
|
+
for (const [port, keys] of Object.entries(plan.missing)) {
|
|
161
|
+
log.push({ nodeId, laneKey: null, level: 'warn', message: `input "${port}" has no branch for keys: ${keys.join(', ')}` });
|
|
162
|
+
}
|
|
163
|
+
// Tracked nodes: decide per lane what to do against last run's set.
|
|
164
|
+
let trackingPlan;
|
|
165
|
+
const trackingKey = trackingKeyOf(doc, node);
|
|
166
|
+
if (def.tracked) {
|
|
167
|
+
let previous = opts.tracking?.load(trackingKey) ?? emptyTrackedSet(trackingKey);
|
|
168
|
+
// A set another node type made under this key is not adopted: its
|
|
169
|
+
// elements go out through THAT type's `remove`, and this node starts
|
|
170
|
+
// from an empty set. Planning against it would overwrite `nodeType`
|
|
171
|
+
// and leave the old type's elements to nobody.
|
|
172
|
+
if (previous.nodeType !== undefined && previous.nodeType !== node.type) {
|
|
173
|
+
const gone = await removeSet(previous, registry, opts.host, opts.signal, log, nodeId);
|
|
174
|
+
if (gone.removed > 0) {
|
|
175
|
+
writesThisRun += 1;
|
|
176
|
+
if (opts.cache)
|
|
177
|
+
opts.cache.writeGeneration += 1;
|
|
178
|
+
}
|
|
179
|
+
if (gone.rest !== undefined) {
|
|
180
|
+
opts.tracking?.save(gone.rest);
|
|
181
|
+
fail(`the tracked set "${trackingKey}" was made by node type "${previous.nodeType}" and ${Object.keys(gone.rest.entries).length} of its element(s) could not be removed; give this node its own tracking key`);
|
|
182
|
+
continue;
|
|
183
|
+
}
|
|
184
|
+
// Persisted now, not with the node's own result: if the node fails
|
|
185
|
+
// below, the store must not still name elements that are gone.
|
|
186
|
+
previous = emptyTrackedSet(trackingKey);
|
|
187
|
+
opts.tracking?.save(previous);
|
|
188
|
+
}
|
|
189
|
+
const desired = plan.lanes
|
|
190
|
+
.filter((l) => !l.nullLane)
|
|
191
|
+
.map((l) => ({ laneKey: l.laneKey ?? '', digest: digest({ args: l.args, params }) }));
|
|
192
|
+
trackingPlan = planTracking(previous, desired, node.tracking ?? 'update');
|
|
193
|
+
for (const k of trackingPlan.duplicateLanes)
|
|
194
|
+
log.push({ nodeId, laneKey: k, level: 'warn', message: 'duplicate lane key; only the first lane is tracked' });
|
|
195
|
+
}
|
|
196
|
+
const laneTracking = (laneKey) => {
|
|
197
|
+
if (!trackingPlan)
|
|
198
|
+
return undefined;
|
|
199
|
+
const k = laneKey ?? '';
|
|
200
|
+
const c = trackingPlan.create.find((e) => e.laneKey === k);
|
|
201
|
+
if (c)
|
|
202
|
+
return { action: 'create', globalId: c.globalId };
|
|
203
|
+
const u = trackingPlan.update.find((e) => e.laneKey === k);
|
|
204
|
+
if (u)
|
|
205
|
+
return { action: 'update', globalId: u.globalId };
|
|
206
|
+
const kept = trackingPlan.keep.find((e) => e.laneKey === k);
|
|
207
|
+
return kept ? { action: 'keep', globalId: kept.globalId } : undefined;
|
|
208
|
+
};
|
|
209
|
+
const makeCtx = (laneKey, tracking) => ({
|
|
210
|
+
host: opts.host,
|
|
211
|
+
laneKey,
|
|
212
|
+
tracking,
|
|
213
|
+
signal: opts.signal,
|
|
214
|
+
log: (level, message) => log.push({ nodeId, laneKey, level, message }),
|
|
215
|
+
});
|
|
216
|
+
const results = [];
|
|
217
|
+
let laneErrors = 0;
|
|
218
|
+
let nodeError;
|
|
219
|
+
const seenLanes = new Set();
|
|
220
|
+
// Lanes skipped as duplicates yield null like a failed lane but must not
|
|
221
|
+
// count as one: counting them dropped the FIRST lane's fresh entry, and
|
|
222
|
+
// the next run then planned `create` against an element that existed.
|
|
223
|
+
const skippedDuplicates = new Set();
|
|
224
|
+
for (const lane of plan.lanes) {
|
|
225
|
+
if (opts.signal?.aborted) {
|
|
226
|
+
nodeError = 'aborted';
|
|
227
|
+
break;
|
|
228
|
+
}
|
|
229
|
+
if (lane.nullLane) {
|
|
230
|
+
results.push(null);
|
|
231
|
+
continue;
|
|
232
|
+
}
|
|
233
|
+
const duplicate = trackingPlan !== undefined && seenLanes.has(lane.laneKey ?? '');
|
|
234
|
+
seenLanes.add(lane.laneKey ?? '');
|
|
235
|
+
if (duplicate) {
|
|
236
|
+
skippedDuplicates.add(results.length);
|
|
237
|
+
results.push(null);
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
const ctx = makeCtx(lane.laneKey, laneTracking(lane.laneKey));
|
|
241
|
+
try {
|
|
242
|
+
results.push(await def.run(ctx, lane.args, params));
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
246
|
+
if (!plan.lifted) {
|
|
247
|
+
nodeError = message;
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
laneErrors += 1;
|
|
251
|
+
log.push({ nodeId, laneKey: lane.laneKey, level: 'error', message });
|
|
252
|
+
results.push(null);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (nodeError !== undefined) {
|
|
256
|
+
fail(nodeError, plan.lanes.length);
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
let removeErrors = 0;
|
|
260
|
+
let removeSkipped = 0;
|
|
261
|
+
const failedRemovals = [];
|
|
262
|
+
if (trackingPlan) {
|
|
263
|
+
if (trackingPlan.remove.length > 0 && !def.remove) {
|
|
264
|
+
// No remove hook: mirror orphans.ts's removeSet guard. Warn, count
|
|
265
|
+
// zero removed, and treat every vanished lane like a failed removal
|
|
266
|
+
// so its entry is retained below instead of being dropped as if it
|
|
267
|
+
// had actually been removed.
|
|
268
|
+
removeSkipped = trackingPlan.remove.length;
|
|
269
|
+
log.push({ nodeId, laneKey: null, level: 'warn', message: `node type "${node.type}" has no remove hook; ${trackingPlan.remove.length} element(s) stay in the model` });
|
|
270
|
+
for (const gone of trackingPlan.remove)
|
|
271
|
+
failedRemovals.push(gone.laneKey);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
for (const gone of trackingPlan.remove) {
|
|
275
|
+
try {
|
|
276
|
+
await def.remove?.(makeCtx(gone.laneKey), gone.globalId);
|
|
277
|
+
}
|
|
278
|
+
catch (err) {
|
|
279
|
+
removeErrors += 1;
|
|
280
|
+
failedRemovals.push(gone.laneKey);
|
|
281
|
+
log.push({ nodeId, laneKey: gone.laneKey, level: 'error', message: `remove ${gone.globalId}: ${err instanceof Error ? err.message : String(err)}` });
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// A lane that failed keeps its previous entry, so the next run retries
|
|
286
|
+
// it instead of forgetting an element that may still exist. A vanished
|
|
287
|
+
// lane whose removal threw, or whose node has no remove hook at all,
|
|
288
|
+
// is the same case: still in the model, so still in the set.
|
|
289
|
+
const failedLanes = new Set([
|
|
290
|
+
...plan.lanes.filter((l, i) => results[i] === null && !l.nullLane && !skippedDuplicates.has(i)).map((l) => l.laneKey ?? ''),
|
|
291
|
+
...failedRemovals,
|
|
292
|
+
]);
|
|
293
|
+
const entries = { ...trackingPlan.next.entries };
|
|
294
|
+
const previous = opts.tracking?.load(trackingKey)?.entries ?? {};
|
|
295
|
+
for (const k of failedLanes) {
|
|
296
|
+
if (previous[k])
|
|
297
|
+
entries[k] = previous[k];
|
|
298
|
+
else
|
|
299
|
+
delete entries[k];
|
|
300
|
+
}
|
|
301
|
+
opts.tracking?.save({ ...trackingPlan.next, entries, nodeType: node.type });
|
|
302
|
+
}
|
|
303
|
+
let assembled;
|
|
304
|
+
try {
|
|
305
|
+
assembled = assemble(plan, def.outputs, results);
|
|
306
|
+
}
|
|
307
|
+
catch (err) {
|
|
308
|
+
fail(err.message, plan.lanes.length);
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
outputs.set(nodeId, assembled);
|
|
312
|
+
if (def.writes) {
|
|
313
|
+
writesThisRun += 1;
|
|
314
|
+
if (opts.cache)
|
|
315
|
+
opts.cache.writeGeneration += 1;
|
|
316
|
+
}
|
|
317
|
+
if (memoKey && opts.cache)
|
|
318
|
+
opts.cache.set(nodeId, memoKey, assembled);
|
|
319
|
+
report({
|
|
320
|
+
status: 'ok',
|
|
321
|
+
lanes: plan.lanes.length,
|
|
322
|
+
laneErrors: laneErrors + removeErrors,
|
|
323
|
+
missing: plan.missing,
|
|
324
|
+
warnings: plan.warnings,
|
|
325
|
+
tracking: trackingPlan
|
|
326
|
+
? { created: trackingPlan.create.length, updated: trackingPlan.update.length, kept: trackingPlan.keep.length, removed: trackingPlan.remove.length - removeErrors - removeSkipped }
|
|
327
|
+
: undefined,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
const orphans = opts.signal?.aborted ? { removed: 0, errors: 0 } : await removeOrphanedSets(doc, opts.host, opts.tracking, registry, log, opts.signal);
|
|
331
|
+
if (orphans.errors > 0)
|
|
332
|
+
failed.add(ORPHAN_NODE_ID);
|
|
333
|
+
if (orphans.removed > 0) {
|
|
334
|
+
writesThisRun += 1;
|
|
335
|
+
if (opts.cache)
|
|
336
|
+
opts.cache.writeGeneration += 1;
|
|
337
|
+
}
|
|
338
|
+
const graphOutputs = doc.outputs.map((o) => ({ label: o.label, nodeId: o.nodeId, port: o.port, data: outputs.get(o.nodeId)?.get(o.port) }));
|
|
339
|
+
return { ok: failed.size === 0, writes: writesThisRun, outputs, graphOutputs, reports, log };
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
|
package/dist/table.d.ts
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Table`: the tabular value that goes to and comes back from Excel/CSV.
|
|
3
|
+
*
|
|
4
|
+
* Every column carries an IFC value type and, when it maps onto a property,
|
|
5
|
+
* the `pset`/`prop` it was read from — so a round trip through a spreadsheet
|
|
6
|
+
* does not lose the difference between `IfcReal` 2.0 and `IfcInteger` 2, and
|
|
7
|
+
* a unit is never guessed on the way back. A table always names its key
|
|
8
|
+
* column: a keyless sheet cannot be matched back to entities and is refused.
|
|
9
|
+
*
|
|
10
|
+
* Long format `(GlobalId, Pset, Prop, Value, Type, Unit)` is the canonical
|
|
11
|
+
* entity/pset/property shape; `pivot` widens it to one row per entity for a
|
|
12
|
+
* sheet and `groupBy` splits it per entity for lifting.
|
|
13
|
+
*/
|
|
14
|
+
import type { GroupKey, Scalar } from './values.js';
|
|
15
|
+
/** IFC value types spelled as strings so they survive JSON documents. */
|
|
16
|
+
export type ColumnType = 'string' | 'real' | 'integer' | 'boolean' | 'logical' | 'label' | 'identifier' | 'text' | 'enum' | 'reference' | 'list';
|
|
17
|
+
export declare const COLUMN_TYPES: readonly ColumnType[];
|
|
18
|
+
export interface Column {
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly type: ColumnType;
|
|
21
|
+
readonly unit?: string;
|
|
22
|
+
/** The property this column was read from, when it maps onto one. */
|
|
23
|
+
readonly binding?: {
|
|
24
|
+
readonly pset: string;
|
|
25
|
+
readonly prop: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export type Cell = Scalar;
|
|
29
|
+
export type Row = Readonly<Record<string, Cell>>;
|
|
30
|
+
export interface Table {
|
|
31
|
+
readonly columns: readonly Column[];
|
|
32
|
+
readonly rows: readonly Row[];
|
|
33
|
+
/** Name of the column whose values identify a row (usually `GlobalId`). */
|
|
34
|
+
readonly key: string;
|
|
35
|
+
}
|
|
36
|
+
export interface TableProblem {
|
|
37
|
+
readonly path: string;
|
|
38
|
+
readonly message: string;
|
|
39
|
+
}
|
|
40
|
+
/** Structural validation of an untrusted table value. */
|
|
41
|
+
export declare function validateTable(value: unknown, path?: string): TableProblem[];
|
|
42
|
+
export declare function column(table: Table, name: string): Column | undefined;
|
|
43
|
+
/** The row key as a group key; `null`/missing keys are reported, never coerced. */
|
|
44
|
+
export declare function rowKey(table: Table, row: Row): GroupKey | null;
|
|
45
|
+
export interface GroupedRows {
|
|
46
|
+
readonly branches: ReadonlyMap<GroupKey, readonly Row[]>;
|
|
47
|
+
/** Rows whose grouping column was empty. */
|
|
48
|
+
readonly unkeyed: readonly Row[];
|
|
49
|
+
}
|
|
50
|
+
/** Split rows into branches by a column's value (defaults to the key column). */
|
|
51
|
+
export declare function groupRows(table: Table, by?: string): GroupedRows;
|
|
52
|
+
/**
|
|
53
|
+
* Widen a long-format table into one row per `rowKey` with a column per
|
|
54
|
+
* distinct `colKey` value. The pivoted column's type is taken from the
|
|
55
|
+
* `valueCol` column; a duplicate (rowKey, colKey) pair keeps the last value
|
|
56
|
+
* and is reported, and a `colKey` that names the key column is refused
|
|
57
|
+
* (`collisions`) rather than overwriting the row's identity.
|
|
58
|
+
*/
|
|
59
|
+
export declare function pivot(table: Table, rowKeyCol: string, colKeyCol: string, valueCol: string): {
|
|
60
|
+
table: Table;
|
|
61
|
+
duplicates: number;
|
|
62
|
+
collisions: number;
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../src/table.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEpD,yEAAyE;AACzE,MAAM,MAAM,UAAU,GAClB,QAAQ,GACR,MAAM,GACN,SAAS,GACT,SAAS,GACT,SAAS,GACT,OAAO,GACP,YAAY,GACZ,MAAM,GACN,MAAM,GACN,WAAW,GACX,MAAM,CAAC;AAEX,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAE7C,CAAC;AAEF,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC;AAC1B,MAAM,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;AAEjD,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,EAAE,CAAC;IAC9B,2EAA2E;IAC3E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,yDAAyD;AACzD,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,SAAU,GAAG,YAAY,EAAE,CAsC5E;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAErE;AAED,mFAAmF;AACnF,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,GAAG,QAAQ,GAAG,IAAI,CAI9D;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,SAAS,GAAG,EAAE,CAAC,CAAC;IACzD,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,GAAG,EAAE,CAAC;CAClC;AAED,iFAAiF;AACjF,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,GAAE,MAAkB,GAAG,WAAW,CAe3E;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CACnB,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAmC1D"}
|