react-state-basis 0.6.5 → 0.6.6
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-EJXGN76H.mjs → chunk-WMHY2C6D.mjs} +138 -85
- package/dist/chunk-WMHY2C6D.mjs.map +1 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +137 -84
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/integrations/zustand.js +137 -84
- package/dist/integrations/zustand.js.map +1 -1
- package/dist/integrations/zustand.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-EJXGN76H.mjs.map +0 -1
|
@@ -1,30 +1,89 @@
|
|
|
1
|
+
// src/core/constants.ts
|
|
2
|
+
var WINDOW_SIZE = 50;
|
|
3
|
+
var PAIR_RARITY_TARGET = 0.01;
|
|
4
|
+
var RELATIVE_OVERLAP_FLOOR = 0.65;
|
|
5
|
+
var LOOP_THRESHOLD = 150;
|
|
6
|
+
var VOLATILITY_THRESHOLD = 25;
|
|
7
|
+
var INSTANCE_SEP = "##";
|
|
8
|
+
|
|
1
9
|
// src/core/math.ts
|
|
2
|
-
var
|
|
10
|
+
var choose = (n, k) => {
|
|
11
|
+
if (k < 0 || k > n) return 0;
|
|
12
|
+
k = Math.min(k, n - k);
|
|
13
|
+
let result = 1;
|
|
14
|
+
for (let i = 0; i < k; i++) {
|
|
15
|
+
result = result * (n - i) / (i + 1);
|
|
16
|
+
}
|
|
17
|
+
return result;
|
|
18
|
+
};
|
|
19
|
+
var hypergeomPMF = (k, n1, m1, N) => {
|
|
20
|
+
const total = choose(N, n1);
|
|
21
|
+
if (total === 0) return 0;
|
|
22
|
+
return choose(m1, k) * choose(N - m1, n1 - k) / total;
|
|
23
|
+
};
|
|
24
|
+
var hypergeomUpperTailP = (kStart, n1, m1, N) => {
|
|
25
|
+
const kMax = Math.min(n1, m1);
|
|
26
|
+
let p = 0;
|
|
27
|
+
for (let k = Math.max(0, kStart); k <= kMax; k++) {
|
|
28
|
+
p += hypergeomPMF(k, n1, m1, N);
|
|
29
|
+
}
|
|
30
|
+
return p;
|
|
31
|
+
};
|
|
32
|
+
var minOverlapForRarity = (n1, m1, N, targetP) => {
|
|
33
|
+
const kMax = Math.min(n1, m1);
|
|
34
|
+
for (let k = 0; k <= kMax; k++) {
|
|
35
|
+
if (hypergeomUpperTailP(k, n1, m1, N) <= targetP) return k;
|
|
36
|
+
}
|
|
37
|
+
return kMax + 1;
|
|
38
|
+
};
|
|
39
|
+
var overlapThresholdCache = /* @__PURE__ */ new Map();
|
|
40
|
+
var getMinOverlap = (densityA, densityB, windowSize) => {
|
|
41
|
+
const lo = Math.min(densityA, densityB) | 0;
|
|
42
|
+
const hi = Math.max(densityA, densityB) | 0;
|
|
43
|
+
const key = `${lo}_${hi}_${windowSize}`;
|
|
44
|
+
let cached = overlapThresholdCache.get(key);
|
|
45
|
+
if (cached === void 0) {
|
|
46
|
+
const rare = minOverlapForRarity(lo, hi, windowSize, PAIR_RARITY_TARGET);
|
|
47
|
+
const floor = Math.ceil(RELATIVE_OVERLAP_FLOOR * lo);
|
|
48
|
+
cached = Math.max(rare, floor);
|
|
49
|
+
overlapThresholdCache.set(key, cached);
|
|
50
|
+
}
|
|
51
|
+
return cached;
|
|
52
|
+
};
|
|
53
|
+
var isSignificantOverlap = (overlap, densityA, densityB, windowSize) => {
|
|
54
|
+
if (densityA < 2 || densityB < 2) return false;
|
|
55
|
+
return overlap >= getMinOverlap(densityA, densityB, windowSize);
|
|
56
|
+
};
|
|
57
|
+
var countOverlapsCircular = (bufferA, headA, bufferB, headB) => {
|
|
3
58
|
const L = bufferA.length;
|
|
4
|
-
|
|
5
|
-
const
|
|
59
|
+
const offSync = ((headB - headA) % L + L) % L;
|
|
60
|
+
const offALeadsB = ((headB - headA + 1) % L + L) % L;
|
|
61
|
+
const offBLeadsA = ((headB - headA - 1) % L + L) % L;
|
|
62
|
+
let kSync = 0;
|
|
63
|
+
let kALeadsB = 0;
|
|
64
|
+
let kBLeadsA = 0;
|
|
65
|
+
let densityA = 0;
|
|
66
|
+
let densityB = 0;
|
|
6
67
|
for (let i = 0; i < L; i++) {
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
68
|
+
const a = bufferA[i] ? 1 : 0;
|
|
69
|
+
const b = bufferB[i] ? 1 : 0;
|
|
70
|
+
densityA += a;
|
|
71
|
+
densityB += b;
|
|
72
|
+
let iSync = i + offSync;
|
|
73
|
+
if (iSync >= L) iSync -= L;
|
|
74
|
+
let iALeadsB = i + offALeadsB;
|
|
75
|
+
if (iALeadsB >= L) iALeadsB -= L;
|
|
76
|
+
let iBLeadsA = i + offBLeadsA;
|
|
77
|
+
if (iBLeadsA >= L) iBLeadsA -= L;
|
|
78
|
+
if (a && bufferB[iSync]) kSync++;
|
|
79
|
+
if (a && bufferB[iALeadsB]) kALeadsB++;
|
|
80
|
+
if (a && bufferB[iBLeadsA]) kBLeadsA++;
|
|
16
81
|
}
|
|
17
|
-
|
|
18
|
-
return dot / (Math.sqrt(magA) * Math.sqrt(magB));
|
|
82
|
+
return { kSync, kALeadsB, kBLeadsA, densityA, densityB };
|
|
19
83
|
};
|
|
20
|
-
var
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
dot += A[i] * B[i];
|
|
24
|
-
magA += A[i] * A[i];
|
|
25
|
-
magB += B[i] * B[i];
|
|
26
|
-
}
|
|
27
|
-
return magA === 0 || magB === 0 ? 0 : dot / (Math.sqrt(magA) * Math.sqrt(magB));
|
|
84
|
+
var cosineFromOverlap = (overlap, densityA, densityB) => {
|
|
85
|
+
if (densityA <= 0 || densityB <= 0) return 0;
|
|
86
|
+
return overlap / Math.sqrt(densityA * densityB);
|
|
28
87
|
};
|
|
29
88
|
|
|
30
89
|
// src/core/graph.ts
|
|
@@ -83,13 +142,6 @@ var groupEventSources = (nodes, edges) => {
|
|
|
83
142
|
return groups.sort((a, b) => b.edges.length - a.edges.length || b.occurrences - a.occurrences);
|
|
84
143
|
};
|
|
85
144
|
|
|
86
|
-
// src/core/constants.ts
|
|
87
|
-
var WINDOW_SIZE = 50;
|
|
88
|
-
var SIMILARITY_THRESHOLD = 0.88;
|
|
89
|
-
var LOOP_THRESHOLD = 150;
|
|
90
|
-
var VOLATILITY_THRESHOLD = 25;
|
|
91
|
-
var INSTANCE_SEP = "##";
|
|
92
|
-
|
|
93
145
|
// src/core/label.ts
|
|
94
146
|
var stripInstance = (label) => {
|
|
95
147
|
const idx = label.indexOf(INSTANCE_SEP);
|
|
@@ -203,32 +255,22 @@ var LAST_LOG_TIMES = /* @__PURE__ */ new Map();
|
|
|
203
255
|
var LOG_COOLDOWN = 3e3;
|
|
204
256
|
var THEME = {
|
|
205
257
|
identity: "#6C5CE7",
|
|
206
|
-
// Purple (Brand)
|
|
207
258
|
problem: "#D63031",
|
|
208
|
-
// Red (Bugs)
|
|
209
259
|
solution: "#FBC531",
|
|
210
|
-
// Yellow (Fixes)
|
|
211
260
|
context: "#0984E3",
|
|
212
|
-
// Blue (Locations)
|
|
213
261
|
muted: "#9AA0A6",
|
|
214
|
-
// Gray (Metadata)
|
|
215
262
|
border: "#2E2E35",
|
|
216
263
|
success: "#00b894"
|
|
217
|
-
// Green (Good Score)
|
|
218
264
|
};
|
|
219
265
|
var STYLES = {
|
|
220
|
-
// Structure
|
|
221
266
|
basis: `background: ${THEME.identity}; color: white; font-weight: bold; padding: 2px 6px; border-radius: 3px;`,
|
|
222
267
|
headerIdentity: `background: ${THEME.identity}; color: white; font-weight: bold; padding: 4px 8px; border-radius: 4px;`,
|
|
223
268
|
headerProblem: `background: ${THEME.problem}; color: white; font-weight: bold; padding: 4px 8px; border-radius: 4px;`,
|
|
224
269
|
version: `background: #a29bfe; color: #2d3436; padding: 2px 6px; border-radius: 3px; margin-left: -4px;`,
|
|
225
|
-
// Actions
|
|
226
270
|
actionLabel: `color: ${THEME.solution}; font-weight: bold;`,
|
|
227
271
|
actionPill: `color: ${THEME.solution}; font-weight: bold; border: 1px solid ${THEME.solution}; padding: 0 4px; border-radius: 3px;`,
|
|
228
|
-
// Context
|
|
229
272
|
impactLabel: `color: ${THEME.context}; font-weight: bold;`,
|
|
230
273
|
location: `color: ${THEME.context}; font-family: monospace; font-weight: bold;`,
|
|
231
|
-
// Text
|
|
232
274
|
subText: `color: ${THEME.muted}; font-size: 11px;`,
|
|
233
275
|
bold: "font-weight: bold;",
|
|
234
276
|
label: "background: #dfe6e9; color: #2d3436; padding: 0 4px; border-radius: 3px; font-family: monospace; font-weight: bold; border: 1px solid #b2bec3;"
|
|
@@ -243,6 +285,15 @@ var shouldLog = (key) => {
|
|
|
243
285
|
return false;
|
|
244
286
|
};
|
|
245
287
|
var isBooleanLike = (name) => /^(is|has|can|should|did|will|show|hide)(?=[A-Z_])/.test(name);
|
|
288
|
+
var areSyncSignificant = (metaA, metaB) => {
|
|
289
|
+
const { kSync, densityA, densityB } = countOverlapsCircular(
|
|
290
|
+
metaA.buffer,
|
|
291
|
+
metaA.head,
|
|
292
|
+
metaB.buffer,
|
|
293
|
+
metaB.head
|
|
294
|
+
);
|
|
295
|
+
return isSignificantOverlap(kSync, densityA, densityB, metaA.buffer.length);
|
|
296
|
+
};
|
|
246
297
|
var getSuggestedFix = (issue, info) => {
|
|
247
298
|
if (issue.label.includes("Global Event")) {
|
|
248
299
|
return `These variables update together but live in different hooks/files. Consolidate them into a single %cuseReducer%c or atomic store update.`;
|
|
@@ -272,7 +323,7 @@ var getSuggestedFix = (issue, info) => {
|
|
|
272
323
|
}
|
|
273
324
|
return `Check the dependency chain of ${info.name}.`;
|
|
274
325
|
};
|
|
275
|
-
var displayHealthReport = (history2,
|
|
326
|
+
var displayHealthReport = (history2, violationMap) => {
|
|
276
327
|
if (!isWeb) return;
|
|
277
328
|
const entries = Array.from(history2.entries());
|
|
278
329
|
if (entries.length === 0) return;
|
|
@@ -348,11 +399,10 @@ var displayHealthReport = (history2, threshold, violationMap) => {
|
|
|
348
399
|
processed.add(labelA);
|
|
349
400
|
entries.forEach(([labelB, metaB]) => {
|
|
350
401
|
if (labelA === labelB || processed.has(labelB)) return;
|
|
351
|
-
if (
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
}
|
|
402
|
+
if (!areSyncSignificant(metaA, metaB)) return;
|
|
403
|
+
if (metaA.role === "context" /* CONTEXT */ && metaB.role === "context" /* CONTEXT */) return;
|
|
404
|
+
currentCluster.push(labelB);
|
|
405
|
+
processed.add(labelB);
|
|
356
406
|
});
|
|
357
407
|
if (currentCluster.length > 1) clusters.push(currentCluster);
|
|
358
408
|
else independentCount++;
|
|
@@ -428,7 +478,7 @@ var displayRedundancyAlert = (labelA, metaA, labelB, metaB, sim) => {
|
|
|
428
478
|
const alertType = isContextMirror ? "CONTEXT MIRRORING" : isStoreMirror ? "STORE MIRRORING" : "DUPLICATE STATE";
|
|
429
479
|
console.group(`%c \u264A BASIS | ${alertType} `, STYLES.headerProblem);
|
|
430
480
|
console.log(`%c\u{1F4CD} Location: %c${infoA.file}`, STYLES.bold, STYLES.location);
|
|
431
|
-
console.log(`%cIssue:%c ${infoA.name} and ${infoB.name}
|
|
481
|
+
console.log(`%cIssue:%c ${infoA.name} and ${infoB.name} overlapped on ${(sim * 100).toFixed(0)}% of aligned updates.`, STYLES.bold, "");
|
|
432
482
|
if (isContextMirror || isStoreMirror) {
|
|
433
483
|
const sourceType = isStoreMirror ? "External Store" : "Global Context";
|
|
434
484
|
console.log(
|
|
@@ -606,7 +656,6 @@ var displayBootLog = (windowSize) => {
|
|
|
606
656
|
};
|
|
607
657
|
|
|
608
658
|
// src/core/analysis.ts
|
|
609
|
-
var CAUSAL_MARGIN = 0.05;
|
|
610
659
|
var isEventDriven = (label, graph) => {
|
|
611
660
|
for (const [parent, targets] of graph.entries()) {
|
|
612
661
|
if (parent.startsWith("Event_Tick_") && targets.has(label)) {
|
|
@@ -616,28 +665,33 @@ var isEventDriven = (label, graph) => {
|
|
|
616
665
|
return false;
|
|
617
666
|
};
|
|
618
667
|
var calculateAllSimilarities = (entryA, entryB) => {
|
|
619
|
-
const
|
|
668
|
+
const { kSync, kALeadsB, kBLeadsA, densityA, densityB } = countOverlapsCircular(
|
|
620
669
|
entryA.meta.buffer,
|
|
621
670
|
entryA.meta.head,
|
|
622
671
|
entryB.meta.buffer,
|
|
623
|
-
entryB.meta.head
|
|
624
|
-
0
|
|
672
|
+
entryB.meta.head
|
|
625
673
|
);
|
|
626
|
-
const
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
);
|
|
633
|
-
const
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
674
|
+
const sync = cosineFromOverlap(kSync, densityA, densityB);
|
|
675
|
+
const bA = cosineFromOverlap(kALeadsB, densityA, densityB);
|
|
676
|
+
const aB = cosineFromOverlap(kBLeadsA, densityA, densityB);
|
|
677
|
+
const max = Math.max(sync, bA, aB);
|
|
678
|
+
const windowSize = entryA.meta.buffer.length;
|
|
679
|
+
const significantSync = isSignificantOverlap(kSync, densityA, densityB, windowSize);
|
|
680
|
+
const kLead = Math.max(kALeadsB, kBLeadsA);
|
|
681
|
+
const significantLead = isSignificantOverlap(kLead, densityA, densityB, windowSize) && kLead >= kSync + 1;
|
|
682
|
+
return {
|
|
683
|
+
sync,
|
|
684
|
+
bA,
|
|
685
|
+
aB,
|
|
686
|
+
max,
|
|
687
|
+
kSync,
|
|
688
|
+
kALeadsB,
|
|
689
|
+
kBLeadsA,
|
|
690
|
+
densityA,
|
|
691
|
+
densityB,
|
|
692
|
+
significantSync,
|
|
693
|
+
significantLead
|
|
694
|
+
};
|
|
641
695
|
};
|
|
642
696
|
var shouldSkipComparison = (entryA, entryB, dirtyLabels2) => {
|
|
643
697
|
if (entryA.label === entryB.label) return true;
|
|
@@ -662,52 +716,51 @@ var detectRedundancy = (entryA, entryB, similarities, redundantSet, violationMap
|
|
|
662
716
|
const roleA = entryA.meta.role;
|
|
663
717
|
const roleB = entryB.meta.role;
|
|
664
718
|
if (isGlobalSource(roleA) && isGlobalSource(roleB)) return;
|
|
665
|
-
if (
|
|
719
|
+
if (similarities.densityA < 2 || similarities.densityB < 2) return;
|
|
720
|
+
const score = similarities.sync;
|
|
666
721
|
if (roleA === "local" /* LOCAL */ && isGlobalSource(roleB)) {
|
|
667
722
|
redundantSet.add(entryA.label);
|
|
668
|
-
pushViolation(violationMap, entryB.label, { type: "context_mirror", target: entryA.label, similarity:
|
|
669
|
-
displayRedundancyAlert(entryA.label, entryA.meta, entryB.label, entryB.meta,
|
|
723
|
+
pushViolation(violationMap, entryB.label, { type: "context_mirror", target: entryA.label, similarity: score });
|
|
724
|
+
displayRedundancyAlert(entryA.label, entryA.meta, entryB.label, entryB.meta, score);
|
|
670
725
|
} else if (isGlobalSource(roleA) && roleB === "local" /* LOCAL */) {
|
|
671
726
|
redundantSet.add(entryB.label);
|
|
672
|
-
pushViolation(violationMap, entryA.label, { type: "context_mirror", target: entryB.label, similarity:
|
|
673
|
-
displayRedundancyAlert(entryB.label, entryB.meta, entryA.label, entryA.meta,
|
|
727
|
+
pushViolation(violationMap, entryA.label, { type: "context_mirror", target: entryB.label, similarity: score });
|
|
728
|
+
displayRedundancyAlert(entryB.label, entryB.meta, entryA.label, entryA.meta, score);
|
|
674
729
|
} else if (roleA === "local" /* LOCAL */ && roleB === "local" /* LOCAL */) {
|
|
675
730
|
redundantSet.add(entryA.label);
|
|
676
731
|
redundantSet.add(entryB.label);
|
|
677
|
-
pushViolation(violationMap, entryA.label, { type: "duplicate_state", target: entryB.label, similarity:
|
|
678
|
-
pushViolation(violationMap, entryB.label, { type: "duplicate_state", target: entryA.label, similarity:
|
|
679
|
-
displayRedundancyAlert(entryA.label, entryA.meta, entryB.label, entryB.meta,
|
|
732
|
+
pushViolation(violationMap, entryA.label, { type: "duplicate_state", target: entryB.label, similarity: score });
|
|
733
|
+
pushViolation(violationMap, entryB.label, { type: "duplicate_state", target: entryA.label, similarity: score });
|
|
734
|
+
displayRedundancyAlert(entryA.label, entryA.meta, entryB.label, entryB.meta, score);
|
|
680
735
|
}
|
|
681
736
|
};
|
|
682
737
|
var detectCausalLeak = (entryA, entryB, similarities, violationMap, graph) => {
|
|
683
738
|
if (entryA.isVolatile || entryB.isVolatile) return;
|
|
684
|
-
if (similarities.max - similarities.sync < CAUSAL_MARGIN) return;
|
|
685
739
|
const addLeak = (source, target) => {
|
|
686
740
|
if (isEventDriven(target, graph)) return;
|
|
687
|
-
|
|
688
|
-
violationMap.set(source, []);
|
|
689
|
-
}
|
|
690
|
-
violationMap.get(source).push({ type: "causal_leak", target });
|
|
741
|
+
pushViolation(violationMap, source, { type: "causal_leak", target });
|
|
691
742
|
const sourceEntry = source === entryA.label ? entryA : entryB;
|
|
692
743
|
const targetEntry = source === entryA.label ? entryB : entryA;
|
|
693
744
|
displayCausalHint(target, targetEntry.meta, source, sourceEntry.meta);
|
|
694
745
|
};
|
|
695
|
-
if (similarities.
|
|
746
|
+
if (similarities.kALeadsB >= similarities.kBLeadsA) {
|
|
696
747
|
addLeak(entryA.label, entryB.label);
|
|
697
|
-
} else
|
|
748
|
+
} else {
|
|
698
749
|
addLeak(entryB.label, entryA.label);
|
|
699
750
|
}
|
|
700
751
|
};
|
|
701
752
|
var detectSubspaceOverlap = (dirtyEntries, allEntries, redundantSet, dirtyLabels2, graph) => {
|
|
702
|
-
let compCount = 0;
|
|
703
753
|
const violationMap = /* @__PURE__ */ new Map();
|
|
754
|
+
let compCount = 0;
|
|
704
755
|
for (const entryA of dirtyEntries) {
|
|
705
756
|
for (const entryB of allEntries) {
|
|
706
757
|
if (shouldSkipComparison(entryA, entryB, dirtyLabels2)) continue;
|
|
707
758
|
compCount++;
|
|
708
759
|
const similarities = calculateAllSimilarities(entryA, entryB);
|
|
709
|
-
if (similarities.
|
|
760
|
+
if (similarities.significantSync) {
|
|
710
761
|
detectRedundancy(entryA, entryB, similarities, redundantSet, violationMap);
|
|
762
|
+
}
|
|
763
|
+
if (similarities.significantLead) {
|
|
711
764
|
detectCausalLeak(entryA, entryB, similarities, violationMap, graph);
|
|
712
765
|
}
|
|
713
766
|
}
|
|
@@ -966,9 +1019,9 @@ var beginEffectTracking = (l) => {
|
|
|
966
1019
|
var endEffectTracking = () => {
|
|
967
1020
|
instance.currentEffectSource = null;
|
|
968
1021
|
};
|
|
969
|
-
var printBasisHealthReport = (
|
|
1022
|
+
var printBasisHealthReport = () => {
|
|
970
1023
|
if (!instance.config.debug) return;
|
|
971
|
-
displayHealthReport(instance.history,
|
|
1024
|
+
displayHealthReport(instance.history, instance.violationMap);
|
|
972
1025
|
};
|
|
973
1026
|
var getBasisMetrics = () => ({
|
|
974
1027
|
engine: "v0.6.x",
|
|
@@ -1042,4 +1095,4 @@ export {
|
|
|
1042
1095
|
getBasisGraph,
|
|
1043
1096
|
printBasisGraph
|
|
1044
1097
|
};
|
|
1045
|
-
//# sourceMappingURL=chunk-
|
|
1098
|
+
//# sourceMappingURL=chunk-WMHY2C6D.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/constants.ts","../src/core/math.ts","../src/core/graph.ts","../src/core/label.ts","../src/core/ranker.ts","../src/core/logger.ts","../src/core/analysis.ts","../src/engine.ts"],"sourcesContent":["// src/core/constants.ts\n\nexport const WINDOW_SIZE = 50;\nexport const PAIR_RARITY_TARGET = 0.01;\nexport const RELATIVE_OVERLAP_FLOOR = 0.65;\n\nexport const LOOP_THRESHOLD = 150;\nexport const LOOP_WINDOW_MS = 1000;\nexport const ANALYSIS_INTERVAL = 5;\n\nexport const VOLATILITY_THRESHOLD = 25;\n\nexport const INSTANCE_SEP = '##';","// src/core/math.ts\n\nimport { PAIR_RARITY_TARGET, RELATIVE_OVERLAP_FLOOR } from './constants';\n\nexport const calculateSimilarityCircular = (\n bufferA: Uint8Array,\n headA: number,\n bufferB: Uint8Array,\n headB: number,\n offset: number\n): number => {\n const L = bufferA.length;\n let dot = 0, magA = 0, magB = 0;\n\n const baseOffset = ((headB - headA + offset) % L + L) % L;\n\n for (let i = 0; i < L; i++) {\n const valA = bufferA[i];\n let iB = i + baseOffset;\n if (iB >= L) iB -= L;\n const valB = bufferB[iB];\n\n dot += valA * valB;\n magA += valA * valA;\n magB += valB * valB;\n }\n\n if (magA === 0 || magB === 0) return 0;\n return dot / (Math.sqrt(magA) * Math.sqrt(magB));\n};\n\nconst choose = (n: number, k: number): number => {\n if (k < 0 || k > n) return 0;\n k = Math.min(k, n - k);\n let result = 1;\n for (let i = 0; i < k; i++) {\n result = (result * (n - i)) / (i + 1);\n }\n return result;\n};\n\nconst hypergeomPMF = (k: number, n1: number, m1: number, N: number): number => {\n const total = choose(N, n1);\n if (total === 0) return 0;\n return (choose(m1, k) * choose(N - m1, n1 - k)) / total;\n};\n\nconst hypergeomUpperTailP = (kStart: number, n1: number, m1: number, N: number): number => {\n const kMax = Math.min(n1, m1);\n let p = 0;\n for (let k = Math.max(0, kStart); k <= kMax; k++) {\n p += hypergeomPMF(k, n1, m1, N);\n }\n return p;\n};\n\nexport const minOverlapForRarity = (\n n1: number, m1: number, N: number, targetP: number\n): number => {\n const kMax = Math.min(n1, m1);\n for (let k = 0; k <= kMax; k++) {\n if (hypergeomUpperTailP(k, n1, m1, N) <= targetP) return k;\n }\n return kMax + 1;\n};\n\nconst overlapThresholdCache = new Map<string, number>();\n\nexport const getMinOverlap = (\n densityA: number,\n densityB: number,\n windowSize: number\n): number => {\n const lo = Math.min(densityA, densityB) | 0;\n const hi = Math.max(densityA, densityB) | 0;\n const key = `${lo}_${hi}_${windowSize}`;\n let cached = overlapThresholdCache.get(key);\n if (cached === undefined) {\n const rare = minOverlapForRarity(lo, hi, windowSize, PAIR_RARITY_TARGET);\n const floor = Math.ceil(RELATIVE_OVERLAP_FLOOR * lo);\n cached = Math.max(rare, floor);\n overlapThresholdCache.set(key, cached);\n }\n return cached;\n};\n\nexport const isSignificantOverlap = (\n overlap: number,\n densityA: number,\n densityB: number,\n windowSize: number\n): boolean => {\n if (densityA < 2 || densityB < 2) return false;\n return overlap >= getMinOverlap(densityA, densityB, windowSize);\n};\n\nexport interface CircularOverlaps {\n kSync: number;\n kALeadsB: number;\n kBLeadsA: number;\n densityA: number;\n densityB: number;\n}\n\nexport const countOverlapsCircular = (\n bufferA: Uint8Array,\n headA: number,\n bufferB: Uint8Array,\n headB: number\n): CircularOverlaps => {\n const L = bufferA.length;\n\n const offSync = ((headB - headA) % L + L) % L;\n const offALeadsB = ((headB - headA + 1) % L + L) % L;\n const offBLeadsA = ((headB - headA - 1) % L + L) % L;\n\n let kSync = 0;\n let kALeadsB = 0;\n let kBLeadsA = 0;\n let densityA = 0;\n let densityB = 0;\n\n for (let i = 0; i < L; i++) {\n const a = bufferA[i] ? 1 : 0;\n const b = bufferB[i] ? 1 : 0;\n densityA += a;\n densityB += b;\n\n let iSync = i + offSync;\n if (iSync >= L) iSync -= L;\n let iALeadsB = i + offALeadsB;\n if (iALeadsB >= L) iALeadsB -= L;\n let iBLeadsA = i + offBLeadsA;\n if (iBLeadsA >= L) iBLeadsA -= L;\n\n if (a && bufferB[iSync]) kSync++;\n if (a && bufferB[iALeadsB]) kALeadsB++;\n if (a && bufferB[iBLeadsA]) kBLeadsA++;\n }\n\n return { kSync, kALeadsB, kBLeadsA, densityA, densityB };\n};\n\nexport const cosineFromOverlap = (overlap: number, densityA: number, densityB: number): number => {\n if (densityA <= 0 || densityB <= 0) return 0;\n return overlap / Math.sqrt(densityA * densityB);\n};","// src/core/graph.ts\n\nimport { BasisGraphNode, BasisGraphEdge, BasisEventGroup } from './types';\n\nexport const calculateSpectralInfluence = (\n graph: Map<string, Map<string, number>>,\n maxIterations = 20,\n tolerance = 0.001\n) => {\n const nodes = Array.from(new Set([...graph.keys(), ...Array.from(graph.values()).flatMap(m => [...m.keys()])]));\n if (nodes.length === 0) return new Map<string, number>();\n\n let scores = new Map<string, number>();\n // Initialize: Every node starts with equal weight\n nodes.forEach(n => scores.set(n, 1 / nodes.length));\n\n for (let i = 0; i < maxIterations; i++) {\n const nextScores = new Map<string, number>();\n let totalWeight = 0;\n\n nodes.forEach(source => {\n let influence = 0;\n const outgoing = graph.get(source);\n\n if (outgoing) {\n outgoing.forEach((weight, target) => {\n // Rule: Source is important if it triggers targets that are active/important\n // We skip self-loops (source === target) to prevent artificial inflation\n if (source !== target) {\n influence += (scores.get(target) || 0) * weight;\n }\n });\n }\n // Every node has a \"Base\" existence weight to prevent sinks from reaching 0\n nextScores.set(source, influence + 0.01);\n totalWeight += (influence + 0.01);\n });\n\n // Normalize\n let delta = 0;\n nextScores.forEach((val, key) => {\n const normalized = val / totalWeight;\n const diff = normalized - (scores.get(key) || 0);\n delta += diff * diff;\n nextScores.set(key, normalized);\n });\n\n scores = nextScores;\n if (Math.sqrt(delta) < tolerance) break;\n }\n\n return scores;\n};\n\nexport const groupEventSources = (\n nodes: BasisGraphNode[],\n edges: BasisGraphEdge[]\n): BasisEventGroup[] => {\n const outgoing = new Map<string, BasisGraphEdge[]>();\n edges.forEach(e => {\n if (!outgoing.has(e.source)) outgoing.set(e.source, []);\n outgoing.get(e.source)!.push(e);\n });\n\n const eventSourceIds = nodes.filter(n => n.role === 'event').map(n => n.id);\n\n const signatureOf = (sourceEdges: BasisGraphEdge[]) =>\n sourceEdges\n .map(e => `${e.target}@${e.weight}`)\n .sort()\n .join('|');\n\n const buckets = new Map<string, string[]>();\n eventSourceIds.forEach(id => {\n const sig = signatureOf(outgoing.get(id) || []);\n if (!buckets.has(sig)) buckets.set(sig, []);\n buckets.get(sig)!.push(id);\n });\n\n const groups: BasisEventGroup[] = Array.from(buckets.values()).map(sourceIds => ({\n sourceIds,\n occurrences: sourceIds.length,\n edges: (outgoing.get(sourceIds[0]) || []).slice()\n }));\n\n return groups.sort((a, b) => (b.edges.length - a.edges.length) || (b.occurrences - a.occurrences));\n};","// src/core/label.ts\n\nimport { INSTANCE_SEP } from './constants';\n\nexport const stripInstance = (label: string): string => {\n const idx = label.indexOf(INSTANCE_SEP);\n return idx === -1 ? label : label.slice(0, idx);\n};\n\nexport const parseLabel = (label: string) => {\n const base = stripInstance(label);\n const parts = base.split(' -> ');\n return { file: parts[0] || \"Unknown\", name: parts[1] || base };\n};\n\nexport const isSameField = (labelA: string, labelB: string): boolean =>\n stripInstance(labelA) === stripInstance(labelB);\n\nexport const isEffectLabel = (name: string): boolean =>\n /^effect_L\\d+(:\\d+)?$/.test(name) ||\n name === 'anonymous_effect' ||\n name === 'anonymous_layout_effect';","// src/core/ranker.ts\n\nimport { calculateSpectralInfluence } from './graph';\nimport { RingBufferMetadata, SignalRole, RankedIssue, ViolationDetail } from './types';\nimport { parseLabel } from './label';\n\nexport const identifyTopIssues = (\n graph: Map<string, Map<string, number>>,\n history: Map<string, RingBufferMetadata>,\n redundantLabels: Set<string>,\n violationMap: Map<string, ViolationDetail[]>\n): RankedIssue[] => {\n const results: RankedIssue[] = [];\n\n const influence = calculateSpectralInfluence(graph);\n\n const isEffect = (label: string) =>\n label.includes('effect_L') ||\n label.includes('useLayoutEffect') ||\n label.includes('useInsertionEffect');\n\n const isEvent = (label: string) => label.startsWith('Event_Tick_');\n\n // --- EVENT AGGREGATION MAP ---\n const eventSignatures = new Map<string, { count: number, score: number, targets: string[] }>();\n\n // 1. FILTER & PROCESS DRIVERS\n const drivers = Array.from(graph.entries())\n .filter(([label, targets]) => {\n if (targets.size === 0) return false;\n\n // AGGREGATE EVENTS\n if (isEvent(label)) {\n const validTargets = Array.from(targets.keys()).filter(t => {\n const meta = history.get(t);\n return meta && meta.role !== SignalRole.CONTEXT;\n });\n\n if (validTargets.length > 1) {\n const signature = validTargets.sort().join('|');\n const existing = eventSignatures.get(signature);\n if (existing) {\n existing.count++;\n existing.score = Math.max(existing.score, influence.get(label) || 0);\n } else {\n eventSignatures.set(signature, {\n count: 1,\n score: influence.get(label) || 0,\n targets: validTargets\n });\n }\n }\n return false;\n }\n\n // STANDARD NODE FILTERING\n const meta = history.get(label);\n if (meta?.role === SignalRole.CONTEXT) return false;\n if (meta?.role === SignalRole.PROJECTION) return false;\n\n const score = influence.get(label) || 0;\n if (isEffect(label) && targets.size > 0) return true;\n if (targets.size < 2 && score < 0.05) return false;\n\n return true;\n })\n .sort((a, b) => {\n const scoreA = influence.get(a[0]) || 0;\n const scoreB = influence.get(b[0]) || 0;\n return scoreB - scoreA;\n });\n\n // 2. INJECT AGGREGATED EVENTS (Top Priority)\n const sortedEvents = Array.from(eventSignatures.entries())\n .sort((a, b) => b[1].targets.length - a[1].targets.length);\n\n sortedEvents.slice(0, 2).forEach(([sig, data]) => {\n // Borrow the filename from the first target\n const primaryVictim = parseLabel(data.targets[0]);\n\n // We construct a label that looks like \"File.tsx -> Interaction Name\"\n // This tricks the Logger into printing the correct file location.\n const smartLabel = `${primaryVictim.file} -> Global Event (${primaryVictim.name})`;\n\n results.push({\n label: smartLabel,\n metric: 'influence',\n score: 1.0,\n reason: `Global Sync Event: An external trigger is updating ${data.targets.length} roots simultaneously. Occurred ${data.count} times.`,\n violations: data.targets.map(t => ({\n type: 'causal_leak',\n target: t\n }))\n });\n });\n\n // 3. GENERATE STANDARD ISSUES\n drivers.slice(0, 3 - results.length).forEach(([label, targets]) => {\n const targetNames = Array.from(targets.keys());\n\n if (isEffect(label)) {\n results.push({\n label,\n metric: 'influence',\n score: influence.get(label) || 0,\n reason: `Side-Effect Driver: Hook writes to state during render.`,\n violations: targetNames.map(t => ({ type: 'causal_leak', target: t }))\n });\n return;\n }\n\n results.push({\n label,\n metric: 'influence',\n score: influence.get(label) || targets.size,\n reason: `Sync Driver: Acts as a \"Prime Mover\" for ${targets.size} downstream signals.`,\n violations: targetNames.map(t => ({ type: 'causal_leak', target: t }))\n });\n });\n\n // 4. DENSITY FALLBACK\n if (results.length === 0) {\n const sortedDensity = Array.from(history.entries())\n .filter(([label, meta]) =>\n meta.role === SignalRole.LOCAL &&\n !redundantLabels.has(label) &&\n meta.density > 25\n )\n .sort((a, b) => b[1].density - a[1].density);\n\n sortedDensity.slice(0, 3).forEach(([label, meta]) => {\n results.push({\n label,\n metric: 'density',\n score: meta.density,\n reason: `High Frequency: potential main-thread saturation.`,\n violations: []\n });\n });\n }\n\n return results;\n};","// src/core/logger.ts\n\nimport { countOverlapsCircular, isSignificantOverlap } from \"./math\";\nimport { identifyTopIssues } from \"./ranker\";\nimport { RingBufferMetadata, SignalRole, RankedIssue, ViolationDetail, BasisGraphJSON, BasisGraphNode, BasisGraphEdge } from \"./types\";\nimport { instance } from \"../engine\";\nimport { parseLabel, isEffectLabel } from \"./label\";\n\nconst isWeb = typeof window !== 'undefined' && typeof window.document !== 'undefined';\nconst LAST_LOG_TIMES = new Map<string, number>();\nconst LOG_COOLDOWN = 3000;\n\nconst THEME = {\n identity: \"#6C5CE7\",\n problem: \"#D63031\",\n solution: \"#FBC531\",\n context: \"#0984E3\",\n muted: \"#9AA0A6\",\n border: \"#2E2E35\",\n success: \"#00b894\",\n};\n\nconst STYLES = {\n basis: `background: ${THEME.identity}; color: white; font-weight: bold; padding: 2px 6px; border-radius: 3px;`,\n headerIdentity: `background: ${THEME.identity}; color: white; font-weight: bold; padding: 4px 8px; border-radius: 4px;`,\n headerProblem: `background: ${THEME.problem}; color: white; font-weight: bold; padding: 4px 8px; border-radius: 4px;`,\n version: `background: #a29bfe; color: #2d3436; padding: 2px 6px; border-radius: 3px; margin-left: -4px;`,\n actionLabel: `color: ${THEME.solution}; font-weight: bold;`,\n actionPill: `color: ${THEME.solution}; font-weight: bold; border: 1px solid ${THEME.solution}; padding: 0 4px; border-radius: 3px;`,\n impactLabel: `color: ${THEME.context}; font-weight: bold;`,\n location: `color: ${THEME.context}; font-family: monospace; font-weight: bold;`,\n subText: `color: ${THEME.muted}; font-size: 11px;`,\n bold: \"font-weight: bold;\",\n label: \"background: #dfe6e9; color: #2d3436; padding: 0 4px; border-radius: 3px; font-family: monospace; font-weight: bold; border: 1px solid #b2bec3;\",\n};\n\nconst shouldLog = (key: string) => {\n const now = Date.now();\n const last = LAST_LOG_TIMES.get(key) || 0;\n if (now - last > LOG_COOLDOWN) {\n LAST_LOG_TIMES.set(key, now);\n return true;\n }\n return false;\n};\n\nconst isBooleanLike = (name: string) =>\n /^(is|has|can|should|did|will|show|hide)(?=[A-Z_])/.test(name);\n\nconst areSyncSignificant = (metaA: RingBufferMetadata, metaB: RingBufferMetadata): boolean => {\n const { kSync, densityA, densityB } = countOverlapsCircular(\n metaA.buffer, metaA.head,\n metaB.buffer, metaB.head\n );\n return isSignificantOverlap(kSync, densityA, densityB, metaA.buffer.length);\n};\n\nconst getSuggestedFix = (issue: RankedIssue, info: { name: string }): string => {\n if (issue.label.includes('Global Event')) {\n return `These variables update together but live in different hooks/files. Consolidate them into a single %cuseReducer%c or atomic store update.`;\n }\n\n const violations = issue.violations || [];\n const leaks = violations.filter(v => v.type === 'causal_leak');\n const mirrors = violations.filter(v => v.type === 'context_mirror');\n const duplicates = violations.filter(v => v.type === 'duplicate_state');\n\n if (mirrors.length > 0) {\n return `Local state is 'shadowing' Global Context. This creates two sources of truth. ` +\n `Delete the local state and consume the %cContext%c value directly.`;\n }\n\n if (leaks.length > 0) {\n const targetName = parseLabel(leaks[0].target).name;\n if (issue.label.includes('effect')) {\n return `This Effect triggers a synchronous re-render of ${targetName}. ` +\n `Calculate ${targetName} during the render phase (Derived State) or wrap in %cuseMemo%c if expensive.`;\n }\n return `State cascading detected. ${info.name} triggers ${targetName} in a separate frame. ` +\n `Merge them into one object to update simultaneously.`;\n }\n\n if (duplicates.length > 0) {\n if (isBooleanLike(info.name)) {\n return `Boolean Explosion detected. Multiple flags are toggling in sync. ` +\n `Replace impossible states with a single %cstatus%c string ('idle' | 'loading' | 'success').`;\n }\n return `Redundant State detected. This variable carries no unique information. ` +\n `Derive it from the source variable during render, or use %cuseMemo%c to cache the result.`;\n }\n\n if (issue.metric === 'density') {\n return `High-Frequency Update. This variable updates faster than the frame rate. ` +\n `Apply %cdebounce%c or move to a Ref to unblock the main thread.`;\n }\n\n return `Check the dependency chain of ${info.name}.`;\n};\n\nexport const displayHealthReport = (\n history: Map<string, RingBufferMetadata>,\n violationMap: Map<string, ViolationDetail[]>\n) => {\n if (!isWeb) return;\n const entries = Array.from(history.entries());\n if (entries.length === 0) return;\n\n const topIssues = identifyTopIssues(instance.graph, history, instance.redundantLabels, violationMap);\n\n console.group(`%c 📊 BASIS | ARCHITECTURAL HEALTH REPORT `, STYLES.headerIdentity);\n\n if (topIssues.length > 0) {\n console.log(`%c🎯 REFACTOR PRIORITIES %c(PRIME MOVERS)`,\n `font-weight: bold; color: ${THEME.identity}; margin-top: 10px;`,\n `font-weight: normal; color: ${THEME.muted}; font-style: italic;`\n );\n\n topIssues.forEach((issue, idx) => {\n const info = parseLabel(issue.label);\n const icon = issue.metric === 'influence' ? '⚡' : '📈';\n const pColor = idx === 0 ? THEME.problem : idx === 1 ? THEME.solution : THEME.identity;\n\n let displayName = info.name;\n let displayFile = info.file;\n\n if (issue.label.includes('Global Event')) {\n displayName = info.name;\n displayFile = info.file;\n }\n\n console.group(\n ` %c${idx + 1}%c ${icon} ${displayName} %c(${displayFile})`,\n `background: ${pColor}; color: ${idx === 1 ? 'black' : 'white'}; border-radius: 50%; padding: 0 5px;`,\n \"font-family: monospace; font-weight: 700;\",\n `color: ${THEME.muted}; font-size: 10px; font-weight: normal; font-style: italic;`\n );\n\n console.log(`%c${issue.reason}`, `color: ${THEME.muted}; font-style: italic;`);\n\n if (issue.violations.length > 0) {\n const byFile = new Map<string, string[]>();\n\n issue.violations.forEach(v => {\n if (issue.label.includes('Global Event') && v.type === 'context_mirror') return;\n const { file, name } = parseLabel(v.target);\n if (!byFile.has(file)) byFile.set(file, []);\n byFile.get(file)!.push(name);\n });\n\n const impactParts: string[] = [];\n byFile.forEach((vars, file) => {\n const varList = vars.join(', ');\n impactParts.push(`${file} (${varList})`);\n });\n\n if (impactParts.length > 0) {\n console.log(`%cImpacts: %c${impactParts.join(' + ')}`, STYLES.impactLabel, \"\");\n }\n }\n\n const fix = getSuggestedFix(issue, info);\n const fixParts = fix.split('%c');\n\n if (fixParts.length === 3) {\n console.log(\n `%cSolution: %c${fixParts[0]}%c${fixParts[1]}%c${fixParts[2]}`,\n STYLES.actionLabel,\n \"\",\n STYLES.actionPill,\n \"\"\n );\n } else {\n console.log(\n `%cSolution: %c${fix}`,\n STYLES.actionLabel,\n \"\"\n );\n }\n\n console.groupEnd();\n });\n console.log(\"\\n\");\n }\n\n const clusters: string[][] = [];\n const processed = new Set<string>();\n let independentCount = 0;\n\n entries.forEach(([labelA, metaA]) => {\n if (processed.has(labelA)) return;\n const currentCluster = [labelA];\n processed.add(labelA);\n entries.forEach(([labelB, metaB]) => {\n if (labelA === labelB || processed.has(labelB)) return;\n if (!areSyncSignificant(metaA, metaB)) return;\n if (metaA.role === SignalRole.CONTEXT && metaB.role === SignalRole.CONTEXT) return;\n currentCluster.push(labelB);\n processed.add(labelB);\n });\n if (currentCluster.length > 1) clusters.push(currentCluster); else independentCount++;\n });\n\n const totalVars = entries.length;\n const redundancyScore = ((independentCount + clusters.length) / totalVars) * 100;\n\n let internalEdges = 0;\n instance.graph.forEach((targets, source) => {\n if (source.startsWith('Event_Tick_')) return;\n internalEdges += targets.size;\n });\n\n const causalPenalty = (internalEdges / totalVars) * 100;\n\n let healthScore = redundancyScore - causalPenalty;\n if (healthScore < 0) healthScore = 0;\n\n const scoreColor = healthScore > 85 ? THEME.success : THEME.problem;\n\n console.log(`%cSystem Efficiency: %c${healthScore.toFixed(1)}%`,\n STYLES.bold, `color: ${scoreColor}; font-weight: bold;`\n );\n console.log(`%cSources of Truth: ${independentCount + clusters.length}/${totalVars} | Causal Leaks: ${internalEdges}`, STYLES.subText);\n\n if (clusters.length > 0) {\n console.log(`%cDetected ${clusters.length} Sync Issues:`, `font-weight: bold; color: ${THEME.problem}; margin-top: 10px;`);\n\n clusters.forEach((cluster, idx) => {\n const clusterMetas = cluster.map(l => ({\n label: l,\n meta: history.get(l)!,\n name: parseLabel(l).name\n }));\n const hasCtx = clusterMetas.some(c =>\n c.meta.role === SignalRole.CONTEXT || c.meta.role === SignalRole.STORE\n );\n\n const names = clusterMetas.map(c => {\n const prefix = c.meta.role === SignalRole.STORE ? 'Σ ' : c.meta.role === SignalRole.CONTEXT ? 'Ω ' : '';\n return `${prefix}${c.name}`;\n }).join(' ⟷ ');\n\n console.group(` %c${idx + 1}%c ${names}`, `background: ${THEME.problem}; color: white; border-radius: 50%; padding: 0 5px;`, \"font-family: monospace; font-weight: bold;\");\n\n if (hasCtx) {\n const hasStore = clusterMetas.some(c => c.meta.role === SignalRole.STORE);\n const sourceType = hasStore ? 'External Store' : 'global context';\n console.log(`%cDiagnosis: ${hasStore ? 'Store' : 'Context'} Mirroring. Local state is shadowing ${sourceType}.`, `color: ${THEME.problem};`);\n console.log(`%cSolution: Use ${sourceType} directly to avoid state drift.`, STYLES.actionLabel);\n } else {\n const boolKeywords = ['is', 'has', 'can', 'should', 'loading', 'success', 'error', 'active', 'enabled', 'open', 'visible'];\n const boolCount = clusterMetas.filter(c =>\n boolKeywords.some(kw => c.name.toLowerCase().startsWith(kw))\n ).length;\n\n const isBoolExplosion = cluster.length > 2 && (boolCount / cluster.length) > 0.5;\n if (isBoolExplosion) {\n console.log(`%cDiagnosis:%c Boolean Explosion. Multiple booleans updating in sync.`, STYLES.bold, \"\");\n console.log(`%cSolution:%c Combine into a single %cstatus%c string or a %creducer%c.`, STYLES.actionLabel, \"\", STYLES.actionPill, \"\", STYLES.actionPill, \"\");\n } else if (cluster.length > 2) {\n console.log(`%cDiagnosis:%c Sibling Updates. These states respond to the same event.`, STYLES.bold, \"\");\n console.log(`%cSolution:%c This may be intentional. If not, consolidate into a %creducer%c.`, STYLES.actionLabel, \"\", STYLES.actionPill, \"\");\n } else {\n console.log(`%cDiagnosis:%c Redundant State. Variables always change together.`, STYLES.bold, \"\");\n console.log(`%cSolution:%c Derive one from the other via %cuseMemo%c.`, STYLES.actionLabel, \"\", STYLES.actionPill, \"\");\n }\n }\n console.groupEnd();\n });\n } else {\n console.log(\"%c✨ Your architecture is clean. No redundant state detected.\", `color: ${THEME.success}; font-weight: bold;`);\n }\n console.groupEnd();\n};\n\nexport const displayRedundancyAlert = (labelA: string, metaA: RingBufferMetadata, labelB: string, metaB: RingBufferMetadata, sim: number) => {\n if (!isWeb || !shouldLog(`redundant-${labelA}-${labelB}`)) return;\n const infoA = parseLabel(labelA);\n const infoB = parseLabel(labelB);\n const isContextMirror = (metaA.role === SignalRole.LOCAL && metaB.role === SignalRole.CONTEXT) ||\n (metaB.role === SignalRole.LOCAL && metaA.role === SignalRole.CONTEXT);\n\n const isStoreMirror = (metaA.role === SignalRole.LOCAL && metaB.role === SignalRole.STORE) ||\n (metaB.role === SignalRole.LOCAL && metaA.role === SignalRole.STORE);\n\n const alertType = isContextMirror ? 'CONTEXT MIRRORING' : isStoreMirror ? 'STORE MIRRORING' : 'DUPLICATE STATE';\n console.group(`%c ♊ BASIS | ${alertType} `, STYLES.headerProblem);\n console.log(`%c📍 Location: %c${infoA.file}`, STYLES.bold, STYLES.location);\n console.log(`%cIssue:%c ${infoA.name} and ${infoB.name} overlapped on ${(sim * 100).toFixed(0)}% of aligned updates.`, STYLES.bold, \"\");\n\n if (isContextMirror || isStoreMirror) {\n const sourceType = isStoreMirror ? 'External Store' : 'Global Context';\n console.log(`%cFix:%c Local state is 'shadowing' ${sourceType}. Delete the local state and consume the %c${sourceType}%c value directly.`,\n STYLES.bold, \"\",\n STYLES.actionPill, \"\"\n );\n } else {\n if (isBooleanLike(infoA.name) || isBooleanLike(infoB.name)) {\n console.log(`%cFix:%c Boolean Explosion detected. Merge flags into a single %cstatus%c string or %cuseReducer%c.`,\n STYLES.bold, \"\",\n STYLES.actionPill, \"\",\n STYLES.actionPill, \"\"\n );\n } else {\n console.log(`%cFix:%c Redundant State detected. Derive %c${infoB.name}%c from %c${infoA.name}%c during render, or use %cuseMemo%c.`,\n STYLES.bold, \"\",\n STYLES.label, \"\",\n STYLES.label, \"\",\n STYLES.actionPill, \"\"\n );\n }\n }\n console.groupEnd();\n};\n\nexport const displayCausalHint = (targetLabel: string, targetMeta: RingBufferMetadata, sourceLabel: string, sourceMeta: RingBufferMetadata) => {\n if (!isWeb || !shouldLog(`causal-${sourceLabel}-${targetLabel}`)) return;\n const target = parseLabel(targetLabel);\n const source = parseLabel(sourceLabel);\n const headerType = sourceMeta.role === SignalRole.CONTEXT\n ? 'CONTEXT SYNC LEAK'\n : sourceMeta.role === SignalRole.STORE\n ? 'STORE SYNC LEAK'\n : 'DOUBLE RENDER';\n\n const isEffect = sourceLabel.includes('effect') || sourceLabel.includes('useLayoutEffect');\n\n console.groupCollapsed(`%c ⚡ BASIS | ${headerType} `, STYLES.headerProblem);\n console.log(`%c📍 Location: %c${target.file}`, STYLES.bold, STYLES.location);\n console.log(`%cIssue:%c ${source.name} triggers ${target.name} in separate frames.`, STYLES.bold, \"\");\n\n if (isEffect) {\n console.log(`%cFix:%c Derive %c${target.name}%c during the render phase (remove effect) or wrap in %cuseMemo%c.`,\n STYLES.bold, \"\",\n STYLES.label, \"\",\n STYLES.actionPill, \"\"\n );\n } else {\n console.log(`%cFix:%c Merge %c${target.name}%c with %c${source.name}%c into a single state update.`,\n STYLES.bold, \"\",\n STYLES.label, \"\",\n STYLES.label, \"\"\n );\n }\n console.groupEnd();\n};\n\nconst splitHookLine = (raw: string): { hook: string; line?: number } => {\n const m = raw.match(/^(.*):(\\d+)$/);\n if (!m) return { hook: raw };\n return { hook: m[1], line: Number(m[2]) };\n};\n\nconst formatHook = (raw: string): string => {\n const { hook } = splitHookLine(raw);\n if (!isEffectLabel(hook)) return hook;\n const lineMatch = hook.match(/L(\\d+)$/);\n return lineMatch ? `effect @ L${lineMatch[1]}` : 'effect (anonymous)';\n};\n\nconst formatNode = (node?: BasisGraphNode, fallbackId = '?'): string => {\n if (!node) return fallbackId;\n if (node.role === 'event') return 'Event';\n const hook = formatHook(node.name || node.id);\n if (node.file && hook) return `${node.file} → ${hook}`;\n return hook || node.id;\n};\n\nexport const displayGraphReport = (graph: BasisGraphJSON) => {\n if (!isWeb) return;\n if (graph.nodes.length === 0) {\n console.log(\n `%c 📊 BASIS | CAUSAL GRAPH %c(no data yet)`,\n STYLES.headerIdentity,\n `color: ${THEME.muted}; font-style: italic;`\n );\n return;\n }\n\n const nodeById = new Map(graph.nodes.map(n => [n.id, n]));\n const outgoing = new Map<string, BasisGraphEdge[]>();\n graph.edges.forEach(e => {\n if (!outgoing.has(e.source)) outgoing.set(e.source, []);\n outgoing.get(e.source)!.push(e);\n });\n\n type Group = {\n sourceIds: string[];\n sourceNode: BasisGraphNode | undefined;\n edges: BasisGraphEdge[];\n occurrences: number;\n };\n\n const eventGroups: Group[] = graph.eventGroups.map(g => ({\n sourceIds: g.sourceIds,\n sourceNode: nodeById.get(g.sourceIds[0]),\n edges: g.edges,\n occurrences: g.occurrences\n }));\n\n const groupedSourceIds = new Set(graph.eventGroups.flatMap(g => g.sourceIds));\n const nonEventGroups: Group[] = Array.from(outgoing.keys())\n .filter(id => !groupedSourceIds.has(id))\n .map(id => ({ sourceIds: [id], sourceNode: nodeById.get(id), edges: outgoing.get(id)!, occurrences: 1 }));\n\n const groups: Group[] = [...eventGroups, ...nonEventGroups].sort(\n (a, b) => (b.edges.length - a.edges.length) || (b.occurrences - a.occurrences)\n );\n\n console.group(\n `%c 📊 BASIS | CAUSAL GRAPH %c${graph.nodes.length} nodes · ${graph.edges.length} edges · ${groups.length} sources · buffer window ${graph.bufferWindowSize}`,\n STYLES.headerIdentity,\n `color: ${THEME.muted}; font-weight: normal; font-style: italic;`\n );\n console.log(\n `%cparent → child = observed cause → update. (×N) = times in this window. Event groups with the same fan-out are collapsed.`,\n STYLES.subText\n );\n\n groups.forEach(group => {\n const isEvent = group.sourceNode?.role === 'event';\n const isCtx = group.sourceNode?.role === SignalRole.CONTEXT;\n const isFx = group.sourceNode?.role === 'effect';\n const isUnknown = group.sourceNode?.role === 'unknown';\n const icon = isEvent ? '⚡' : isCtx ? 'Ω' : isFx ? '↯' : isUnknown ? '?' : '●';\n const color = isEvent ? THEME.solution : isCtx ? THEME.context : THEME.identity;\n\n const fanout = group.edges.length;\n const hits = group.occurrences;\n const hitLabel = hits > 1 ? ` · ×${hits}` : '';\n\n const title = isEvent\n ? `Event · ${fanout} target${fanout === 1 ? '' : 's'}${hitLabel}`\n : formatNode(group.sourceNode, group.sourceIds[0]);\n\n console.groupCollapsed(\n `%c${icon} %c${title}`,\n `color: ${color};`,\n 'font-family: monospace; font-weight: 600;'\n );\n\n group.edges\n .slice()\n .sort((a, b) => b.weight - a.weight)\n .forEach(edge => {\n const target = nodeById.get(edge.target);\n const label = formatNode(target, edge.target);\n const weight = edge.weight > 1 ? ` (×${edge.weight})` : '';\n if (target?.redundant) {\n console.log(\n `%c ${label}%c${weight} %credundant`,\n `color: ${THEME.muted}; font-family: monospace;`,\n `color: ${THEME.muted}; font-style: italic;`,\n `color: ${THEME.problem}; font-weight: bold;`\n );\n } else {\n console.log(\n `%c ${label}%c${weight}`,\n `color: ${THEME.muted}; font-family: monospace;`,\n `color: ${THEME.muted}; font-style: italic;`\n );\n }\n });\n\n console.groupEnd();\n });\n\n console.groupEnd();\n};\n\nexport const displayViolentBreaker = (label: string, count: number, threshold: number) => {\n if (!isWeb) return;\n const { name } = parseLabel(label);\n console.group(`%c 🛑 BASIS CRITICAL | CIRCUIT BREAKER `, STYLES.headerProblem);\n console.error(`INFINITE LOOP DETECTED\\nVariable: ${name}\\nFrequency: ${count} updates/sec`);\n console.log(`%cACTION: Update BLOCKED to prevent browser freeze.`, `color: ${THEME.problem}; font-weight: bold;`);\n console.groupEnd();\n};\n\nexport const displayBootLog = (windowSize: number) => {\n if (!isWeb) return;\n console.log(`%cBasis%cAuditor%c \"Graph Era\" (Window: ${windowSize})`, STYLES.basis, STYLES.version, `color: ${THEME.muted}; font-style: italic; margin-left: 8px;`);\n};","// src/core/analysis.ts\n\nimport * as UI from './logger';\nimport { countOverlapsCircular, cosineFromOverlap, isSignificantOverlap } from './math';\nimport { SignalRole, Entry, ViolationDetail } from './types';\nimport { isSameField } from './label';\n\ninterface Similarities {\n sync: number;\n bA: number;\n aB: number;\n max: number;\n kSync: number;\n kALeadsB: number;\n kBLeadsA: number;\n densityA: number;\n densityB: number;\n significantSync: boolean;\n significantLead: boolean;\n}\n\nconst isEventDriven = (label: string, graph: Map<string, Map<string, number>>): boolean => {\n for (const [parent, targets] of graph.entries()) {\n if (parent.startsWith('Event_Tick_') && targets.has(label)) {\n return true;\n }\n }\n return false;\n};\n\nconst calculateAllSimilarities = (entryA: Entry, entryB: Entry): Similarities => {\n const { kSync, kALeadsB, kBLeadsA, densityA, densityB } = countOverlapsCircular(\n entryA.meta.buffer, entryA.meta.head,\n entryB.meta.buffer, entryB.meta.head\n );\n\n const sync = cosineFromOverlap(kSync, densityA, densityB);\n const bA = cosineFromOverlap(kALeadsB, densityA, densityB);\n const aB = cosineFromOverlap(kBLeadsA, densityA, densityB);\n const max = Math.max(sync, bA, aB);\n\n const windowSize = entryA.meta.buffer.length;\n const significantSync = isSignificantOverlap(kSync, densityA, densityB, windowSize);\n\n const kLead = Math.max(kALeadsB, kBLeadsA);\n const significantLead =\n isSignificantOverlap(kLead, densityA, densityB, windowSize) &&\n kLead >= kSync + 1;\n\n return {\n sync, bA, aB, max,\n kSync, kALeadsB, kBLeadsA,\n densityA, densityB,\n significantSync,\n significantLead,\n };\n};\n\nconst shouldSkipComparison = (\n entryA: Entry,\n entryB: Entry,\n dirtyLabels: Set<string>\n): boolean => {\n if (entryA.label === entryB.label) return true;\n if (isSameField(entryA.label, entryB.label)) return true;\n if (dirtyLabels.has(entryB.label) && entryA.label > entryB.label) return true;\n return false;\n};\n\nconst pushViolation = (\n map: Map<string, ViolationDetail[]>,\n source: string,\n detail: ViolationDetail\n) => {\n if (!map.has(source)) {\n map.set(source, []);\n }\n const list = map.get(source)!;\n const exists = list.some(\n v => v.type === detail.type && v.target === detail.target\n );\n if (!exists) {\n list.push(detail);\n }\n};\n\nconst isGlobalSource = (role: SignalRole): boolean =>\n role === SignalRole.CONTEXT || role === SignalRole.STORE;\n\nconst detectRedundancy = (\n entryA: Entry,\n entryB: Entry,\n similarities: Similarities,\n redundantSet: Set<string>,\n violationMap: Map<string, ViolationDetail[]>\n): void => {\n const roleA = entryA.meta.role;\n const roleB = entryB.meta.role;\n\n if (isGlobalSource(roleA) && isGlobalSource(roleB)) return;\n if (similarities.densityA < 2 || similarities.densityB < 2) return;\n\n const score = similarities.sync;\n\n if (roleA === SignalRole.LOCAL && isGlobalSource(roleB)) {\n redundantSet.add(entryA.label);\n pushViolation(violationMap, entryB.label, { type: 'context_mirror', target: entryA.label, similarity: score });\n UI.displayRedundancyAlert(entryA.label, entryA.meta, entryB.label, entryB.meta, score);\n } else if (isGlobalSource(roleA) && roleB === SignalRole.LOCAL) {\n redundantSet.add(entryB.label);\n pushViolation(violationMap, entryA.label, { type: 'context_mirror', target: entryB.label, similarity: score });\n UI.displayRedundancyAlert(entryB.label, entryB.meta, entryA.label, entryA.meta, score);\n } else if (roleA === SignalRole.LOCAL && roleB === SignalRole.LOCAL) {\n redundantSet.add(entryA.label);\n redundantSet.add(entryB.label);\n pushViolation(violationMap, entryA.label, { type: 'duplicate_state', target: entryB.label, similarity: score });\n pushViolation(violationMap, entryB.label, { type: 'duplicate_state', target: entryA.label, similarity: score });\n UI.displayRedundancyAlert(entryA.label, entryA.meta, entryB.label, entryB.meta, score);\n }\n};\n\nconst detectCausalLeak = (\n entryA: Entry,\n entryB: Entry,\n similarities: Similarities,\n violationMap: Map<string, ViolationDetail[]>,\n graph: Map<string, Map<string, number>>\n): void => {\n if (entryA.isVolatile || entryB.isVolatile) return;\n\n const addLeak = (source: string, target: string) => {\n if (isEventDriven(target, graph)) return;\n\n pushViolation(violationMap, source, { type: 'causal_leak', target });\n\n const sourceEntry = source === entryA.label ? entryA : entryB;\n const targetEntry = source === entryA.label ? entryB : entryA;\n UI.displayCausalHint(target, targetEntry.meta, source, sourceEntry.meta);\n };\n\n // Period-2 trains have equal lags. Still a lag vs sync; keep A→B like the old max check.\n if (similarities.kALeadsB >= similarities.kBLeadsA) {\n addLeak(entryA.label, entryB.label);\n } else {\n addLeak(entryB.label, entryA.label);\n }\n};\n\nexport const detectSubspaceOverlap = (\n dirtyEntries: Entry[],\n allEntries: Entry[],\n redundantSet: Set<string>,\n dirtyLabels: Set<string>,\n graph: Map<string, Map<string, number>>\n): { compCount: number; violationMap: Map<string, ViolationDetail[]> } => {\n const violationMap = new Map<string, ViolationDetail[]>();\n\n let compCount = 0;\n for (const entryA of dirtyEntries) {\n for (const entryB of allEntries) {\n if (shouldSkipComparison(entryA, entryB, dirtyLabels)) continue;\n\n compCount++;\n const similarities = calculateAllSimilarities(entryA, entryB);\n\n if (similarities.significantSync) {\n detectRedundancy(entryA, entryB, similarities, redundantSet, violationMap);\n }\n if (similarities.significantLead) {\n detectCausalLeak(entryA, entryB, similarities, violationMap, graph);\n }\n }\n }\n\n return { compCount, violationMap };\n};","// src/engine.ts\n\nimport * as UI from './core/logger';\nimport { detectSubspaceOverlap } from './core/analysis';\nimport {\n SignalRole,\n StateOptions,\n RingBufferMetadata,\n BasisEngineState,\n Entry,\n ViolationDetail,\n BasisGraphJSON,\n BasisGraphNode,\n BasisGraphEdge\n} from './core/types';\nimport {\n WINDOW_SIZE,\n LOOP_THRESHOLD,\n VOLATILITY_THRESHOLD\n} from './core/constants';\nimport { parseLabel, isEffectLabel } from './core/label';\nimport { groupEventSources } from './core/graph';\n\n// --- Static Internal State ---\n\nconst BASIS_INSTANCE_KEY = Symbol.for('__basis_engine_instance__');\n\nconst GRAPH_CLEANUP_INTERVAL = 5000; // Run every 5 seconds\nconst EVENT_TTL = 10000; // Keep events for 10 seconds\n\nconst NULL_SIGNAL: RingBufferMetadata = {\n role: SignalRole.PROJECTION,\n buffer: new Uint8Array(0),\n head: 0,\n density: 0,\n options: {}\n};\n\n// --- v0.6.0 EVENT TOPOLOGY ---\nlet activeEventId: string | null = null;\nlet activeEventTimer: any = null;\n\n// Garbage Collect old Event Nodes\nconst pruneGraph = () => {\n const now = Date.now();\n\n // Only checking the keys (Source Nodes)\n for (const source of instance.graph.keys()) {\n if (source.startsWith('Event_Tick_')) {\n // Extract timestamp from \"Event_Tick_1738492...\"\n const parts = source.split('_');\n const timestamp = parseInt(parts[2], 10);\n\n if (now - timestamp > EVENT_TTL) {\n instance.graph.delete(source);\n }\n }\n }\n};\n\nconst getEventId = () => {\n if (!activeEventId) {\n activeEventId = `Event_Tick_${Date.now()}_${Math.random().toString(36).substr(2, 5)}`;\n\n requestAnimationFrame(() => {\n activeEventId = null;\n });\n }\n return activeEventId;\n};\n\n// GLOBAL SINGLETON HMR BRIDGE\nconst getGlobalInstance = (): BasisEngineState => {\n const root = globalThis as any;\n if (!root[BASIS_INSTANCE_KEY]) {\n root[BASIS_INSTANCE_KEY] = {\n config: { debug: false },\n history: new Map<string, RingBufferMetadata>(),\n currentTickBatch: new Set<string>(),\n redundantLabels: new Set<string>(),\n booted: false,\n tick: 0,\n isBatching: false,\n currentEffectSource: null,\n lastStateUpdate: null,\n pausedVariables: new Set<string>(),\n graph: new Map<string, Map<string, number>>(),\n violationMap: new Map<string, ViolationDetail[]>(),\n metrics: {\n lastAnalysisTimeMs: 0,\n comparisonCount: 0,\n lastAnalysisTimestamp: 0,\n systemEntropy: 0\n },\n alertCount: 0,\n loopCounters: new Map<string, number>(),\n lastCleanup: Date.now()\n };\n }\n return root[BASIS_INSTANCE_KEY];\n};\n\nexport const instance = getGlobalInstance();\n\nexport const config = instance.config;\nexport const history = instance.history;\nexport const redundantLabels = instance.redundantLabels;\nexport const currentTickBatch = instance.currentTickBatch;\n\nlet currentTickRegistry: Record<string, boolean> = {};\nconst dirtyLabels = new Set<string>();\n\n// TEMPORAL ENTROPY\nconst calculateTickEntropy = (tickIdx: number) => {\n let activeCount = 0;\n const total = instance.history.size;\n if (total === 0) return 1;\n\n instance.history.forEach((meta: RingBufferMetadata) => {\n if (meta.buffer[tickIdx] === 1) activeCount++;\n });\n return 1 - (activeCount / total);\n};\n\nexport const recordEdge = (source: string, target: string) => {\n if (!source || !target || source === target) return;\n if (!instance.graph.has(source)) {\n instance.graph.set(source, new Map());\n }\n const targets = instance.graph.get(source)!;\n targets.set(target, (targets.get(target) || 0) + 1);\n};\n\nexport const analyzeBasis = () => {\n if (!instance.config.debug || dirtyLabels.size === 0) {\n return;\n }\n\n const scheduler = (globalThis as any).requestIdleCallback || ((cb: any) => setTimeout(cb, 1));\n const snapshot = new Set(dirtyLabels);\n dirtyLabels.clear();\n\n scheduler(() => {\n const analysisStart = performance.now();\n const allEntries: Entry[] = [];\n const dirtyEntries: Entry[] = [];\n\n instance.history.forEach((meta: RingBufferMetadata, label: string) => {\n if (meta.options.suppressAll || meta.density === 0) return;\n\n const entry: Entry = {\n label, meta,\n isVolatile: meta.density > VOLATILITY_THRESHOLD\n };\n\n allEntries.push(entry);\n if (snapshot.has(label)) {\n dirtyEntries.push(entry);\n }\n });\n\n if (dirtyEntries.length === 0 || allEntries.length < 2) return;\n\n const nextRedundant = new Set<string>();\n instance.redundantLabels.forEach((l: string) => {\n if (!snapshot.has(l)) {\n nextRedundant.add(l);\n }\n });\n\n const { compCount, violationMap } = detectSubspaceOverlap(\n dirtyEntries,\n allEntries,\n nextRedundant,\n snapshot,\n instance.graph\n );\n\n instance.redundantLabels.clear();\n nextRedundant.forEach((l: string) => {\n instance.redundantLabels.add(l);\n });\n\n violationMap.forEach((newList, label) => {\n const existing = instance.violationMap.get(label) || [];\n newList.forEach(detail => {\n const alreadyExists = existing.some(\n v => v.type === detail.type && v.target === detail.target\n );\n if (!alreadyExists) {\n existing.push(detail);\n }\n });\n instance.violationMap.set(label, existing);\n });\n\n if (instance.violationMap.size > 500) {\n const keys = Array.from(instance.violationMap.keys()).slice(0, 200);\n keys.forEach(k => instance.violationMap.delete(k));\n }\n\n instance.metrics.lastAnalysisTimeMs = performance.now() - analysisStart;\n instance.metrics.comparisonCount = compCount;\n instance.metrics.lastAnalysisTimestamp = Date.now();\n });\n};\n\nconst processHeartbeat = () => {\n instance.tick++;\n\n instance.history.forEach((meta: RingBufferMetadata, label: string) => {\n const oldValue = meta.buffer[meta.head];\n const newValue = instance.currentTickBatch.has(label) ? 1 : 0;\n\n meta.buffer[meta.head] = newValue;\n if (oldValue !== newValue) {\n meta.density += (newValue - oldValue);\n }\n\n meta.head = (meta.head + 1) % WINDOW_SIZE;\n });\n\n const lastHead = (instance.history.size > 0) ? (instance.tick % WINDOW_SIZE) : 0;\n instance.metrics.systemEntropy = calculateTickEntropy(lastHead);\n\n instance.currentTickBatch.clear();\n currentTickRegistry = {};\n instance.isBatching = false;\n instance.lastStateUpdate = null;\n\n if (dirtyLabels.size > 0) {\n analyzeBasis();\n }\n};\n\n// INTERCEPTION LAYER\nexport const recordUpdate = (label: string): boolean => {\n if (!instance.config.debug) return true;\n if (instance.pausedVariables.has(label)) return false;\n\n const now = Date.now();\n if (now - instance.lastCleanup > 1000) {\n instance.loopCounters.clear();\n instance.lastCleanup = now;\n\n pruneGraph();\n }\n\n const count = (instance.loopCounters.get(label) || 0) + 1;\n instance.loopCounters.set(label, count);\n\n if (count > LOOP_THRESHOLD) {\n UI.displayViolentBreaker(label, count, LOOP_THRESHOLD);\n instance.pausedVariables.add(label);\n return false;\n }\n\n const meta = instance.history.get(label);\n\n // --- CAUSAL RESOLUTION ---\n let edgeSource: string | null = null;\n\n // PRIORITY 1: Explicit Effect Driver\n // If we are inside an effect, it IS the cause.\n if (instance.currentEffectSource) {\n edgeSource = instance.currentEffectSource;\n }\n // PRIORITY 2: The Event Horizon (Siblings)\n // We removed the synchronous state-to-state link here.\n // If A and B update in the same event handler, they are siblings (Event -> A, Event -> B).\n // They are NOT a dependency chain (A -> B).\n else {\n edgeSource = getEventId();\n }\n\n // Record graph edge\n if (edgeSource && edgeSource !== label) {\n recordEdge(edgeSource, label);\n\n // Hinting Logic (only for non-events)\n if (instance.currentEffectSource && instance.currentEffectSource !== label) {\n\n const sourceMeta = instance.history.get(instance.currentEffectSource) || NULL_SIGNAL;\n\n // Volatility Guard\n if (meta && sourceMeta && meta.density < VOLATILITY_THRESHOLD && sourceMeta.density < VOLATILITY_THRESHOLD) {\n UI.displayCausalHint(label, meta, instance.currentEffectSource, sourceMeta);\n }\n }\n }\n\n // Source Tracking\n // We still track this for future features, but we don't use it for \n // immediate causal attribution anymore to prevent sibling-glomming.\n if (meta && meta.role === SignalRole.LOCAL && !instance.currentEffectSource) {\n instance.lastStateUpdate = label;\n }\n\n if (currentTickRegistry[label]) return true;\n\n currentTickRegistry[label] = true;\n instance.currentTickBatch.add(label);\n dirtyLabels.add(label);\n\n if (!instance.isBatching) {\n instance.isBatching = true;\n requestAnimationFrame(processHeartbeat);\n }\n\n return true;\n};\n\n// --- LIFECYCLE API ---\n\nexport const configureBasis = (c: any) => {\n Object.assign(instance.config, c);\n if (instance.config.debug && !instance.booted) {\n UI.displayBootLog(WINDOW_SIZE);\n instance.booted = true;\n }\n};\n\nexport const registerVariable = (l: string, o: StateOptions = {}) => {\n if (o.suppressAll) return;\n\n if (!instance.history.has(l)) {\n instance.history.set(l, {\n buffer: new Uint8Array(WINDOW_SIZE),\n head: 0,\n density: 0,\n options: o,\n role: o.role || SignalRole.LOCAL\n });\n }\n};\n\nexport const unregisterVariable = (l: string) => {\n instance.history.delete(l);\n instance.loopCounters.delete(l);\n instance.pausedVariables.delete(l);\n instance.redundantLabels.delete(l);\n\n instance.graph.delete(l);\n instance.graph.forEach((targets) => targets.delete(l));\n\n instance.violationMap.delete(l);\n instance.violationMap.forEach((list) => {\n const idx = list.findIndex((v) => v.target === l);\n if (idx !== -1) list.splice(idx, 1);\n });\n};\n\nexport const beginEffectTracking = (l: string) => {\n if (instance.config.debug) instance.currentEffectSource = l;\n};\n\nexport const endEffectTracking = () => {\n instance.currentEffectSource = null;\n};\n\nexport const printBasisHealthReport = () => {\n if (!instance.config.debug) return;\n UI.displayHealthReport(instance.history, instance.violationMap);\n};\n\nexport const getBasisMetrics = () => ({\n engine: 'v0.6.x',\n hooks: instance.history.size,\n analysis_ms: instance.metrics.lastAnalysisTimeMs.toFixed(3),\n entropy: instance.metrics.systemEntropy.toFixed(3)\n});\n\nexport const getBasisGraph = (): BasisGraphJSON => {\n const nodeIds = new Set<string>();\n const edges: BasisGraphEdge[] = [];\n\n instance.graph.forEach((targets, source) => {\n nodeIds.add(source);\n targets.forEach((weight, target) => {\n nodeIds.add(target);\n edges.push({ source, target, weight });\n });\n });\n\n const nodes: BasisGraphNode[] = Array.from(nodeIds).map((id) => {\n if (id.startsWith('Event_Tick_')) {\n return { id, name: 'Event', file: '(shared trigger)', role: 'event', density: null, redundant: false };\n }\n const meta = instance.history.get(id);\n const { file, name } = parseLabel(id);\n if (!meta) {\n const role = isEffectLabel(name) ? 'effect' : 'unknown';\n return { id, name, file, role, density: null, redundant: false };\n }\n return {\n id,\n name,\n file,\n role: meta.role,\n density: meta.density,\n redundant: instance.redundantLabels.has(id)\n };\n });\n\n return {\n generatedAt: Date.now(),\n bufferWindowSize: WINDOW_SIZE,\n eventTtlMs: EVENT_TTL,\n nodes,\n edges,\n eventGroups: groupEventSources(nodes, edges)\n };\n};\n\nexport const printBasisGraph = () => {\n if (!instance.config.debug) return;\n UI.displayGraphReport(getBasisGraph());\n};\n\nif (typeof window !== 'undefined') {\n (window as any).printBasisReport = printBasisHealthReport;\n (window as any).getBasisMetrics = getBasisMetrics;\n (window as any).getBasisGraph = getBasisGraph;\n (window as any).printBasisGraph = printBasisGraph;\n}\n\nexport const __testEngine__ = {\n instance,\n history,\n configureBasis,\n registerVariable,\n unregisterVariable,\n recordUpdate,\n printBasisHealthReport,\n analyzeBasis,\n beginEffectTracking,\n endEffectTracking,\n getBasisGraph,\n printBasisGraph\n};"],"mappings":"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","names":["history","redundantLabels","meta","history","dirtyLabels"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -79,7 +79,7 @@ declare const useBasisConfig: () => {
|
|
|
79
79
|
};
|
|
80
80
|
|
|
81
81
|
declare const configureBasis: (c: any) => void;
|
|
82
|
-
declare const printBasisHealthReport: (
|
|
82
|
+
declare const printBasisHealthReport: () => void;
|
|
83
83
|
declare const getBasisMetrics: () => {
|
|
84
84
|
engine: string;
|
|
85
85
|
hooks: number;
|
package/dist/index.d.ts
CHANGED
|
@@ -79,7 +79,7 @@ declare const useBasisConfig: () => {
|
|
|
79
79
|
};
|
|
80
80
|
|
|
81
81
|
declare const configureBasis: (c: any) => void;
|
|
82
|
-
declare const printBasisHealthReport: (
|
|
82
|
+
declare const printBasisHealthReport: () => void;
|
|
83
83
|
declare const getBasisMetrics: () => {
|
|
84
84
|
engine: string;
|
|
85
85
|
hooks: number;
|