@modernrelay/orbit-core 0.13.6 → 0.14.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/dist/{chunk-FG6TQANI.js → chunk-KRCG2JFN.js} +3 -3
- package/dist/chunk-KRCG2JFN.js.map +1 -0
- package/dist/engine.d.ts +1 -1
- package/dist/{index-BoQfS8jd.d.ts → index-CPRTWpGA.d.ts} +175 -175
- package/dist/index.d.ts +611 -611
- package/dist/index.js +145 -146
- package/dist/index.js.map +1 -1
- package/dist/{lane-SZYhcrXT.d.ts → lane-_KPQ1deI.d.ts} +42 -42
- package/dist/testing.d.ts +22 -22
- package/dist/testing.js +15 -15
- package/dist/testing.js.map +1 -1
- package/dist/worker/entry.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-FG6TQANI.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DIAGNOSTIC_SAMPLE_CAP, encodeStringTable, collectTransfers, deriveClusters, resolveClusterCenters, clusterCentroids, EnvelopeSequencer, RequestLedger } from './chunk-
|
|
2
|
-
export { DEFAULT_CLUSTER_CENTER_RADIUS, DEFAULT_LAYOUT_SEED, DIAGNOSTIC_SAMPLE_CAP, acceptColumnar, clusterCentroids, collectTransfers, decodeStringTable, deriveClusters, encodeStringTable, generateClusterCenters, judgeEpoch, resolveClusterCenters } from './chunk-
|
|
1
|
+
import { DIAGNOSTIC_SAMPLE_CAP, encodeStringTable, collectTransfers, deriveClusters, resolveClusterCenters, clusterCentroids, EnvelopeSequencer, RequestLedger } from './chunk-KRCG2JFN.js';
|
|
2
|
+
export { DEFAULT_CLUSTER_CENTER_RADIUS, DEFAULT_LAYOUT_SEED, DIAGNOSTIC_SAMPLE_CAP, acceptColumnar, clusterCentroids, collectTransfers, decodeStringTable, deriveClusters, encodeStringTable, generateClusterCenters, judgeEpoch, resolveClusterCenters } from './chunk-KRCG2JFN.js';
|
|
3
3
|
import { createStore } from 'zustand/vanilla';
|
|
4
4
|
|
|
5
5
|
// src/errors.ts
|
|
@@ -349,7 +349,7 @@ function validateGroupSpecs(specs, nodeIndex) {
|
|
|
349
349
|
severity: "error",
|
|
350
350
|
count,
|
|
351
351
|
sampleIds: samples,
|
|
352
|
-
message: `groups rejected before scene rewrite
|
|
352
|
+
message: `groups rejected before scene rewrite: ${kinds} \u2014 the previous group configuration stays active`
|
|
353
353
|
}
|
|
354
354
|
};
|
|
355
355
|
}
|
|
@@ -419,7 +419,7 @@ function validateGroupBySpec(spec) {
|
|
|
419
419
|
if (!expandOk) problems.push("semanticZoom.expandAbove must be a finite number");
|
|
420
420
|
if (collapseOk && expandOk && !(sz.expandAbove > sz.collapseBelow)) {
|
|
421
421
|
problems.push(
|
|
422
|
-
"semanticZoom.expandAbove must be strictly greater than collapseBelow
|
|
422
|
+
"semanticZoom.expandAbove must be strictly greater than collapseBelow to provide a hysteresis gap"
|
|
423
423
|
);
|
|
424
424
|
}
|
|
425
425
|
}
|
|
@@ -429,7 +429,7 @@ function validateGroupBySpec(spec) {
|
|
|
429
429
|
severity: "error",
|
|
430
430
|
count: problems.length,
|
|
431
431
|
sampleIds: [],
|
|
432
|
-
message: `groupBy rejected
|
|
432
|
+
message: `groupBy rejected: ${problems.join("; ")} \u2014 the previous groupBy configuration stays active`
|
|
433
433
|
};
|
|
434
434
|
}
|
|
435
435
|
function deriveGroupsByKey(nodes, by, isCollapsedKey) {
|
|
@@ -476,7 +476,7 @@ function deriveGroupsByKey(nodes, by, isCollapsedKey) {
|
|
|
476
476
|
severity: "warning",
|
|
477
477
|
count: errorCount,
|
|
478
478
|
sampleIds: errorSamples,
|
|
479
|
-
message: "groupBy.by threw; the affected nodes derived as ungrouped
|
|
479
|
+
message: "groupBy.by threw; the affected nodes derived as ungrouped"
|
|
480
480
|
}
|
|
481
481
|
};
|
|
482
482
|
}
|
|
@@ -701,27 +701,27 @@ var EMPTY_INDEX = /* @__PURE__ */ new Map();
|
|
|
701
701
|
var Reconciler = class {
|
|
702
702
|
datasetKey = null;
|
|
703
703
|
hasScene = false;
|
|
704
|
-
// Previous scene, kept for the structural diff
|
|
704
|
+
// Previous scene, kept for the structural diff.
|
|
705
705
|
prevIdByIndex = [];
|
|
706
706
|
prevIndexById = EMPTY_INDEX;
|
|
707
707
|
prevEdgeIdByIndex = [];
|
|
708
708
|
prevLinks = new Uint32Array(0);
|
|
709
709
|
/**
|
|
710
710
|
* Declared node.x/y as of the previous reconcile, for nodes that declared
|
|
711
|
-
* them. Lets Priority 1 distinguish a CHANGED declaration (caller intent
|
|
711
|
+
* them. Lets Priority 1 distinguish a CHANGED declaration (caller intent
|
|
712
712
|
* wins over any cache) from an unchanged one (defers to live drift). Fresh
|
|
713
713
|
* per pass, so departed ids drop and a re-add treats its declaration as new.
|
|
714
714
|
*/
|
|
715
715
|
prevDeclared = /* @__PURE__ */ new Map();
|
|
716
716
|
/**
|
|
717
|
-
* CPU position mirror for the CURRENT scene, indexed by slot
|
|
717
|
+
* CPU position mirror for the CURRENT scene, indexed by slot.
|
|
718
718
|
* Owned copy — never aliases a published scene's positions array, so
|
|
719
719
|
* noteEnginePositions never mutates an already-published RenderScene.
|
|
720
720
|
*/
|
|
721
721
|
livePositions = new Float32Array(0);
|
|
722
722
|
/**
|
|
723
|
-
* Ids removed from the scene → last known finite position
|
|
724
|
-
* leave-and-return guarantee
|
|
723
|
+
* Ids removed from the scene → last known finite position, preserving the
|
|
724
|
+
* leave-and-return guarantee. Map insertion order doubles as LRU order;
|
|
725
725
|
* invariant: never overlaps the current scene's id set.
|
|
726
726
|
*/
|
|
727
727
|
departed = /* @__PURE__ */ new Map();
|
|
@@ -835,7 +835,7 @@ var Reconciler = class {
|
|
|
835
835
|
}
|
|
836
836
|
/**
|
|
837
837
|
* Copy engine-read positions into the live cache for the CURRENT scene's
|
|
838
|
-
* slots
|
|
838
|
+
* slots.
|
|
839
839
|
* Extra trailing floats are ignored; a short buffer updates a prefix.
|
|
840
840
|
*/
|
|
841
841
|
noteEnginePositions(positions) {
|
|
@@ -1391,7 +1391,7 @@ function mergeDiagnostics(merge) {
|
|
|
1391
1391
|
severity: "info",
|
|
1392
1392
|
count: merge.shadowedCount,
|
|
1393
1393
|
sampleIds: merge.shadowedSamples,
|
|
1394
|
-
message: `${merge.shadowedCount} overlay node row(s) shadowed by a same-id row admitted earlier
|
|
1394
|
+
message: `${merge.shadowedCount} overlay node row(s) shadowed by a same-id row admitted earlier; rows retained`
|
|
1395
1395
|
});
|
|
1396
1396
|
}
|
|
1397
1397
|
if (merge.duplicateEdgeCount > 0) {
|
|
@@ -1441,7 +1441,7 @@ function sessionCommitDiagnostics(tallies, danglingCount, danglingSamples = [])
|
|
|
1441
1441
|
severity: "warning",
|
|
1442
1442
|
count: danglingCount,
|
|
1443
1443
|
sampleIds: danglingSamples.slice(0, DIAGNOSTIC_SAMPLE_CAP),
|
|
1444
|
-
message: `${danglingCount} ingested edge(s) still awaiting an endpoint at commit (
|
|
1444
|
+
message: `${danglingCount} ingested edge(s) still awaiting an endpoint at commit (the endpoint was not ingested before the session committed)`
|
|
1445
1445
|
});
|
|
1446
1446
|
}
|
|
1447
1447
|
return out;
|
|
@@ -1571,7 +1571,7 @@ var IncrementalAlphaComposer = class {
|
|
|
1571
1571
|
bufB = null;
|
|
1572
1572
|
staleA = [];
|
|
1573
1573
|
staleB = [];
|
|
1574
|
-
/** Which buffer the NEXT nextBuffer
|
|
1574
|
+
/** Which buffer the NEXT nextBuffer call returns (0 = A, 1 = B). */
|
|
1575
1575
|
next = 0;
|
|
1576
1576
|
// --- seed key ---
|
|
1577
1577
|
seededBase = null;
|
|
@@ -1674,7 +1674,7 @@ var PressureSampler = class {
|
|
|
1674
1674
|
/**
|
|
1675
1675
|
* Record one onFrame tick. `settled` marks a tick that arrived while the
|
|
1676
1676
|
* scene was at rest (sim settled, no pending commit work) — the idle-
|
|
1677
|
-
* wakeup counter, which reads 0 when the
|
|
1677
|
+
* wakeup counter, which reads 0 when the gated activity clock is honest.
|
|
1678
1678
|
*/
|
|
1679
1679
|
noteFrame(timeMs, settled) {
|
|
1680
1680
|
this.frames += 1;
|
|
@@ -1844,7 +1844,7 @@ var DegradeController = class {
|
|
|
1844
1844
|
/**
|
|
1845
1845
|
* Resource-admission trigger: engage the NEXT not-yet-engaged step in the
|
|
1846
1846
|
* declared order. Null when the order is exhausted — the caller must then
|
|
1847
|
-
* REJECT before allocating
|
|
1847
|
+
* REJECT before allocating.
|
|
1848
1848
|
*/
|
|
1849
1849
|
engageNextResourceStep(visible) {
|
|
1850
1850
|
for (const step of this.limits.resourceDegradationOrder) {
|
|
@@ -2057,8 +2057,8 @@ var LinkPickIndex = class {
|
|
|
2057
2057
|
while (!r.done) r = it.next();
|
|
2058
2058
|
}
|
|
2059
2059
|
/**
|
|
2060
|
-
* Incremental build: yields whenever `now
|
|
2061
|
-
* scheduler can spread the work across idle frames
|
|
2060
|
+
* Incremental build: yields whenever `now − sliceStart ≥ budgetMs` so a
|
|
2061
|
+
* scheduler can spread the work across idle frames.
|
|
2062
2062
|
* Pure generator — no rAF/timers here; the caller owns scheduling.
|
|
2063
2063
|
*
|
|
2064
2064
|
* The previous grid stays armed and queryable until the new one commits on
|
|
@@ -2222,7 +2222,7 @@ var LinkPickIndex = class {
|
|
|
2222
2222
|
* Nearest link within `tolerance` (space units) of the space point
|
|
2223
2223
|
* `(x, y)`, or null. Scans the candidate cells covering the tolerance
|
|
2224
2224
|
* disc's bounding box (typically the 3×3 neighborhood; more when the
|
|
2225
|
-
* tolerance exceeds the cell size), applies the optional
|
|
2225
|
+
* tolerance exceeds the cell size), applies the optional visibility
|
|
2226
2226
|
* mask per candidate, then runs the exact point→segment distance test.
|
|
2227
2227
|
* Nearest wins; exact-distance ties break toward the LOWER link index.
|
|
2228
2228
|
* Returns null while unbuilt/invalidated (picking disarmed).
|
|
@@ -2374,7 +2374,7 @@ var EdgePickingFacade = class {
|
|
|
2374
2374
|
this.generation++;
|
|
2375
2375
|
this.index.invalidate();
|
|
2376
2376
|
}
|
|
2377
|
-
/**
|
|
2377
|
+
/** mask pass-through stub: applied per candidate at query time. */
|
|
2378
2378
|
setLinkVisibilityMask(mask) {
|
|
2379
2379
|
this.mask = mask;
|
|
2380
2380
|
}
|
|
@@ -2734,7 +2734,7 @@ function throwAborted2(signal, sourceId, targetId) {
|
|
|
2734
2734
|
const reason = signal.reason;
|
|
2735
2735
|
throw new OrbitOperationError(
|
|
2736
2736
|
reason === void 0 ? { code: "aborted" } : { code: "aborted", cause: reason },
|
|
2737
|
-
`local find('${sourceId}' \u2192 '${targetId}') aborted mid-scan
|
|
2737
|
+
`local find('${sourceId}' \u2192 '${targetId}') aborted mid-scan`
|
|
2738
2738
|
);
|
|
2739
2739
|
}
|
|
2740
2740
|
function createLocalPathService(getBase) {
|
|
@@ -2919,7 +2919,7 @@ function throwAborted3(signal, query) {
|
|
|
2919
2919
|
const reason = signal.reason;
|
|
2920
2920
|
throw new OrbitOperationError(
|
|
2921
2921
|
reason === void 0 ? { code: "aborted" } : { code: "aborted", cause: reason },
|
|
2922
|
-
`local search('${query}') aborted mid-scan
|
|
2922
|
+
`local search('${query}') aborted mid-scan`
|
|
2923
2923
|
);
|
|
2924
2924
|
}
|
|
2925
2925
|
function createLocalSearchService(getBase) {
|
|
@@ -3291,8 +3291,8 @@ var WorkerLane = class {
|
|
|
3291
3291
|
}
|
|
3292
3292
|
return this.availableState;
|
|
3293
3293
|
}
|
|
3294
|
-
/**
|
|
3295
|
-
*
|
|
3294
|
+
/** A constructed-but-dead worker must strand NOTHING: every pending
|
|
3295
|
+
* request rejects as 'worker-failed' so callers
|
|
3296
3296
|
* run their main-lane fallback, the lane goes permanently unavailable,
|
|
3297
3297
|
* and the unavailability callback fires (the instance one-shots it). */
|
|
3298
3298
|
fail(reason) {
|
|
@@ -3348,7 +3348,7 @@ var WorkerLane = class {
|
|
|
3348
3348
|
}
|
|
3349
3349
|
/** Abort everything in flight (epoch advance / detach / dataset swap).
|
|
3350
3350
|
* The ledger's controllers fire each pending promise's abort listener;
|
|
3351
|
-
* the sweep below catches anything tracked before a listener attached
|
|
3351
|
+
* the sweep below catches anything tracked before a listener attached
|
|
3352
3352
|
* rejects stay idempotent through the delete guard. */
|
|
3353
3353
|
abortAll() {
|
|
3354
3354
|
this.ledger.abortAll();
|
|
@@ -3817,7 +3817,7 @@ var MetricStore = class {
|
|
|
3817
3817
|
/** Admitted async columns by metric name; NaN encodes null. */
|
|
3818
3818
|
columns = /* @__PURE__ */ new Map();
|
|
3819
3819
|
degreePasses = 0;
|
|
3820
|
-
/**
|
|
3820
|
+
/** telemetry: estimated bytes of metric storage held. */
|
|
3821
3821
|
estimatedBytes() {
|
|
3822
3822
|
let bytes = 0;
|
|
3823
3823
|
for (const col of this.columns.values()) bytes += col.byteLength;
|
|
@@ -3848,10 +3848,10 @@ var MetricStore = class {
|
|
|
3848
3848
|
}
|
|
3849
3849
|
}
|
|
3850
3850
|
/**
|
|
3851
|
-
* Joins async metric columns against the accepted model
|
|
3851
|
+
* Joins async metric columns against the accepted model.
|
|
3852
3852
|
* Revision-gated PER COLUMN (I1): a column whose issue-time
|
|
3853
3853
|
* `forModelRevision` stamp differs from `opts.modelRevision` is discarded
|
|
3854
|
-
* (info diagnostic — a normal async race outcome
|
|
3854
|
+
* (info diagnostic — a normal async race outcome). A missing or
|
|
3855
3855
|
* mismatched stamp is never defaulted to the current revision — that
|
|
3856
3856
|
* would make the gate self-satisfying.
|
|
3857
3857
|
* Structural rejections ('index' length mismatch, missing/mismatched ids)
|
|
@@ -3869,7 +3869,7 @@ var MetricStore = class {
|
|
|
3869
3869
|
"info",
|
|
3870
3870
|
1,
|
|
3871
3871
|
[column.metric],
|
|
3872
|
-
`metric column '${column.metric}' discarded: computed for model revision ${String(column.forModelRevision)} but the update was issued at revision ${String(opts.modelRevision)}
|
|
3872
|
+
`metric column '${column.metric}' discarded: computed for model revision ${String(column.forModelRevision)} but the update was issued at revision ${String(opts.modelRevision)}`
|
|
3873
3873
|
)
|
|
3874
3874
|
);
|
|
3875
3875
|
continue;
|
|
@@ -3979,7 +3979,7 @@ var MetricStore = class {
|
|
|
3979
3979
|
}
|
|
3980
3980
|
/**
|
|
3981
3981
|
* Raw column in accepted-base order, or null when unavailable. NaN encodes
|
|
3982
|
-
* null
|
|
3982
|
+
* null — consumers exclude NaN slots from domains. Do NOT mutate:
|
|
3983
3983
|
* this is the live cache, not a copy.
|
|
3984
3984
|
*/
|
|
3985
3985
|
metricValues(metric) {
|
|
@@ -4025,7 +4025,7 @@ var MetricStore = class {
|
|
|
4025
4025
|
};
|
|
4026
4026
|
|
|
4027
4027
|
// src/capabilityPolicy.ts
|
|
4028
|
-
var CLUSTER_FORCE_DEGRADATION_REASON = "clusters requested but the engine capability record does not declare clusterForce; the cluster force is inert while membership, cluster labels, and centroids still work
|
|
4028
|
+
var CLUSTER_FORCE_DEGRADATION_REASON = "clusters requested but the engine capability record does not declare clusterForce; the cluster force is inert while membership, cluster labels, and centroids still work";
|
|
4029
4029
|
function degradation(feature, reason) {
|
|
4030
4030
|
return Object.freeze({ feature, reason });
|
|
4031
4031
|
}
|
|
@@ -4038,7 +4038,7 @@ function resolveEnginePolicy(capabilities, requested) {
|
|
|
4038
4038
|
degradations.push(
|
|
4039
4039
|
degradation(
|
|
4040
4040
|
"edgeArrows",
|
|
4041
|
-
"edgeArrows requested but the engine capability record does not declare edgeArrows; the prop is inert
|
|
4041
|
+
"edgeArrows requested but the engine capability record does not declare edgeArrows; the prop is inert"
|
|
4042
4042
|
)
|
|
4043
4043
|
);
|
|
4044
4044
|
}
|
|
@@ -4046,7 +4046,7 @@ function resolveEnginePolicy(capabilities, requested) {
|
|
|
4046
4046
|
degradations.push(
|
|
4047
4047
|
degradation(
|
|
4048
4048
|
"images",
|
|
4049
|
-
"node images requested but the engine capability record does not declare pointImages; placeholder glyphs render and image refs are retained
|
|
4049
|
+
"node images requested but the engine capability record does not declare pointImages; placeholder glyphs render and image refs are retained"
|
|
4050
4050
|
)
|
|
4051
4051
|
);
|
|
4052
4052
|
}
|
|
@@ -4069,14 +4069,14 @@ function assertCapabilityMethodParity(engine) {
|
|
|
4069
4069
|
const mismatches = [];
|
|
4070
4070
|
const capabilities = engine.capabilities;
|
|
4071
4071
|
if (capabilities === null || typeof capabilities !== "object") {
|
|
4072
|
-
mismatches.push("engine.capabilities is missing or not an object
|
|
4072
|
+
mismatches.push("engine.capabilities is missing or not an object");
|
|
4073
4073
|
return mismatches;
|
|
4074
4074
|
}
|
|
4075
4075
|
const caps = capabilities;
|
|
4076
4076
|
const getPositions = engine.getPositions;
|
|
4077
4077
|
if (caps.trackedPositions === true && typeof getPositions !== "function") {
|
|
4078
4078
|
mismatches.push(
|
|
4079
|
-
"capabilities.trackedPositions is declared but engine.getPositions is absent
|
|
4079
|
+
"capabilities.trackedPositions is declared but engine.getPositions is absent"
|
|
4080
4080
|
);
|
|
4081
4081
|
}
|
|
4082
4082
|
return mismatches;
|
|
@@ -4163,7 +4163,7 @@ var ImageAtlasPipeline = class {
|
|
|
4163
4163
|
generation = null;
|
|
4164
4164
|
flushScheduled = false;
|
|
4165
4165
|
disposed = false;
|
|
4166
|
-
/**
|
|
4166
|
+
/** Evicted-entry bitmaps awaiting close — closed AFTER the
|
|
4167
4167
|
* flush that carries their removeSlots, so the instance's recovery-replay
|
|
4168
4168
|
* map (pruned synchronously in the batch callback) can never re-send a
|
|
4169
4169
|
* closed bitmap. */
|
|
@@ -4397,7 +4397,7 @@ var ImageAtlasPipeline = class {
|
|
|
4397
4397
|
return index;
|
|
4398
4398
|
}
|
|
4399
4399
|
/**
|
|
4400
|
-
*
|
|
4400
|
+
* Roster-atomic resource mappings: the SYNCHRONOUS point→slot
|
|
4401
4401
|
* mapping for the last requested roster — a slot appears only when its ref
|
|
4402
4402
|
* is resolved AND the engine has already received the bitmap (delivered);
|
|
4403
4403
|
* pending, failed, evicted, and reused-but-undelivered refs are the −1
|
|
@@ -4477,12 +4477,12 @@ var SoftMask = class {
|
|
|
4477
4477
|
edgeHideLane;
|
|
4478
4478
|
edgeDimLane;
|
|
4479
4479
|
sources = /* @__PURE__ */ new Set();
|
|
4480
|
-
/** Dedicated internal source implementing the
|
|
4480
|
+
/** Dedicated internal source implementing the node→edge cascade. */
|
|
4481
4481
|
cascadeSource = null;
|
|
4482
4482
|
overflowedFlag = false;
|
|
4483
4483
|
/** Total memberships currently held across all sources and lanes. */
|
|
4484
4484
|
totalHeld = 0;
|
|
4485
|
-
/**
|
|
4485
|
+
/** O(Δ) op counters. */
|
|
4486
4486
|
statsBox = {
|
|
4487
4487
|
slotsVisited: 0,
|
|
4488
4488
|
zeroCrossings: 0,
|
|
@@ -4505,12 +4505,12 @@ var SoftMask = class {
|
|
|
4505
4505
|
return this.edgeCap;
|
|
4506
4506
|
}
|
|
4507
4507
|
/** One-time latch: some counter hit 0xFFFF and an increment was dropped.
|
|
4508
|
-
* Counts may drift afterwards; the caller reports it
|
|
4508
|
+
* Counts may drift afterwards; the caller reports it. */
|
|
4509
4509
|
get overflowed() {
|
|
4510
4510
|
return this.overflowedFlag;
|
|
4511
4511
|
}
|
|
4512
4512
|
// Live counter columns (read-only views by convention — do not mutate;
|
|
4513
|
-
// references are replaced on grow
|
|
4513
|
+
// references are replaced on grow).
|
|
4514
4514
|
get nodeHideFailures() {
|
|
4515
4515
|
return this.nodeHideLane.counters;
|
|
4516
4516
|
}
|
|
@@ -4525,7 +4525,7 @@ var SoftMask = class {
|
|
|
4525
4525
|
}
|
|
4526
4526
|
/**
|
|
4527
4527
|
* Grows capacities for structure changes (existing slot state is
|
|
4528
|
-
* preserved; new slots start fully visible). Capacities never shrink
|
|
4528
|
+
* preserved; new slots start fully visible). Capacities never shrink
|
|
4529
4529
|
* a smaller value is a no-op for that dimension.
|
|
4530
4530
|
*/
|
|
4531
4531
|
grow(nodeCapacity, edgeCapacity) {
|
|
@@ -4550,7 +4550,7 @@ var SoftMask = class {
|
|
|
4550
4550
|
this.edgeCap = edgeCapacity;
|
|
4551
4551
|
}
|
|
4552
4552
|
}
|
|
4553
|
-
/** Registers a new failure source. No cap on source count
|
|
4553
|
+
/** Registers a new failure source. No cap on source count. */
|
|
4554
4554
|
acquire(name) {
|
|
4555
4555
|
const state = {
|
|
4556
4556
|
name,
|
|
@@ -4605,11 +4605,11 @@ var SoftMask = class {
|
|
|
4605
4605
|
};
|
|
4606
4606
|
}
|
|
4607
4607
|
/**
|
|
4608
|
-
*
|
|
4608
|
+
* edge cascade over the mask lane: recomputes, from the CURRENT node
|
|
4609
4609
|
* hide lane, the set of edges with at least one hidden endpoint, and feeds
|
|
4610
4610
|
* it to the dedicated internal cascade source (edge hide lane only).
|
|
4611
|
-
* `links` is the flat `[src0, tgt0, src1, tgt1, …]` node-slot pair buffer
|
|
4612
|
-
*
|
|
4611
|
+
* `links` is the flat `[src0, tgt0, src1, tgt1, …]` node-slot pair buffer;
|
|
4612
|
+
* edge slot i has endpoints at links[2i]/[2i+1].
|
|
4613
4613
|
* O(E) scan per call — typically once per drain — but only edges whose
|
|
4614
4614
|
* cascade state changed produce counter deltas (and thus dirty entries).
|
|
4615
4615
|
* Edges beyond `links.length / 2` are treated as having no hidden
|
|
@@ -4640,11 +4640,11 @@ var SoftMask = class {
|
|
|
4640
4640
|
}
|
|
4641
4641
|
if (hide[source] !== 0 || hide[target] !== 0) failing.push(i);
|
|
4642
4642
|
}
|
|
4643
|
-
this.cascadeSource ??= this.acquire("
|
|
4643
|
+
this.cascadeSource ??= this.acquire("node\u2192edge cascade");
|
|
4644
4644
|
this.cascadeSource.setEdgeFailures(failing);
|
|
4645
4645
|
}
|
|
4646
4646
|
/**
|
|
4647
|
-
* O(incident-edges) delta form of the
|
|
4647
|
+
* O(incident-edges) delta form of the cascade: for each node
|
|
4648
4648
|
* whose HIDE visibility crossed zero, recompute only its incident edges'
|
|
4649
4649
|
* cascade state from the CURRENT node counters and apply the delta through
|
|
4650
4650
|
* the same internal cascade source the full form uses — the two compose
|
|
@@ -4656,7 +4656,7 @@ var SoftMask = class {
|
|
|
4656
4656
|
applyNodeCascadeToEdgesDelta(links, incidence, crossedNodes) {
|
|
4657
4657
|
if (crossedNodes.length === 0) return;
|
|
4658
4658
|
const hide = this.nodeHideLane.counters;
|
|
4659
|
-
this.cascadeSource ??= this.acquire("
|
|
4659
|
+
this.cascadeSource ??= this.acquire("node\u2192edge cascade");
|
|
4660
4660
|
const nowFailing = [];
|
|
4661
4661
|
const nowClear = [];
|
|
4662
4662
|
for (let k = 0; k < crossedNodes.length; k++) {
|
|
@@ -4686,7 +4686,7 @@ var SoftMask = class {
|
|
|
4686
4686
|
edgeVisibleCount: this.edgeHideLane.zeroCount
|
|
4687
4687
|
};
|
|
4688
4688
|
}
|
|
4689
|
-
/**
|
|
4689
|
+
/** telemetry: estimated bytes of mask storage held:
|
|
4690
4690
|
* four counter lanes (+pending trackers) and per-source flag columns. */
|
|
4691
4691
|
estimatedBytes() {
|
|
4692
4692
|
let bytes = 0;
|
|
@@ -4698,7 +4698,7 @@ var SoftMask = class {
|
|
|
4698
4698
|
}
|
|
4699
4699
|
return bytes;
|
|
4700
4700
|
}
|
|
4701
|
-
/**
|
|
4701
|
+
/** O(Δ) op counters (live object — snapshot before comparing). */
|
|
4702
4702
|
get stats() {
|
|
4703
4703
|
return this.statsBox;
|
|
4704
4704
|
}
|
|
@@ -4720,7 +4720,7 @@ var SoftMask = class {
|
|
|
4720
4720
|
isEdgeVisible(index) {
|
|
4721
4721
|
return this.edgeHideLane.counters[index] === 0;
|
|
4722
4722
|
}
|
|
4723
|
-
/** Dimmed iff visible AND dimFailures > 0
|
|
4723
|
+
/** Dimmed iff visible AND dimFailures > 0. */
|
|
4724
4724
|
isNodeDimmed(index) {
|
|
4725
4725
|
return this.isNodeVisible(index) && (this.nodeDimLane.counters[index] ?? 0) > 0;
|
|
4726
4726
|
}
|
|
@@ -4781,7 +4781,7 @@ var SoftMask = class {
|
|
|
4781
4781
|
mem.holes = 0;
|
|
4782
4782
|
}
|
|
4783
4783
|
/**
|
|
4784
|
-
* O(Δ) delta ops on one lane membership
|
|
4784
|
+
* O(Δ) delta ops on one lane membership. Adds and removes are
|
|
4785
4785
|
* idempotent per slot (adding a member / removing a non-member is a
|
|
4786
4786
|
* no-op); removed slots leave HOLES in `list` (compacted past 50%), so
|
|
4787
4787
|
* replace/clear passes must honor the bit0 guard above. `crossings`, when
|
|
@@ -4882,7 +4882,7 @@ var SoftMask = class {
|
|
|
4882
4882
|
this.applyMembership(this.edgeDimLane, state.edgeDim, null);
|
|
4883
4883
|
}
|
|
4884
4884
|
/** Debug balanced-increment assert: whenever no source holds any
|
|
4885
|
-
* membership, every counter must read zero (skipped once overflowed
|
|
4885
|
+
* membership, every counter must read zero (skipped once overflowed
|
|
4886
4886
|
* clamped increments legitimately drift the books). */
|
|
4887
4887
|
assertBalancedIfIdle() {
|
|
4888
4888
|
if (!DEBUG || this.overflowedFlag || this.totalHeld !== 0) return;
|
|
@@ -4904,7 +4904,7 @@ var SVG_MAX_ELEMENTS_DEFAULT = 5e4;
|
|
|
4904
4904
|
var SvgBudgetError = class extends Error {
|
|
4905
4905
|
constructor(elementCount, limit) {
|
|
4906
4906
|
super(
|
|
4907
|
-
`SVG export of ${elementCount} elements exceeds the ${limit}-element budget \u2014 filter/isolate first, or use the raster-hybrid fallback
|
|
4907
|
+
`SVG export of ${elementCount} elements exceeds the ${limit}-element budget \u2014 filter/isolate first, or use the raster-hybrid fallback`
|
|
4908
4908
|
);
|
|
4909
4909
|
this.elementCount = elementCount;
|
|
4910
4910
|
this.limit = limit;
|
|
@@ -5264,7 +5264,7 @@ function upperBound(values, sorted, target) {
|
|
|
5264
5264
|
return lo;
|
|
5265
5265
|
}
|
|
5266
5266
|
var TypedColumnCrossfilter = class {
|
|
5267
|
-
/** Test instrumentation; see CrossfilterStats. Reset with resetStats
|
|
5267
|
+
/** Test instrumentation; see CrossfilterStats. Reset with resetStats. */
|
|
5268
5268
|
stats = {
|
|
5269
5269
|
slotsWalked: 0,
|
|
5270
5270
|
fullSorts: 0,
|
|
@@ -5272,7 +5272,7 @@ var TypedColumnCrossfilter = class {
|
|
|
5272
5272
|
binUpdates: 0,
|
|
5273
5273
|
filteredRecomputes: 0
|
|
5274
5274
|
};
|
|
5275
|
-
/** Count of dims whose filtered layer is live-maintained
|
|
5275
|
+
/** Count of dims whose filtered layer is live-maintained. */
|
|
5276
5276
|
liveDims = 0;
|
|
5277
5277
|
dims = [];
|
|
5278
5278
|
byKey = /* @__PURE__ */ new Map();
|
|
@@ -5298,7 +5298,7 @@ var TypedColumnCrossfilter = class {
|
|
|
5298
5298
|
this.stats.binUpdates = 0;
|
|
5299
5299
|
this.stats.filteredRecomputes = 0;
|
|
5300
5300
|
}
|
|
5301
|
-
/**
|
|
5301
|
+
/** telemetry: estimated bytes of typed-column storage held.
|
|
5302
5302
|
* Documented components: per-dim value/permutation/bin/code/pass arrays,
|
|
5303
5303
|
* the global failure counter, and the external mask. */
|
|
5304
5304
|
estimatedBytes() {
|
|
@@ -5313,7 +5313,7 @@ var TypedColumnCrossfilter = class {
|
|
|
5313
5313
|
}
|
|
5314
5314
|
return bytes;
|
|
5315
5315
|
}
|
|
5316
|
-
/**
|
|
5316
|
+
/** live-layer bookkeeping — the ONLY writer of `filteredLive`. */
|
|
5317
5317
|
setFilteredLive(dim, live) {
|
|
5318
5318
|
if (dim.filteredLive === live) return;
|
|
5319
5319
|
dim.filteredLive = live;
|
|
@@ -5376,8 +5376,8 @@ var TypedColumnCrossfilter = class {
|
|
|
5376
5376
|
}
|
|
5377
5377
|
/**
|
|
5378
5378
|
* External node-mask predicate for the joint "filtered" second layer (the
|
|
5379
|
-
* instance wires the
|
|
5380
|
-
* never selection visibility. Length must equal rowCount
|
|
5379
|
+
* instance wires the filter-prop node mask in). Affects summaries only,
|
|
5380
|
+
* never selection visibility. Length must equal rowCount. Notifies on
|
|
5381
5381
|
* observable change; does NOT advance selectionRevision.
|
|
5382
5382
|
*/
|
|
5383
5383
|
setExternalMask(passSlots) {
|
|
@@ -5402,7 +5402,7 @@ var TypedColumnCrossfilter = class {
|
|
|
5402
5402
|
this.notify();
|
|
5403
5403
|
}
|
|
5404
5404
|
/**
|
|
5405
|
-
* Immutable summary. The filtered layer is recomputed lazily when dirty
|
|
5405
|
+
* Immutable summary. The filtered layer is recomputed lazily when dirty
|
|
5406
5406
|
* O(rows) per dirty summarize (v0.7 tier; see module doc). Returned objects
|
|
5407
5407
|
* are frozen and never mutated by later operations.
|
|
5408
5408
|
*/
|
|
@@ -5454,7 +5454,7 @@ var TypedColumnCrossfilter = class {
|
|
|
5454
5454
|
return Object.freeze(domain !== void 0 ? { ...base, domain } : base);
|
|
5455
5455
|
}
|
|
5456
5456
|
/**
|
|
5457
|
-
* Incrementally extend columns with new rows
|
|
5457
|
+
* Incrementally extend columns with new rows: no full
|
|
5458
5458
|
* rebuild, no full re-argsort — the pre-sorted old permutation merges with
|
|
5459
5459
|
* the sorted new block. Brushes stay by key and are applied to the NEW slots
|
|
5460
5460
|
* only; the returned delta covers only new slots. Keeps selectionRevision;
|
|
@@ -5708,16 +5708,16 @@ var TypedColumnCrossfilter = class {
|
|
|
5708
5708
|
}
|
|
5709
5709
|
}
|
|
5710
5710
|
/**
|
|
5711
|
-
*
|
|
5711
|
+
* inline maintenance of LIVE filtered layers, dispatched from the
|
|
5712
5712
|
* one place that knows the failCount transition. `boundary` is the
|
|
5713
5713
|
* other-failures picture at the interesting side of the flip (after for
|
|
5714
5714
|
* shown, before for hidden):
|
|
5715
|
-
*
|
|
5716
|
-
*
|
|
5717
|
-
*
|
|
5718
|
-
*
|
|
5719
|
-
*
|
|
5720
|
-
*
|
|
5715
|
+
* - 0 → the slot crossed the FULLY-VISIBLE boundary: every other live
|
|
5716
|
+
* layer counts it (own layers ignore the own-dim brush, so the brushed
|
|
5717
|
+
* dim's layer is provably unchanged by its own flip);
|
|
5718
|
+
* - 1 → exactly one OTHER dim still fails the slot: only that dim's
|
|
5719
|
+
* what-if-I-cleared-mine layer flips;
|
|
5720
|
+
* - ≥2 → no layer can change.
|
|
5721
5721
|
* External-mask-excluded and hygiene-invalid slots contribute nothing
|
|
5722
5722
|
* either way and are skipped.
|
|
5723
5723
|
*/
|
|
@@ -6022,7 +6022,7 @@ function assertSerializable(value, slice) {
|
|
|
6022
6022
|
switch (typeof v) {
|
|
6023
6023
|
case "function":
|
|
6024
6024
|
throw new TypeError(
|
|
6025
|
-
`history command for slice "${slice}" carries a function at ${path} \u2014 commands are value diffs, not closures
|
|
6025
|
+
`history command for slice "${slice}" carries a function at ${path} \u2014 commands are value diffs, not closures`
|
|
6026
6026
|
);
|
|
6027
6027
|
case "symbol":
|
|
6028
6028
|
case "bigint":
|
|
@@ -6037,7 +6037,7 @@ function assertSerializable(value, slice) {
|
|
|
6037
6037
|
if (v === null) return;
|
|
6038
6038
|
if (v instanceof Map || v instanceof Set) {
|
|
6039
6039
|
throw new TypeError(
|
|
6040
|
-
`history command for slice "${slice}" carries a ${v instanceof Map ? "Map" : "Set"} at ${path} \u2014 convert to arrays/objects before recording
|
|
6040
|
+
`history command for slice "${slice}" carries a ${v instanceof Map ? "Map" : "Set"} at ${path} \u2014 convert to arrays/objects before recording`
|
|
6041
6041
|
);
|
|
6042
6042
|
}
|
|
6043
6043
|
if (seen.has(v)) {
|
|
@@ -6059,7 +6059,7 @@ var HistoryKernel = class {
|
|
|
6059
6059
|
debug;
|
|
6060
6060
|
undoStack = [];
|
|
6061
6061
|
redoStack = [];
|
|
6062
|
-
/** Nested begin
|
|
6062
|
+
/** Nested begin joins the outer transaction (depth-counted). */
|
|
6063
6063
|
txDepth = 0;
|
|
6064
6064
|
txCommands = [];
|
|
6065
6065
|
txLabel;
|
|
@@ -6125,7 +6125,7 @@ var HistoryKernel = class {
|
|
|
6125
6125
|
}
|
|
6126
6126
|
this.pushEntry({ label: void 0, commands: [command] }, null);
|
|
6127
6127
|
}
|
|
6128
|
-
/** Close a transaction; the outermost end
|
|
6128
|
+
/** Close a transaction; the outermost end pushes one stack entry. */
|
|
6129
6129
|
end() {
|
|
6130
6130
|
if (!this.enabled) return;
|
|
6131
6131
|
if (this.txDepth === 0) throw new Error("HistoryKernel.end() without a matching begin()");
|
|
@@ -6395,7 +6395,7 @@ function createGraphInstance(opts) {
|
|
|
6395
6395
|
if (accepted === null) {
|
|
6396
6396
|
throw new OrbitOperationError(
|
|
6397
6397
|
{ code: "aborted", cause: "no accepted base" },
|
|
6398
|
-
"expansion requires an accepted base dataset
|
|
6398
|
+
"expansion requires an accepted base dataset"
|
|
6399
6399
|
);
|
|
6400
6400
|
}
|
|
6401
6401
|
return { accepted, adjacency: acceptedAdjacencyOf() };
|
|
@@ -6628,7 +6628,7 @@ function createGraphInstance(opts) {
|
|
|
6628
6628
|
severity: "error",
|
|
6629
6629
|
count: 1,
|
|
6630
6630
|
sampleIds: [],
|
|
6631
|
-
message: "columnar snapshot mutated while worker acceptance was pending \u2014 rejected whole (
|
|
6631
|
+
message: "columnar snapshot mutated while worker acceptance was pending \u2014 rejected whole (source coordinates are immutable; publish a new sourceRevision)"
|
|
6632
6632
|
}
|
|
6633
6633
|
];
|
|
6634
6634
|
publish({ diagnostics: composeDiagnostics() });
|
|
@@ -6662,7 +6662,7 @@ function createGraphInstance(opts) {
|
|
|
6662
6662
|
severity: "error",
|
|
6663
6663
|
count: 1,
|
|
6664
6664
|
sampleIds: [],
|
|
6665
|
-
message: "columnar snapshot mutated while worker acceptance was pending \u2014 rejected whole (
|
|
6665
|
+
message: "columnar snapshot mutated while worker acceptance was pending \u2014 rejected whole (source coordinates are immutable; publish a new sourceRevision)"
|
|
6666
6666
|
}
|
|
6667
6667
|
];
|
|
6668
6668
|
publish({ diagnostics: composeDiagnostics() });
|
|
@@ -6754,7 +6754,7 @@ function createGraphInstance(opts) {
|
|
|
6754
6754
|
if (event.engaged && !capLabelsNudged) {
|
|
6755
6755
|
capLabelsNudged = true;
|
|
6756
6756
|
console.warn(
|
|
6757
|
-
"orbit: cap-dom-labels engaged \u2014 DOM labels are hard-capped at the label budget above limits.domLabelNodes visible nodes
|
|
6757
|
+
"orbit: cap-dom-labels engaged \u2014 DOM labels are hard-capped at the label budget above limits.domLabelNodes visible nodes. A GPU label lane (labelStrategy 'sdf') is the planned scale path."
|
|
6758
6758
|
);
|
|
6759
6759
|
}
|
|
6760
6760
|
scheduleViewportRerank();
|
|
@@ -7407,7 +7407,7 @@ function createGraphInstance(opts) {
|
|
|
7407
7407
|
severity: "warning",
|
|
7408
7408
|
count: errorCount,
|
|
7409
7409
|
sampleIds: samples,
|
|
7410
|
-
message: `filter predicate threw for ${errorCount} item(s); failing open \u2014 throwing predicates never hide data
|
|
7410
|
+
message: `filter predicate threw for ${errorCount} item(s); failing open \u2014 throwing predicates never hide data`
|
|
7411
7411
|
}
|
|
7412
7412
|
];
|
|
7413
7413
|
} else {
|
|
@@ -7918,7 +7918,7 @@ function createGraphInstance(opts) {
|
|
|
7918
7918
|
}
|
|
7919
7919
|
function requireCrossfilterEngine() {
|
|
7920
7920
|
if (crossfilterEngine === null) {
|
|
7921
|
-
throw new Error("crossfilter session is not available
|
|
7921
|
+
throw new Error("crossfilter session is not available; set the crossfilter prop first");
|
|
7922
7922
|
}
|
|
7923
7923
|
return crossfilterEngine;
|
|
7924
7924
|
}
|
|
@@ -7969,13 +7969,13 @@ function createGraphInstance(opts) {
|
|
|
7969
7969
|
const eng = crossfilterEngine;
|
|
7970
7970
|
if (eng === null) {
|
|
7971
7971
|
throw new TypeError(
|
|
7972
|
-
"playTimeline: the crossfilter prop must configure dimensions first
|
|
7972
|
+
"playTimeline: the crossfilter prop must configure dimensions first"
|
|
7973
7973
|
);
|
|
7974
7974
|
}
|
|
7975
7975
|
const summary = eng.summarize(key);
|
|
7976
7976
|
if (summary.kind === "categorical" || summary.domain === void 0) {
|
|
7977
7977
|
throw new TypeError(
|
|
7978
|
-
`playTimeline: dimension "${key}" must be numeric/temporal with a non-empty domain
|
|
7978
|
+
`playTimeline: dimension "${key}" must be numeric/temporal with a non-empty domain`
|
|
7979
7979
|
);
|
|
7980
7980
|
}
|
|
7981
7981
|
const { min, max } = summary.domain;
|
|
@@ -7997,7 +7997,7 @@ function createGraphInstance(opts) {
|
|
|
7997
7997
|
);
|
|
7998
7998
|
}
|
|
7999
7999
|
if (mode !== "sliding" && mode !== "cumulative") {
|
|
8000
|
-
throw new TypeError(`playTimeline: unsupported mode "${String(mode)}"
|
|
8000
|
+
throw new TypeError(`playTimeline: unsupported mode "${String(mode)}"`);
|
|
8001
8001
|
}
|
|
8002
8002
|
stopTimelineTimer();
|
|
8003
8003
|
timelineSessionSeq += 1;
|
|
@@ -8470,7 +8470,7 @@ function createGraphInstance(opts) {
|
|
|
8470
8470
|
severity: "warning",
|
|
8471
8471
|
count: overload,
|
|
8472
8472
|
sampleIds: [],
|
|
8473
|
-
message: `showLabelsFor exceeds tracked-label capacity; ${overload} forced label(s) omitted
|
|
8473
|
+
message: `showLabelsFor exceeds tracked-label capacity; ${overload} forced label(s) omitted`
|
|
8474
8474
|
}
|
|
8475
8475
|
];
|
|
8476
8476
|
diagsChanged = true;
|
|
@@ -8746,7 +8746,7 @@ function createGraphInstance(opts) {
|
|
|
8746
8746
|
severity: "warning",
|
|
8747
8747
|
count: state.streak,
|
|
8748
8748
|
sampleIds: [],
|
|
8749
|
-
message: `${channel} reprojected on ${state.streak} consecutive commits with identical sampled outputs \u2014 likely an inline lambda prop; hoist or memoize it
|
|
8749
|
+
message: `${channel} reprojected on ${state.streak} consecutive commits with identical sampled outputs \u2014 likely an inline lambda prop; hoist or memoize it`
|
|
8750
8750
|
}
|
|
8751
8751
|
];
|
|
8752
8752
|
}
|
|
@@ -9148,9 +9148,9 @@ function createGraphInstance(opts) {
|
|
|
9148
9148
|
nodeIds: orderByAcceptedBase(full.nodeIds, nodeIndexBase()),
|
|
9149
9149
|
edgeIds: orderByAcceptedBase(full.edgeIds, edgeIndexById),
|
|
9150
9150
|
// Group namespace: the raw full-state form stays TOLERANT (deduped,
|
|
9151
|
-
// not validated — pinned
|
|
9151
|
+
// not validated — pinned legacy behavior); ids that stop naming a
|
|
9152
9152
|
// resolved group prune through the ownership path whenever the groups
|
|
9153
|
-
// RESOLUTION changes
|
|
9153
|
+
// RESOLUTION changes. selectGroups is the validating
|
|
9154
9154
|
// mutator.
|
|
9155
9155
|
groupIds: dedupeFirstOccurrence(full.groupIds)
|
|
9156
9156
|
});
|
|
@@ -9429,7 +9429,7 @@ function createGraphInstance(opts) {
|
|
|
9429
9429
|
if (DEV) {
|
|
9430
9430
|
rejectGroupOp(
|
|
9431
9431
|
"warning",
|
|
9432
|
-
"groupNodes ignored: membership is derived and read-only under groupBy
|
|
9432
|
+
"groupNodes ignored: membership is derived and read-only under groupBy \u2014 change the groupBy accessor or remove it",
|
|
9433
9433
|
spec.id
|
|
9434
9434
|
);
|
|
9435
9435
|
}
|
|
@@ -9452,7 +9452,7 @@ function createGraphInstance(opts) {
|
|
|
9452
9452
|
if (DEV) {
|
|
9453
9453
|
rejectGroupOp(
|
|
9454
9454
|
"warning",
|
|
9455
|
-
"ungroup ignored: membership is derived and read-only under groupBy
|
|
9455
|
+
"ungroup ignored: membership is derived and read-only under groupBy \u2014 change the groupBy accessor or remove it",
|
|
9456
9456
|
groupId
|
|
9457
9457
|
);
|
|
9458
9458
|
}
|
|
@@ -9477,7 +9477,7 @@ function createGraphInstance(opts) {
|
|
|
9477
9477
|
if (DEV) {
|
|
9478
9478
|
rejectGroupOp(
|
|
9479
9479
|
"warning",
|
|
9480
|
-
"setGroupCollapsed ignored: groups and groupBy are both configured
|
|
9480
|
+
"setGroupCollapsed ignored: groups and groupBy are both configured \u2014 remove one",
|
|
9481
9481
|
groupId
|
|
9482
9482
|
);
|
|
9483
9483
|
}
|
|
@@ -9488,7 +9488,7 @@ function createGraphInstance(opts) {
|
|
|
9488
9488
|
if (DEV) {
|
|
9489
9489
|
rejectGroupOp(
|
|
9490
9490
|
"warning",
|
|
9491
|
-
`setGroupCollapsed ignored: no derived group '${groupId}' in the current derivation
|
|
9491
|
+
`setGroupCollapsed ignored: no derived group '${groupId}' in the current derivation`,
|
|
9492
9492
|
groupId
|
|
9493
9493
|
);
|
|
9494
9494
|
}
|
|
@@ -9702,7 +9702,7 @@ function createGraphInstance(opts) {
|
|
|
9702
9702
|
function invalidateReplaceSessions(owner) {
|
|
9703
9703
|
for (const s of [...openSessions]) {
|
|
9704
9704
|
if (s === owner || s.purpose !== "replace") continue;
|
|
9705
|
-
abortSessionInternal(s, "stale-base: the model changed outside the session
|
|
9705
|
+
abortSessionInternal(s, "stale-base: the model changed outside the session", false);
|
|
9706
9706
|
}
|
|
9707
9707
|
}
|
|
9708
9708
|
function abortAllSessions(except, cause) {
|
|
@@ -9771,7 +9771,7 @@ function createGraphInstance(opts) {
|
|
|
9771
9771
|
if (expansionHandles.size === 0 && expansionLedger.size === 0) return;
|
|
9772
9772
|
const err = new OrbitOperationError(
|
|
9773
9773
|
{ code: "aborted", cause: "dataset-changed" },
|
|
9774
|
-
"expansion aborted: the datasetKey changed
|
|
9774
|
+
"expansion aborted: the datasetKey changed"
|
|
9775
9775
|
);
|
|
9776
9776
|
for (const [requestId, handle] of expansionHandles) {
|
|
9777
9777
|
handle.abort(err);
|
|
@@ -9792,7 +9792,7 @@ function createGraphInstance(opts) {
|
|
|
9792
9792
|
scopeExtraIds.clear();
|
|
9793
9793
|
expansionOverlays.clear();
|
|
9794
9794
|
abortExpansionsForDatasetSwap();
|
|
9795
|
-
abortSearchFlight("dataset-changed", "search aborted: the datasetKey changed
|
|
9795
|
+
abortSearchFlight("dataset-changed", "search aborted: the datasetKey changed");
|
|
9796
9796
|
resetMaskState();
|
|
9797
9797
|
historyKernel.clear();
|
|
9798
9798
|
stopTimelineTimer();
|
|
@@ -9954,7 +9954,7 @@ function createGraphInstance(opts) {
|
|
|
9954
9954
|
const labelRerank = recomputeCandidates();
|
|
9955
9955
|
const patch = {
|
|
9956
9956
|
revisions,
|
|
9957
|
-
// Counts are ACCEPTED-MODEL counts; the scene may be scoped
|
|
9957
|
+
// Counts are ACCEPTED-MODEL counts; the scene may be scoped.
|
|
9958
9958
|
nodeCount: p.merged.nodes.length,
|
|
9959
9959
|
edgeCount: p.merged.edges.length,
|
|
9960
9960
|
diagnostics: composeDiagnostics()
|
|
@@ -10014,7 +10014,7 @@ function createGraphInstance(opts) {
|
|
|
10014
10014
|
cancelFlushTimer(rec);
|
|
10015
10015
|
return rejectOperation(
|
|
10016
10016
|
{ code: "overlay-id-conflict", overlayId: id },
|
|
10017
|
-
`overlayId '${id}' is already reserved by an open or committed overlay for this dataset
|
|
10017
|
+
`overlayId '${id}' is already reserved by an open or committed overlay for this dataset`
|
|
10018
10018
|
);
|
|
10019
10019
|
}
|
|
10020
10020
|
reservedOverlayIds.set(id, rec);
|
|
@@ -10086,14 +10086,14 @@ function createGraphInstance(opts) {
|
|
|
10086
10086
|
if (rec.atomic && queuedBytes > rec.maxPendingBytes) {
|
|
10087
10087
|
return rejectOperation(
|
|
10088
10088
|
{ code: "queue-overflow", queuedBytes, limit: rec.maxPendingBytes },
|
|
10089
|
-
`append(): atomic session would queue ${queuedBytes} bytes, exceeding its non-drainable budget of ${rec.maxPendingBytes}; the append was rejected and the session remains open
|
|
10089
|
+
`append(): atomic session would queue ${queuedBytes} bytes, exceeding its non-drainable budget of ${rec.maxPendingBytes}; the append was rejected and the session remains open`
|
|
10090
10090
|
);
|
|
10091
10091
|
}
|
|
10092
10092
|
const overflowLimit = rec.maxPendingBytes * INGEST_OVERFLOW_FACTOR;
|
|
10093
10093
|
if (bytes > overflowLimit) {
|
|
10094
10094
|
return rejectOperation(
|
|
10095
10095
|
{ code: "queue-overflow", queuedBytes: bytes, limit: overflowLimit },
|
|
10096
|
-
`append(): batch of ${bytes} bytes exceeds the absolute cap of ${overflowLimit}
|
|
10096
|
+
`append(): batch of ${bytes} bytes exceeds the absolute cap of ${overflowLimit}`
|
|
10097
10097
|
);
|
|
10098
10098
|
}
|
|
10099
10099
|
const counts = stageBatch(
|
|
@@ -10151,7 +10151,7 @@ function createGraphInstance(opts) {
|
|
|
10151
10151
|
};
|
|
10152
10152
|
}
|
|
10153
10153
|
const datasetChanged = baseAccepted !== null && baseAccepted.datasetKey !== rec.datasetKey;
|
|
10154
|
-
abortAllSessions(rec, "replaced: a replace session committed
|
|
10154
|
+
abortAllSessions(rec, "replaced: a replace session committed");
|
|
10155
10155
|
const overlaysCleared = clearOverlayState();
|
|
10156
10156
|
const newBase = baseFromContribution(rec.datasetKey, sourceRevision, c, []);
|
|
10157
10157
|
const commitDiags = sessionCommitDiagnostics(rec.tallies, newBase.pendingEdges.length);
|
|
@@ -10249,7 +10249,7 @@ function createGraphInstance(opts) {
|
|
|
10249
10249
|
code: "resource-limit",
|
|
10250
10250
|
detail: { reason: err instanceof Error ? err.message : String(err) }
|
|
10251
10251
|
},
|
|
10252
|
-
`commit() failed; session rolled back
|
|
10252
|
+
`commit() failed; session rolled back`
|
|
10253
10253
|
);
|
|
10254
10254
|
}
|
|
10255
10255
|
rec.state = "committed";
|
|
@@ -10273,16 +10273,16 @@ function createGraphInstance(opts) {
|
|
|
10273
10273
|
}
|
|
10274
10274
|
if (purpose === "replace") {
|
|
10275
10275
|
if (opts2.sourceRevision === void 0) {
|
|
10276
|
-
throw new TypeError("beginIngest: purpose:'replace' requires sourceRevision
|
|
10276
|
+
throw new TypeError("beginIngest: purpose:'replace' requires sourceRevision");
|
|
10277
10277
|
}
|
|
10278
10278
|
if (opts2.atomic === false) {
|
|
10279
10279
|
throw new TypeError(
|
|
10280
|
-
"beginIngest: replace sessions are always atomic \u2014 progressive replace frames would expose rows before their sourceRevision existed
|
|
10280
|
+
"beginIngest: replace sessions are always atomic \u2014 progressive replace frames would expose rows before their sourceRevision existed"
|
|
10281
10281
|
);
|
|
10282
10282
|
}
|
|
10283
10283
|
if (baseSource === "declarative") {
|
|
10284
10284
|
throw new TypeError(
|
|
10285
|
-
"beginIngest: purpose:'replace' is unavailable while a declarative data source is active; keep applying snapshots via applyHostUpdate, or use an overlay session
|
|
10285
|
+
"beginIngest: purpose:'replace' is unavailable while a declarative data source is active; keep applying snapshots via applyHostUpdate, or use an overlay session"
|
|
10286
10286
|
);
|
|
10287
10287
|
}
|
|
10288
10288
|
}
|
|
@@ -10297,7 +10297,7 @@ function createGraphInstance(opts) {
|
|
|
10297
10297
|
if (baseAccepted === null || baseAccepted.datasetKey !== opts2.datasetKey) {
|
|
10298
10298
|
throw new OrbitOperationError(
|
|
10299
10299
|
{ code: "stale-revision", expected: currentModel, actual: opts2.baseModelRevision },
|
|
10300
|
-
baseAccepted === null ? "beginIngest: overlay sessions require an accepted base dataset
|
|
10300
|
+
baseAccepted === null ? "beginIngest: overlay sessions require an accepted base dataset" : `beginIngest: overlay sessions must name the current datasetKey '${baseAccepted.datasetKey}', got '${opts2.datasetKey}'`
|
|
10301
10301
|
);
|
|
10302
10302
|
}
|
|
10303
10303
|
}
|
|
@@ -10306,7 +10306,7 @@ function createGraphInstance(opts) {
|
|
|
10306
10306
|
purpose,
|
|
10307
10307
|
datasetKey: opts2.datasetKey,
|
|
10308
10308
|
sourceRevision: opts2.sourceRevision ?? null,
|
|
10309
|
-
// replace is always atomic; overlays default atomic:true
|
|
10309
|
+
// replace is always atomic; overlays default atomic:true.
|
|
10310
10310
|
atomic: purpose === "replace" ? true : opts2.atomic ?? true,
|
|
10311
10311
|
overlayId,
|
|
10312
10312
|
maxFlushLatencyMs: opts2.maxFlushLatencyMs ?? INGEST_MAX_FLUSH_LATENCY_MS_DEFAULT,
|
|
@@ -10419,11 +10419,11 @@ function createGraphInstance(opts) {
|
|
|
10419
10419
|
pushServiceDiagnostic(
|
|
10420
10420
|
"service-aborted",
|
|
10421
10421
|
"info",
|
|
10422
|
-
`expansion result for '${id}' discarded before admission: ${why}
|
|
10422
|
+
`expansion result for '${id}' discarded before admission: ${why}`
|
|
10423
10423
|
);
|
|
10424
10424
|
throw new OrbitOperationError(
|
|
10425
10425
|
{ code: "aborted", cause: why },
|
|
10426
|
-
`expandNode('${id}') result discarded: ${why}
|
|
10426
|
+
`expandNode('${id}') result discarded: ${why}`
|
|
10427
10427
|
);
|
|
10428
10428
|
}
|
|
10429
10429
|
async function mergeExpansionSession(id, ctx, at, batches, provenance) {
|
|
@@ -10644,14 +10644,14 @@ function createGraphInstance(opts) {
|
|
|
10644
10644
|
expansionPromises.delete(id);
|
|
10645
10645
|
const err = new OrbitOperationError(
|
|
10646
10646
|
{ code: "aborted", cause: "collapsed" },
|
|
10647
|
-
`expandNode('${id}') aborted by retractExpansion()
|
|
10647
|
+
`expandNode('${id}') aborted by retractExpansion()`
|
|
10648
10648
|
);
|
|
10649
10649
|
expansionHandles.get(requestId)?.abort(err);
|
|
10650
10650
|
expansionRejectors.get(requestId)?.(err);
|
|
10651
10651
|
pushServiceDiagnostic(
|
|
10652
10652
|
"service-aborted",
|
|
10653
10653
|
"info",
|
|
10654
|
-
`pending expansion of '${id}' aborted by retractExpansion()
|
|
10654
|
+
`pending expansion of '${id}' aborted by retractExpansion()`
|
|
10655
10655
|
);
|
|
10656
10656
|
publish({ pendingExpansions: expansionLedger.ids() });
|
|
10657
10657
|
}
|
|
@@ -10858,14 +10858,14 @@ function createGraphInstance(opts) {
|
|
|
10858
10858
|
if (ctx.signal.aborted) {
|
|
10859
10859
|
throw new OrbitOperationError(
|
|
10860
10860
|
{ code: "aborted", cause: "superseded" },
|
|
10861
|
-
`search('${query}') was superseded before admission
|
|
10861
|
+
`search('${query}') was superseded before admission`
|
|
10862
10862
|
);
|
|
10863
10863
|
}
|
|
10864
10864
|
const denial = acceptanceQueue.admit(() => searchAdmissible(ctx, at));
|
|
10865
10865
|
if (denial !== null) {
|
|
10866
10866
|
throw new OrbitOperationError(
|
|
10867
10867
|
{ code: "aborted", cause: denial },
|
|
10868
|
-
`search('${query}') result discarded: ${denial}
|
|
10868
|
+
`search('${query}') result discarded: ${denial}`
|
|
10869
10869
|
);
|
|
10870
10870
|
}
|
|
10871
10871
|
if (accepted === null) return raw;
|
|
@@ -10896,7 +10896,7 @@ function createGraphInstance(opts) {
|
|
|
10896
10896
|
const at = revisionSnapshot();
|
|
10897
10897
|
const key = serviceCacheKey({
|
|
10898
10898
|
serviceId: "search",
|
|
10899
|
-
// `fields` is defensive insurance
|
|
10899
|
+
// `fields` is defensive insurance: searchIndex is
|
|
10900
10900
|
// construction-only (D7) so it cannot legitimately change, but keying
|
|
10901
10901
|
// it here guarantees a cached result can never outlive the field
|
|
10902
10902
|
// configuration it was computed under.
|
|
@@ -10910,7 +10910,7 @@ function createGraphInstance(opts) {
|
|
|
10910
10910
|
searchFlight = null;
|
|
10911
10911
|
const err = new OrbitOperationError(
|
|
10912
10912
|
{ code: "aborted", cause: "superseded" },
|
|
10913
|
-
`search('${query}') superseded the older in-flight query
|
|
10913
|
+
`search('${query}') superseded the older in-flight query`
|
|
10914
10914
|
);
|
|
10915
10915
|
flight.handle.abort(err);
|
|
10916
10916
|
flight.reject(err);
|
|
@@ -10976,7 +10976,7 @@ function createGraphInstance(opts) {
|
|
|
10976
10976
|
searchFlight = null;
|
|
10977
10977
|
const err = new OrbitOperationError(
|
|
10978
10978
|
{ code: "aborted", cause: "cleared" },
|
|
10979
|
-
"search cleared while in flight
|
|
10979
|
+
"search cleared while in flight"
|
|
10980
10980
|
);
|
|
10981
10981
|
flight.handle.abort(err);
|
|
10982
10982
|
flight.reject(err);
|
|
@@ -11043,7 +11043,7 @@ function createGraphInstance(opts) {
|
|
|
11043
11043
|
if (denial !== null) {
|
|
11044
11044
|
throw new OrbitOperationError(
|
|
11045
11045
|
{ code: "aborted", cause: "stale" },
|
|
11046
|
-
`findPath('${sourceId}' \u2192 '${targetId}') discarded: ${denial}
|
|
11046
|
+
`findPath('${sourceId}' \u2192 '${targetId}') discarded: ${denial}`
|
|
11047
11047
|
);
|
|
11048
11048
|
}
|
|
11049
11049
|
if (token !== pathSeq || result === null) return result;
|
|
@@ -11135,7 +11135,7 @@ function createGraphInstance(opts) {
|
|
|
11135
11135
|
findings.push(`mode: unknown filter mode '${String(spec.mode)}'`);
|
|
11136
11136
|
}
|
|
11137
11137
|
if (findings.length > 0) {
|
|
11138
|
-
throw new TypeError(`applyHostUpdate: invalid filter
|
|
11138
|
+
throw new TypeError(`applyHostUpdate: invalid filter: ${findings.join("; ")}`);
|
|
11139
11139
|
}
|
|
11140
11140
|
}
|
|
11141
11141
|
const prev = store.getState();
|
|
@@ -11175,7 +11175,7 @@ function createGraphInstance(opts) {
|
|
|
11175
11175
|
severity: "error",
|
|
11176
11176
|
count: issues.length,
|
|
11177
11177
|
sampleIds: issues.slice(0, DIAGNOSTIC_SAMPLE_CAP).map((i) => i.where),
|
|
11178
|
-
message: `columnar snapshot rejected whole
|
|
11178
|
+
message: `columnar snapshot rejected whole: ${issues[0].where} \u2014 ${issues[0].detail}`
|
|
11179
11179
|
}
|
|
11180
11180
|
];
|
|
11181
11181
|
columnarRejected = true;
|
|
@@ -11196,14 +11196,14 @@ function createGraphInstance(opts) {
|
|
|
11196
11196
|
const isReplay = baseAccepted !== null && baseAccepted.datasetKey === data.datasetKey && baseAccepted.sourceRevision === data.sourceRevision;
|
|
11197
11197
|
if (!isReplay) {
|
|
11198
11198
|
const nextAccepted = preAccepted ?? validateSnapshot(data);
|
|
11199
|
-
abortAllSessions(null, "replaced: a declarative snapshot was applied
|
|
11199
|
+
abortAllSessions(null, "replaced: a declarative snapshot was applied");
|
|
11200
11200
|
overlayIdsCleared = clearOverlayState();
|
|
11201
11201
|
datasetKeyChanged = baseAccepted !== null && baseAccepted.datasetKey !== data.datasetKey;
|
|
11202
11202
|
if (datasetKeyChanged) {
|
|
11203
11203
|
reconciler = new Reconciler();
|
|
11204
11204
|
engineDiags = [];
|
|
11205
11205
|
abortExpansionsForDatasetSwap();
|
|
11206
|
-
abortSearchFlight("dataset-changed", "search aborted: the datasetKey changed
|
|
11206
|
+
abortSearchFlight("dataset-changed", "search aborted: the datasetKey changed");
|
|
11207
11207
|
resetMaskState();
|
|
11208
11208
|
historyKernel.clear();
|
|
11209
11209
|
stopTimelineTimer();
|
|
@@ -11318,7 +11318,7 @@ function createGraphInstance(opts) {
|
|
|
11318
11318
|
severity: "error",
|
|
11319
11319
|
count: 1,
|
|
11320
11320
|
sampleIds: [],
|
|
11321
|
-
message: "groups and groupBy are mutually exclusive
|
|
11321
|
+
message: "groups and groupBy are mutually exclusive: NEITHER applies until the host removes one"
|
|
11322
11322
|
}
|
|
11323
11323
|
];
|
|
11324
11324
|
groupsDiagsChanged = true;
|
|
@@ -11356,7 +11356,7 @@ function createGraphInstance(opts) {
|
|
|
11356
11356
|
severity: "warning",
|
|
11357
11357
|
count: 1,
|
|
11358
11358
|
sampleIds: [],
|
|
11359
|
-
message: "parallelEdgeGrouping is inoperative: the accepted edge list has no same-endpoint-pair parallels (ids synthesized from (type,source,target)-style dedupe already collapse them) \u2014 the toggle changed nothing
|
|
11359
|
+
message: "parallelEdgeGrouping is inoperative: the accepted edge list has no same-endpoint-pair parallels (ids synthesized from (type,source,target)-style dedupe already collapse them) \u2014 the toggle changed nothing"
|
|
11360
11360
|
}
|
|
11361
11361
|
];
|
|
11362
11362
|
parallelRejected = true;
|
|
@@ -11436,7 +11436,7 @@ function createGraphInstance(opts) {
|
|
|
11436
11436
|
severity: "warning",
|
|
11437
11437
|
count: update.metrics.length,
|
|
11438
11438
|
sampleIds: update.metrics.slice(0, DIAGNOSTIC_SAMPLE_CAP).map((c) => c.metric),
|
|
11439
|
-
message: "metric columns discarded: no accepted model to join against
|
|
11439
|
+
message: "metric columns discarded: no accepted model to join against"
|
|
11440
11440
|
}
|
|
11441
11441
|
];
|
|
11442
11442
|
} else {
|
|
@@ -11445,7 +11445,7 @@ function createGraphInstance(opts) {
|
|
|
11445
11445
|
count: accepted.nodes.length,
|
|
11446
11446
|
// I1: columns must be stamped with the revision current at ISSUE
|
|
11447
11447
|
// time — never the post-update revision (that made the gate
|
|
11448
|
-
// self-satisfying
|
|
11448
|
+
// self-satisfying).
|
|
11449
11449
|
modelRevision: issuedModelSeq
|
|
11450
11450
|
});
|
|
11451
11451
|
metricDiags = res.diagnostics;
|
|
@@ -11582,7 +11582,7 @@ function createGraphInstance(opts) {
|
|
|
11582
11582
|
severity: "warning",
|
|
11583
11583
|
count: 1,
|
|
11584
11584
|
sampleIds: [],
|
|
11585
|
-
message: "searchIndex is construction-only
|
|
11585
|
+
message: "searchIndex is construction-only: pass it to createGraphInstance options (or key-remount <Graph>) \u2014 this update's searchIndex was ignored"
|
|
11586
11586
|
}
|
|
11587
11587
|
];
|
|
11588
11588
|
searchIndexRejected = true;
|
|
@@ -12019,9 +12019,9 @@ function createGraphInstance(opts) {
|
|
|
12019
12019
|
applyEmphasis(s.engine, node === null ? null : index);
|
|
12020
12020
|
emit("nodeHover", { node });
|
|
12021
12021
|
},
|
|
12022
|
-
//
|
|
12022
|
+
// native-route edge events. Host onLink* events are
|
|
12023
12023
|
// honored regardless of the committed route — an adapter that surfaces
|
|
12024
|
-
// them despite declaring linkPicking:false is a harmless pass-through
|
|
12024
|
+
// them despite declaring linkPicking:false is a harmless pass-through
|
|
12025
12025
|
// but only the 'native' route RELIES on them; the fallback route feeds
|
|
12026
12026
|
// the same typed events through the pointer samplers.
|
|
12027
12027
|
onLinkClick(linkIndex) {
|
|
@@ -12058,7 +12058,7 @@ function createGraphInstance(opts) {
|
|
|
12058
12058
|
const prevented = emit("nodeDragEnd", { node, x, y });
|
|
12059
12059
|
if (!prevented) writePin(node.id, [x, y]);
|
|
12060
12060
|
},
|
|
12061
|
-
//
|
|
12061
|
+
// Right-click or long-press → typed 'contextMenu' event. The
|
|
12062
12062
|
// core adds NO built-in follow-up — components own the menu.
|
|
12063
12063
|
onContextMenu(index, screen) {
|
|
12064
12064
|
if (!active()) return;
|
|
@@ -12072,7 +12072,7 @@ function createGraphInstance(opts) {
|
|
|
12072
12072
|
emit("contextMenu", { target: { kind: "node", node }, screen: screenPt });
|
|
12073
12073
|
},
|
|
12074
12074
|
/**
|
|
12075
|
-
*
|
|
12075
|
+
* Overlay scheduler tick (adapter activity clock). Per tick:
|
|
12076
12076
|
* (1) sim-hot degradation — while the simulation runs, ONE getPositions
|
|
12077
12077
|
* readback refreshes the CPU cache at a capped >=500ms cadence (M0:
|
|
12078
12078
|
* tracked readback stalls ~18ms, so the lane NEVER reads back per
|
|
@@ -12299,8 +12299,8 @@ function createGraphInstance(opts) {
|
|
|
12299
12299
|
route,
|
|
12300
12300
|
screenToSpace: (p) => eng.screenToSpace?.(p) ?? null,
|
|
12301
12301
|
medianLinkWidthPx: () => medianLinkWidthPx(lastLinkWidths),
|
|
12302
|
-
//
|
|
12303
|
-
//
|
|
12302
|
+
// the facade's per-candidate visibility mask reads the LIVE
|
|
12303
|
+
// mask — no re-arm needed on mask changes.
|
|
12304
12304
|
linkVisible: (linkIndex) => maskEdgeVisibleAt(linkIndex)
|
|
12305
12305
|
});
|
|
12306
12306
|
const restartAlpha = layout === "force" ? 1 : null;
|
|
@@ -12405,7 +12405,7 @@ function createGraphInstance(opts) {
|
|
|
12405
12405
|
if (g.requestAnimationFrame === wrapper) g.requestAnimationFrame = native;
|
|
12406
12406
|
if (registrations > 0 && !destroyed) {
|
|
12407
12407
|
console.warn(
|
|
12408
|
-
`orbit: ${registrations} requestAnimationFrame registration(s) observed over 500ms while this instance is quiescent
|
|
12408
|
+
`orbit: ${registrations} requestAnimationFrame registration(s) observed over 500ms while this instance is quiescent. If no app-owned animation is running, a second frame loop is leaking.`
|
|
12409
12409
|
);
|
|
12410
12410
|
}
|
|
12411
12411
|
}, 500);
|
|
@@ -12480,7 +12480,7 @@ function createGraphInstance(opts) {
|
|
|
12480
12480
|
function warnViewStateDrop(channel, why) {
|
|
12481
12481
|
if (!DEV || viewStateDropWarned.has(channel)) return;
|
|
12482
12482
|
viewStateDropWarned.add(channel);
|
|
12483
|
-
console.warn(`orbit: getViewState omitted ${channel} \u2014 ${why}
|
|
12483
|
+
console.warn(`orbit: getViewState omitted ${channel} \u2014 ${why}`);
|
|
12484
12484
|
}
|
|
12485
12485
|
function serializableScaleOf(channel, value) {
|
|
12486
12486
|
if (value === void 0) return void 0;
|
|
@@ -12597,7 +12597,7 @@ function createGraphInstance(opts) {
|
|
|
12597
12597
|
if (visible.length > limit) {
|
|
12598
12598
|
throw new OrbitOperationError(
|
|
12599
12599
|
{ code: "export-materialization-too-large", rowCount: visible.length, limit },
|
|
12600
|
-
`includePositions over ${limit} nodes \u2014 persist the layout through the export lane and reference it from dataRef
|
|
12600
|
+
`includePositions over ${limit} nodes \u2014 persist the layout through the export lane and reference it from dataRef`
|
|
12601
12601
|
);
|
|
12602
12602
|
}
|
|
12603
12603
|
const pos = eng.getPositions();
|
|
@@ -12697,7 +12697,7 @@ function createGraphInstance(opts) {
|
|
|
12697
12697
|
severity: "error",
|
|
12698
12698
|
count: verdict.problems.length,
|
|
12699
12699
|
sampleIds: [],
|
|
12700
|
-
message: `setViewState rejected (${verdict.code}): ${verdict.problems.slice(0, 3).join("; ")} \u2014 nothing was applied
|
|
12700
|
+
message: `setViewState rejected (${verdict.code}): ${verdict.problems.slice(0, 3).join("; ")} \u2014 nothing was applied`
|
|
12701
12701
|
}
|
|
12702
12702
|
];
|
|
12703
12703
|
pendingDiagnosticsRefresh = true;
|
|
@@ -12920,7 +12920,7 @@ function createGraphInstance(opts) {
|
|
|
12920
12920
|
if (eng2 === null || eng2.captureScreenshot === void 0) {
|
|
12921
12921
|
throw new OrbitOperationError(
|
|
12922
12922
|
{ code: "aborted", cause: "no screenshot capability" },
|
|
12923
|
-
'exportImage("png") requires an engine with screenshot capture
|
|
12923
|
+
'exportImage("png") requires an engine with screenshot capture'
|
|
12924
12924
|
);
|
|
12925
12925
|
}
|
|
12926
12926
|
const blob = await eng2.captureScreenshot();
|
|
@@ -12961,7 +12961,7 @@ function createGraphInstance(opts) {
|
|
|
12961
12961
|
if (elementCount > limit && opts2?.fallback !== "raster-hybrid") {
|
|
12962
12962
|
throw new OrbitOperationError(
|
|
12963
12963
|
{ code: "export-too-large", elementCount, limit },
|
|
12964
|
-
`SVG export of ${elementCount} elements exceeds ${limit} \u2014 filter/isolate first, or pass { fallback: 'raster-hybrid' }
|
|
12964
|
+
`SVG export of ${elementCount} elements exceeds ${limit} \u2014 filter/isolate first, or pass { fallback: 'raster-hybrid' }`
|
|
12965
12965
|
);
|
|
12966
12966
|
}
|
|
12967
12967
|
let minX = Infinity;
|
|
@@ -13092,7 +13092,7 @@ function createGraphInstance(opts) {
|
|
|
13092
13092
|
if (rowCount > limit) {
|
|
13093
13093
|
throw new OrbitOperationError(
|
|
13094
13094
|
{ code: "export-materialization-too-large", rowCount, limit },
|
|
13095
|
-
`exportData would materialize ${rowCount} rows (limit ${limit}) \u2014 use exportDataStream
|
|
13095
|
+
`exportData would materialize ${rowCount} rows (limit ${limit}) \u2014 use exportDataStream`
|
|
13096
13096
|
);
|
|
13097
13097
|
}
|
|
13098
13098
|
if (scope === "accepted") return { nodes: pin.accepted.nodes, edges: pin.accepted.edges };
|
|
@@ -13135,7 +13135,7 @@ function createGraphInstance(opts) {
|
|
|
13135
13135
|
if (bound > limit) {
|
|
13136
13136
|
throw new OrbitOperationError(
|
|
13137
13137
|
{ code: "export-materialization-too-large", rowCount: bound, limit },
|
|
13138
|
-
`exportLayout would materialize ${bound} rows (limit ${limit}) \u2014 use exportLayoutStream
|
|
13138
|
+
`exportLayout would materialize ${bound} rows (limit ${limit}) \u2014 use exportLayoutStream`
|
|
13139
13139
|
);
|
|
13140
13140
|
}
|
|
13141
13141
|
const out = /* @__PURE__ */ new Map();
|
|
@@ -13214,9 +13214,8 @@ function createGraphInstance(opts) {
|
|
|
13214
13214
|
visibleNodeCount: st.visible.nodes,
|
|
13215
13215
|
visibleEdgeCount: st.visible.edges,
|
|
13216
13216
|
estimatedCpuBytes: estimateCpuBytes(),
|
|
13217
|
-
// The acceptance queue is synchronous
|
|
13218
|
-
// reader inside a job observes 1
|
|
13219
|
-
// the worker lane (PR-E).
|
|
13217
|
+
// The acceptance queue is synchronous: depth is 0 outside a job, and a
|
|
13218
|
+
// reader inside a job observes 1.
|
|
13220
13219
|
queueDepth: acceptanceQueue.active ? 1 : 0,
|
|
13221
13220
|
modelRevision: st.revisions.model,
|
|
13222
13221
|
scopeRevision: st.revisions.scope,
|
|
@@ -13440,7 +13439,7 @@ var OverviewController = class {
|
|
|
13440
13439
|
getScene;
|
|
13441
13440
|
getVisible;
|
|
13442
13441
|
size;
|
|
13443
|
-
/** Transform of the LAST rasterization; null until rasterize
|
|
13442
|
+
/** Transform of the LAST rasterization; null until rasterize succeeds. */
|
|
13444
13443
|
frame = null;
|
|
13445
13444
|
// --- throttle state (latched by shouldRefresh when it answers true) ---
|
|
13446
13445
|
lastRefreshMs = null;
|
|
@@ -13455,9 +13454,9 @@ var OverviewController = class {
|
|
|
13455
13454
|
* when it returns true, so each `true` accounts for exactly one refresh:
|
|
13456
13455
|
*
|
|
13457
13456
|
* - hot (`simulationRunning`): time-gated only (≤ 2 Hz) — the epoch is
|
|
13458
|
-
*
|
|
13457
|
+
* ignored because positions change continuously without epoch advances;
|
|
13459
13458
|
* - idle: refresh only when the epoch ADVANCED since the last refresh,
|
|
13460
|
-
*
|
|
13459
|
+
* time-gated at ≤ 1 Hz;
|
|
13461
13460
|
* - idle + unchanged epoch: always false — zero work, forever.
|
|
13462
13461
|
*/
|
|
13463
13462
|
shouldRefresh(nowMs2, simulationRunning, epoch) {
|
|
@@ -13475,7 +13474,7 @@ var OverviewController = class {
|
|
|
13475
13474
|
/**
|
|
13476
13475
|
* Rasterizes the current scene into a fresh `size²` RGBA dot field: 1 px
|
|
13477
13476
|
* white dots whose alpha ACCUMULATES on overlap (heatmap-ish density),
|
|
13478
|
-
* dimmed for mask-hidden points; NaN pairs
|
|
13477
|
+
* dimmed for mask-hidden points; NaN pairs are skipped.
|
|
13479
13478
|
* World bounds map into the thumbnail with a 5 % edge padding at a UNIFORM
|
|
13480
13479
|
* scale (aspect preserved, centered on the short axis) and a downward pixel
|
|
13481
13480
|
* y (see module header). Returns null when there is no scene or no point.
|