react-state-basis 0.6.4 → 0.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -192,6 +192,64 @@ The report can include:
192
192
 
193
193
  These metrics are diagnostic rather than a score for the quality of your application.
194
194
 
195
+ ### Causal graph
196
+
197
+ `printBasisReport()` gives a diagnosis. If you want to see the evidence that report is based on, Basis also exposes the observed update graph directly.
198
+
199
+ `printBasisGraph()` does nothing unless `debug` is on (same as `printBasisReport()`). `getBasisGraph()` always returns the current snapshot, regardless of `debug`, since it's just serializing the graph, not printing anything.
200
+
201
+ ```js
202
+ window.printBasisGraph()
203
+ ```
204
+
205
+ prints it to the console, grouped by source:
206
+
207
+ ```
208
+ 📊 BASIS | CAUSAL GRAPH 7 nodes · 7 edges · 2 sources · buffer window 50
209
+ parent → child = observed cause → update. (×N) = times in this window.
210
+ ⚡ Event · 3 targets · ×2
211
+ BooleanEntanglement.tsx → isLoading redundant
212
+ BooleanEntanglement.tsx → isSuccess redundant
213
+ BooleanEntanglement.tsx → hasData redundant
214
+ ↯ WeatherLab.tsx → effect @ L7
215
+ WeatherLab.tsx → fahrenheit (×2)
216
+ ```
217
+
218
+ For the raw data, either from the console:
219
+
220
+ ```js
221
+ window.getBasisGraph()
222
+ ```
223
+
224
+ or imported directly, if you're building your own tooling on top of it rather than reading it from the console:
225
+
226
+ ```ts
227
+ import { getBasisGraph } from 'react-state-basis';
228
+ import type { BasisGraphJSON } from 'react-state-basis';
229
+ ```
230
+
231
+ Either way it returns:
232
+
233
+ ```ts
234
+ {
235
+ generatedAt: number;
236
+ bufferWindowSize: number;
237
+ eventTtlMs: number;
238
+ nodes: { id, name, file, role, density, redundant }[];
239
+ edges: { source, target, weight }[];
240
+ eventGroups: { sourceIds, occurrences, edges }[];
241
+ }
242
+ ```
243
+
244
+ A few things worth knowing about the shape:
245
+
246
+ * `role` distinguishes real state (`local` / `context` / `store` / `proj`) from `effect` sources, virtual `event` triggers, and `unknown` (a graph edge with no recognized shape - e.g. a custom integration recording edges directly). `effect`, `event`, and `unknown` all have `density: null` - none of them has a real update history of its own.
247
+ * `bufferWindowSize` and `eventTtlMs` are two different clocks: state nodes' `density` is measured over the last `bufferWindowSize` ticks, while virtual `event` nodes are pruned after `eventTtlMs` of inactivity. They're unrelated, so don't read one as describing the other.
248
+ * User interactions are recorded as virtual, per-frame `event` triggers. Repeated interactions that produce the exact same fan-out (same targets, same weights) are collapsed into one entry in `eventGroups`, so clicking the same button 20 times doesn't produce 20 near-identical entries. `nodes` and `edges` remain the full, ungrouped data if you need it - the node/edge counts in the header above are always raw counts, not the number of lines shown after grouping.
249
+ * Only nodes that appear on at least one edge are included - a registered variable that has never caused or received an update won't show up.
250
+
251
+ This is meant for inspecting what Basis actually observed, building your own tooling on top of it, or attaching to a bug report - not as a second diagnostic layer alongside `printBasisReport()`.
252
+
195
253
  ### Runtime metrics
196
254
 
197
255
  You can inspect engine metrics with:
@@ -327,4 +385,4 @@ For a deeper look at the implementation and underlying model:
327
385
 
328
386
  Built by [LP](https://github.com/liovic) • [MIT License](https://opensource.org/licenses/MIT)
329
387
 
330
- </div>
388
+ </div>
@@ -61,6 +61,27 @@ var calculateSpectralInfluence = (graph, maxIterations = 20, tolerance = 1e-3) =
61
61
  }
62
62
  return scores;
63
63
  };
64
+ var groupEventSources = (nodes, edges) => {
65
+ const outgoing = /* @__PURE__ */ new Map();
66
+ edges.forEach((e) => {
67
+ if (!outgoing.has(e.source)) outgoing.set(e.source, []);
68
+ outgoing.get(e.source).push(e);
69
+ });
70
+ const eventSourceIds = nodes.filter((n) => n.role === "event").map((n) => n.id);
71
+ const signatureOf = (sourceEdges) => sourceEdges.map((e) => `${e.target}@${e.weight}`).sort().join("|");
72
+ const buckets = /* @__PURE__ */ new Map();
73
+ eventSourceIds.forEach((id) => {
74
+ const sig = signatureOf(outgoing.get(id) || []);
75
+ if (!buckets.has(sig)) buckets.set(sig, []);
76
+ buckets.get(sig).push(id);
77
+ });
78
+ const groups = Array.from(buckets.values()).map((sourceIds) => ({
79
+ sourceIds,
80
+ occurrences: sourceIds.length,
81
+ edges: (outgoing.get(sourceIds[0]) || []).slice()
82
+ }));
83
+ return groups.sort((a, b) => b.edges.length - a.edges.length || b.occurrences - a.occurrences);
84
+ };
64
85
 
65
86
  // src/core/constants.ts
66
87
  var WINDOW_SIZE = 50;
@@ -80,6 +101,7 @@ var parseLabel = (label) => {
80
101
  return { file: parts[0] || "Unknown", name: parts[1] || base };
81
102
  };
82
103
  var isSameField = (labelA, labelB) => stripInstance(labelA) === stripInstance(labelB);
104
+ var isEffectLabel = (name) => /^effect_L\d+(:\d+)?$/.test(name) || name === "anonymous_effect" || name === "anonymous_layout_effect";
83
105
 
84
106
  // src/core/ranker.ts
85
107
  var identifyTopIssues = (graph, history2, redundantLabels2, violationMap) => {
@@ -475,6 +497,99 @@ var displayCausalHint = (targetLabel, targetMeta, sourceLabel, sourceMeta) => {
475
497
  }
476
498
  console.groupEnd();
477
499
  };
500
+ var splitHookLine = (raw) => {
501
+ const m = raw.match(/^(.*):(\d+)$/);
502
+ if (!m) return { hook: raw };
503
+ return { hook: m[1], line: Number(m[2]) };
504
+ };
505
+ var formatHook = (raw) => {
506
+ const { hook } = splitHookLine(raw);
507
+ if (!isEffectLabel(hook)) return hook;
508
+ const lineMatch = hook.match(/L(\d+)$/);
509
+ return lineMatch ? `effect @ L${lineMatch[1]}` : "effect (anonymous)";
510
+ };
511
+ var formatNode = (node, fallbackId = "?") => {
512
+ if (!node) return fallbackId;
513
+ if (node.role === "event") return "Event";
514
+ const hook = formatHook(node.name || node.id);
515
+ if (node.file && hook) return `${node.file} \u2192 ${hook}`;
516
+ return hook || node.id;
517
+ };
518
+ var displayGraphReport = (graph) => {
519
+ if (!isWeb) return;
520
+ if (graph.nodes.length === 0) {
521
+ console.log(
522
+ `%c \u{1F4CA} BASIS | CAUSAL GRAPH %c(no data yet)`,
523
+ STYLES.headerIdentity,
524
+ `color: ${THEME.muted}; font-style: italic;`
525
+ );
526
+ return;
527
+ }
528
+ const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));
529
+ const outgoing = /* @__PURE__ */ new Map();
530
+ graph.edges.forEach((e) => {
531
+ if (!outgoing.has(e.source)) outgoing.set(e.source, []);
532
+ outgoing.get(e.source).push(e);
533
+ });
534
+ const eventGroups = graph.eventGroups.map((g) => ({
535
+ sourceIds: g.sourceIds,
536
+ sourceNode: nodeById.get(g.sourceIds[0]),
537
+ edges: g.edges,
538
+ occurrences: g.occurrences
539
+ }));
540
+ const groupedSourceIds = new Set(graph.eventGroups.flatMap((g) => g.sourceIds));
541
+ const nonEventGroups = Array.from(outgoing.keys()).filter((id) => !groupedSourceIds.has(id)).map((id) => ({ sourceIds: [id], sourceNode: nodeById.get(id), edges: outgoing.get(id), occurrences: 1 }));
542
+ const groups = [...eventGroups, ...nonEventGroups].sort(
543
+ (a, b) => b.edges.length - a.edges.length || b.occurrences - a.occurrences
544
+ );
545
+ console.group(
546
+ `%c \u{1F4CA} BASIS | CAUSAL GRAPH %c${graph.nodes.length} nodes \xB7 ${graph.edges.length} edges \xB7 ${groups.length} sources \xB7 buffer window ${graph.bufferWindowSize}`,
547
+ STYLES.headerIdentity,
548
+ `color: ${THEME.muted}; font-weight: normal; font-style: italic;`
549
+ );
550
+ console.log(
551
+ `%cparent \u2192 child = observed cause \u2192 update. (\xD7N) = times in this window. Event groups with the same fan-out are collapsed.`,
552
+ STYLES.subText
553
+ );
554
+ groups.forEach((group) => {
555
+ const isEvent = group.sourceNode?.role === "event";
556
+ const isCtx = group.sourceNode?.role === "context" /* CONTEXT */;
557
+ const isFx = group.sourceNode?.role === "effect";
558
+ const isUnknown = group.sourceNode?.role === "unknown";
559
+ const icon = isEvent ? "\u26A1" : isCtx ? "\u03A9" : isFx ? "\u21AF" : isUnknown ? "?" : "\u25CF";
560
+ const color = isEvent ? THEME.solution : isCtx ? THEME.context : THEME.identity;
561
+ const fanout = group.edges.length;
562
+ const hits = group.occurrences;
563
+ const hitLabel = hits > 1 ? ` \xB7 \xD7${hits}` : "";
564
+ const title = isEvent ? `Event \xB7 ${fanout} target${fanout === 1 ? "" : "s"}${hitLabel}` : formatNode(group.sourceNode, group.sourceIds[0]);
565
+ console.groupCollapsed(
566
+ `%c${icon} %c${title}`,
567
+ `color: ${color};`,
568
+ "font-family: monospace; font-weight: 600;"
569
+ );
570
+ group.edges.slice().sort((a, b) => b.weight - a.weight).forEach((edge) => {
571
+ const target = nodeById.get(edge.target);
572
+ const label = formatNode(target, edge.target);
573
+ const weight = edge.weight > 1 ? ` (\xD7${edge.weight})` : "";
574
+ if (target?.redundant) {
575
+ console.log(
576
+ `%c ${label}%c${weight} %credundant`,
577
+ `color: ${THEME.muted}; font-family: monospace;`,
578
+ `color: ${THEME.muted}; font-style: italic;`,
579
+ `color: ${THEME.problem}; font-weight: bold;`
580
+ );
581
+ } else {
582
+ console.log(
583
+ `%c ${label}%c${weight}`,
584
+ `color: ${THEME.muted}; font-family: monospace;`,
585
+ `color: ${THEME.muted}; font-style: italic;`
586
+ );
587
+ }
588
+ });
589
+ console.groupEnd();
590
+ });
591
+ console.groupEnd();
592
+ };
478
593
  var displayViolentBreaker = (label, count, threshold) => {
479
594
  if (!isWeb) return;
480
595
  const { name } = parseLabel(label);
@@ -861,9 +976,53 @@ var getBasisMetrics = () => ({
861
976
  analysis_ms: instance.metrics.lastAnalysisTimeMs.toFixed(3),
862
977
  entropy: instance.metrics.systemEntropy.toFixed(3)
863
978
  });
979
+ var getBasisGraph = () => {
980
+ const nodeIds = /* @__PURE__ */ new Set();
981
+ const edges = [];
982
+ instance.graph.forEach((targets, source) => {
983
+ nodeIds.add(source);
984
+ targets.forEach((weight, target) => {
985
+ nodeIds.add(target);
986
+ edges.push({ source, target, weight });
987
+ });
988
+ });
989
+ const nodes = Array.from(nodeIds).map((id) => {
990
+ if (id.startsWith("Event_Tick_")) {
991
+ return { id, name: "Event", file: "(shared trigger)", role: "event", density: null, redundant: false };
992
+ }
993
+ const meta = instance.history.get(id);
994
+ const { file, name } = parseLabel(id);
995
+ if (!meta) {
996
+ const role = isEffectLabel(name) ? "effect" : "unknown";
997
+ return { id, name, file, role, density: null, redundant: false };
998
+ }
999
+ return {
1000
+ id,
1001
+ name,
1002
+ file,
1003
+ role: meta.role,
1004
+ density: meta.density,
1005
+ redundant: instance.redundantLabels.has(id)
1006
+ };
1007
+ });
1008
+ return {
1009
+ generatedAt: Date.now(),
1010
+ bufferWindowSize: WINDOW_SIZE,
1011
+ eventTtlMs: EVENT_TTL,
1012
+ nodes,
1013
+ edges,
1014
+ eventGroups: groupEventSources(nodes, edges)
1015
+ };
1016
+ };
1017
+ var printBasisGraph = () => {
1018
+ if (!instance.config.debug) return;
1019
+ displayGraphReport(getBasisGraph());
1020
+ };
864
1021
  if (typeof window !== "undefined") {
865
1022
  window.printBasisReport = printBasisHealthReport;
866
1023
  window.getBasisMetrics = getBasisMetrics;
1024
+ window.getBasisGraph = getBasisGraph;
1025
+ window.printBasisGraph = printBasisGraph;
867
1026
  }
868
1027
 
869
1028
  export {
@@ -879,6 +1038,8 @@ export {
879
1038
  beginEffectTracking,
880
1039
  endEffectTracking,
881
1040
  printBasisHealthReport,
882
- getBasisMetrics
1041
+ getBasisMetrics,
1042
+ getBasisGraph,
1043
+ printBasisGraph
883
1044
  };
884
- //# sourceMappingURL=chunk-6GBZSOB3.mjs.map
1045
+ //# sourceMappingURL=chunk-EJXGN76H.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/math.ts","../src/core/graph.ts","../src/core/constants.ts","../src/core/label.ts","../src/core/ranker.ts","../src/core/logger.ts","../src/core/analysis.ts","../src/engine.ts"],"sourcesContent":["// src/core/math.ts\n\n/**\n * CIRCULAR SIMILARITY (v0.5.x)\n * Calculates Cosine Similarity across circular buffers.\n * \n * Optimization: Pre-normalizes the circular offset using a single modulo operation \n * outside the hot loop. This ensures the inner loop stays linearized (no division) \n * while remaining robust against extreme lead/lag values.\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\n let iB = i + baseOffset;\n if (iB >= L) {\n iB -= L;\n }\n\n const valB = bufferB[iB];\n\n dot += valA * valB;\n magA += valA * valA;\n magB += valB * valB;\n }\n\n // Prevent Divide-by-Zero (Orthogonal/Idle result)\n if (magA === 0 || magB === 0) return 0;\n\n // Cosine Similarity Formula: (A · B) / (||A|| * ||B||)\n return dot / (Math.sqrt(magA) * Math.sqrt(magB));\n};\n\nexport const calculateCosineSimilarity = (A: Uint8Array, B: Uint8Array): number => {\n let dot = 0, magA = 0, magB = 0;\n for (let i = 0; i < A.length; i++) {\n dot += A[i] * B[i];\n magA += A[i] * A[i];\n magB += B[i] * B[i];\n }\n return (magA === 0 || magB === 0) ? 0 : dot / (Math.sqrt(magA) * Math.sqrt(magB));\n};\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/constants.ts\n\nexport const WINDOW_SIZE = 50;\nexport const SIMILARITY_THRESHOLD = 0.88;\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/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 { calculateCosineSimilarity } 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\", // Purple (Brand)\n problem: \"#D63031\", // Red (Bugs)\n solution: \"#FBC531\", // Yellow (Fixes)\n context: \"#0984E3\", // Blue (Locations)\n muted: \"#9AA0A6\", // Gray (Metadata)\n border: \"#2E2E35\",\n success: \"#00b894\", // Green (Good Score)\n};\n\nconst STYLES = {\n // Structure\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\n // Actions\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\n // Context\n impactLabel: `color: ${THEME.context}; font-weight: bold;`,\n location: `color: ${THEME.context}; font-family: monospace; font-weight: bold;`,\n\n // Text\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\n// Helper: Detects boolean flags vs data\nconst isBooleanLike = (name: string) =>\n /^(is|has|can|should|did|will|show|hide)(?=[A-Z_])/.test(name);\n\n// --- SUGGESTION LOGIC ---\nconst getSuggestedFix = (issue: RankedIssue, info: { name: string }): string => {\n\n // 1. GLOBAL EVENT (Split State)\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 // 2. CONTEXT MIRRORING (Shadow State)\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 // 3. EFFECT CHAINS (Double Render)\n if (leaks.length > 0) {\n const targetName = parseLabel(leaks[0].target).name;\n\n // If driven by an Effect\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 // If driven by State (A -> B)\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 // 4. DUPLICATE STATE (Restored Logic)\n if (duplicates.length > 0) {\n // Boolean Explosion Logic\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 // 5. HIGH FREQUENCY\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\n\nexport const displayHealthReport = (history: Map<string, RingBufferMetadata>, threshold: number, violationMap: Map<string, ViolationDetail[]>) => {\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 // 1. REFACTOR PRIORITIES\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\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 // IMPACTS: Grouped by File\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 // SOLUTION\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 // 2. EFFICIENCY SCORE\n const clusters: string[][] = [];\n const processed = new Set<string>();\n let independentCount = 0;\n\n // A. Redundancy Check\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 (calculateCosineSimilarity(metaA.buffer, metaB.buffer) > threshold) {\n if (metaA.role === SignalRole.CONTEXT && metaB.role === SignalRole.CONTEXT) return;\n currentCluster.push(labelB);\n processed.add(labelB);\n }\n });\n if (currentCluster.length > 1) clusters.push(currentCluster); else independentCount++;\n });\n\n // B. Causality Check (Graph Penalty)\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 // 3. SYNC ISSUES\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\n// --- LIVE STREAM LOGGERS ---\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} are synchronized (${(sim * 100).toFixed(0)}%).`, 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 { calculateSimilarityCircular } from './math';\nimport { SIMILARITY_THRESHOLD } from './constants';\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}\n\nconst CAUSAL_MARGIN = 0.05;\n\n// --- NOISE REDUCTION ---\n// Check if a node is directly driven by a Virtual Event.\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 sync = calculateSimilarityCircular(\n entryA.meta.buffer,\n entryA.meta.head,\n entryB.meta.buffer,\n entryB.meta.head,\n 0\n );\n\n const bA = calculateSimilarityCircular(\n entryA.meta.buffer,\n entryA.meta.head,\n entryB.meta.buffer,\n entryB.meta.head,\n 1\n );\n\n const aB = calculateSimilarityCircular(\n entryA.meta.buffer,\n entryA.meta.head,\n entryB.meta.buffer,\n entryB.meta.head,\n -1\n );\n\n return { sync, bA, aB, max: Math.max(sync, bA, aB) };\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\n if (isSameField(entryA.label, entryB.label)) return true;\n\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 (entryA.meta.density < 2 || entryB.meta.density < 2) return;\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: similarities.max });\n UI.displayRedundancyAlert(entryA.label, entryA.meta, entryB.label, entryB.meta, similarities.max);\n }\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: similarities.max });\n UI.displayRedundancyAlert(entryB.label, entryB.meta, entryA.label, entryA.meta, similarities.max);\n }\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: similarities.max });\n pushViolation(violationMap, entryB.label, { type: 'duplicate_state', target: entryA.label, similarity: similarities.max });\n UI.displayRedundancyAlert(entryA.label, entryA.meta, entryB.label, entryB.meta, similarities.max);\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 if (similarities.max - similarities.sync < CAUSAL_MARGIN) return;\n\n const addLeak = (source: string, target: string) => {\n if (isEventDriven(target, graph)) return;\n\n if (!violationMap.has(source)) {\n violationMap.set(source, []);\n }\n violationMap.get(source)!.push({ 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 // bA High = A[t] matches B[t+1]. A happens before B.\n // Source: A, Target: B\n if (similarities.bA === similarities.max) {\n addLeak(entryA.label, entryB.label);\n }\n // aB High = A[t+1] matches B[t]. B happens before A.\n // Source: B, Target: A\n else if (similarities.aB === similarities.max) {\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 let compCount = 0;\n const violationMap = new Map<string, ViolationDetail[]>();\n\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.max > SIMILARITY_THRESHOLD) {\n detectRedundancy(entryA, entryB, similarities, redundantSet, violationMap);\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 = (threshold = 0.5) => {\n if (!instance.config.debug) return;\n UI.displayHealthReport(instance.history, threshold, 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
@@ -3,6 +3,39 @@ import React__default, { ReactNode } from 'react';
3
3
  export { basis } from './vite-plugin.mjs';
4
4
  import 'vite';
5
5
 
6
+ declare enum SignalRole {
7
+ LOCAL = "local",
8
+ CONTEXT = "context",
9
+ PROJECTION = "proj",
10
+ STORE = "store"
11
+ }
12
+ interface BasisGraphNode {
13
+ id: string;
14
+ name: string;
15
+ file: string;
16
+ role: SignalRole | 'event' | 'effect' | 'unknown';
17
+ density: number | null;
18
+ redundant: boolean;
19
+ }
20
+ interface BasisGraphEdge {
21
+ source: string;
22
+ target: string;
23
+ weight: number;
24
+ }
25
+ interface BasisEventGroup {
26
+ sourceIds: string[];
27
+ occurrences: number;
28
+ edges: BasisGraphEdge[];
29
+ }
30
+ interface BasisGraphJSON {
31
+ generatedAt: number;
32
+ bufferWindowSize: number;
33
+ eventTtlMs: number;
34
+ nodes: BasisGraphNode[];
35
+ edges: BasisGraphEdge[];
36
+ eventGroups: BasisEventGroup[];
37
+ }
38
+
6
39
  /**
7
40
  * Standard React Reducer type inference helpers.
8
41
  */
@@ -53,5 +86,7 @@ declare const getBasisMetrics: () => {
53
86
  analysis_ms: string;
54
87
  entropy: string;
55
88
  };
89
+ declare const getBasisGraph: () => BasisGraphJSON;
90
+ declare const printBasisGraph: () => void;
56
91
 
57
- export { BasisProvider, configureBasis, createContext, getBasisMetrics, printBasisHealthReport, use, useActionState, useBasisConfig, useCallback, useContext, useDebugValue, useDeferredValue, useEffect, useId, useImperativeHandle, useInsertionEffect, useLayoutEffect, useMemo, useOptimistic, useReducer, useRef, useState, useSyncExternalStore, useTransition };
92
+ export { type BasisEventGroup, type BasisGraphEdge, type BasisGraphJSON, type BasisGraphNode, BasisProvider, configureBasis, createContext, getBasisGraph, getBasisMetrics, printBasisGraph, printBasisHealthReport, use, useActionState, useBasisConfig, useCallback, useContext, useDebugValue, useDeferredValue, useEffect, useId, useImperativeHandle, useInsertionEffect, useLayoutEffect, useMemo, useOptimistic, useReducer, useRef, useState, useSyncExternalStore, useTransition };
package/dist/index.d.ts CHANGED
@@ -3,6 +3,39 @@ import React__default, { ReactNode } from 'react';
3
3
  export { basis } from './vite-plugin.js';
4
4
  import 'vite';
5
5
 
6
+ declare enum SignalRole {
7
+ LOCAL = "local",
8
+ CONTEXT = "context",
9
+ PROJECTION = "proj",
10
+ STORE = "store"
11
+ }
12
+ interface BasisGraphNode {
13
+ id: string;
14
+ name: string;
15
+ file: string;
16
+ role: SignalRole | 'event' | 'effect' | 'unknown';
17
+ density: number | null;
18
+ redundant: boolean;
19
+ }
20
+ interface BasisGraphEdge {
21
+ source: string;
22
+ target: string;
23
+ weight: number;
24
+ }
25
+ interface BasisEventGroup {
26
+ sourceIds: string[];
27
+ occurrences: number;
28
+ edges: BasisGraphEdge[];
29
+ }
30
+ interface BasisGraphJSON {
31
+ generatedAt: number;
32
+ bufferWindowSize: number;
33
+ eventTtlMs: number;
34
+ nodes: BasisGraphNode[];
35
+ edges: BasisGraphEdge[];
36
+ eventGroups: BasisEventGroup[];
37
+ }
38
+
6
39
  /**
7
40
  * Standard React Reducer type inference helpers.
8
41
  */
@@ -53,5 +86,7 @@ declare const getBasisMetrics: () => {
53
86
  analysis_ms: string;
54
87
  entropy: string;
55
88
  };
89
+ declare const getBasisGraph: () => BasisGraphJSON;
90
+ declare const printBasisGraph: () => void;
56
91
 
57
- export { BasisProvider, configureBasis, createContext, getBasisMetrics, printBasisHealthReport, use, useActionState, useBasisConfig, useCallback, useContext, useDebugValue, useDeferredValue, useEffect, useId, useImperativeHandle, useInsertionEffect, useLayoutEffect, useMemo, useOptimistic, useReducer, useRef, useState, useSyncExternalStore, useTransition };
92
+ export { type BasisEventGroup, type BasisGraphEdge, type BasisGraphJSON, type BasisGraphNode, BasisProvider, configureBasis, createContext, getBasisGraph, getBasisMetrics, printBasisGraph, printBasisHealthReport, use, useActionState, useBasisConfig, useCallback, useContext, useDebugValue, useDeferredValue, useEffect, useId, useImperativeHandle, useInsertionEffect, useLayoutEffect, useMemo, useOptimistic, useReducer, useRef, useState, useSyncExternalStore, useTransition };