react-state-basis 0.6.6 → 0.6.7
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 +2 -2
- package/dist/{chunk-WMHY2C6D.mjs → chunk-KIXM6YRX.mjs} +179 -137
- package/dist/chunk-KIXM6YRX.mjs.map +1 -0
- package/dist/index.js +178 -136
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/integrations/zustand.js +173 -135
- package/dist/integrations/zustand.js.map +1 -1
- package/dist/integrations/zustand.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-WMHY2C6D.mjs.map +0 -1
|
@@ -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 {\n RingBufferMetadata,\n SignalRole,\n RankedIssue,\n ViolationDetail,\n BasisGraphJSON,\n BasisGraphNode,\n BasisGraphEdge,\n OverlapStats,\n} 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:\n \"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 displayName = (raw: string) => {\n const { name } = parseLabel(raw);\n return name.replace(/:\\d+$/, \"\");\n};\n\nconst areSyncSignificant = (metaA: RingBufferMetadata, metaB: RingBufferMetadata): boolean => {\n const { kSync, densityA, densityB } = countOverlapsCircular(\n metaA.buffer,\n metaA.head,\n metaB.buffer,\n 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 `One interaction is updating state in several places. If that is really one transition, put it in one %cstore / reducer%c. If it is intentional, ignore this.`;\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 `A local hook is only tracking context or a store. If it is not a draft, delete it and read the %ccontext / store%c in render.`;\n }\n\n if (leaks.length > 0) {\n const targetName = displayName(leaks[0].target);\n if (issue.label.includes(\"effect\")) {\n return `An effect is calling setState on ${targetName}, which paints again. If you can compute ${targetName} while rendering, drop the %ceffect%c.`;\n }\n return `${info.name} updates, then ${targetName} updates on the next frame. If they are one fact, write them in the same %csetState%c.`;\n }\n\n if (duplicates.length > 0) {\n if (isBooleanLike(info.name)) {\n return `Several flags move together. One %cstatus%c value avoids impossible combinations.`;\n }\n return `These hooks move together. If one is just the other in another shape, compute it while %crendering%c.`;\n }\n\n if (issue.metric === \"density\") {\n return `This hook updates faster than a frame. %cDebounce%c it or keep it in a ref if the UI does not need every pulse.`;\n }\n\n return `Inspect ${info.name} and what updates with it.`;\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 | report `, STYLES.headerIdentity);\n\n if (topIssues.length > 0) {\n console.log(`%cStart here`, `font-weight: bold; color: ${THEME.identity}; margin-top: 10px;`);\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 console.group(\n ` %c${idx + 1}%c ${icon} ${displayName(issue.label)} %c(${info.file})`,\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;`\n );\n\n console.log(`%c${issue.reason}`, `color: ${THEME.muted};`);\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.replace(/:\\d+$/, \"\"));\n });\n\n const impactParts: string[] = [];\n byFile.forEach((vars, file) => {\n impactParts.push(`${file} (${vars.join(\", \")})`);\n });\n\n if (impactParts.length > 0) {\n console.log(`%cAlso updates: %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 `%cTry: %c${fixParts[0]}%c${fixParts[1]}%c${fixParts[2]}`,\n STYLES.actionLabel,\n \"\",\n STYLES.actionPill,\n \"\"\n );\n } else {\n console.log(`%cTry: %c${fix}`, STYLES.actionLabel, \"\");\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);\n else independentCount++;\n });\n\n const totalVars = entries.length;\n\n console.log(\n `%c${independentCount + clusters.length} of ${totalVars} instrumented hooks look independent in this window.`,\n STYLES.subText\n );\n\n if (clusters.length > 0) {\n console.log(\n `%c${clusters.length} group${clusters.length === 1 ? \"\" : \"s\"} that keep updating together:`,\n `font-weight: bold; color: ${THEME.problem}; margin-top: 10px;`\n );\n\n clusters.forEach((cluster, idx) => {\n const clusterMetas = cluster.map((l) => ({\n label: l,\n meta: history.get(l)!,\n name: displayName(l),\n }));\n const hasCtx = clusterMetas.some(\n (c) => c.meta.role === SignalRole.CONTEXT || c.meta.role === SignalRole.STORE\n );\n\n const names = clusterMetas.map((c) => c.name).join(\", \");\n\n console.group(\n ` %c${idx + 1}%c ${names}`,\n `background: ${THEME.problem}; color: white; border-radius: 50%; padding: 0 5px;`,\n \"font-family: monospace; font-weight: bold;\"\n );\n\n if (hasCtx) {\n const hasStore = clusterMetas.some((c) => c.meta.role === SignalRole.STORE);\n const sourceType = hasStore ? \"a store\" : \"context\";\n console.log(`A local hook is only following ${sourceType}.`);\n console.log(\n `%cTry:%c Read ${sourceType} in render if the local value is not a draft.`,\n STYLES.actionLabel,\n \"\"\n );\n } else {\n const boolKeywords = [\n \"is\",\n \"has\",\n \"can\",\n \"should\",\n \"loading\",\n \"success\",\n \"error\",\n \"active\",\n \"enabled\",\n \"open\",\n \"visible\",\n ];\n const boolCount = clusterMetas.filter((c) =>\n boolKeywords.some((kw) => c.name.toLowerCase().startsWith(kw))\n ).length;\n\n if (cluster.length > 2 && boolCount / cluster.length > 0.5) {\n console.log(`These flags move together.`);\n console.log(\n `%cTry:%c One %cstatus%c instead of several booleans.`,\n STYLES.actionLabel,\n \"\",\n STYLES.actionPill,\n \"\"\n );\n } else if (cluster.length > 2) {\n console.log(`These hooks move on the same frames. Often the same click or fetch.`);\n console.log(\n `%cTry:%c Leave it if that is intentional. Otherwise one %creducer%c.`,\n STYLES.actionLabel,\n \"\",\n STYLES.actionPill,\n \"\"\n );\n } else {\n console.log(`These two hooks keep updating in the same frame.`);\n console.log(\n `%cTry:%c If one is derived, compute it while %crendering%c.`,\n STYLES.actionLabel,\n \"\",\n STYLES.actionPill,\n \"\"\n );\n }\n }\n console.groupEnd();\n });\n } else {\n console.log(\n \"%cNo hooks were updating in lockstep in this window.\",\n `color: ${THEME.success}; font-weight: bold;`\n );\n }\n console.groupEnd();\n};\n\nexport const displayRedundancyAlert = (\n labelA: string,\n metaA: RingBufferMetadata,\n labelB: string,\n metaB: RingBufferMetadata,\n overlap: OverlapStats\n) => {\n if (!isWeb || !shouldLog(`redundant-${labelA}-${labelB}`)) return;\n\n const infoA = parseLabel(labelA);\n const nameA = displayName(labelA);\n const nameB = displayName(labelB);\n\n const isContextMirror =\n (metaA.role === SignalRole.LOCAL && metaB.role === SignalRole.CONTEXT) ||\n (metaB.role === SignalRole.LOCAL && metaA.role === SignalRole.CONTEXT);\n\n const isStoreMirror =\n (metaA.role === SignalRole.LOCAL && metaB.role === SignalRole.STORE) ||\n (metaB.role === SignalRole.LOCAL && metaA.role === SignalRole.STORE);\n\n const alertType = isContextMirror\n ? \"local state follows context\"\n : isStoreMirror\n ? \"local state follows a store\"\n : \"hooks moving together\";\n\n const times = overlap.kSync === 1 ? \"time\" : \"times\";\n\n console.group(`%c BASIS | ${alertType} `, STYLES.headerProblem);\n console.log(`%c${infoA.file}`, STYLES.location);\n console.log(\n `%c${nameA}%c and %c${nameB}%c updated in the same frame ${overlap.kSync} ${times}.`,\n STYLES.label,\n \"\",\n STYLES.label,\n \"\"\n );\n\n if (isContextMirror || isStoreMirror) {\n const sourceType = isStoreMirror ? \"store\" : \"context\";\n console.log(\n `%cTry:%c If this is not a draft, delete the local hook and read the %c${sourceType}%c in render.`,\n STYLES.bold,\n \"\",\n STYLES.actionPill,\n \"\"\n );\n } else if (isBooleanLike(nameA) || isBooleanLike(nameB)) {\n console.log(\n `%cTry:%c One %cstatus%c instead of several flags.`,\n STYLES.bold,\n \"\",\n STYLES.actionPill,\n \"\"\n );\n } else {\n console.log(\n `%cTry:%c If %c${nameB}%c is just %c${nameA}%c in another shape, compute it while rendering.`,\n STYLES.bold,\n \"\",\n STYLES.label,\n \"\",\n STYLES.label,\n \"\"\n );\n }\n console.groupEnd();\n};\n\nexport const displayCausalHint = (\n targetLabel: string,\n _targetMeta: RingBufferMetadata,\n sourceLabel: string,\n sourceMeta: RingBufferMetadata\n) => {\n if (!isWeb || !shouldLog(`causal-${sourceLabel}-${targetLabel}`)) return;\n\n const target = parseLabel(targetLabel);\n const sourceName = displayName(sourceLabel);\n const targetName = displayName(targetLabel);\n\n const headerType =\n sourceMeta.role === SignalRole.CONTEXT\n ? \"extra render from context\"\n : sourceMeta.role === SignalRole.STORE\n ? \"extra render from a store\"\n : \"extra render\";\n\n const isEffect = sourceLabel.includes(\"effect\") || sourceLabel.includes(\"useLayoutEffect\");\n\n console.groupCollapsed(`%c BASIS | ${headerType} `, STYLES.headerProblem);\n console.log(`%c${target.file}`, STYLES.location);\n console.log(\n `%c${sourceName}%c updates %c${targetName}%c on the next frame.`,\n STYLES.label,\n \"\",\n STYLES.label,\n \"\"\n );\n\n if (isEffect) {\n console.log(\n `%cTry:%c If %c${targetName}%c can be computed while rendering, drop the extra setState.`,\n STYLES.bold,\n \"\",\n STYLES.label,\n \"\"\n );\n } else {\n console.log(\n `%cTry:%c Write %c${targetName}%c in the same update as %c${sourceName}%c if they are one fact.`,\n STYLES.bold,\n \"\",\n STYLES.label,\n \"\",\n STYLES.label,\n \"\"\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 | update graph %c(nothing recorded 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) => ({\n sourceIds: [id],\n sourceNode: nodeById.get(id),\n edges: outgoing.get(id)!,\n occurrences: 1,\n }));\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 | update graph %c${graph.nodes.length} nodes · ${graph.edges.length} edges · ${groups.length} sources · last ${graph.bufferWindowSize} frames`,\n STYLES.headerIdentity,\n `color: ${THEME.muted}; font-weight: normal;`\n );\n console.log(\n `%cparent → child = what we saw cause an update. (×N) = times in this window. Repeat clicks with the same targets are grouped.`,\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 ? \"ctx\" : isFx ? \"fx\" : 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 ? `click / event · ${fanout} update${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} %cmoving with another hook`,\n `color: ${THEME.muted}; font-family: monospace;`,\n `color: ${THEME.muted};`,\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};`\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 = displayName(label);\n console.group(`%c BASIS | loop guard `, STYLES.headerProblem);\n console.error(\n `${name} updated ${count} times in one second. Basis stopped recording this path so the tab stays usable.`\n );\n console.log(\n `%cReact may still error on its own. Fix the effect that writes a value it also lists as a dependency.`,\n `color: ${THEME.muted};`\n );\n console.groupEnd();\n};\n\nexport const displayBootLog = (windowSize: number) => {\n if (!isWeb) return;\n console.log(\n `%cBasis%c watching updates (${windowSize}-frame window)`,\n STYLES.basis,\n `color: ${THEME.muted}; margin-left: 8px;`\n );\n};","// src/core/analysis.ts\n\nimport * as UI from './logger';\nimport { countOverlapsCircular, cosineFromOverlap, isSignificantOverlap } from './math';\nimport { SignalRole, Entry, ViolationDetail, OverlapStats } 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 overlapFrom = (s: Similarities): OverlapStats => ({\n kSync: s.kSync,\n densityA: s.densityA,\n densityB: s.densityB,\n cosine: s.sync,\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 overlap = overlapFrom(similarities);\n\n if (roleA === SignalRole.LOCAL && isGlobalSource(roleB)) {\n redundantSet.add(entryA.label);\n pushViolation(violationMap, entryB.label, { type: 'context_mirror', target: entryA.label, overlap });\n UI.displayRedundancyAlert(entryA.label, entryA.meta, entryB.label, entryB.meta, overlap);\n } else if (isGlobalSource(roleA) && roleB === SignalRole.LOCAL) {\n redundantSet.add(entryB.label);\n pushViolation(violationMap, entryA.label, { type: 'context_mirror', target: entryB.label, overlap });\n UI.displayRedundancyAlert(entryB.label, entryB.meta, entryA.label, entryA.meta, overlap);\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, overlap });\n pushViolation(violationMap, entryB.label, { type: 'duplicate_state', target: entryA.label, overlap });\n UI.displayRedundancyAlert(entryA.label, entryA.meta, entryB.label, entryB.meta, overlap);\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 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"]}
|