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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks.ts","../src/context.tsx","../src/ui/BasisHUD.tsx","../src/ui/config.ts"],"sourcesContent":["// src/hooks.ts\n\nimport * as React from 'react';\nimport {\n useState as reactUseState,\n useEffect as reactUseEffect,\n useMemo as reactUseMemo,\n useReducer as reactUseReducer,\n useContext as reactUseContext,\n useSyncExternalStore as reactUseSyncExternalStore,\n createContext as reactCreateContext,\n useRef as reactUseRef,\n useLayoutEffect as reactUseLayoutEffect,\n useCallback as reactUseCallback,\n useTransition as reactUseTransition,\n useDeferredValue as reactUseDeferredValue,\n} from 'react';\n\nimport {\n registerVariable,\n unregisterVariable,\n recordUpdate,\n beginEffectTracking,\n endEffectTracking,\n history as engineHistory\n} from './engine';\nimport { SignalRole } from './core/types';\nimport { INSTANCE_SEP } from './core/constants';\n\n// --- Internal Type Helpers ---\n\nlet anonCount = 0;\nconst getFallbackLabel = (type: string) => `anon_${type}_${anonCount++}`;\n\nconst reactUseId = (React as unknown as { useId?: () => string }).useId;\nlet legacyInstanceCounter = 0;\n\nconst useInstanceId = (): string => {\n const [legacyId] = reactUseState(() =>\n typeof reactUseId === 'function' ? '' : `legacy_${legacyInstanceCounter++}`\n );\n return typeof reactUseId === 'function' ? reactUseId() : legacyId;\n};\n\nconst withInstance = (label: string, instanceId: string) =>\n `${label}${INSTANCE_SEP}${instanceId}`;\n\n/**\n * Standard React Reducer type inference helpers.\n */\ntype GetReducerState<R extends React.Reducer<any, any>> = R extends React.Reducer<infer S, any> ? S : never;\ntype GetReducerAction<R extends React.Reducer<any, any>> = R extends React.Reducer<any, infer A> ? A : never;\n\ninterface BasisContext<T> extends React.Context<T> {\n _basis_label?: string;\n}\n\ninterface React19Extended {\n useOptimistic?<S, P>(passthrough: S, reducer?: (state: S, payload: P) => S): [S, (payload: P) => void];\n useActionState?<State, Payload>(\n action: (state: State, payload: Payload) => Promise<State> | State,\n initialState: State,\n permalink?: string\n ): [state: State, dispatch: (payload: Payload) => void, isPending: boolean];\n use?<T>(usable: React.Usable<T>): T;\n}\n\nconst React19 = React as unknown as React19Extended;\n\n// --- useState ---\n\nexport function useState<S>(\n initialState: S | (() => S),\n label?: string\n): [S, React.Dispatch<React.SetStateAction<S>>] {\n const [val, setVal] = reactUseState(initialState);\n const effectiveLabel = reactUseRef(label || getFallbackLabel('state')).current;\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n\n reactUseEffect(() => {\n registerVariable(storageKey, { role: SignalRole.LOCAL });\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n\n const setter = reactUseCallback((value: React.SetStateAction<S>) => {\n if (recordUpdate(storageKey)) {\n setVal(value);\n }\n }, [storageKey]);\n\n return [val, setter];\n}\n\n// --- useReducer ---\n\n/**\n * PUBLIC OVERLOAD: Lazy initialization\n */\nexport function useReducer<R extends React.Reducer<any, any>, I>(\n reducer: R,\n initializerArg: I,\n initializer: (arg: I) => GetReducerState<R>,\n label?: string\n): [GetReducerState<R>, React.Dispatch<GetReducerAction<R>>];\n\n/**\n * PUBLIC OVERLOAD: Direct initialization\n */\nexport function useReducer<R extends React.Reducer<any, any>>(\n reducer: R,\n initialState: GetReducerState<R>,\n initializer?: undefined,\n label?: string\n): [GetReducerState<R>, React.Dispatch<GetReducerAction<R>>];\n\n/**\n * FINAL IMPLEMENTATION\n */\nexport function useReducer<R extends React.Reducer<any, any>, I>(\n reducer: R,\n initialArg: I | GetReducerState<R>,\n init?: ((arg: I) => GetReducerState<R>) | string,\n label?: string\n): [GetReducerState<R>, React.Dispatch<GetReducerAction<R>>] {\n const isLazy = typeof init === 'function';\n\n // v0.5.x Label Extraction: prioritize 4th arg, fallback to 3rd if string (Babel behavior)\n const providedLabel = label || (typeof init === 'string' ? init : undefined);\n const effectiveLabel = reactUseRef(providedLabel || getFallbackLabel('reducer')).current;\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n\n const [state, dispatch] = isLazy\n ? reactUseReducer(reducer, initialArg as I, init as (arg: I) => GetReducerState<R>)\n : reactUseReducer(reducer, initialArg as GetReducerState<R>);\n\n reactUseEffect(() => {\n registerVariable(storageKey, { role: SignalRole.LOCAL });\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n\n const basisDispatch = reactUseCallback((action: GetReducerAction<R>) => {\n if (recordUpdate(storageKey)) {\n dispatch(action);\n }\n }, [storageKey, dispatch]);\n\n return [state, basisDispatch];\n}\n\n// --- Context ---\n\nexport function createContext<T>(defaultValue: T, label?: string): React.Context<T> {\n const context = reactCreateContext(defaultValue) as BasisContext<T>;\n const effectiveLabel = label || getFallbackLabel('context');\n\n // Use non-enumerable property to store the Basis label\n Object.defineProperty(context, '_basis_label', {\n value: effectiveLabel,\n writable: false,\n enumerable: false\n });\n\n return context;\n}\n\nexport function useContext<T>(context: React.Context<T>): T {\n const val = reactUseContext(context);\n const label = (context as BasisContext<T>)._basis_label;\n\n reactUseLayoutEffect(() => {\n if (label) {\n registerVariable(label, { role: SignalRole.CONTEXT });\n recordUpdate(label);\n }\n }, [val, label]);\n\n return val;\n}\n\n// --- Projections ---\n\nexport function useMemo<T>(factory: () => T, deps: React.DependencyList | undefined, label?: string): T {\n const effectiveLabel = reactUseRef(label || getFallbackLabel('proj')).current;\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n reactUseEffect(() => {\n registerVariable(storageKey, { role: SignalRole.PROJECTION });\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n return reactUseMemo(factory, deps || []);\n}\n\nexport function useCallback<T extends (...args: unknown[]) => unknown>(callback: T, deps: React.DependencyList, label?: string): T {\n const effectiveLabel = reactUseRef(label || getFallbackLabel('cb')).current;\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n reactUseEffect(() => {\n registerVariable(storageKey, { role: SignalRole.PROJECTION });\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n return reactUseCallback(callback, deps);\n}\n\n// --- Effects ---\n\nexport function useEffect(effect: React.EffectCallback, deps?: React.DependencyList, label?: string): void {\n const effectiveLabel = label || 'anonymous_effect';\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n reactUseEffect(() => {\n beginEffectTracking(storageKey);\n const destructor = effect();\n endEffectTracking();\n return typeof destructor === 'function' ? destructor : undefined;\n }, deps);\n\n reactUseEffect(() => {\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n}\n\nexport function useLayoutEffect(effect: React.EffectCallback, deps?: React.DependencyList, label?: string): void {\n const effectiveLabel = label || 'anonymous_layout_effect';\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n reactUseLayoutEffect(() => {\n beginEffectTracking(storageKey);\n const destructor = effect();\n endEffectTracking();\n return typeof destructor === 'function' ? destructor : undefined;\n }, deps);\n\n reactUseEffect(() => {\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n}\n\n// --- React 19 ---\n\nexport function useOptimistic<S, P>(\n passthrough: S,\n reducer?: (state: S, payload: P) => S,\n label?: string\n): [S, (payload: P) => void] {\n const effectiveLabel = reactUseRef(label || getFallbackLabel('optimistic')).current;\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n reactUseEffect(() => {\n registerVariable(storageKey, { role: SignalRole.LOCAL });\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n\n const [state, reactAddOptimistic] = React19.useOptimistic!(\n passthrough,\n reducer as (state: S, action: P) => S\n );\n\n const addOptimistic = reactUseCallback((payload: P) => {\n if (recordUpdate(storageKey)) {\n reactAddOptimistic(payload);\n }\n }, [storageKey, reactAddOptimistic]);\n\n return [state, addOptimistic];\n}\n\nexport function useActionState<State, Payload>(\n action: (state: State, payload: Payload) => Promise<State> | State,\n initialState: State,\n permalink?: string,\n label?: string\n): [state: State, dispatch: (payload: Payload) => void, isPending: boolean] {\n\n const isLabelArg = typeof permalink === 'string' && label === undefined;\n const effectiveLabel = reactUseRef(isLabelArg ? (permalink as string) : (label || getFallbackLabel('action_state'))).current;\n const actualPermalink = isLabelArg ? undefined : permalink;\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n\n const [state, reactDispatch, isPending] = React19.useActionState!(action, initialState, actualPermalink);\n\n reactUseEffect(() => {\n registerVariable(storageKey, { role: SignalRole.LOCAL });\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n\n const basisDispatch = reactUseCallback((payload: Payload) => {\n if (recordUpdate(storageKey)) {\n reactDispatch(payload);\n }\n }, [storageKey, reactDispatch]);\n\n return [state, basisDispatch, isPending];\n}\n\n// --- Direct Exports ---\nexport const useRef = reactUseRef;\nexport const useId = React.useId;\nexport const useDebugValue = React.useDebugValue;\nexport const useImperativeHandle = React.useImperativeHandle;\nexport const useInsertionEffect = React.useInsertionEffect;\nexport const useSyncExternalStore = reactUseSyncExternalStore;\nexport const useTransition = reactUseTransition;\nexport const useDeferredValue = reactUseDeferredValue;\nexport const use = React19.use!;\n\nexport const __test__ = {\n registerVariable,\n history: engineHistory,\n unregisterVariable,\n recordUpdate,\n beginEffectTracking,\n endEffectTracking\n};","// src/context.tsx\n\nimport React, { createContext, useContext, ReactNode, useLayoutEffect } from 'react';\nimport { configureBasis } from './engine';\nimport { BasisHUD } from './ui/BasisHUD';\n\nconst BasisContext = createContext({ debug: false });\nconst isWeb = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n\ninterface BasisProviderProps {\n children: ReactNode;\n debug?: boolean;\n showHUD?: boolean;\n}\n\nexport const BasisProvider: React.FC<BasisProviderProps> = ({\n children,\n debug = true,\n showHUD = true\n}) => {\n useLayoutEffect(() => {\n configureBasis({ debug });\n if (isWeb) {\n (window as any)._basis_debug = debug;\n }\n }, [debug]);\n\n return (\n <BasisContext.Provider value={{ debug }}>\n {children}\n\n {(debug && showHUD && isWeb) && <BasisHUD />}\n </BasisContext.Provider>\n );\n};\n\nexport const useBasisConfig = () => useContext(BasisContext);","// src/ui/BasisHUD.tsx\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { history, redundantLabels } from '../engine';\nimport { HUD_DIMENSIONS as DIM, getHUDContainerStyle, HUD_THEME as THEME } from './config';\nimport { parseLabel } from '../core/label';\n\nexport const BasisHUD: React.FC = () => {\n const [isExpanded, setIsExpanded] = useState(false);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n if (!isExpanded) return;\n\n let isMounted = true;\n let animationFrame: number | null = null;\n\n const draw = () => {\n if (!isMounted) {\n if (animationFrame !== null) {\n cancelAnimationFrame(animationFrame);\n }\n return;\n }\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const entries = Array.from(history.entries()).sort((a, b) => {\n const roleOrder = (role: string) => {\n if (role === 'context') return 0;\n if (role === 'store') return 1;\n return 2;\n };\n return roleOrder(a[1].role) - roleOrder(b[1].role);\n });\n const dpr = window.devicePixelRatio || 1;\n const rawWidth = DIM.WINDOW_SIZE * DIM.COL_WIDTH + DIM.LABEL_WIDTH + DIM.PADDING * 2;\n const rawHeight = Math.max(entries.length * DIM.ROW_HEIGHT + DIM.PADDING * 2, 80);\n\n updateCanvasSize(canvas, rawWidth, rawHeight, dpr);\n ctx.save();\n ctx.scale(dpr, dpr);\n ctx.clearRect(0, 0, rawWidth, rawHeight);\n\n if (entries.length === 0) renderEmptyState(ctx);\n else renderMatrix(ctx, entries);\n\n ctx.restore();\n animationFrame = requestAnimationFrame(draw);\n };\n\n // Kick off the animation loop\n animationFrame = requestAnimationFrame(draw);\n\n return () => {\n isMounted = false;\n if (animationFrame !== null) {\n cancelAnimationFrame(animationFrame);\n }\n };\n }, [isExpanded]);\n\n return (\n <div style={getHUDContainerStyle(isExpanded)} onClick={() => setIsExpanded(!isExpanded)}>\n <HUDHeader isExpanded={isExpanded} />\n {isExpanded && (\n <div style={{ padding: '10px 14px 15px 14px' }}>\n <canvas ref={canvasRef} style={{ display: 'block' }} />\n </div>\n )}\n </div>\n );\n};\n\nfunction updateCanvasSize(canvas: HTMLCanvasElement, w: number, h: number, dpr: number) {\n const targetW = Math.floor(w * dpr);\n const targetH = Math.floor(h * dpr);\n if (canvas.width !== targetW || canvas.height !== targetH) {\n canvas.width = targetW;\n canvas.height = targetH;\n canvas.style.width = `${w}px`;\n canvas.style.height = `${h}px`;\n }\n}\n\nfunction renderEmptyState(ctx: CanvasRenderingContext2D) {\n ctx.fillStyle = THEME.textDim;\n ctx.font = '11px Inter, sans-serif';\n ctx.fillText('Waiting for state transitions...', DIM.PADDING, 30);\n}\n\nfunction renderMatrix(ctx: CanvasRenderingContext2D, entries: [string, any][]) {\n const L = DIM.WINDOW_SIZE;\n const colW = DIM.COL_WIDTH;\n const rowH = DIM.ROW_HEIGHT;\n const pad = DIM.PADDING;\n const cellW = colW - 1.5;\n const cellH = rowH - 4;\n\n const gridPath = new Path2D();\n const successPath = new Path2D();\n const contextPath = new Path2D();\n const errorPath = new Path2D();\n\n ctx.font = \"11px Inter, Menlo, monospace\";\n\n let rowIndex = 0;\n for (const [label, meta] of entries) {\n const y = rowIndex * rowH + pad;\n const isContext = meta.role === 'context' || meta.role === 'store';\n const isRedundant = !isContext && redundantLabels.has(label);\n\n const { buffer, head } = meta;\n let uiPos = 0;\n\n const addToPath = (val: number, xIdx: number) => {\n const x = xIdx * colW + pad;\n if (val === 1) {\n if (isContext) contextPath.rect(x, y, cellW, cellH);\n else if (isRedundant) errorPath.rect(x, y, cellW, cellH);\n else successPath.rect(x, y, cellW, cellH);\n } else {\n gridPath.rect(x, y, cellW, cellH);\n }\n };\n\n for (let i = head; i < L; i++) addToPath(buffer[i], uiPos++);\n for (let i = 0; i < head; i++) addToPath(buffer[i], uiPos++);\n\n const stateName = parseLabel(label).name;\n const textX = (L * colW) + pad + 10;\n\n ctx.fillStyle = isContext ? THEME.header : (isRedundant ? THEME.error : THEME.text);\n const prefix = meta.role === 'store' ? \"Σ \" : isContext ? \"Ω \" : isRedundant ? \"! \" : \"\";\n ctx.fillText(prefix + stateName, textX, y + 9);\n\n rowIndex++;\n }\n\n ctx.fillStyle = THEME.grid; ctx.fill(gridPath);\n ctx.fillStyle = THEME.success; ctx.fill(successPath);\n ctx.fillStyle = THEME.header; ctx.fill(contextPath);\n ctx.fillStyle = THEME.error; ctx.fill(errorPath);\n}\n\nconst HUDHeader: React.FC<{ isExpanded: boolean }> = ({ isExpanded }) => (\n <div\n style={{\n padding: '10px 14px',\n backgroundColor: isExpanded ? THEME.header : 'transparent',\n color: isExpanded ? 'white' : THEME.header,\n fontWeight: 600,\n fontSize: '11px',\n letterSpacing: '0.05em',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n transition: 'background 0.3s',\n }}\n >\n <span>{isExpanded ? 'STATE BASIS MATRIX' : '📐 BASIS ACTIVE'}</span>\n {isExpanded && <span style={{ opacity: 0.8, fontSize: '9px' }}>v0.6.x</span>}\n </div>\n);","// src/ui/config.ts\n\nimport { WINDOW_SIZE } from '../core/constants';\n\nexport const HUD_DIMENSIONS = {\n WINDOW_SIZE,\n ROW_HEIGHT: 16,\n COL_WIDTH: 5,\n LABEL_WIDTH: 100,\n PADDING: 10,\n RADIUS: 1.5,\n};\n\nexport const HUD_THEME = {\n bg: 'rgba(15, 23, 42, 0.95)',\n border: '#334155',\n header: '#8b5cf6',\n text: '#f1f5f9',\n textDim: '#94a3b8',\n success: '#10b981',\n error: '#ef4444',\n grid: '#1e293b',\n};\n\nexport const getHUDContainerStyle = (isExpanded: boolean): React.CSSProperties => ({\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n backgroundColor: HUD_THEME.bg,\n border: `1px solid ${HUD_THEME.border}`,\n borderRadius: '12px',\n backdropFilter: 'blur(8px)',\n boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3)',\n zIndex: 999999,\n overflow: 'hidden',\n width: isExpanded ? '380px' : '130px',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n cursor: 'pointer',\n userSelect: 'none',\n WebkitUserSelect: 'none'\n});"],"mappings":"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","names":["useId","useDebugValue","useImperativeHandle","useInsertionEffect","createContext","useContext","useLayoutEffect","useEffect","useRef","useState","useState","useRef","useEffect","jsx","jsxs","createContext","useLayoutEffect","useContext"]}
1
+ {"version":3,"sources":["../src/hooks.ts","../src/context.tsx","../src/ui/BasisHUD.tsx","../src/ui/config.ts"],"sourcesContent":["// src/hooks.ts\n\nimport * as React from 'react';\nimport {\n useState as reactUseState,\n useEffect as reactUseEffect,\n useMemo as reactUseMemo,\n useReducer as reactUseReducer,\n useContext as reactUseContext,\n useSyncExternalStore as reactUseSyncExternalStore,\n createContext as reactCreateContext,\n useRef as reactUseRef,\n useLayoutEffect as reactUseLayoutEffect,\n useCallback as reactUseCallback,\n useTransition as reactUseTransition,\n useDeferredValue as reactUseDeferredValue,\n} from 'react';\n\nimport {\n registerVariable,\n unregisterVariable,\n recordUpdate,\n beginEffectTracking,\n endEffectTracking,\n history as engineHistory\n} from './engine';\nimport { SignalRole } from './core/types';\nimport { INSTANCE_SEP } from './core/constants';\n\n// --- Internal Type Helpers ---\n\nlet anonCount = 0;\nconst getFallbackLabel = (type: string) => `anon_${type}_${anonCount++}`;\n\nconst reactUseId = (React as unknown as { useId?: () => string }).useId;\nlet legacyInstanceCounter = 0;\n\nconst useInstanceId = (): string => {\n const [legacyId] = reactUseState(() =>\n typeof reactUseId === 'function' ? '' : `legacy_${legacyInstanceCounter++}`\n );\n return typeof reactUseId === 'function' ? reactUseId() : legacyId;\n};\n\nconst withInstance = (label: string, instanceId: string) =>\n `${label}${INSTANCE_SEP}${instanceId}`;\n\n/**\n * Standard React Reducer type inference helpers.\n */\ntype GetReducerState<R extends React.Reducer<any, any>> = R extends React.Reducer<infer S, any> ? S : never;\ntype GetReducerAction<R extends React.Reducer<any, any>> = R extends React.Reducer<any, infer A> ? A : never;\n\ninterface BasisContext<T> extends React.Context<T> {\n _basis_label?: string;\n}\n\ninterface React19Extended {\n useOptimistic?<S, P>(passthrough: S, reducer?: (state: S, payload: P) => S): [S, (payload: P) => void];\n useActionState?<State, Payload>(\n action: (state: State, payload: Payload) => Promise<State> | State,\n initialState: State,\n permalink?: string\n ): [state: State, dispatch: (payload: Payload) => void, isPending: boolean];\n use?<T>(usable: React.Usable<T>): T;\n}\n\nconst React19 = React as unknown as React19Extended;\n\n// --- useState ---\n\nexport function useState<S>(\n initialState: S | (() => S),\n label?: string\n): [S, React.Dispatch<React.SetStateAction<S>>] {\n const [val, setVal] = reactUseState(initialState);\n const effectiveLabel = reactUseRef(label || getFallbackLabel('state')).current;\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n\n reactUseEffect(() => {\n registerVariable(storageKey, { role: SignalRole.LOCAL });\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n\n const setter = reactUseCallback((value: React.SetStateAction<S>) => {\n if (recordUpdate(storageKey)) {\n setVal(value);\n }\n }, [storageKey]);\n\n return [val, setter];\n}\n\n// --- useReducer ---\n\n/**\n * PUBLIC OVERLOAD: Lazy initialization\n */\nexport function useReducer<R extends React.Reducer<any, any>, I>(\n reducer: R,\n initializerArg: I,\n initializer: (arg: I) => GetReducerState<R>,\n label?: string\n): [GetReducerState<R>, React.Dispatch<GetReducerAction<R>>];\n\n/**\n * PUBLIC OVERLOAD: Direct initialization\n */\nexport function useReducer<R extends React.Reducer<any, any>>(\n reducer: R,\n initialState: GetReducerState<R>,\n initializer?: undefined,\n label?: string\n): [GetReducerState<R>, React.Dispatch<GetReducerAction<R>>];\n\n/**\n * FINAL IMPLEMENTATION\n */\nexport function useReducer<R extends React.Reducer<any, any>, I>(\n reducer: R,\n initialArg: I | GetReducerState<R>,\n init?: ((arg: I) => GetReducerState<R>) | string,\n label?: string\n): [GetReducerState<R>, React.Dispatch<GetReducerAction<R>>] {\n const isLazy = typeof init === 'function';\n\n // v0.5.x Label Extraction: prioritize 4th arg, fallback to 3rd if string (Babel behavior)\n const providedLabel = label || (typeof init === 'string' ? init : undefined);\n const effectiveLabel = reactUseRef(providedLabel || getFallbackLabel('reducer')).current;\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n\n const [state, dispatch] = isLazy\n ? reactUseReducer(reducer, initialArg as I, init as (arg: I) => GetReducerState<R>)\n : reactUseReducer(reducer, initialArg as GetReducerState<R>);\n\n reactUseEffect(() => {\n registerVariable(storageKey, { role: SignalRole.LOCAL });\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n\n const basisDispatch = reactUseCallback((action: GetReducerAction<R>) => {\n if (recordUpdate(storageKey)) {\n dispatch(action);\n }\n }, [storageKey, dispatch]);\n\n return [state, basisDispatch];\n}\n\n// --- Context ---\n\nexport function createContext<T>(defaultValue: T, label?: string): React.Context<T> {\n const context = reactCreateContext(defaultValue) as BasisContext<T>;\n const effectiveLabel = label || getFallbackLabel('context');\n\n // Use non-enumerable property to store the Basis label\n Object.defineProperty(context, '_basis_label', {\n value: effectiveLabel,\n writable: false,\n enumerable: false\n });\n\n return context;\n}\n\nexport function useContext<T>(context: React.Context<T>): T {\n const val = reactUseContext(context);\n const label = (context as BasisContext<T>)._basis_label;\n\n reactUseLayoutEffect(() => {\n if (label) {\n registerVariable(label, { role: SignalRole.CONTEXT });\n recordUpdate(label);\n }\n }, [val, label]);\n\n return val;\n}\n\n// --- Projections ---\n\nexport function useMemo<T>(factory: () => T, deps: React.DependencyList | undefined, label?: string): T {\n const effectiveLabel = reactUseRef(label || getFallbackLabel('proj')).current;\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n reactUseEffect(() => {\n registerVariable(storageKey, { role: SignalRole.PROJECTION });\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n return reactUseMemo(factory, deps || []);\n}\n\nexport function useCallback<T extends (...args: unknown[]) => unknown>(callback: T, deps: React.DependencyList, label?: string): T {\n const effectiveLabel = reactUseRef(label || getFallbackLabel('cb')).current;\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n reactUseEffect(() => {\n registerVariable(storageKey, { role: SignalRole.PROJECTION });\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n return reactUseCallback(callback, deps);\n}\n\n// --- Effects ---\n\nexport function useEffect(effect: React.EffectCallback, deps?: React.DependencyList, label?: string): void {\n const effectiveLabel = label || 'anonymous_effect';\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n reactUseEffect(() => {\n beginEffectTracking(storageKey);\n const destructor = effect();\n endEffectTracking();\n return typeof destructor === 'function' ? destructor : undefined;\n }, deps);\n\n reactUseEffect(() => {\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n}\n\nexport function useLayoutEffect(effect: React.EffectCallback, deps?: React.DependencyList, label?: string): void {\n const effectiveLabel = label || 'anonymous_layout_effect';\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n reactUseLayoutEffect(() => {\n beginEffectTracking(storageKey);\n const destructor = effect();\n endEffectTracking();\n return typeof destructor === 'function' ? destructor : undefined;\n }, deps);\n\n reactUseEffect(() => {\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n}\n\n// --- React 19 ---\n\nexport function useOptimistic<S, P>(\n passthrough: S,\n reducer?: (state: S, payload: P) => S,\n label?: string\n): [S, (payload: P) => void] {\n const effectiveLabel = reactUseRef(label || getFallbackLabel('optimistic')).current;\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n reactUseEffect(() => {\n registerVariable(storageKey, { role: SignalRole.LOCAL });\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n\n const [state, reactAddOptimistic] = React19.useOptimistic!(\n passthrough,\n reducer as (state: S, action: P) => S\n );\n\n const addOptimistic = reactUseCallback((payload: P) => {\n if (recordUpdate(storageKey)) {\n reactAddOptimistic(payload);\n }\n }, [storageKey, reactAddOptimistic]);\n\n return [state, addOptimistic];\n}\n\nexport function useActionState<State, Payload>(\n action: (state: State, payload: Payload) => Promise<State> | State,\n initialState: State,\n permalink?: string,\n label?: string\n): [state: State, dispatch: (payload: Payload) => void, isPending: boolean] {\n\n const isLabelArg = typeof permalink === 'string' && label === undefined;\n const effectiveLabel = reactUseRef(isLabelArg ? (permalink as string) : (label || getFallbackLabel('action_state'))).current;\n const actualPermalink = isLabelArg ? undefined : permalink;\n const instanceId = useInstanceId();\n const storageKey = withInstance(effectiveLabel, instanceId);\n\n const [state, reactDispatch, isPending] = React19.useActionState!(action, initialState, actualPermalink);\n\n reactUseEffect(() => {\n registerVariable(storageKey, { role: SignalRole.LOCAL });\n return () => { unregisterVariable(storageKey); };\n }, [storageKey]);\n\n const basisDispatch = reactUseCallback((payload: Payload) => {\n if (recordUpdate(storageKey)) {\n reactDispatch(payload);\n }\n }, [storageKey, reactDispatch]);\n\n return [state, basisDispatch, isPending];\n}\n\n// --- Direct Exports ---\nexport const useRef = reactUseRef;\nexport const useId = React.useId;\nexport const useDebugValue = React.useDebugValue;\nexport const useImperativeHandle = React.useImperativeHandle;\nexport const useInsertionEffect = React.useInsertionEffect;\nexport const useSyncExternalStore = reactUseSyncExternalStore;\nexport const useTransition = reactUseTransition;\nexport const useDeferredValue = reactUseDeferredValue;\nexport const use = React19.use!;\n\nexport const __test__ = {\n registerVariable,\n history: engineHistory,\n unregisterVariable,\n recordUpdate,\n beginEffectTracking,\n endEffectTracking\n};","// src/context.tsx\n\nimport React, { createContext, useContext, ReactNode, useLayoutEffect } from 'react';\nimport { configureBasis } from './engine';\nimport { BasisHUD } from './ui/BasisHUD';\n\nconst BasisContext = createContext({ debug: false });\nconst isWeb = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n\ninterface BasisProviderProps {\n children: ReactNode;\n debug?: boolean;\n showHUD?: boolean;\n}\n\nexport const BasisProvider: React.FC<BasisProviderProps> = ({\n children,\n debug = true,\n showHUD = true\n}) => {\n useLayoutEffect(() => {\n configureBasis({ debug });\n if (isWeb) {\n (window as any)._basis_debug = debug;\n }\n }, [debug]);\n\n return (\n <BasisContext.Provider value={{ debug }}>\n {children}\n\n {(debug && showHUD && isWeb) && <BasisHUD />}\n </BasisContext.Provider>\n );\n};\n\nexport const useBasisConfig = () => useContext(BasisContext);","// src/ui/BasisHUD.tsx\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { history, redundantLabels } from '../engine';\nimport { HUD_DIMENSIONS as DIM, getHUDContainerStyle, HUD_THEME as THEME } from './config';\nimport { parseLabel } from '../core/label';\n\nexport const BasisHUD: React.FC = () => {\n const [isExpanded, setIsExpanded] = useState(false);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n useEffect(() => {\n if (!isExpanded) return;\n\n let isMounted = true;\n let animationFrame: number | null = null;\n\n const draw = () => {\n if (!isMounted) {\n if (animationFrame !== null) {\n cancelAnimationFrame(animationFrame);\n }\n return;\n }\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const entries = Array.from(history.entries()).sort((a, b) => {\n const roleOrder = (role: string) => {\n if (role === 'context') return 0;\n if (role === 'store') return 1;\n return 2;\n };\n return roleOrder(a[1].role) - roleOrder(b[1].role);\n });\n const dpr = window.devicePixelRatio || 1;\n const rawWidth = DIM.WINDOW_SIZE * DIM.COL_WIDTH + DIM.LABEL_WIDTH + DIM.PADDING * 2;\n const rawHeight = Math.max(entries.length * DIM.ROW_HEIGHT + DIM.PADDING * 2, 80);\n\n updateCanvasSize(canvas, rawWidth, rawHeight, dpr);\n ctx.save();\n ctx.scale(dpr, dpr);\n ctx.clearRect(0, 0, rawWidth, rawHeight);\n\n if (entries.length === 0) renderEmptyState(ctx);\n else renderMatrix(ctx, entries);\n\n ctx.restore();\n animationFrame = requestAnimationFrame(draw);\n };\n\n // Kick off the animation loop\n animationFrame = requestAnimationFrame(draw);\n\n return () => {\n isMounted = false;\n if (animationFrame !== null) {\n cancelAnimationFrame(animationFrame);\n }\n };\n }, [isExpanded]);\n\n return (\n <div style={getHUDContainerStyle(isExpanded)} onClick={() => setIsExpanded(!isExpanded)}>\n <HUDHeader isExpanded={isExpanded} />\n {isExpanded && (\n <div style={{ padding: '10px 14px 15px 14px' }}>\n <canvas ref={canvasRef} style={{ display: 'block' }} />\n </div>\n )}\n </div>\n );\n};\n\nfunction updateCanvasSize(canvas: HTMLCanvasElement, w: number, h: number, dpr: number) {\n const targetW = Math.floor(w * dpr);\n const targetH = Math.floor(h * dpr);\n if (canvas.width !== targetW || canvas.height !== targetH) {\n canvas.width = targetW;\n canvas.height = targetH;\n canvas.style.width = `${w}px`;\n canvas.style.height = `${h}px`;\n }\n}\n\nfunction renderEmptyState(ctx: CanvasRenderingContext2D) {\n ctx.fillStyle = THEME.textDim;\n ctx.font = '11px Inter, sans-serif';\n ctx.fillText('Waiting for state transitions...', DIM.PADDING, 30);\n}\n\nfunction renderMatrix(ctx: CanvasRenderingContext2D, entries: [string, any][]) {\n const L = DIM.WINDOW_SIZE;\n const colW = DIM.COL_WIDTH;\n const rowH = DIM.ROW_HEIGHT;\n const pad = DIM.PADDING;\n const cellW = colW - 1.5;\n const cellH = rowH - 4;\n\n const gridPath = new Path2D();\n const successPath = new Path2D();\n const contextPath = new Path2D();\n const errorPath = new Path2D();\n\n ctx.font = \"11px Inter, Menlo, monospace\";\n\n let rowIndex = 0;\n for (const [label, meta] of entries) {\n const y = rowIndex * rowH + pad;\n const isContext = meta.role === 'context' || meta.role === 'store';\n const isRedundant = !isContext && redundantLabels.has(label);\n\n const { buffer, head } = meta;\n let uiPos = 0;\n\n const addToPath = (val: number, xIdx: number) => {\n const x = xIdx * colW + pad;\n if (val === 1) {\n if (isContext) contextPath.rect(x, y, cellW, cellH);\n else if (isRedundant) errorPath.rect(x, y, cellW, cellH);\n else successPath.rect(x, y, cellW, cellH);\n } else {\n gridPath.rect(x, y, cellW, cellH);\n }\n };\n\n for (let i = head; i < L; i++) addToPath(buffer[i], uiPos++);\n for (let i = 0; i < head; i++) addToPath(buffer[i], uiPos++);\n\n const stateName = parseLabel(label).name;\n const textX = (L * colW) + pad + 10;\n\n ctx.fillStyle = isContext ? THEME.header : (isRedundant ? THEME.error : THEME.text);\n const prefix = meta.role === 'store' ? \"Σ \" : isContext ? \"Ω \" : isRedundant ? \"! \" : \"\";\n ctx.fillText(prefix + stateName, textX, y + 9);\n\n rowIndex++;\n }\n\n ctx.fillStyle = THEME.grid; ctx.fill(gridPath);\n ctx.fillStyle = THEME.success; ctx.fill(successPath);\n ctx.fillStyle = THEME.header; ctx.fill(contextPath);\n ctx.fillStyle = THEME.error; ctx.fill(errorPath);\n}\n\nconst HUDHeader: React.FC<{ isExpanded: boolean }> = ({ isExpanded }) => (\n <div\n style={{\n padding: '10px 14px',\n backgroundColor: isExpanded ? THEME.header : 'transparent',\n color: isExpanded ? 'white' : THEME.header,\n fontWeight: 600,\n fontSize: '11px',\n letterSpacing: '0.05em',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n transition: 'background 0.3s',\n }}\n >\n <span>{isExpanded ? 'STATE BASIS MATRIX' : '📐 BASIS ACTIVE'}</span>\n {isExpanded && <span style={{ opacity: 0.8, fontSize: '9px' }}>v0.6.x</span>}\n </div>\n);","// src/ui/config.ts\n\nimport { WINDOW_SIZE } from '../core/constants';\n\nexport const HUD_DIMENSIONS = {\n WINDOW_SIZE,\n ROW_HEIGHT: 16,\n COL_WIDTH: 5,\n LABEL_WIDTH: 100,\n PADDING: 10,\n RADIUS: 1.5,\n};\n\nexport const HUD_THEME = {\n bg: 'rgba(15, 23, 42, 0.95)',\n border: '#334155',\n header: '#8b5cf6',\n text: '#f1f5f9',\n textDim: '#94a3b8',\n success: '#10b981',\n error: '#ef4444',\n grid: '#1e293b',\n};\n\nexport const getHUDContainerStyle = (isExpanded: boolean): React.CSSProperties => ({\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n backgroundColor: HUD_THEME.bg,\n border: `1px solid ${HUD_THEME.border}`,\n borderRadius: '12px',\n backdropFilter: 'blur(8px)',\n boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3)',\n zIndex: 999999,\n overflow: 'hidden',\n width: isExpanded ? '380px' : '130px',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n cursor: 'pointer',\n userSelect: 'none',\n WebkitUserSelect: 'none'\n});"],"mappings":"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","names":["useId","useDebugValue","useImperativeHandle","useInsertionEffect","createContext","useContext","useLayoutEffect","useEffect","useRef","useState","useState","useRef","useEffect","jsx","jsxs","createContext","useLayoutEffect","useContext"]}
@@ -87,6 +87,27 @@ var calculateSpectralInfluence = (graph, maxIterations = 20, tolerance = 1e-3) =
87
87
  }
88
88
  return scores;
89
89
  };
90
+ var groupEventSources = (nodes, edges) => {
91
+ const outgoing = /* @__PURE__ */ new Map();
92
+ edges.forEach((e) => {
93
+ if (!outgoing.has(e.source)) outgoing.set(e.source, []);
94
+ outgoing.get(e.source).push(e);
95
+ });
96
+ const eventSourceIds = nodes.filter((n) => n.role === "event").map((n) => n.id);
97
+ const signatureOf = (sourceEdges) => sourceEdges.map((e) => `${e.target}@${e.weight}`).sort().join("|");
98
+ const buckets = /* @__PURE__ */ new Map();
99
+ eventSourceIds.forEach((id) => {
100
+ const sig = signatureOf(outgoing.get(id) || []);
101
+ if (!buckets.has(sig)) buckets.set(sig, []);
102
+ buckets.get(sig).push(id);
103
+ });
104
+ const groups = Array.from(buckets.values()).map((sourceIds) => ({
105
+ sourceIds,
106
+ occurrences: sourceIds.length,
107
+ edges: (outgoing.get(sourceIds[0]) || []).slice()
108
+ }));
109
+ return groups.sort((a, b) => b.edges.length - a.edges.length || b.occurrences - a.occurrences);
110
+ };
90
111
 
91
112
  // src/core/constants.ts
92
113
  var WINDOW_SIZE = 50;
@@ -106,6 +127,7 @@ var parseLabel = (label) => {
106
127
  return { file: parts[0] || "Unknown", name: parts[1] || base };
107
128
  };
108
129
  var isSameField = (labelA, labelB) => stripInstance(labelA) === stripInstance(labelB);
130
+ var isEffectLabel = (name) => /^effect_L\d+(:\d+)?$/.test(name) || name === "anonymous_effect" || name === "anonymous_layout_effect";
109
131
 
110
132
  // src/core/ranker.ts
111
133
  var identifyTopIssues = (graph, history2, redundantLabels2, violationMap) => {
@@ -501,6 +523,99 @@ var displayCausalHint = (targetLabel, targetMeta, sourceLabel, sourceMeta) => {
501
523
  }
502
524
  console.groupEnd();
503
525
  };
526
+ var splitHookLine = (raw) => {
527
+ const m = raw.match(/^(.*):(\d+)$/);
528
+ if (!m) return { hook: raw };
529
+ return { hook: m[1], line: Number(m[2]) };
530
+ };
531
+ var formatHook = (raw) => {
532
+ const { hook } = splitHookLine(raw);
533
+ if (!isEffectLabel(hook)) return hook;
534
+ const lineMatch = hook.match(/L(\d+)$/);
535
+ return lineMatch ? `effect @ L${lineMatch[1]}` : "effect (anonymous)";
536
+ };
537
+ var formatNode = (node, fallbackId = "?") => {
538
+ if (!node) return fallbackId;
539
+ if (node.role === "event") return "Event";
540
+ const hook = formatHook(node.name || node.id);
541
+ if (node.file && hook) return `${node.file} \u2192 ${hook}`;
542
+ return hook || node.id;
543
+ };
544
+ var displayGraphReport = (graph) => {
545
+ if (!isWeb) return;
546
+ if (graph.nodes.length === 0) {
547
+ console.log(
548
+ `%c \u{1F4CA} BASIS | CAUSAL GRAPH %c(no data yet)`,
549
+ STYLES.headerIdentity,
550
+ `color: ${THEME.muted}; font-style: italic;`
551
+ );
552
+ return;
553
+ }
554
+ const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));
555
+ const outgoing = /* @__PURE__ */ new Map();
556
+ graph.edges.forEach((e) => {
557
+ if (!outgoing.has(e.source)) outgoing.set(e.source, []);
558
+ outgoing.get(e.source).push(e);
559
+ });
560
+ const eventGroups = graph.eventGroups.map((g) => ({
561
+ sourceIds: g.sourceIds,
562
+ sourceNode: nodeById.get(g.sourceIds[0]),
563
+ edges: g.edges,
564
+ occurrences: g.occurrences
565
+ }));
566
+ const groupedSourceIds = new Set(graph.eventGroups.flatMap((g) => g.sourceIds));
567
+ 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 }));
568
+ const groups = [...eventGroups, ...nonEventGroups].sort(
569
+ (a, b) => b.edges.length - a.edges.length || b.occurrences - a.occurrences
570
+ );
571
+ console.group(
572
+ `%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}`,
573
+ STYLES.headerIdentity,
574
+ `color: ${THEME.muted}; font-weight: normal; font-style: italic;`
575
+ );
576
+ console.log(
577
+ `%cparent \u2192 child = observed cause \u2192 update. (\xD7N) = times in this window. Event groups with the same fan-out are collapsed.`,
578
+ STYLES.subText
579
+ );
580
+ groups.forEach((group) => {
581
+ const isEvent = group.sourceNode?.role === "event";
582
+ const isCtx = group.sourceNode?.role === "context" /* CONTEXT */;
583
+ const isFx = group.sourceNode?.role === "effect";
584
+ const isUnknown = group.sourceNode?.role === "unknown";
585
+ const icon = isEvent ? "\u26A1" : isCtx ? "\u03A9" : isFx ? "\u21AF" : isUnknown ? "?" : "\u25CF";
586
+ const color = isEvent ? THEME.solution : isCtx ? THEME.context : THEME.identity;
587
+ const fanout = group.edges.length;
588
+ const hits = group.occurrences;
589
+ const hitLabel = hits > 1 ? ` \xB7 \xD7${hits}` : "";
590
+ const title = isEvent ? `Event \xB7 ${fanout} target${fanout === 1 ? "" : "s"}${hitLabel}` : formatNode(group.sourceNode, group.sourceIds[0]);
591
+ console.groupCollapsed(
592
+ `%c${icon} %c${title}`,
593
+ `color: ${color};`,
594
+ "font-family: monospace; font-weight: 600;"
595
+ );
596
+ group.edges.slice().sort((a, b) => b.weight - a.weight).forEach((edge) => {
597
+ const target = nodeById.get(edge.target);
598
+ const label = formatNode(target, edge.target);
599
+ const weight = edge.weight > 1 ? ` (\xD7${edge.weight})` : "";
600
+ if (target?.redundant) {
601
+ console.log(
602
+ `%c ${label}%c${weight} %credundant`,
603
+ `color: ${THEME.muted}; font-family: monospace;`,
604
+ `color: ${THEME.muted}; font-style: italic;`,
605
+ `color: ${THEME.problem}; font-weight: bold;`
606
+ );
607
+ } else {
608
+ console.log(
609
+ `%c ${label}%c${weight}`,
610
+ `color: ${THEME.muted}; font-family: monospace;`,
611
+ `color: ${THEME.muted}; font-style: italic;`
612
+ );
613
+ }
614
+ });
615
+ console.groupEnd();
616
+ });
617
+ console.groupEnd();
618
+ };
504
619
  var displayViolentBreaker = (label, count, threshold) => {
505
620
  if (!isWeb) return;
506
621
  const { name } = parseLabel(label);
@@ -857,9 +972,53 @@ var getBasisMetrics = () => ({
857
972
  analysis_ms: instance.metrics.lastAnalysisTimeMs.toFixed(3),
858
973
  entropy: instance.metrics.systemEntropy.toFixed(3)
859
974
  });
975
+ var getBasisGraph = () => {
976
+ const nodeIds = /* @__PURE__ */ new Set();
977
+ const edges = [];
978
+ instance.graph.forEach((targets, source) => {
979
+ nodeIds.add(source);
980
+ targets.forEach((weight, target) => {
981
+ nodeIds.add(target);
982
+ edges.push({ source, target, weight });
983
+ });
984
+ });
985
+ const nodes = Array.from(nodeIds).map((id) => {
986
+ if (id.startsWith("Event_Tick_")) {
987
+ return { id, name: "Event", file: "(shared trigger)", role: "event", density: null, redundant: false };
988
+ }
989
+ const meta = instance.history.get(id);
990
+ const { file, name } = parseLabel(id);
991
+ if (!meta) {
992
+ const role = isEffectLabel(name) ? "effect" : "unknown";
993
+ return { id, name, file, role, density: null, redundant: false };
994
+ }
995
+ return {
996
+ id,
997
+ name,
998
+ file,
999
+ role: meta.role,
1000
+ density: meta.density,
1001
+ redundant: instance.redundantLabels.has(id)
1002
+ };
1003
+ });
1004
+ return {
1005
+ generatedAt: Date.now(),
1006
+ bufferWindowSize: WINDOW_SIZE,
1007
+ eventTtlMs: EVENT_TTL,
1008
+ nodes,
1009
+ edges,
1010
+ eventGroups: groupEventSources(nodes, edges)
1011
+ };
1012
+ };
1013
+ var printBasisGraph = () => {
1014
+ if (!instance.config.debug) return;
1015
+ displayGraphReport(getBasisGraph());
1016
+ };
860
1017
  if (typeof window !== "undefined") {
861
1018
  window.printBasisReport = printBasisHealthReport;
862
1019
  window.getBasisMetrics = getBasisMetrics;
1020
+ window.getBasisGraph = getBasisGraph;
1021
+ window.printBasisGraph = printBasisGraph;
863
1022
  }
864
1023
 
865
1024
  // src/integrations/zustand.ts