@atlassian/chippy 0.0.0-stage → 0.0.1-beta.2
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/LICENSE +201 -0
- package/README.md +276 -2
- package/bin/chippy.mjs +92 -0
- package/bin/pack.mjs +204 -0
- package/bin/skill-dir.mjs +15 -0
- package/lib/avalanche.js +2601 -0
- package/lib/avalanche.js.map +7 -0
- package/lib/bootstrap.d.ts +1 -0
- package/lib/bootstrap.js +70 -0
- package/lib/bootstrap.js.map +7 -0
- package/lib/browser.js +15 -0
- package/lib/browser.js.map +7 -0
- package/lib/extension/avalanche.es.js +5535 -0
- package/lib/extension/avalanche.es.js.map +1 -0
- package/lib/extension/chippy-page-bridge.js +1953 -0
- package/lib/extension/inspect-react.js +216 -0
- package/lib/extension/layout-lab.js +1453 -0
- package/lib/extension/panel-dom.js +90 -0
- package/lib/extension/resolve-probes.js +342 -0
- package/lib/mcp-skill/LICENSE +201 -0
- package/lib/mcp-skill/README.md +148 -0
- package/lib/mcp-skill/SKILL.md +335 -0
- package/lib/mcp-skill/browser-scripts/playwright-probes.js +368 -0
- package/lib/mcp-skill/browser-scripts/playwright-session.js +114 -0
- package/lib/mcp-skill/extension/armed-reload-startup.js +83 -0
- package/lib/mcp-skill/extension/avalanche.es.js +5535 -0
- package/lib/mcp-skill/extension/avalanche.es.js.map +1 -0
- package/lib/mcp-skill/extension/avalanche.iife.js +5536 -0
- package/lib/mcp-skill/extension/avalanche.iife.js.map +1 -0
- package/lib/mcp-skill/extension/background.js +325 -0
- package/lib/mcp-skill/extension/chippy-page-bridge.js +1953 -0
- package/lib/mcp-skill/extension/content-script.js +190 -0
- package/lib/mcp-skill/extension/devtools-hook-shim.js +85 -0
- package/lib/mcp-skill/extension/early-bootstrap.js +49 -0
- package/lib/mcp-skill/extension/icon-128.png +0 -0
- package/lib/mcp-skill/extension/icon-16.png +0 -0
- package/lib/mcp-skill/extension/icon-32.png +0 -0
- package/lib/mcp-skill/extension/icon-48.png +0 -0
- package/lib/mcp-skill/extension/inspect-react.js +216 -0
- package/lib/mcp-skill/extension/layout-lab.js +1453 -0
- package/lib/mcp-skill/extension/logo.svg +14 -0
- package/lib/mcp-skill/extension/manifest.json +69 -0
- package/lib/mcp-skill/extension/panel-dom.js +90 -0
- package/lib/mcp-skill/extension/panel-settings.js +173 -0
- package/lib/mcp-skill/extension/popup.html +41 -0
- package/lib/mcp-skill/extension/popup.js +80 -0
- package/lib/mcp-skill/extension/probe-descriptor.js +241 -0
- package/lib/mcp-skill/extension/resolve-probes.js +342 -0
- package/lib/mcp-skill/extension/startup-handoff.js +30 -0
- package/lib/mcp-skill/package.json +1 -0
- package/lib/mcp-skill/references/README.md +56 -0
- package/lib/mcp-skill/references/active-stimulus.md +85 -0
- package/lib/mcp-skill/references/avalanche-detector.md +731 -0
- package/lib/mcp-skill/references/bdd-router.md +310 -0
- package/lib/mcp-skill/references/browser-runtime-api.md +193 -0
- package/lib/mcp-skill/references/command-output-formats.md +1085 -0
- package/lib/mcp-skill/references/command-surface.md +183 -0
- package/lib/mcp-skill/references/cynefin.md +99 -0
- package/lib/mcp-skill/references/debug-hook.md +161 -0
- package/lib/mcp-skill/references/fixing-performance.md +490 -0
- package/lib/mcp-skill/references/hook-metrics.md +199 -0
- package/lib/mcp-skill/references/hooks-inspection.md +61 -0
- package/lib/mcp-skill/references/jira-taxonomy.md +81 -0
- package/lib/mcp-skill/references/mcp.md +122 -0
- package/lib/mcp-skill/references/mode-a-injection.md +102 -0
- package/lib/mcp-skill/references/operating-model.md +128 -0
- package/lib/mcp-skill/references/playwright-cli-setup.md +105 -0
- package/lib/mcp-skill/references/playwright-probes.md +205 -0
- package/lib/mcp-skill/references/procedures.md +545 -0
- package/lib/mcp-skill/references/recipes.txt +114 -0
- package/lib/mcp-skill/references/stability-render.md +428 -0
- package/lib/mcp-skill/references/test-mode-playbook.md +194 -0
- package/lib/mcp-skill/references/troubleshooting.md +59 -0
- package/lib/mcp-skill/scripts/avalanche-analyze.cjs +495 -0
- package/lib/mcp-skill/scripts/build-avalanche-command.js +34 -0
- package/lib/mcp-skill/scripts/build-fiber-state-command.js +19 -0
- package/lib/mcp-skill/scripts/chippy-helper-server.js +1768 -0
- package/lib/mcp-skill/scripts/chippy-mcp.cjs +273 -0
- package/lib/mcp-skill/scripts/chippy.sh +1252 -0
- package/lib/mcp-skill/scripts/format-probe-result.js +34 -0
- package/lib/mcp-skill/scripts/helper-access.js +158 -0
- package/lib/mcp-skill/scripts/helper-proxy.js +87 -0
- package/lib/mcp-skill/scripts/page-socket-trust.js +81 -0
- package/lib/mcp-skill/scripts/probe-annotation-channel.js +116 -0
- package/lib/mcp-skill/scripts/search-recipes.js +248 -0
- package/lib/mcp-skill/snippets/README.md +89 -0
- package/lib/mcp-skill/snippets/count-context-consumers.js +40 -0
- package/lib/mcp-skill/snippets/find-context-providers.js +38 -0
- package/lib/mcp-skill/snippets/find-legacy-context.js +47 -0
- package/lib/mcp-skill/snippets/find-prop.js +83 -0
- package/lib/mcp-skill/snippets/hook-metrics-sample.js +69 -0
- package/lib/mcp-skill/snippets/hook-metrics.js +60 -0
- package/lib/mcp-skill/snippets/hook-tracker.js +198 -0
- package/lib/mcp-skill/snippets/stability-nudge.js +101 -0
- package/lib/package.json +1 -0
- package/lib/plugin.js +119 -0
- package/lib/plugin.js.map +7 -0
- package/lib/storybook/avalanche-panel-model.js +79 -0
- package/lib/storybook/brand.jsx +6 -0
- package/lib/storybook/connection-fallback.jsx +47 -0
- package/lib/storybook/constants.js +15 -0
- package/lib/storybook/context-card.jsx +171 -0
- package/lib/storybook/manager-owner.js +42 -0
- package/lib/storybook/manager.jsx +425 -0
- package/lib/storybook/preset.js +7 -0
- package/lib/storybook/preview.js +298 -0
- package/lib/storybook/probe-annotation-editor.jsx +52 -0
- package/lib/storybook/probe-intent.js +23 -0
- package/lib/storybook/setup.js +104 -0
- package/lib/types/avalanche/commit-metrics-adapter.d.ts +76 -0
- package/lib/types/avalanche/commit-stats-indices.d.ts +41 -0
- package/lib/types/avalanche/commit-surface-ownership.d.ts +9 -0
- package/lib/types/avalanche/detector.d.ts +183 -0
- package/lib/types/avalanche/interaction-capture.d.ts +25 -0
- package/lib/types/avalanche/internals.d.ts +189 -0
- package/lib/types/avalanche/report-serializer.d.ts +283 -0
- package/lib/types/avalanche/reporter.d.ts +610 -0
- package/lib/types/chippy-bridge/fiber-source.d.ts +48 -0
- package/lib/types/chippy-bridge/react-renderer.d.ts +74 -0
- package/lib/types/chippy-bridge/recorded-source.d.ts +44 -0
- package/lib/types/chippy-bridge/source-map.d.ts +30 -0
- package/lib/types/debug-render/core.d.ts +78 -0
- package/lib/types/layout-lab/fiber-boundaries.d.ts +51 -0
- package/lib/types/layout-lab/fiber-walk.d.ts +131 -0
- package/lib/types/layout-lab/marker-context.d.ts +94 -0
- package/lib/types/package/avalanche.d.ts +6 -0
- package/lib/types/package/browser.d.ts +10 -0
- package/lib/types/package/plugin.d.ts +15 -0
- package/lib/types/plugins/atl/commit-metrics-adapter.d.ts +65 -0
- package/lib/types/plugins/atl/metrics-slot.d.ts +37 -0
- package/lib/types/plugins/index.d.ts +49 -0
- package/lib/types/plugins/jira/context-provider.d.ts +36 -0
- package/package.json +106 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avalanche.iife.js","sources":["../src/chippy-bridge/source-map.ts","../src/chippy-bridge/recorded-source.ts","../src/chippy-bridge/fiber-source.ts","../src/avalanche/internals.tsx","../src/avalanche/commit-stats-indices.ts","../src/avalanche/report-serializer.tsx","../src/avalanche/commit-metrics-adapter.ts","../src/avalanche/reporter.tsx","../src/chippy-bridge/react-renderer.ts","../src/debug-render/core.ts","../src/avalanche/commit-surface-ownership.ts","../src/layout-lab/fiber-walk.ts","../src/avalanche/interaction-capture.ts","../src/avalanche/detector.tsx","../src/debug-render/context-replay.ts","../src/debug-render/replay.ts","../src/layout-lab/fiber-boundaries.ts","../src/layout-lab/marker-context.ts","../src/plugins/atl/metrics-slot.ts","../src/plugins/atl/commit-metrics-adapter.ts","../src/plugins/jira/context-provider.ts","../src/plugins/index.ts","../src/layout-lab/probe-intent.ts","../src/chippy-bridge/inspect-formatters.ts","../src/chippy-bridge/describe-component.ts","../src/chippy-bridge/avalanche-commands.ts","../src/chippy-bridge/eval-helpers.ts","../src/chippy-bridge/fiber-introspect.ts","../src/chippy-bridge/fiber-invoke.ts","../src/chippy-bridge/fiber-schedule-update.ts","../src/chippy-bridge/fiber-state.ts","../src/chippy-bridge/declarative-boundaries.ts","../src/iife.ts"],"sourcesContent":["/**\n * Small, dependency-free Source Map v3 reader.\n *\n * Chippy only needs the generated-position lookup used by React 19's\n * `_debugStack` source path, so it deliberately omits names and source contents.\n */\n\nconst DIGITS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\nconst VALUE_OF = new Int8Array(128).fill(-1);\nfor (let index = 0; index < DIGITS.length; index += 1) {\n VALUE_OF[DIGITS.charCodeAt(index)] = index;\n}\n\ntype Segment = {\n generatedColumn: number;\n sourceIndex: number | null;\n originalLine: number | null;\n originalColumn: number | null;\n};\n\nexport type SourceMap = {\n sources: readonly string[];\n lines: readonly (readonly Segment[])[];\n offset: { line: number; column: number };\n};\n\nexport type OriginalPosition = {\n source: string;\n line: number;\n column: number;\n};\n\ntype RawMap = {\n version?: unknown;\n sources?: unknown;\n sourceRoot?: unknown;\n mappings?: unknown;\n sections?: unknown;\n};\n\nfunction decodeVlq(field: string): number[] {\n const values: number[] = [];\n let value = 0;\n let shift = 0;\n\n for (let index = 0; index < field.length; index += 1) {\n const code = field.charCodeAt(index);\n const digit = code < 128 ? VALUE_OF[code]! : -1;\n if (digit < 0) return values;\n\n const more = (digit & 32) !== 0;\n value += (digit & 31) << shift;\n if (more) {\n shift += 5;\n continue;\n }\n\n const negative = (value & 1) === 1;\n const magnitude = value >>> 1;\n values.push(negative ? (magnitude === 0 ? -0x80000000 : -magnitude) : magnitude);\n value = 0;\n shift = 0;\n }\n\n return values;\n}\n\nfunction decodeMappings(mappings: string, sourceCount: number): Segment[][] {\n const lines: Segment[][] = [];\n let sourceIndex = 0;\n let originalLine = 0;\n let originalColumn = 0;\n\n for (const encodedLine of mappings.split(';')) {\n const segments: Segment[] = [];\n let generatedColumn = 0;\n\n for (const field of encodedLine === '' ? [] : encodedLine.split(',')) {\n const values = decodeVlq(field);\n if (values.length < 4) {\n if (values.length > 0) {\n generatedColumn += values[0]!;\n segments.push({ generatedColumn, sourceIndex: null, originalLine: null, originalColumn: null });\n }\n continue;\n }\n\n generatedColumn += values[0]!;\n sourceIndex += values[1]!;\n originalLine += values[2]!;\n originalColumn += values[3]!;\n if (sourceIndex >= 0 && sourceIndex < sourceCount) {\n segments.push({ generatedColumn, sourceIndex, originalLine, originalColumn });\n }\n }\n\n segments.sort((left, right) => left.generatedColumn - right.generatedColumn);\n lines.push(segments);\n }\n\n return lines;\n}\n\nfunction resolveSources(raw: RawMap): string[] | null {\n if (!Array.isArray(raw.sources)) return null;\n const root = typeof raw.sourceRoot === 'string' ? raw.sourceRoot : '';\n\n return raw.sources.map((source) => {\n if (typeof source !== 'string') return '';\n if (root === '' || source === '' || /^[a-z][a-z0-9+.-]*:/i.test(source)) return source;\n if (root.endsWith('/') && source.startsWith('/')) return `${root}${source.slice(1)}`;\n if (root.endsWith('/') || source.startsWith('/')) return `${root}${source}`;\n return `${root}/${source}`;\n });\n}\n\nexport function parseSourceMap(text: string): SourceMap[] {\n let raw: RawMap;\n try {\n raw = JSON.parse(text) as RawMap;\n } catch {\n return [];\n }\n\n if (raw === null || typeof raw !== 'object') return [];\n if (raw.version !== 3) return [];\n\n if (Array.isArray(raw.sections)) {\n return raw.sections.flatMap((section) => {\n if (section === null || typeof section !== 'object') return [];\n const { offset, map } = section as { offset?: unknown; map?: unknown };\n if (offset === null || typeof offset !== 'object' || map === null || typeof map !== 'object') return [];\n const { line, column } = offset as { line?: unknown; column?: unknown };\n if (typeof line !== 'number' || typeof column !== 'number') return [];\n return parseSourceMap(JSON.stringify(map)).map((parsed) => ({ ...parsed, offset: { line, column } }));\n });\n }\n\n const sources = resolveSources(raw);\n if (sources === null || typeof raw.mappings !== 'string') return [];\n return [{ sources, lines: decodeMappings(raw.mappings, sources.length), offset: { line: 0, column: 0 } }];\n}\n\nfunction sectionsFor(maps: readonly SourceMap[], line: number, column: number): readonly SourceMap[] {\n if (\n maps.length === 0 ||\n (maps.length === 1 && maps[0]?.offset.line === 0 && maps[0]?.offset.column === 0)\n ) return maps;\n const zeroBasedLine = line - 1;\n const candidates = maps.filter(\n (map) =>\n map.offset.line < zeroBasedLine ||\n (map.offset.line === zeroBasedLine && map.offset.column < column),\n );\n return candidates.length === 0 ? [] : [candidates[candidates.length - 1]!];\n}\n\nfunction segmentAt(segments: readonly Segment[], column: number): Segment | undefined {\n let low = 0;\n let high = segments.length - 1;\n let found: Segment | undefined;\n\n while (low <= high) {\n const middle = (low + high) >> 1;\n const segment = segments[middle]!;\n if (segment.generatedColumn <= column) {\n found = segment;\n low = middle + 1;\n } else {\n high = middle - 1;\n }\n }\n\n return found;\n}\n\nexport function originalPositionFor(\n maps: readonly SourceMap[],\n line: number,\n column: number,\n): OriginalPosition | null {\n for (const map of sectionsFor(maps, line, column)) {\n const localLine = line - map.offset.line;\n const localColumn = localLine === 1 ? column - map.offset.column : column;\n const segments = map.lines[localLine - 1];\n if (segments === undefined || segments.length === 0) continue;\n\n const found = segmentAt(segments, localColumn - 1);\n if (found === undefined) continue;\n if (\n found.sourceIndex === null ||\n found.originalLine === null ||\n found.originalColumn === null\n ) return null;\n const source = map.sources[found.sourceIndex];\n if (source === undefined || source === '') continue;\n return { source, line: found.originalLine + 1, column: found.originalColumn + 1 };\n }\n\n return null;\n}\n\nexport function sourceMappingUrlOf(code: string): string | null {\n const found = [...code.matchAll(/^[/*]{2,}[#@]\\s*sourceMappingURL=(\\S+)\\s*(?:\\*\\/)?$/gm)];\n return found.at(-1)?.[1] ?? null;\n}\n\nexport function inlineSourceMapOf(url: string): string | null {\n const match = /^data:application\\/json[^,]*,(.*)$/s.exec(url);\n if (match === null) return null;\n const payload = match[1]!;\n\n if (!/;base64/i.test(url)) {\n try {\n return decodeURIComponent(payload);\n } catch {\n return null;\n }\n }\n\n try {\n const decode = (globalThis as { atob?: (input: string) => string }).atob;\n if (decode) {\n const binary = decode(payload);\n const Decoder = (globalThis as {\n TextDecoder?: new () => { decode(bytes: Uint8Array): string };\n }).TextDecoder;\n return Decoder\n ? new Decoder().decode(Uint8Array.from(binary, (character) => character.charCodeAt(0)))\n : binary;\n }\n const buffer = (globalThis as {\n Buffer?: { from(value: string, encoding: string): { toString(encoding: string): string } };\n }).Buffer;\n return buffer?.from(payload, 'base64').toString('utf8') ?? null;\n } catch {\n return null;\n }\n}\n","/**\n * Correct React <=18 `_debugSource` lines through the served module.\n *\n * The JSX transform records `lineNumber`/`columnNumber` from the code it\n * receives. When an earlier transform adds lines first, the recorded position\n * points into that intermediate code rather than the authored file. For\n * example, `@vitejs/plugin-react` adds a Fast Refresh header before esbuild\n * compiles JSX, which shifts every recorded line in the module.\n *\n * The served module still contains the recorded literal, and its source map\n * maps that literal to the JSX element in the authored file. This module finds\n * the literal and the URLs that may serve the recorded file; the call-site\n * resolver in fiber-source.ts fetches the module and applies the map.\n */\n\nexport type RecordedSource = {\n fileName: string;\n lineNumber: number;\n columnNumber: number | null;\n};\n\nexport type ServedPosition = { line: number; column: number };\n\nexport type PageModules = {\n origin: string;\n /** Script and module URLs the page loaded, oldest first. */\n resourceUrls: readonly string[];\n /** Vite serves any allowed file from `/@fs/<absolute path>`. */\n vite: boolean;\n};\n\n/**\n * The position of the single debug literal for `source` in served code, or\n * null when the literal is missing or appears more than once.\n */\nexport function recordedLiteralPosition(code: string, source: RecordedSource): ServedPosition | null {\n const column = source.columnNumber === null ? '' : `,\\\\s*columnNumber:\\\\s*${source.columnNumber}`;\n const literal = new RegExp(`lineNumber:\\\\s*${source.lineNumber}${column}(?!\\\\d)`, 'g');\n const first = literal.exec(code);\n if (first === null || literal.exec(code) !== null) return null;\n const before = code.slice(0, first.index);\n const lineStart = before.lastIndexOf('\\n');\n return { line: before.split('\\n').length, column: first.index - lineStart };\n}\n\nfunction decodedPath(pathname: string): string {\n try {\n return decodeURIComponent(pathname);\n } catch {\n return pathname;\n }\n}\n\nfunction slashPath(fileName: string): string {\n return fileName.replace(/\\\\/g, '/');\n}\n\n/**\n * Same-origin URLs that may serve `fileName`, best match first: loaded modules\n * whose path ends the recorded file path, newest first, then Vite's `/@fs`\n * URL when the page runs on Vite.\n */\nexport function servedModuleUrls(fileName: string, page: PageModules): string[] {\n const file = slashPath(fileName);\n const matches = new Map<string, { url: string; length: number }>();\n for (const raw of page.resourceUrls) {\n let url: URL;\n try {\n url = new URL(raw, page.origin);\n } catch {\n continue;\n }\n if (url.origin !== page.origin) continue;\n const path = decodedPath(url.pathname).replace(/^\\/@fs(?=\\/)/, '');\n const tail = /^\\/[A-Za-z]:\\//.test(path) && /^[A-Za-z]:\\//.test(file) ? path.slice(1) : path;\n if (tail.length < 2 || !file.endsWith(tail)) continue;\n // Later entries are newer, for example a module reloaded with `?t=`.\n matches.set(tail, { url: url.href, length: tail.length });\n }\n const ranked = [...matches.values()].sort((a, b) => b.length - a.length).map((entry) => entry.url);\n if (page.vite && (file.startsWith('/') || /^[A-Za-z]:\\//.test(file))) {\n const fsUrl = new URL(`/@fs${file.startsWith('/') ? '' : '/'}${file}`, page.origin).href;\n if (!ranked.includes(fsUrl)) ranked.push(fsUrl);\n }\n return ranked;\n}\n\nfunction readPageModules(): PageModules | null {\n const scope = globalThis as {\n location?: { origin?: string };\n performance?: { getEntriesByType?: (type: string) => Array<{ name: string }> };\n document?: { scripts?: ArrayLike<{ src?: string }> };\n };\n const origin = scope.location?.origin;\n if (!origin || origin === 'null') return null;\n const resourceUrls: string[] = [];\n for (const script of Array.from(scope.document?.scripts ?? [])) {\n if (script.src) resourceUrls.push(script.src);\n }\n try {\n for (const entry of scope.performance?.getEntriesByType?.('resource') ?? []) resourceUrls.push(entry.name);\n } catch {}\n const vite = resourceUrls.some((url) => url.includes('/@vite/client'));\n return { origin, resourceUrls, vite };\n}\n\n/** Candidate module URLs for a recorded file on the current page. */\nexport function pageModuleUrls(fileName: string): string[] {\n const page = readPageModules();\n return page ? servedModuleUrls(fileName, page) : [];\n}\n\nexport function baseName(path: string): string {\n const clean = slashPath(path).replace(/[?#].*$/, '');\n return clean.slice(clean.lastIndexOf('/') + 1);\n}\n","import {\n inlineSourceMapOf,\n originalPositionFor,\n parseSourceMap,\n sourceMappingUrlOf,\n type OriginalPosition,\n type SourceMap,\n} from './source-map';\nimport { baseName, pageModuleUrls, recordedLiteralPosition } from './recorded-source';\n\nexport type FiberSourceLocation = {\n fileName: string;\n lineNumber: number;\n columnNumber: number | null;\n};\n\nexport type StackFrame = {\n url: string;\n line: number;\n column: number;\n function?: string;\n};\n\nexport type SourceFiber = {\n type?: unknown;\n _debugSource?: unknown;\n _debugStack?: unknown;\n};\n\nexport type FetchModule = (url: string) => Promise<string | null>;\n\n/** Module URLs that may serve a file named by React <=18 `_debugSource`. */\nexport type ModuleUrlsFor = (fileName: string) => readonly string[];\n\nexport type CallSiteResolver = {\n locate(frames: readonly StackFrame[]): Promise<FiberSourceLocation | null>;\n /** Map a recorded `_debugSource` position through its served module. */\n locateRecorded(source: FiberSourceLocation): Promise<FiberSourceLocation>;\n readonly stats: { modules: number; sites: number; located: number };\n};\n\ntype ResolvedMaps = {\n code: string;\n maps: readonly SourceMap[];\n sourceBaseUrl: string;\n};\n\nconst V8_FRAME = /^\\s*at\\s+(?:(.+?)\\s+\\()?(.+?):(\\d+):(\\d+)\\)?$/;\nconst AT_FRAME = /^\\s*(?:(.*?)@)(.+?):(\\d+):(\\d+)$/;\nconst MAX_CALL_SITE_FRAMES = 4;\n\nconst resolvedFiberSources = new WeakMap<object, FiberSourceLocation | null>();\nconst pendingFiberSources = new WeakMap<object, Promise<FiberSourceLocation | null>>();\nlet defaultResolver: CallSiteResolver | null = null;\n\nexport function parseStackFrames(stack: string): StackFrame[] {\n const frames: StackFrame[] = [];\n\n for (const raw of stack.split('\\n')) {\n const line = raw.trimEnd();\n if (line === '' || line.includes('(eval at ')) continue;\n const match = V8_FRAME.exec(line) ?? AT_FRAME.exec(line);\n if (!match) continue;\n\n const [, name, url = '', lineDigits = '', columnDigits = ''] = match;\n if (url === '' || url.startsWith('data:')) continue;\n const at = Number(lineDigits);\n const column = Number(columnDigits);\n if (!Number.isFinite(at) || !Number.isFinite(column) || at < 1) continue;\n frames.push({\n url,\n line: at,\n column,\n ...(name !== undefined && name !== '' ? { function: name } : {}),\n });\n }\n\n return frames;\n}\n\nexport function isVendorPath(path: string): boolean {\n return (\n path.includes('node_modules') ||\n path.includes('/.vite/deps/') ||\n path.includes('/.yarn/')\n );\n}\n\nfunction rawLocation(frame: StackFrame): FiberSourceLocation {\n return { fileName: frame.url, lineNumber: frame.line, columnNumber: frame.column };\n}\n\nfunction locationFromOriginal(original: OriginalPosition): FiberSourceLocation {\n return { fileName: original.source, lineNumber: original.line, columnNumber: original.column };\n}\n\nexport function writerLocationOf(\n frames: readonly StackFrame[],\n originalFor: (frame: StackFrame) => OriginalPosition | null,\n): FiberSourceLocation | null {\n for (const frame of frames) {\n if (isVendorPath(frame.url)) continue;\n const original = originalFor(frame);\n if (original === null) return rawLocation(frame);\n if (isVendorPath(original.source)) continue;\n return locationFromOriginal(original);\n }\n return null;\n}\n\nfunction parseUrl(url: string, base?: string): URL | null {\n try {\n return new URL(url, base);\n } catch {\n return null;\n }\n}\n\nfunction sourcePath(source: string, moduleUrl: string): string {\n if (/^\\/(?:Users|home|private|Volumes)\\//.test(source)) return source;\n const direct = parseUrl(source);\n if (direct?.protocol === 'file:') return decodeURIComponent(direct.pathname);\n const resolved = parseUrl(source, moduleUrl)?.href ?? source;\n const parsed = parseUrl(resolved);\n return parsed ? parsed.pathname.replace(/^\\/+/, '') : resolved;\n}\n\nexport function createCallSiteResolver(\n fetchModule: FetchModule,\n moduleUrlsFor: ModuleUrlsFor = () => [],\n): CallSiteResolver {\n const maps = new Map<string, Promise<ResolvedMaps | null>>();\n const sites = new Map<string, Promise<FiberSourceLocation | null>>();\n const recordedSites = new Map<string, Promise<FiberSourceLocation>>();\n const stats = { modules: 0, sites: 0, located: 0 };\n\n async function mapsFor(url: string): Promise<ResolvedMaps | null> {\n const cached = maps.get(url);\n if (cached) return cached;\n\n const pending = (async () => {\n stats.modules += 1;\n const code = await fetchModule(url);\n if (code === null) return null;\n const annotation = sourceMappingUrlOf(code);\n if (annotation === null) return null;\n const inline = inlineSourceMapOf(annotation);\n if (inline !== null) return { code, maps: parseSourceMap(inline), sourceBaseUrl: url };\n const mapUrl = parseUrl(annotation, url)?.href ?? null;\n const text = mapUrl === null ? null : await fetchModule(mapUrl);\n return text === null || mapUrl === null\n ? null\n : { code, maps: parseSourceMap(text), sourceBaseUrl: mapUrl };\n })();\n\n maps.set(url, pending);\n return pending;\n }\n\n async function locateFrame(frame: StackFrame): Promise<FiberSourceLocation | null> {\n const parsed = await mapsFor(frame.url);\n if (!parsed || parsed.maps.length === 0) return null;\n const original = originalPositionFor(parsed.maps, frame.line, frame.column);\n if (!original) return null;\n return {\n fileName: sourcePath(original.source, parsed.sourceBaseUrl),\n lineNumber: original.line,\n columnNumber: original.column,\n };\n }\n\n async function locate(frames: readonly StackFrame[]): Promise<FiberSourceLocation | null> {\n for (const frame of frames) {\n if (isVendorPath(frame.url)) continue;\n const key = `${frame.url}:${frame.line}:${frame.column}`;\n let answer = sites.get(key);\n if (!answer) {\n stats.sites += 1;\n answer = locateFrame(frame);\n sites.set(key, answer);\n }\n\n const located = await answer;\n const chosen = located === null\n ? writerLocationOf([frame], () => null)\n : isVendorPath(located.fileName) ? null : located;\n if (chosen) {\n stats.located += 1;\n return chosen;\n }\n }\n return null;\n }\n\n async function correctRecorded(source: FiberSourceLocation): Promise<FiberSourceLocation> {\n for (const url of moduleUrlsFor(source.fileName)) {\n const parsed = await mapsFor(url);\n if (!parsed || parsed.maps.length === 0) continue;\n const served = recordedLiteralPosition(parsed.code, source);\n if (served === null) continue;\n const original = originalPositionFor(parsed.maps, served.line, served.column);\n // The literal must map back into the recorded file, not a neighbor.\n if (!original || baseName(original.source) !== baseName(source.fileName)) continue;\n return { fileName: source.fileName, lineNumber: original.line, columnNumber: original.column };\n }\n return source;\n }\n\n function locateRecorded(source: FiberSourceLocation): Promise<FiberSourceLocation> {\n const key = `${source.fileName}:${source.lineNumber}:${source.columnNumber}`;\n let answer = recordedSites.get(key);\n if (!answer) {\n answer = correctRecorded(source).catch(() => source);\n recordedSites.set(key, answer);\n }\n return answer;\n }\n\n return { locate, locateRecorded, stats };\n}\n\nfunction debugSourceOf(value: unknown): FiberSourceLocation | null {\n if (!value || typeof value !== 'object') return null;\n const source = value as { fileName?: unknown; lineNumber?: unknown; columnNumber?: unknown };\n if (typeof source.fileName !== 'string' || typeof source.lineNumber !== 'number') return null;\n return {\n fileName: source.fileName,\n lineNumber: source.lineNumber,\n columnNumber: typeof source.columnNumber === 'number' ? source.columnNumber : null,\n };\n}\n\nfunction recordedSource(fiber: SourceFiber): FiberSourceLocation | null {\n const direct = debugSourceOf(fiber._debugSource);\n if (direct) return direct;\n const type = fiber.type;\n return type && (typeof type === 'object' || typeof type === 'function')\n ? debugSourceOf((type as { _debugSource?: unknown })._debugSource)\n : null;\n}\n\nexport function getFiberStackFrames(fiber: SourceFiber | null | undefined): StackFrame[] {\n if (!fiber || !fiber._debugStack || typeof fiber._debugStack !== 'object') return [];\n const stack = (fiber._debugStack as { stack?: unknown }).stack;\n if (typeof stack !== 'string' || stack === '') return [];\n const candidates: StackFrame[] = [];\n for (const frame of parseStackFrames(stack)) {\n if (isVendorPath(frame.url)) continue;\n candidates.push(frame);\n if (candidates.length >= MAX_CALL_SITE_FRAMES) break;\n }\n return candidates;\n}\n\n/** Stable synchronous source, before any async source-map upgrade. */\nexport function getFiberSourceCandidate(fiber: SourceFiber | null | undefined): FiberSourceLocation | null {\n if (!fiber) return null;\n const recorded = recordedSource(fiber);\n if (recorded) return recorded;\n return writerLocationOf(getFiberStackFrames(fiber), () => null);\n}\n\n/**\n * Synchronous source read used by fiber walks and snapshots: the resolved\n * source once `resolveFiberSource` has run for this fiber, else the candidate.\n */\nexport function getFiberSource(fiber: SourceFiber | null | undefined): FiberSourceLocation | null {\n if (!fiber) return null;\n const cached = resolvedFiberSources.get(fiber as object);\n if (cached !== undefined) return cached;\n return getFiberSourceCandidate(fiber);\n}\n\nasync function fetchModuleFromPage(url: string): Promise<string | null> {\n const fetchFn = (globalThis as { fetch?: typeof fetch }).fetch;\n if (!fetchFn) return null;\n const controller = typeof AbortController === 'function' ? new AbortController() : null;\n const timeout = controller ? setTimeout(() => controller.abort(), 2000) : null;\n try {\n const response = await fetchFn(url, {\n credentials: 'same-origin',\n signal: controller?.signal,\n });\n return response.ok ? await response.text() : null;\n } catch {\n return null;\n } finally {\n if (timeout !== null) clearTimeout(timeout);\n }\n}\n\nfunction pageResolver(): CallSiteResolver {\n if (!defaultResolver) defaultResolver = createCallSiteResolver(fetchModuleFromPage, pageModuleUrls);\n return defaultResolver;\n}\n\n/**\n * Resolve a fiber's authored source through the served module's inline or\n * external map: the React 19 `_debugStack` call site, or the React <=18\n * `_debugSource` literal when a transform shifted its recorded line.\n */\nexport function resolveFiberSource(\n fiber: SourceFiber | null | undefined,\n resolver: CallSiteResolver = pageResolver(),\n): Promise<FiberSourceLocation | null> {\n if (!fiber) return Promise.resolve(null);\n const cached = pendingFiberSources.get(fiber as object);\n if (cached) return cached;\n\n const recorded = recordedSource(fiber);\n if (recorded) {\n const pending = resolver.locateRecorded(recorded).then((located) => {\n resolvedFiberSources.set(fiber as object, located);\n return located;\n });\n pendingFiberSources.set(fiber as object, pending);\n return pending;\n }\n\n const frames = getFiberStackFrames(fiber);\n const fallback = writerLocationOf(frames, () => null);\n const pending = resolver.locate(frames)\n .catch(() => null)\n .then((source) => {\n const located = source ?? fallback;\n resolvedFiberSources.set(fiber as object, located);\n return located;\n });\n pendingFiberSources.set(fiber as object, pending);\n return pending;\n}\n","// React fiber constants and structural comparisons used by the commit detector.\n\nimport { getFiberSourceCandidate } from '../chippy-bridge/fiber-source';\n\nexport type ComponentType =\n | Function\n | symbol\n | {\n // ForwardRef/memo/etc may be objects.\n $$typeof?: symbol;\n render?: Function;\n displayName?: string;\n name?: string;\n };\n\ninterface StoreCheck {\n getSnapshot: () => unknown;\n value: unknown;\n}\n\nexport interface Fiber {\n tag: number;\n type: ComponentType;\n alternate: Fiber | null;\n return: Fiber | null;\n child: Fiber | null;\n sibling: Fiber | null;\n flags: number;\n subtreeFlags: number;\n lanes: number;\n memoizedState: Hook | null;\n memoizedProps?: unknown;\n pendingProps?: unknown;\n updateQueue: { stores: StoreCheck[] | null } | null;\n /**\n * React populates this array during the render phase with fibers that will be\n * deleted in the commit phase. Present when subtreeFlags & ChildDeletion !== 0.\n * Only available in React 18+ (replaces the older effectList pattern).\n */\n deletions?: Fiber[] | null;\n\n // Dev-only / optional debug fields (not always present).\n elementType?: unknown;\n _debugSource?: { fileName: string; lineNumber: number };\n _debugStack?: unknown;\n _debugHookTypes?: string[];\n}\n\nexport interface Hook {\n memoizedState: unknown;\n baseState: unknown;\n baseQueue: unknown;\n queue: HookQueue | null;\n next: Hook | null;\n}\n\ninterface HookQueue {\n dispatch?: Function;\n value?: unknown;\n getSnapshot?: Function;\n lastRenderedState?: unknown;\n}\n\nexport interface DepOrigin {\n type: ComponentType;\n hookIndex: number;\n depth: number;\n hookType: 'useCallback' | 'useMemo';\n}\n\nexport interface ThrashInfo {\n hookIndex: number;\n hookType: 'effect' | 'callback' | 'memo';\n deps: unknown[];\n changedDepIndices: number[];\n changedDepOrigins: (DepOrigin | null)[];\n effectTag?: number;\n memoValue?: unknown;\n /** The hook body function (for useCallback) or memoized value (for useMemo) */\n hookBody?: Function | unknown;\n}\n\nexport type ChangedHook =\n | {\n prevValue: unknown;\n currentValue: unknown;\n info?: string; // For structural changes\n }\n | 'repeat'; // Entire object replaced with string if identical to previous commit\n\nexport interface StateChangeResult {\n hasChange: boolean;\n actionable: boolean;\n changedIndices: number[];\n changedHooks: ChangedHook[];\n /** True if any of the changes came from useSyncExternalStore */\n hasExternalStoreChange: boolean;\n}\n\nexport interface ThrashingResult {\n effects: ThrashInfo[];\n callbacks: ThrashInfo[];\n memos: ThrashInfo[];\n}\n\n// React fiber flags (React 18.3.1)\nexport const PerformedWork = 1;\n\n// Flags relevant to filtering out non-preventable work from collateral counts.\n// - Placement: mount/insert work (initial render)\n// - Hydrating: work done while hydrating server-rendered markup\n// These are stable for React 18.x.\nexport const Placement = 2;\nexport const Hydrating = 4096;\n\n// Special sentinel values for hook change detection\n\n// Component fiber tags for React 18.3.1 (stable within 18.x)\n// 0: FunctionComponent, 1: ClassComponent, 2: IndeterminateComponent\n// 11: MemoComponent, 14: SimpleMemoComponent, 15: ForwardRef\nconst COMPONENT_TAGS = new Set([0, 1, 2, 11, 14, 15]);\n\n// Context Provider tag\nconst CONTEXT_PROVIDER_TAG = 10;\n\n// Suspense fiber tag (React 18.3.1 — stable within 18.x)\nexport const SuspenseTag = 13;\n\n// ChildDeletion — set on fiber.flags (NOT subtreeFlags) when the fiber has deletions[].\n// Value 16 is stable for React 18.3.1.\nexport const ChildDeletion = 16;\n\n// Update — set on fiber.flags when the fiber received an update this commit.\n// This is the flag React puts on Suspense fibers when they transition state.\n// Value 4 is stable for React 18.3.1.\nexport const Update = 4;\n\n// DidCapture — render-phase flag, cleared before commit. Do NOT check at commit time.\n// Kept for documentation. Value 128 in React 18.3.1.\nexport const DidCapture = 128;\n\nexport function isComponentFiber(tag: number): boolean {\n return COMPONENT_TAGS.has(tag);\n}\n\nexport function isContextProviderFiber(tag: number): boolean {\n return tag === CONTEXT_PROVIDER_TAG;\n}\n\nexport function isSuspenseFiber(tag: number): boolean {\n return tag === SuspenseTag;\n}\n\n/**\n * Detect whether a Suspense boundary transitioned between suspended/unsuspended states.\n *\n * Suspense memoizedState is:\n * null → primary content is showing (not suspended)\n * non-null (object) → boundary is showing the fallback (suspended/dehydrated)\n *\n * Returns:\n * { entered: true } — boundary just entered fallback\n * - null → non-null (update path)\n * - no alternate + memoizedState non-null (first render directly to fallback)\n * { left: true } — boundary just left fallback / revealed primary (non-null → null)\n * null — no state change (both null, both non-null, or first render not suspended)\n *\n * A Suspense that renders without delay never enters fallback, so memoizedState stays\n * null → returns null → correctly ignored by the detector.\n */\nexport function didSuspenseStateChange(\n fiber: Fiber\n): { entered: boolean; left: boolean } | null {\n const currSuspended = fiber.memoizedState !== null;\n\n if (!fiber.alternate) {\n // First render of this Suspense boundary.\n // If it went directly to fallback (memoizedState non-null), that IS an enter.\n // If it rendered primary content (memoizedState null), no transition.\n if (currSuspended) {\n return { entered: true, left: false };\n }\n return null;\n }\n\n const prevSuspended = fiber.alternate.memoizedState !== null;\n if (prevSuspended === currSuspended) return null;\n return { entered: currSuspended, left: prevSuspended };\n}\n\n/**\n * Check if a Context Provider's value changed.\n */\nexport function didContextValueChange(fiber: Fiber): boolean {\n if (fiber.tag !== CONTEXT_PROVIDER_TAG || !fiber.alternate) return false;\n\n type FiberWithProps = Fiber & { memoizedProps?: { value?: unknown } };\n const alternateFiber: FiberWithProps = fiber.alternate;\n const currentFiber: FiberWithProps = fiber;\n\n const prevProps = alternateFiber.memoizedProps;\n const currentProps = currentFiber.memoizedProps;\n\n return prevProps && currentProps && !Object.is(prevProps.value, currentProps.value);\n}\n\n// Detect React built-in fiber types (Suspense/Offscreen/etc).\n// IMPORTANT: Do NOT use component names. User components can be named anything.\n// In React 18, built-ins like Suspense/Offscreen are represented as symbols.\nexport function isReactInternalComponentType(type: ComponentType): boolean {\n return typeof type === 'symbol';\n}\n\nexport function getComponentName(fiber: Fiber): string {\n type TypeWithName = {\n displayName?: string;\n name?: string;\n };\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const type = fiber.type as TypeWithName;\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const elementType = fiber.elementType as TypeWithName;\n const named = (\n type?.displayName ||\n type?.name ||\n elementType?.displayName ||\n elementType?.name\n );\n if (named) return named;\n const source = getFiberSourceCandidate(fiber);\n return (source && `<${source.fileName}:${source.lineNumber}>`) || 'Anonymous';\n}\n\n/**\n * Check if hook is a state hook (useState/useReducer/useSyncExternalStore).\n *\n * All hooks share a base shape. The reliable differentiators:\n * - useState/useReducer: queue.dispatch is a function\n * - useSyncExternalStore: queue has 'value' and 'getSnapshot' properties\n */\nexport function isStateHook(hook: Hook): boolean {\n const queue = hook.queue;\n if (!queue) return false;\n\n return typeof queue.dispatch === 'function' || ('value' in queue && 'getSnapshot' in queue);\n}\n\n/** True if the hook is a useSyncExternalStore-like hook. */\nexport function isExternalStoreHook(hook: Hook): boolean {\n const queue = hook.queue;\n return (\n queue && typeof queue.dispatch !== 'function' && 'value' in queue && 'getSnapshot' in queue\n );\n}\n\n/**\n * Compare hook chains to detect state changes.\n *\n * IMPORTANT: Hook indices are React internal memoizedState indices, NOT code order.\n * `useContext` hooks are not in memoizedState, causing index misalignment.\n */\nexport function detectHookStateChanges(\n prevHookChain: Hook | null,\n currentHookChain: Hook | null\n): StateChangeResult {\n if (prevHookChain === currentHookChain) {\n return {\n hasChange: false,\n actionable: false,\n changedIndices: [],\n changedHooks: [],\n hasExternalStoreChange: false,\n };\n }\n\n let prevHook = prevHookChain;\n let currentHook = currentHookChain;\n let memoizedStateIndex = 0;\n const changedIndices: number[] = [];\n const changedHooks: ChangedHook[] = [];\n let hasExternalStoreChange = false;\n\n while (prevHook && currentHook) {\n if (isStateHook(currentHook)) {\n const prevValueRaw =\n prevHook.memoizedState === undefined\n ? prevHook.queue?.lastRenderedState\n : prevHook.memoizedState;\n const curValueRaw =\n currentHook.memoizedState === undefined\n ? currentHook.queue?.lastRenderedState\n : currentHook.memoizedState;\n\n if (!Object.is(prevValueRaw, curValueRaw)) {\n const isExternal = isExternalStoreHook(currentHook);\n if (isExternal) hasExternalStoreChange = true;\n\n changedIndices.push(memoizedStateIndex);\n changedHooks.push({\n prevValue: prevValueRaw,\n currentValue: curValueRaw,\n ...(isExternal && { isExternalStore: true }),\n });\n }\n }\n\n prevHook = prevHook.next;\n currentHook = currentHook.next;\n memoizedStateIndex++;\n }\n\n return {\n hasChange: changedIndices.length > 0,\n actionable: changedIndices.length > 0,\n changedIndices,\n changedHooks,\n hasExternalStoreChange,\n };\n}\n\n/**\n * Detect thrashing for hooks with deps: useEffect/useLayoutEffect/useInsertionEffect,\n * useCallback and useMemo.\n */\nexport function detectHookThrashing(\n prevHookChain: Hook | null,\n currentHookChain: Hook | null,\n mode: 'non-primitive' | 'all' = 'non-primitive',\n valueProvenance: WeakMap<object | Function, DepOrigin> | null = null\n): ThrashingResult {\n if (prevHookChain === currentHookChain) {\n return { effects: [], callbacks: [], memos: [] };\n }\n\n const thrashedEffects: ThrashInfo[] = [];\n const thrashedCallbacks: ThrashInfo[] = [];\n const thrashedMemos: ThrashInfo[] = [];\n\n let prevHook = prevHookChain;\n let currentHook = currentHookChain;\n let hookIndex = 0;\n\n while (prevHook && currentHook) {\n if (!isStateHook(currentHook)) {\n const prevValue = prevHook.memoizedState;\n const currentValue = currentHook.memoizedState;\n\n let prevDeps: unknown[] | null = null;\n let currentDeps: unknown[] | null = null;\n let hookType: ThrashInfo['hookType'] | null = null;\n\n // Effect hooks store an object with `deps`.\n if (\n prevValue &&\n currentValue &&\n typeof prevValue === 'object' &&\n typeof currentValue === 'object' &&\n 'deps' in prevValue &&\n 'deps' in currentValue &&\n 'tag' in currentValue\n ) {\n type EffectHook = { deps: unknown[] };\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n prevDeps = (prevValue as EffectHook).deps;\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n currentDeps = (currentValue as EffectHook).deps;\n hookType = 'effect';\n }\n // useMemo/useCallback store [result, deps].\n else if (\n Array.isArray(prevValue) &&\n Array.isArray(currentValue) &&\n prevValue.length === 2 &&\n currentValue.length === 2 &&\n Array.isArray(prevValue[1]) &&\n Array.isArray(currentValue[1])\n ) {\n prevDeps = prevValue[1];\n currentDeps = currentValue[1];\n hookType = typeof currentValue[0] === 'function' ? 'callback' : 'memo';\n }\n\n if (hookType && Array.isArray(prevDeps) && Array.isArray(currentDeps)) {\n const changedDepIndices: number[] = [];\n const changedDepOrigins: (DepOrigin | null)[] = [];\n\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n for (let j = 0; j < currentDeps.length; j++) {\n if (!Object.is(prevDeps[j], currentDeps[j])) {\n changedDepIndices.push(j);\n\n let origin: DepOrigin | null = null;\n const dep = currentDeps[j];\n if (\n valueProvenance &&\n dep != null &&\n (typeof dep === 'object' || typeof dep === 'function')\n ) {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n origin = valueProvenance.get(dep as object | ((...args: never[]) => unknown)) || null;\n }\n changedDepOrigins.push(origin);\n }\n }\n\n let shouldReport = changedDepIndices.length > 0;\n if (shouldReport && mode === 'non-primitive') {\n // Only report if at least one non-primitive dep changed.\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n shouldReport = changedDepIndices.some((idx) => {\n const dep = currentDeps[idx];\n const t = typeof dep;\n return !(\n dep == null ||\n t === 'string' ||\n t === 'number' ||\n t === 'boolean' ||\n t === 'symbol' ||\n t === 'bigint'\n );\n });\n }\n\n if (shouldReport) {\n const thrashInfo: ThrashInfo = {\n hookIndex,\n hookType,\n deps: currentDeps,\n changedDepIndices,\n changedDepOrigins,\n };\n\n if (hookType === 'effect') {\n type EffectValue = { tag?: number; create?: Function };\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const effectValue = currentValue as EffectValue;\n thrashInfo.effectTag = effectValue.tag;\n // Capture the effect function itself (the create function)\n if (effectValue.create) {\n thrashInfo.hookBody = effectValue.create;\n }\n thrashedEffects.push(thrashInfo);\n } else if (hookType === 'callback') {\n type CallbackValue = [Function, unknown[]];\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const callbackFn = (currentValue as CallbackValue)[0];\n // Capture the callback function itself\n thrashInfo.hookBody = callbackFn;\n thrashedCallbacks.push(thrashInfo);\n } else {\n type MemoValue = [unknown, unknown[]];\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const memoValue = (currentValue as MemoValue)[0];\n thrashInfo.memoValue = memoValue;\n // For useMemo, also expose the memoized value as hookBody\n thrashInfo.hookBody = memoValue;\n thrashedMemos.push(thrashInfo);\n }\n }\n }\n }\n\n prevHook = prevHook.next;\n currentHook = currentHook.next;\n hookIndex++;\n }\n\n return {\n effects: thrashedEffects,\n callbacks: thrashedCallbacks,\n memos: thrashedMemos,\n };\n}\n\nexport function didFiberUpdate(fiber: Fiber): boolean {\n // eslint-disable-next-line no-bitwise\n return (fiber.flags & PerformedWork) !== 0;\n}\n\n/**\n * Detect if fiber has actionable hook state changes by comparing with fiber.alternate.\n *\n * ┌─────────────────────────────────────────────────────────────────────────────┐\n * │ ⚠️ WARNING: fiber.alternate COMPARISON IS UNRELIABLE │\n * └─────────────────────────────────────────────────────────────────────────────┘\n *\n * This function compares fiber.memoizedState vs fiber.alternate.memoizedState.\n *\n * THE PROBLEM:\n * fiber.alternate is NOT always \"state from the previous commit\".\n * It's \"state from last time this fiber was used as work-in-progress\".\n *\n * If a component re-renders due to parent/context changes (not self-update),\n * its alternate may be stale - from 1 commit ago, or 100 commits ago!\n *\n * This causes FALSE POSITIVES: we detect \"state changed\" when it didn't\n * change in THIS commit - it changed in some PAST commit.\n *\n * WHEN THIS FUNCTION IS RELIABLE:\n * ✓ Component called setState (it IS the initiator)\n * ✓ Component has useSyncExternalStore that just triggered\n * ✓ Used alongside memoizedUpdaters validation\n *\n * WHEN THIS FUNCTION IS UNRELIABLE:\n * ✗ Component re-rendered due to parent update\n * ✗ Component re-rendered due to context change\n * ✗ Component was memoized and skipped N commits\n * ✗ Any scenario where alternate wasn't recently updated\n *\n * RECOMMENDED USAGE:\n * - In development: Use memoizedUpdaters to verify component is an initiator,\n * THEN use this function to get hook change details.\n * - In production: Use lastSeenHookState tracking (see detector.tsx)\n * instead of relying on fiber.alternate.\n *\n * See detector.tsx for the full explanation of the \"swap\" problem and solution.\n */\nexport function didFiberSelfUpdate(fiber: Fiber): StateChangeResult | null {\n // Early exit: only check fibers that actually rendered (have PerformedWork flag)\n if (!didFiberUpdate(fiber)) return null;\n\n const alt = fiber.alternate;\n if (!alt) return null;\n\n const prevState = alt.memoizedState;\n const currentState = fiber.memoizedState;\n\n const result = detectHookStateChanges(prevState, currentState);\n return result.hasChange ? result : null;\n}\n\nexport function isDevelopment(): boolean {\n return process.env.NODE_ENV !== 'production';\n}\n","/**\n * Named constants for CommitStats tuple indices.\n *\n * CommitStats is a fixed 10-position tuple per commit. This module provides\n * human-readable names for each index to replace magic numbers in code.\n *\n * Tuple structure:\n * [0] collateral — total updates caused by this source (collateral damage)\n * [1] sources — number of distinct sources that fired in this commit\n * [2] restarts — render count from ATL render-counter delta (or 0 if not available)\n * [3] performedWork — components with PerformedWork flag set\n * [4] effects — effect count\n * [5] memos — memo count\n * [6] callbacks — callback count\n * [7] contextUpdates — context update count\n * [8] unmountedComponents — number of unmounted components\n * [9] unmountedSubtrees — number of unmounted subtrees\n *\n * This positional layout is shared by the detector, serializer, bridge, and\n * offline readers. Changing an index is a wire-format change even though the\n * tuple remains valid TypeScript, so keep the names and length together.\n */\n\nexport const CS_COLLATERAL = 0;\nexport const CS_SOURCES = 1;\nexport const CS_RESTARTS = 2;\nexport const CS_PERFORMED_WORK = 3;\nexport const CS_EFFECTS = 4;\nexport const CS_MEMOS = 5;\nexport const CS_CALLBACKS = 6;\nexport const CS_CONTEXT_UPDATES = 7;\nexport const CS_UNMOUNTED_COMPONENTS = 8;\nexport const CS_UNMOUNTED_SUBTREES = 9;\n\n/**\n * Total length of the CommitStats tuple.\n * Used for validation and bounds checking.\n */\nexport const COMMIT_STATS_LENGTH = 10;\n\n/**\n * Array of all commitStats indices for iteration/validation.\n */\nexport const ALL_COMMIT_STATS_INDICES = [\n CS_COLLATERAL,\n CS_SOURCES,\n CS_RESTARTS,\n CS_PERFORMED_WORK,\n CS_EFFECTS,\n CS_MEMOS,\n CS_CALLBACKS,\n CS_CONTEXT_UPDATES,\n CS_UNMOUNTED_COMPONENTS,\n CS_UNMOUNTED_SUBTREES,\n] as const;\n","/**\n * Report Serializer - Converts Report to serializable DTO.\n *\n * PROBLEM:\n * The Report interface contains non-serializable data (Fiber references, ComponentType functions)\n * which makes it unsuitable for JSON.stringify(), IPC, or network transmission.\n *\n * SOLUTION:\n * Strip non-serializable fields (fiber, type). Keep only what's needed:\n * - sourceId already contains component name (e.g., \"MyComponent#1@5\")\n * - Metrics and numerical data\n * - No need to convert anything - just omit problematic fields\n *\n * USAGE:\n * ```typescript\n * const report = detector.report(50);\n * const dto = serializeReport(report);\n *\n * // Now safe to serialize\n * const json = JSON.stringify(dto);\n *\n * // Send over IPC/network\n * postMessage({ type: 'report', data: dto });\n * ```\n *\n * DESIGN:\n * - Minimal DTO - only what you need for metrics/analysis\n * - sourceId already has component name - no conversion needed\n * - Drop fiber and type fields completely\n *\n * The serializer is also the trust boundary between page-side React objects\n * and helper/offline consumers. A DTO must remain stable after the page is\n * gone, so it carries evidence and summaries rather than live object identity.\n */\n\nimport type { CommitMetricsDelta, IntegrationMode } from './commit-metrics-adapter';\n\n// ============================================================================\n// DTO TYPES (Serializable - no function refs, no Fiber refs)\n// ============================================================================\n\n/**\n * Commit stats tuple: [collateral, sources, restarts, performedWork, effects, memos, callbacks,\n * contextUpdates, unmountedComponents, unmountedSubtrees]. Mirrors CommitStats in reporter.tsx.\n */\nexport type CommitStatsDTO = [\n collateral: number,\n sources: number,\n restarts: number,\n performedWork: number,\n effects: number,\n memos: number,\n callbacks: number,\n contextUpdates: number,\n unmountedComponents: number,\n unmountedSubtrees: number,\n];\n\n/**\n * Per-commit counter deltas from the commit metrics adapter, keyed by counter\n * name. The counters depend on the adapter (see `meta.metricsAdapter`).\n */\nexport type CommitMetricsDeltaDTO = CommitMetricsDelta;\n\n/** @deprecated Use CommitMetricsDeltaDTO. Kept for one release. */\nexport type ATLCommitDeltaDTO = CommitMetricsDeltaDTO;\n\n/**\n * Commit timing data - measures React commit duration and detector overhead.\n */\nexport interface CommitTimingDTO {\n timeSinceLastCommit: number;\n detectorOverhead: number;\n}\n\n/**\n * Report metadata - profiling context and overhead metrics.\n */\nexport interface ReportMetaDTO {\n version: number;\n commits: number;\n config: {\n detectionLevel: 'stats' | 'sources' | 'amplifierMetrics' | 'amplifiers' | 'full';\n effectThrashMode: 'non-primitive' | 'all';\n captureFibers: boolean;\n historySize: number;\n };\n memoizedUpdatersSupport: {\n available: boolean;\n commitsWithData: number;\n coverage: string;\n };\n /** Commit-hook integration model; older reports used `'atl'` for `'adapter:atl'`. */\n integrationMode?: IntegrationMode | 'atl';\n /** Id of the commit metrics adapter that drove the report, or null. */\n metricsAdapter?: string | null;\n /** Per-field availability for commitStats indices and metricsByCommit. */\n dataAvailability?: Record<string, boolean>;\n amplifiersMetrics?: {\n totalHookThrashes: number;\n affectedComponentCount: number;\n };\n timing: {\n totalDetectorOverhead: number;\n avgDetectorOverhead: number;\n totalTimeSpan: number;\n avgTimeBetweenCommits: number;\n };\n}\n\n/**\n * Minimal serializable source - just the metrics, no functions/fibers.\n * sourceId already contains component name (e.g., \"MyComponent#1@5\")\n */\nexport interface SourceDTO {\n sourceId: string;\n depth: number;\n collateralUpdates: number;\n maxCollateralUpdates: number;\n maxPenetrationDepth: number;\n causedUpdates: number;\n restartWaste?: number;\n maxRestartWaste?: number;\n}\n\n/**\n * Source entry in sourcesByCommit - which sources fired in each commit.\n */\nexport interface SourceByCommitDTO {\n sourceId: string;\n depth: number;\n collateral: number;\n rank: number | null;\n sourceIndex: number | null;\n trashers?: Array<{ index: number; prevValue: unknown; currentValue: unknown }>;\n isRepeat?: boolean;\n}\n\n/**\n * Serializable Report - minimal data for metrics and analysis.\n * All non-serializable fields (fiber, type) are omitted.\n */\nexport interface SuspenseBoundaryEventDTO {\n depth: number;\n entered: boolean;\n left: boolean;\n}\n\nexport interface UnmountSampleDTO {\n name: string;\n key: string | null;\n depth: number | null;\n count: number;\n source?: { fileName?: string; lineNumber?: number; columnNumber?: number } | null;\n}\n\nexport type PropChangeKindDTO = 'same' | 'ref-changed' | 'scalar-changed' | 'added' | 'removed';\n\nexport interface PropValueSummaryDTO {\n type: string;\n isArray: boolean;\n isFunction: boolean;\n isNull: boolean;\n preview: string;\n display?: string;\n length?: number;\n keysTop?: string[];\n sample?: unknown[];\n}\n\nexport interface PropChangeEvidenceDTO {\n name: string;\n kind: PropChangeKindDTO;\n prev: PropValueSummaryDTO;\n current: PropValueSummaryDTO;\n}\n\nexport interface RenderedComponentEvidenceDTO {\n sourceId: string;\n name: string;\n depth: number;\n parentSourceId: string | null;\n ownerSourceId: string | null;\n isSelfSource: boolean;\n propChanges: PropChangeEvidenceDTO[];\n hasPropChanges: boolean;\n trasherCounts: { effects: number; callbacks: number; memos: number };\n}\n\nexport interface CommitInteractionActionDTO {\n id: number;\n lastCommitId: number;\n deltaTime: number;\n action: string;\n location: {\n dom: {\n tag: string | null;\n text: string;\n nearestTestId: string | null;\n };\n targetFiber: {\n name: string | null;\n key: string | null;\n source: { fileName?: string; lineNumber?: number; columnNumber?: number } | null;\n ownerStackKind: 'owners' | 'parents';\n ownerStack: Array<{\n name: string | null;\n key: string | null;\n props: string[];\n hookCount: number;\n hookCountTruncated: boolean;\n hookCountMax: number;\n source: { fileName?: string; lineNumber?: number; columnNumber?: number } | null;\n }>;\n } | null;\n };\n}\n\nexport interface ReportDTO {\n meta: ReportMetaDTO;\n sources: SourceDTO[];\n commitStats: Record<number, CommitStatsDTO>;\n suspenseByCommit: Record<number, SuspenseBoundaryEventDTO[]>;\n sourcesByCommit?: Record<number, SourceByCommitDTO[]>;\n interactionsByCommit?: Record<number, CommitInteractionActionDTO[]>;\n renderedByCommit?: Record<number, RenderedComponentEvidenceDTO[]>;\n metricsByCommit?: Record<number, CommitMetricsDeltaDTO>;\n /** @deprecated Alias of `metricsByCommit`, kept for one release. */\n atlByCommit?: Record<number, CommitMetricsDeltaDTO>;\n timing?: Record<number, CommitTimingDTO>;\n}\n\n// ============================================================================\n// SERIALIZATION FUNCTION\n// ============================================================================\n\n/**\n * Convert Report to serializable DTO.\n *\n * Strips non-serializable fields (fiber, type) and keeps only essential metrics.\n *\n * @param report - Full Report from detector.report()\n * @returns Minimal serializable ReportDTO safe for JSON.stringify()\n */\nexport function serializeReport(report: {\n meta: ReportMetaDTO;\n sources: Array<{\n sourceId: string;\n depth: number;\n causedUpdates: number;\n collateralUpdates: number;\n maxCollateralUpdates: number;\n maxPenetrationDepth: number;\n restartWaste?: number;\n maxRestartWaste?: number;\n }>;\n commitStats: Record<number, CommitStatsDTO>;\n sourcesByCommit?: Record<\n number,\n Array<{\n sourceId: string;\n depth: number;\n collateral: number;\n rank: number | null;\n sourceIndex: number | null;\n hooks?: Array<{ index: number; prevValue: unknown; currentValue: unknown }>;\n trashers?: Array<{ index: number; prevValue: unknown; currentValue: unknown }>;\n isRepeat?: boolean;\n }>\n >;\n suspenseByCommit?: Record<number, Array<{ depth: number; entered: boolean; left: boolean; fiber?: unknown }>>;\n interactionsByCommit?: Record<number, CommitInteractionActionDTO[]>;\n renderedByCommit?: Record<number, RenderedComponentEvidenceDTO[]>;\n metricsByCommit?: Record<number, CommitMetricsDeltaDTO>;\n /** @deprecated Alias of `metricsByCommit`, kept for one release. */\n atlByCommit?: Record<number, CommitMetricsDeltaDTO>;\n timing?: Record<number, CommitTimingDTO>;\n}): ReportDTO {\n // Just extract the fields we need - no conversion necessary\n const sources: SourceDTO[] = report.sources.map((source) => ({\n sourceId: source.sourceId,\n depth: source.depth,\n causedUpdates: source.causedUpdates,\n collateralUpdates: source.collateralUpdates,\n maxCollateralUpdates: source.maxCollateralUpdates,\n maxPenetrationDepth: source.maxPenetrationDepth,\n ...(source.restartWaste !== undefined && { restartWaste: source.restartWaste }),\n ...(source.maxRestartWaste !== undefined && { maxRestartWaste: source.maxRestartWaste }),\n }));\n\n // Serialize sourcesByCommit (strip non-serializable type/fiber fields)\n const sourcesByCommit: Record<number, SourceByCommitDTO[]> | undefined = report.sourcesByCommit\n ? Object.fromEntries(\n Object.entries(report.sourcesByCommit).map(([commitId, commitSources]) => [\n commitId,\n commitSources.map((src) => ({\n sourceId: src.sourceId,\n depth: src.depth,\n collateral: src.collateral,\n rank: src.rank,\n sourceIndex: src.sourceIndex,\n ...((src.trashers || src.hooks) && { trashers: src.trashers || src.hooks }),\n ...(src.isRepeat && { isRepeat: true }),\n })),\n ])\n )\n : undefined;\n\n // Serialize suspenseByCommit — strip fiber refs (not serializable), keep scalar event fields\n const suspenseByCommit: Record<number, SuspenseBoundaryEventDTO[]> = {};\n if (report.suspenseByCommit) {\n for (const [k, evts] of Object.entries(report.suspenseByCommit)) {\n suspenseByCommit[Number(k)] = evts.map((e) => ({\n depth: e.depth,\n entered: e.entered,\n left: e.left,\n }));\n }\n }\n\n return {\n meta: report.meta,\n sources,\n commitStats: report.commitStats,\n suspenseByCommit,\n ...(sourcesByCommit && { sourcesByCommit }),\n ...(report.interactionsByCommit && { interactionsByCommit: report.interactionsByCommit }),\n ...(report.renderedByCommit && { renderedByCommit: report.renderedByCommit }),\n ...((report.metricsByCommit || report.atlByCommit) && {\n metricsByCommit: report.metricsByCommit || report.atlByCommit,\n atlByCommit: report.metricsByCommit || report.atlByCommit,\n }),\n ...(report.timing && { timing: report.timing }),\n };\n}\n","/**\n * Commit metrics adapter: an optional per-commit counter source that sits next\n * to the DevTools fiber walk.\n *\n * The detector always captures commits through the DevTools hook. Some hosts\n * also run an instrumented react-dom that exposes render counters and calls a\n * commit callback of its own. An adapter wraps one such host surface: it seeds\n * and protects the surface, snapshots its counters, turns two snapshots into a\n * per-commit delta plus a restart count, and wires the host's commit callback\n * to the detector. Without an adapter the detector runs in `devtools` mode and\n * reports restarts as unavailable.\n *\n * One adapter is active at a time. Product adapters live in `src/plugins/`.\n */\n\nimport type { Fiber } from './internals';\n\nexport type CommitMetricsRoot = { current: Fiber; memoizedUpdaters?: Set<Fiber> };\n\n/** Raw counters read from the host surface at one point in time. */\nexport type CommitMetricsSnapshot = Record<string, unknown>;\n\n/** Counter deltas for one commit, keyed by counter name. */\nexport type CommitMetricsDelta = { [counter: string]: number | undefined };\n\nexport type CommitMetricsMeasurement = {\n delta: CommitMetricsDelta;\n /** Render passes React performed but did not commit. Never negative. */\n restarts: number;\n};\n\nexport interface CommitMetricsAdapter {\n /** Stable id; the detector reports `integrationMode: 'adapter:<id>'`. */\n readonly id: string;\n /**\n * Stack frame names the host surface adds to every render. Hook ancestry\n * hides them like other renderer internals.\n */\n readonly frameFilters?: readonly string[];\n /**\n * Setup that must run before React evaluates, such as installing an accessor\n * that survives host cleanup. Called by the extension's early bootstrap\n * through `__AVALANCHE__.runPrePageHooks(config)`.\n */\n prePage?(config: unknown): void;\n /** Seed the host surface before a detector installs, unless the host owns it. */\n prepare?(): void;\n /** Whether the host surface is present right now. */\n isAvailable(): boolean;\n snapshot(): CommitMetricsSnapshot | null;\n measure(\n before: CommitMetricsSnapshot,\n after: CommitMetricsSnapshot,\n committedComponents: number,\n commitId: number,\n ): CommitMetricsMeasurement;\n /**\n * Route the host's commit callback to `onCommit`. Returns false when the\n * surface is absent. A callback is proof that the host surface is live.\n */\n attach(onCommit: (root: CommitMetricsRoot) => void): boolean;\n /** True while the callback from attach() is still wired into the live surface. */\n isAttached(): boolean;\n /** Re-seed and re-wire after the host wiped or replaced its surface. */\n reattach(): void;\n /** Remove the callback from attach(), only if it is still ours. */\n detach(): void;\n}\n\nlet active: CommitMetricsAdapter | null = null;\n\nconst REQUIRED_METHODS = ['isAvailable', 'snapshot', 'measure', 'attach', 'isAttached', 'reattach', 'detach'] as const;\n\n/**\n * Make `adapter` the active commit metrics adapter for detectors installed\n * afterwards. Replaces any earlier adapter. Returns an unregister function.\n */\nexport function registerCommitMetricsAdapter(adapter: CommitMetricsAdapter): () => void {\n if (!adapter || typeof adapter.id !== 'string' || !adapter.id) {\n throw new TypeError('registerCommitMetricsAdapter expects an adapter with a non-empty id');\n }\n for (const method of REQUIRED_METHODS) {\n if (typeof adapter[method] !== 'function') {\n throw new TypeError(`commit metrics adapter ${adapter.id} is missing ${method}()`);\n }\n }\n active = adapter;\n return () => {\n if (active === adapter) active = null;\n };\n}\n\nexport function getCommitMetricsAdapter(): CommitMetricsAdapter | null {\n return active;\n}\n\n/**\n * Run the active adapter's pre-page hook. Returns the adapter id when a hook\n * ran, or null. A failing hook is swallowed: the detector falls back to\n * DevTools capture.\n */\nexport function runPrePageHooks(config?: unknown): string | null {\n const adapter = active;\n if (!adapter || typeof adapter.prePage !== 'function') return null;\n try {\n adapter.prePage(config);\n return adapter.id;\n } catch {\n return null;\n }\n}\n\nexport type IntegrationMode = `adapter:${string}` | 'devtools' | 'none';\n\nexport function adapterIdFromMode(mode: IntegrationMode | string | null | undefined): string | null {\n return typeof mode === 'string' && mode.startsWith('adapter:') ? mode.slice('adapter:'.length) : null;\n}\n","/**\n * Projects the detector's live fiber history into ranked evidence and the\n * serializable report consumed by bridge commands and offline analysis. The\n * detector owns capture-time truth; this layer owns interpretation and output\n * ordering, so presentation changes do not alter hot-path collection.\n */\n\nimport type { ComponentType, ChangedHook, Fiber, ThrashInfo } from './internals';\nimport { CS_RESTARTS } from './commit-stats-indices';\nimport { getComponentName } from './internals';\nimport type { ReportDTO } from './report-serializer';\nimport { serializeReport } from './report-serializer';\nimport {\n type CommitMetricsAdapter,\n type CommitMetricsDelta,\n type CommitMetricsSnapshot,\n type IntegrationMode,\n adapterIdFromMode,\n} from './commit-metrics-adapter';\n\nexport type SortBy = 'effect' | 'callback' | 'memo' | 'total';\n\nexport interface Source {\n sourceId: string; // Human-readable ID (e.g., \"Counter#1@3\" in dev, \"Unknown#1@3\" in prod)\n type: ComponentType;\n depth: number;\n renderCount: number;\n causedUpdates: number;\n collateralUpdates: number;\n maxCollateralUpdates: number;\n maxPenetrationDepth: number; // Relative to source depth (how deep the avalanche went)\n updateHistory: Record<number, Record<number, ChangedHook> | 'repeat' | string>;\n collateralByCommit: Record<number, number>; // Per-commit collateral for this source\n fiber?: Fiber;\n /** Changed hook indices from this source's latest self-update; maps debugHook indices to debug-render events. */\n debugHookIndices?: number[];\n\n /**\n * RESTART WASTE TRACKING - identifies sources contributing to restart waste\n *\n * Restarts = wasted renders (component rendered but work was discarded)\n * Attribution: proportional to sources that fired in each commit with restarts\n *\n * Example: Commit has 1000 restarts, 2 sources fire\n * → Each source attributed 500 restarts\n *\n * High restartWaste = this source triggers commits that cause React to restart work\n */\n restartWaste?: number; // Total restarts attributed to this source across all commits\n maxRestartWaste?: number; // Max restarts in a single commit\n restartWasteByCommit?: Record<number, number>; // Per-commit restart waste for this source\n\n /**\n * Components that were amplified when this source triggered them.\n * These are components that re-rendered with unstable hooks (effects, callbacks, memos).\n * Includes both:\n * - This source itself (if it has unstable hooks)\n * - Descendant components that re-rendered with unstable hooks\n */\n amplified?: Array<{\n /** Component that amplified work */\n sourceId: string;\n type: ComponentType;\n depth: number;\n /** Total effect amplifications across all commits */\n effectCount: number;\n /** Total callback amplifications across all commits */\n callbackCount: number;\n /** Total memo amplifications across all commits */\n memoCount: number;\n /** Total hook amplifications (effect + callback + memo) */\n hooksTotal: number;\n /** Commits where this component amplified work */\n commitIds: number[];\n /** Per-commit breakdown: { commitId: { effects, callbacks, memos } } */\n byCommit: Record<number, { effects: number; callbacks: number; memos: number }>;\n /** Latest amplification details */\n lastAmplification: {\n depth: number;\n thrashedHooks: ThrashInfo[];\n fiber?: Fiber;\n };\n }>;\n}\n\nexport interface Amplifier {\n type: ComponentType;\n renderCount: number;\n instancesTotal: number;\n maxInstancesPerCommit: number;\n hooksTotal: number;\n maxHooksPerCommit: number;\n effectCount: number;\n callbackCount: number;\n memoCount: number;\n lastAmplification: {\n depth: number;\n thrashedHooks: ThrashInfo[];\n fiber?: Fiber;\n };\n}\n\n/**\n * Linked thrasher - connects thrashing info to source identity.\n *\n * This enables:\n * - thrasher.sourceId → navigate to source\n * - thrasher.isSource → prioritize fixes (source+thrasher = high impact)\n * - thrasher.commitIds → correlate with commitStats\n * - source.thrashing → see hook instability for a source\n */\nexport interface AmplifierSource {\n /** Human-readable ID (e.g., \"Counter#1@5\" in dev, \"Unknown#1@5\" in prod) */\n sourceId: string;\n /** Component type (function reference) */\n type: ComponentType;\n /** Depth in component tree */\n depth: number;\n\n /** Collateral damage caused by this source (0 if not tracked) */\n collateralUpdates: number;\n\n /** Total effect amplifications across all commits */\n effectCount: number;\n /** Total callback amplifications across all commits */\n callbackCount: number;\n /** Total memo amplifications across all commits */\n memoCount: number;\n /** Total hook amplifications (effect + callback + memo) */\n hooksTotal: number;\n\n /** Commits where this component amplified work */\n commitIds: number[];\n /** Per-commit breakdown: { commitId: { effects, callbacks, memos } } */\n byCommit: Record<number, { effects: number; callbacks: number; memos: number }>;\n\n /** If not a source, which sourceId caused this to re-render? */\n causedBySourceId: string | null;\n\n /** Latest amplification details */\n lastAmplification: {\n depth: number;\n thrashedHooks: ThrashInfo[];\n fiber?: Fiber;\n };\n}\n\n/**\n * Commit stats tuple: [collateral, sources, restarts, performedWork, effects, memos, callbacks, contextUpdates, unmountedComponents, unmountedSubtrees]\n * Use these numbers to find which commits to investigate in DevTools.\n * - collateral: components re-rendered as victims\n * - sources: components that initiated updates (update sources)\n * - restarts: extra renders due to external store mutations, priority changes, etc.\n * - performedWork: components with PerformedWork flag (actual work React processed)\n * - effects/memos/callbacks: thrashing hooks (effects likely cause next commit!)\n * - contextUpdates: number of Context Providers whose value changed this commit\n * - unmountedComponents: total component fibers unmounted this commit\n * - unmountedSubtrees: number of distinct unmount \"branch starts\" (topmost deleted components)\n */\nexport type CommitStats = [\n collateral: number,\n sources: number,\n restarts: number,\n performedWork: number,\n effects: number,\n memos: number,\n callbacks: number,\n contextUpdates: number,\n unmountedComponents: number,\n unmountedSubtrees: number,\n];\n\n/**\n * Human-readable keys for CommitStats tuple positions.\n * Use with commitStats[commit][commitStatsKeys.collateral]\n */\nexport const commitStatsKeys = {\n collateral: 0,\n sources: 1,\n restarts: 2,\n performedWork: 3,\n effects: 4,\n memos: 5,\n callbacks: 6,\n contextUpdates: 7,\n unmountedComponents: 8,\n unmountedSubtrees: 9,\n} as const;\n\n/**\n * Report metadata - profiling context and overhead metrics.\n */\nexport interface ReportMeta {\n /** Report format version - increment when changing data structure */\n version: number;\n /** Total commits processed */\n commits: number;\n /** Detector configuration used during profiling */\n config: {\n /** Detection level: 'stats' (minimal), 'sources', 'amplifiers', or 'full' */\n detectionLevel: DetectionLevel;\n /** Effect thrashing sensitivity: 'non-primitive' or 'all' */\n effectThrashMode: 'non-primitive' | 'all';\n /** Whether fibers were captured (for debugging) */\n captureFibers: boolean;\n /** Update history size per source */\n historySize: number;\n };\n /** memoizedUpdaters availability and coverage */\n memoizedUpdatersSupport: {\n available: boolean;\n commitsWithData: number;\n coverage: string;\n };\n /**\n * Which commit-hook integration model produced this report. Determines what\n * is reliably present in `commitStats[N]` and `metricsByCommit[N]`.\n *\n * 'adapter:<id>' — A commit metrics adapter (for example `adapter:atl`) drove\n * the commit callback with host render counters. ALL fields below\n * are populated and `metricsByCommit` is present.\n * 'devtools' — Reconstructed entirely from the React DevTools commit hook\n * (fiber walk only). The fiber-walk fields are real measurements:\n * collateral, sources, performedWork, effects, memos, callbacks,\n * contextUpdates. The render-counter math (restarts) is NOT\n * available — `commitStats[N][2]` will be 0 (semantically\n * \"unknown / not measurable in this mode\") and `metricsByCommit`\n * is empty. This is normal on stock react-dom.\n * 'none' — Detector wasn't installed when this report was generated.\n *\n * Reports before the adapter seam used `'atl'` for `'adapter:atl'`.\n */\n integrationMode: IntegrationMode;\n /** Id of the commit metrics adapter that drove this report, or null. */\n metricsAdapter: string | null;\n /**\n * Per-field availability map for `commitStats[N]` indices. `false` means the\n * value is a placeholder (typically 0) that consumers should treat as unknown\n * rather than a real measurement of zero.\n *\n * Stable across all commits in a given report — set once from integrationMode.\n */\n dataAvailability: {\n /** [0] perCommit.totalCollateral — reconstructed from fiber walk */\n collateral: boolean;\n /** [1] perCommit.selfUpdated.size — reconstructed from fiber walk */\n sources: boolean;\n /** [2] derived from the adapter's render-counter delta — only in 'adapter:<id>' mode */\n restarts: boolean;\n /** [3] perCommit.committedComponentCount — reconstructed from fiber walk */\n performedWork: boolean;\n /** [4] perCommit.effectCount — reconstructed from fiber walk */\n effects: boolean;\n /** [5] perCommit.memoCount — reconstructed from fiber walk */\n memos: boolean;\n /** [6] perCommit.callbackCount — reconstructed from fiber walk */\n callbacks: boolean;\n /** [7] perCommit.contextUpdates — reconstructed from fiber walk */\n contextUpdates: boolean;\n /** Adapter counters in metricsByCommit — only in 'adapter:<id>' mode */\n metricsByCommit: boolean;\n /** @deprecated Alias of `metricsByCommit`, kept for one release. */\n atlByCommit: boolean;\n };\n /** Amplifier summary (when detectionMode: 'amplifierMetrics') */\n amplifiersMetrics?: {\n totalHookThrashes: number;\n affectedComponentCount: number;\n };\n /**\n * Timing summary - shows detector overhead and commit durations.\n * Use this to justify avalanche-detector overhead in production.\n */\n timing: {\n /** Total time spent in detector across all commits (ms) */\n totalDetectorOverhead: number;\n /** Average detector overhead per commit (ms) */\n avgDetectorOverhead: number;\n /** Total time from first to last commit (ms) */\n totalTimeSpan: number;\n /** Average time between commits (ms) */\n avgTimeBetweenCommits: number;\n };\n}\n\nexport interface HostUnmountSummary {\n elements: number;\n text: number;\n tagsTop: Array<[string, number]>;\n testIdsTop: Array<[string, number]>;\n rolesTop: Array<[string, number]>;\n ariaLabels: string[];\n textHints: string[];\n}\n\nexport interface UnmountSample {\n name: string;\n key: string | null;\n depth: number | null;\n count: number;\n source?: { fileName?: string; lineNumber?: number; columnNumber?: number } | null;\n host?: HostUnmountSummary;\n}\n\nexport type InteractionCaptureLevel = 'off' | 'explicit' | 'noisy' | 'all';\n\nexport interface InteractionActionLocation {\n dom: {\n tag: string | null;\n text: string;\n nearestTestId: string | null;\n };\n targetFiber: {\n name: string | null;\n key: string | null;\n source: { fileName?: string; lineNumber?: number; columnNumber?: number } | null;\n ownerStackKind: 'owners' | 'parents';\n ownerStack: Array<{\n name: string | null;\n key: string | null;\n props: string[];\n hookCount: number;\n hookCountTruncated: boolean;\n hookCountMax: number;\n source: { fileName?: string; lineNumber?: number; columnNumber?: number } | null;\n }>;\n } | null;\n}\n\nexport interface InteractionAction {\n /** Sequential action id within this detector capture. */\n id: number;\n /** Native event name, e.g. click, keydown, wheel. */\n action: string;\n /** performance.now() at event capture time. Kept live-only; DTO emits deltaTime. */\n timestamp: number;\n /** DOM-grounded event target plus target component/ownership stack. */\n location: InteractionActionLocation;\n}\n\nexport type PropChangeKind = 'same' | 'ref-changed' | 'scalar-changed' | 'added' | 'removed';\n\nexport interface PropValueSummary {\n type: string;\n isArray: boolean;\n isFunction: boolean;\n isNull: boolean;\n preview: string;\n display?: string;\n length?: number;\n keysTop?: string[];\n sample?: unknown[];\n}\n\nexport interface PropChangeEvidence {\n name: string;\n kind: PropChangeKind;\n prev: PropValueSummary;\n current: PropValueSummary;\n}\n\nexport interface RenderedComponentEvidence {\n sourceId: string;\n name: string;\n depth: number;\n parentSourceId: string | null;\n ownerSourceId: string | null;\n isSelfSource: boolean;\n propChanges: PropChangeEvidence[];\n hasPropChanges: boolean;\n trasherCounts: { effects: number; callbacks: number; memos: number };\n}\n\nexport interface CommitInteractionAction {\n /** Original action id — must match InteractionAction.id for describe-action lookup. */\n id: number;\n /** Last commit id at the moment this action was observed. */\n lastCommitId: number;\n /** Milliseconds from action capture to the linked commit. */\n deltaTime: number;\n action: string;\n location: InteractionAction['location'];\n}\n\nexport interface Report {\n /** Metadata: version, counts, overhead metrics */\n meta: ReportMeta;\n /** Components that caused updates, sorted by collateral damage */\n sources: Source[];\n /** Bridge to DevTools - maps commit ID to sources that fired in that commit */\n sourcesByCommit: Record<\n number,\n Array<{\n sourceId: string;\n type: ComponentType;\n depth: number;\n /** Collateral damage caused by this source in THIS commit */\n collateral: number;\n /** Position in top N sources list (1-based), or null if not in top N */\n rank: number | null;\n /** Index into sources[] array for full accumulated data, or null if not in top N */\n sourceIndex: number | null;\n hooks?: Array<{ index: number; prevValue: unknown; currentValue: unknown }>;\n isRepeat?: boolean;\n }>\n >;\n /**\n * Per-commit metrics to find the needle: [collateral, effects, memos, callbacks]\n * High collateral = avalanche. High effects = likely causes next commit!\n */\n commitStats: Record<number, CommitStats>;\n /**\n * Per-commit timing data - correlate restarts with commit duration.\n * High commitStats[N].restarts + high commitTimings[N].timeSinceLastCommit = React wasted work.\n */\n commitTimings: Record<number, CommitTiming>;\n /**\n * Per-commit counter deltas from the commit metrics adapter - low-level React\n * work per commit. With the ATL adapter:\n * metricsByCommit[N].componentRenderWithHooksCount + finishClassComponentCount\n * should equal commitStats[N].collateral + commitStats[N].sources\n */\n metricsByCommit?: Record<number, CommitMetricsDelta>;\n /** @deprecated Alias of `metricsByCommit`, kept for one release. */\n atlByCommit?: Record<number, CommitMetricsDelta>;\n /** @deprecated Use amplifierSources instead for full source linkage */\n amplifiers?: Amplifier[];\n /**\n * Amplifier sources - components that amplified the update cost with hook re-executions.\n * Shows which components responded to updates with expensive work (effects, memos, callbacks).\n * Linked to the source that triggered them.\n */\n amplifierSources?: AmplifierSource[];\n /**\n * Per-commit Suspense boundary transitions.\n * Only populated for commits where at least one boundary entered or left fallback.\n * Empty object when no Suspense transitions occurred during the capture.\n */\n suspenseByCommit: Record<number, SuspenseBoundaryEvent[]>;\n\n /** Bounded samples of component subtrees unmounted per commit. */\n unmountsByCommit?: Record<number, UnmountSample[]>;\n\n /** Compact user/browser actions linked to nearby commits. */\n interactionsByCommit?: Record<number, CommitInteractionAction[]>;\n\n /** Structural evidence for each component that rendered in a commit. */\n renderedByCommit?: Record<number, RenderedComponentEvidence[]>;\n\n /**\n * Convert this report to a serializable DTO (safe for JSON.stringify, IPC, network).\n * Strips non-serializable fields like Fiber references and ComponentType functions.\n */\n toSerializable(): ReportDTO;\n}\n\nexport interface DetectorOptions {\n ignore?: ComponentType[];\n effectThrashMode?: 'non-primitive' | 'all';\n captureFibers?: boolean;\n /**\n * Detection mode - controls what the detector tracks (tiered for performance):\n *\n * Use DETECTION_LEVEL constants for clarity:\n * - DETECTION_LEVEL.LEVEL1_STATS ('stats'): Only commitStats, super fast\n * - DETECTION_LEVEL.LEVEL2_SOURCES ('sources'): + source tracking\n * - DETECTION_LEVEL.LEVEL3_AMPLIFIER_METRICS ('amplifierMetrics'): + aggregate amplifier counts only\n * - DETECTION_LEVEL.LEVEL3_AMPLIFIERS ('amplifiers'): + full amplifier arrays\n *\n * Shortcuts:\n * - false: Alias for 'stats' (minimal overhead)\n * - true: Alias for 'full' (maximum detail)\n *\n * Performance hierarchy (fastest to slowest):\n * stats < sources < amplifierMetrics < amplifiers ≈ full\n */\n detectionMode?:\n | boolean\n | 'full'\n | 'amplifiers'\n | 'amplifierMetrics'\n | 'sources'\n | 'stats'\n | false;\n\n historySize?: number;\n\n /**\n * Browser action capture level. Defaults to 'explicit' to capture high-signal\n * actions (click/keyboard/input) while leaving noisy wheel/move capture opt-in.\n */\n interactionCapture?: InteractionCaptureLevel;\n\n /** Extra native event names to capture in addition to the selected level. */\n interactionEvents?: string[];\n\n /** Time window for linking captured actions to a commit, in ms. Default: 1000. */\n interactionWindowMs?: number;\n\n /**\n * Commit metrics adapter for host render counters. Defaults to the adapter\n * registered with `registerCommitMetricsAdapter` when the detector installs.\n * Pass `null` to run on the DevTools hook only.\n */\n metricsAdapter?: CommitMetricsAdapter | null;\n\n /** @deprecated Historical option used by older call sites. Prefer `detector.report(topN)` */\n topN?: number;\n}\n\nexport type ThrashMode = 'full' | 'counts' | false;\nexport type DetectionLevel = 'stats' | 'sources' | 'amplifierMetrics' | 'amplifiers' | 'full';\n\n/**\n * Internal amplifier source state - keyed by sourceId for navigation.\n */\nexport interface AmplifierSourceState {\n type: ComponentType;\n depth: number;\n effectCount: number;\n callbackCount: number;\n memoCount: number;\n hooksTotal: number;\n commitIds: number[];\n byCommit: Record<number, { effects: number; callbacks: number; memos: number }>;\n /** sourceId that caused this component to re-render (if not self-caused) */\n causedBySourceId: string | null;\n lastAmplification: {\n depth: number;\n thrashedHooks: ThrashInfo[];\n fiber?: Fiber;\n };\n}\n\n/**\n * Commit timing data - measures React commit duration and detector overhead.\n * All times in milliseconds.\n */\nexport interface CommitTiming {\n /** Time from previous commit end to this commit end (includes React work + idle time) */\n timeSinceLastCommit: number;\n /** Time spent in avalanche detector processing (our overhead) */\n detectorOverhead: number;\n}\n\n/**\n * Internal profiler state - tracks all avalanche detection data.\n *\n * This is the core state structure that accumulates across commits.\n * Most users should use the `Report` interface from `detector.report()` instead.\n */\nexport interface ProfilerState {\n /** Total commits processed since install() or reset() */\n commits: number;\n\n /**\n * All detected sources, keyed by stable source ID (e.g., \"Button#1@3\").\n * Source = component that caused an update (not just re-rendered).\n */\n sources: Map<string, Omit<Source, 'sourceId'>>;\n\n /** @deprecated Use amplifierSources instead */\n amplifiers: Map<ComponentType, Omit<Amplifier, 'type'>>;\n\n /**\n * Amplifier sources keyed by sourceId.\n * Enables source↔amplifier navigation and per-commit breakdown.\n */\n amplifierSources: Map<string, AmplifierSourceState>;\n\n /**\n * Aggregate thrashing counts (only if detectThrashing: 'counts').\n * Lightweight alternative to full thrashing analysis.\n */\n thrashCounts: null | { totalHooks: number; affectedComponents: Set<ComponentType> };\n\n /** Whether React DevTools hook exposes memoizedUpdaters (React 18.3.1+) */\n memoizedUpdatersAvailable: boolean;\n\n /** Number of commits where memoizedUpdaters data was present */\n commitsWithMemoizedUpdaters: number;\n\n /** Per-commit stats: [collateral, effects, memos, callbacks] */\n commitStats: Record<number, CommitStats>;\n\n /**\n * Per-commit counter deltas from the commit metrics adapter.\n * Enables full reconciliation with Avalanche counts.\n */\n metricsByCommit: Record<number, CommitMetricsDelta>;\n\n /** Last adapter snapshot (for delta calculation) */\n lastMetricsSnapshot: CommitMetricsSnapshot | null;\n\n /**\n * Per-commit timing data - measures commit duration and detector overhead.\n * Enables correlation: high restarts → longer commit times.\n */\n commitTimings: Record<number, CommitTiming>;\n\n /** Timestamp when last commit ended (for delta calculation) */\n lastCommitEndTime: number;\n\n /**\n * Per-commit Suspense boundary transitions.\n * Only populated for commits where at least one boundary entered or left fallback.\n */\n suspenseByCommit: Record<number, SuspenseBoundaryEvent[]>;\n\n /** Bounded samples of component subtrees unmounted per commit. */\n unmountsByCommit: Record<number, UnmountSample[]>;\n\n /** Recent action breadcrumbs captured from native events. */\n interactionActions: InteractionAction[];\n\n /** Compact user/browser actions linked to nearby commits. */\n interactionsByCommit: Record<number, CommitInteractionAction[]>;\n\n /** Structural evidence for each component that rendered in a commit. */\n renderedByCommit: Record<number, RenderedComponentEvidence[]>;\n}\n\nfunction isTrueSource(s: Source): boolean {\n const commits = Object.values(s.updateHistory);\n if (commits.length === 0) return false;\n\n // A source is \"true\" if ANY commit in the retained window has a concrete hook entry.\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n for (let i = 0; i < commits.length; i++) {\n const entry = commits[i];\n if (!entry || entry === 'repeat') {\n // Skip empty or repeat entries\n } else if (typeof entry === 'object' && entry !== null) {\n if (Object.values(entry).some((hook) => hook !== 'repeat')) {\n return true;\n }\n }\n }\n\n return false;\n}\n\n/**\n * A Suspense boundary state transition captured during a commit.\n * Only emitted when the boundary actually entered or left the fallback state.\n * Boundaries that render without delay (no fallback shown) produce no events.\n */\nexport interface SuspenseBoundaryEvent {\n /** Tree depth of the Suspense fiber */\n depth: number;\n /** true = boundary entered fallback (primary → suspended) */\n entered: boolean;\n /** true = boundary left fallback (suspended → primary revealed) */\n left: boolean;\n /** The Suspense fiber itself (only present when captureFibers is true) */\n fiber?: Fiber;\n}\n\nexport interface ReportOptions {\n /** Minimum collateral damage to include a source in sourcesByCommit (default: 0 - show all) */\n minCollateral?: number;\n}\n\nexport function buildReport(\n state: ProfilerState,\n thrashMode: ThrashMode,\n topN: number,\n sortBy: SortBy,\n options: ReportOptions = {},\n detectorConfig?: {\n effectThrashMode: 'non-primitive' | 'all';\n captureFibers: boolean;\n historySize: number;\n detectionLevel?: DetectionLevel;\n /**\n * Integration model that produced this report. Determines what's reliable\n * in commitStats and metricsByCommit. Defaults to 'none'.\n */\n integrationMode?: IntegrationMode;\n }\n): Report {\n const { minCollateral = 1 } = options;\n\n // Helper to generate human-readable sourceId from internal ID (e.g., \"T1#2@3\" -> \"Counter#2@3\")\n const toHumanReadableId = (internalId: string, type: ComponentType, depth: number): string => {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const componentName = getComponentName({ type } as Fiber);\n // Extract instance number from internal ID (e.g., \"T1#2@3\" -> \"2\")\n const match = internalId.match(/#(\\d+)@/);\n const instanceNum = match ? match[1] : '1';\n return `${componentName}#${instanceNum}@${depth}`;\n };\n\n // Map internal IDs to human-readable IDs for the report\n const idMapping = new Map<string, string>(); // internalId -> humanId\n\n // Build ALL sources first (for accurate sourcesByCommit)\n const allSources = Array.from(state.sources.entries())\n .map(([internalId, s]) => {\n const humanId = toHumanReadableId(internalId, s.type, s.depth);\n idMapping.set(internalId, humanId);\n\n return {\n sourceId: humanId,\n ...s,\n maxPenetrationDepth: Math.max(0, s.maxPenetrationDepth - s.depth), // Convert to relative depth (never negative!)\n // Initialize restart waste tracking\n restartWaste: 0,\n maxRestartWaste: 0,\n restartWasteByCommit: {},\n };\n })\n .filter(isTrueSource);\n\n // RESTART WASTE ATTRIBUTION\n // Distribute restarts proportionally to sources that fired in each commit\n // This identifies sources contributing to restart waste\n Object.entries(state.commitStats).forEach(([commitIdStr, stats]) => {\n const commitId = Number(commitIdStr);\n const restarts = stats[CS_RESTARTS]; // commitStats[CS_RESTARTS] = restart count\n\n if (restarts === 0) return;\n\n // Find all sources that fired in this commit\n const sourcesInCommit = allSources.filter(\n (source) => source.updateHistory[commitId] !== undefined\n );\n\n if (sourcesInCommit.length === 0) {\n // Ghost restarts (Suspense, priority interruption, external store)\n // No sources to attribute to - these are not directly caused by component updates\n return;\n }\n\n // Distribute restarts proportionally among sources\n const restartsPerSource = restarts / sourcesInCommit.length;\n\n // Mutate the source objects directly (they're from allSources array we own)\n for (const sourceItem of sourcesInCommit) {\n sourceItem.restartWaste += restartsPerSource;\n sourceItem.restartWasteByCommit[commitId] = restartsPerSource;\n\n if (restartsPerSource > sourceItem.maxRestartWaste) {\n sourceItem.maxRestartWaste = restartsPerSource;\n }\n }\n });\n\n // Build amplified array for each source (Direction 1: Source → Amplified components)\n if (thrashMode === 'full') {\n for (const sourceItem of allSources) {\n const amplifiedByThisSource: Source['amplified'] = [];\n\n // Find all components that were amplified when this source triggered them\n state.amplifierSources.forEach((amplifierData, amplifierInternalId) => {\n const amplifierHumanId =\n idMapping.get(amplifierInternalId) ||\n toHumanReadableId(amplifierInternalId, amplifierData.type, amplifierData.depth);\n\n // Check if this component was amplified by the current source\n // amplifierData.causedBySourceId is the INTERNAL id, need to convert to human id\n const causedByHumanId = amplifierData.causedBySourceId\n ? idMapping.get(amplifierData.causedBySourceId)\n : null;\n\n if (causedByHumanId === sourceItem.sourceId || amplifierHumanId === sourceItem.sourceId) {\n // This component was either:\n // 1. Amplified by this source (descendant with unstable hooks)\n // 2. IS this source (self-amplification - source has unstable hooks)\n amplifiedByThisSource.push({\n sourceId: amplifierHumanId,\n type: amplifierData.type,\n depth: amplifierData.depth,\n effectCount: amplifierData.effectCount,\n callbackCount: amplifierData.callbackCount,\n memoCount: amplifierData.memoCount,\n hooksTotal: amplifierData.hooksTotal,\n commitIds: amplifierData.commitIds,\n byCommit: amplifierData.byCommit,\n lastAmplification: amplifierData.lastAmplification,\n });\n }\n });\n\n if (amplifiedByThisSource.length > 0) {\n sourceItem.amplified = amplifiedByThisSource;\n }\n }\n }\n\n // Top N sources - update sources sorted by TOTAL WASTE (collateral + restarts)\n // This identifies the real offenders, including those causing restart waste\n const sources = [...allSources]\n .sort((a, b) => {\n const aTotalWaste = a.collateralUpdates + (a.restartWaste || 0);\n const bTotalWaste = b.collateralUpdates + (b.restartWaste || 0);\n return (\n bTotalWaste - aTotalWaste ||\n b.maxCollateralUpdates - a.maxCollateralUpdates ||\n (b.maxRestartWaste || 0) - (a.maxRestartWaste || 0)\n );\n })\n .slice(0, topN);\n\n const coverage =\n state.commits > 0\n ? Math.round((state.commitsWithMemoizedUpdaters / state.commits) * 100) + '%'\n : '0%';\n\n // Calculate timing summary\n const timingEntries = Object.values(state.commitTimings);\n const totalDetectorOverhead = timingEntries.reduce((sum, t) => sum + t.detectorOverhead, 0);\n const totalTimeSpan = timingEntries.reduce((sum, t) => sum + t.timeSinceLastCommit, 0);\n const avgDetectorOverhead =\n timingEntries.length > 0 ? totalDetectorOverhead / timingEntries.length : 0;\n const avgTimeBetweenCommits = timingEntries.length > 0 ? totalTimeSpan / timingEntries.length : 0;\n\n // Build lookup map for top N sources (sourceId → { rank, index })\n const topNLookup = new Map<string, { rank: number; index: number }>();\n for (let i = 0; i < sources.length; i++) {\n topNLookup.set(sources[i].sourceId, { rank: i + 1, index: i });\n }\n\n // Build sourcesByCommit from ALL sources (not just top N!)\n // This ensures commitStats[N].sources matches sourcesByCommit[N].length\n const sourcesByCommit: Report['sourcesByCommit'] = {};\n\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n allSources.forEach((source) => {\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n Object.entries(source.updateHistory).forEach(([commitIdStr, data]) => {\n const commitId = Number(commitIdStr);\n\n // Diagnostic strings like \"detector-only\" are not \"this source fired in this commit\".\n // They exist only to explain detector/React disagreement. Do not surface them in sourcesByCommit.\n if (typeof data === 'string' && data !== 'repeat') {\n return;\n }\n\n // Get per-commit collateral for this source\n const collateral = source.collateralByCommit?.[commitId] ?? 0;\n\n // Skip sources below minCollateral threshold\n if (collateral < minCollateral) {\n return;\n }\n\n if (!sourcesByCommit[commitId]) {\n sourcesByCommit[commitId] = [];\n }\n\n const isRepeat = data === 'repeat';\n\n // Build detailed hook info\n let hookChanges:\n | Array<{ index: number; prevValue: unknown; currentValue: unknown }>\n | undefined;\n if (typeof data === 'object' && data !== null) {\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n hookChanges = Object.entries(data).map(([index, hookData]) => ({\n index: Number(index),\n prevValue:\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n hookData !== 'repeat' ? (hookData as { prevValue: unknown }).prevValue : undefined,\n currentValue:\n hookData !== 'repeat'\n ? // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n (hookData as { currentValue: unknown }).currentValue\n : undefined,\n }));\n }\n\n // Get rank and index (null if not in top N)\n const lookup = topNLookup.get(source.sourceId);\n const rank = lookup?.rank ?? null;\n const sourceIndex = lookup?.index ?? null;\n\n const entry: Report['sourcesByCommit'][number][number] = {\n sourceId: source.sourceId,\n type: source.type,\n depth: source.depth,\n collateral,\n rank,\n sourceIndex,\n };\n\n if (hookChanges && hookChanges.length > 0) {\n entry.hooks = hookChanges;\n }\n if (isRepeat) {\n entry.isRepeat = true;\n }\n\n sourcesByCommit[commitId].push(entry);\n });\n });\n\n // Only include metricsByCommit if there's data\n const hasMetricsData = Object.keys(state.metricsByCommit).length > 0;\n\n // Build meta object\n const integrationMode = detectorConfig?.integrationMode ?? 'none';\n const metricsAdapter = adapterIdFromMode(integrationMode);\n const metricsAvailable = metricsAdapter !== null && hasMetricsData;\n const meta: ReportMeta = {\n version: 6, // v6: CommitStats[8,9] = unmountedComponents/unmountedSubtrees; suspenseByCommit\n commits: state.commits,\n config: {\n detectionLevel: detectorConfig?.detectionLevel ?? 'full',\n effectThrashMode: detectorConfig?.effectThrashMode ?? 'non-primitive',\n captureFibers: detectorConfig?.captureFibers ?? false,\n historySize: detectorConfig?.historySize ?? 1,\n },\n memoizedUpdatersSupport: {\n available: state.memoizedUpdatersAvailable,\n commitsWithData: state.commitsWithMemoizedUpdaters,\n coverage,\n },\n integrationMode,\n metricsAdapter,\n // Per-field availability — fiber-walk fields are always real measurements\n // because recordTree() runs in every mode. The only adapter-exclusive\n // datapoint is the render-counter delta (restarts, metricsByCommit).\n dataAvailability: {\n collateral: true,\n sources: true,\n restarts: metricsAvailable,\n performedWork: true,\n effects: true,\n memos: true,\n callbacks: true,\n contextUpdates: true,\n metricsByCommit: metricsAvailable,\n atlByCommit: metricsAvailable,\n },\n timing: {\n totalDetectorOverhead,\n avgDetectorOverhead,\n totalTimeSpan,\n avgTimeBetweenCommits,\n },\n };\n\n const base: Report = {\n meta,\n sources,\n sourcesByCommit,\n commitStats: state.commitStats,\n commitTimings: state.commitTimings,\n suspenseByCommit: state.suspenseByCommit,\n unmountsByCommit: state.unmountsByCommit,\n interactionsByCommit: state.interactionsByCommit,\n renderedByCommit: state.renderedByCommit,\n ...(hasMetricsData && { metricsByCommit: state.metricsByCommit, atlByCommit: state.metricsByCommit }),\n toSerializable() {\n return serializeReport(this);\n },\n };\n\n if (thrashMode === 'full') {\n const getSortValue = (amplifier: Amplifier) => {\n if (sortBy === 'effect') return amplifier.effectCount;\n if (sortBy === 'callback') return amplifier.callbackCount;\n if (sortBy === 'memo') return amplifier.memoCount;\n if (sortBy === 'total') return amplifier.hooksTotal;\n return amplifier.effectCount;\n };\n\n const getLinkedSortValue = (as: AmplifierSource) => {\n if (sortBy === 'effect') return as.effectCount;\n if (sortBy === 'callback') return as.callbackCount;\n if (sortBy === 'memo') return as.memoCount;\n if (sortBy === 'total') return as.hooksTotal;\n return as.effectCount;\n };\n\n // Build amplifierSources\n const amplifierSources: AmplifierSource[] = Array.from(state.amplifierSources.entries())\n .map(([internalId, lt]) => {\n const humanId =\n idMapping.get(internalId) || toHumanReadableId(internalId, lt.type, lt.depth);\n const sourceData = state.sources.get(internalId);\n\n return {\n sourceId: humanId,\n type: lt.type,\n depth: lt.depth,\n collateralUpdates: sourceData?.collateralUpdates ?? 0,\n effectCount: lt.effectCount,\n callbackCount: lt.callbackCount,\n memoCount: lt.memoCount,\n hooksTotal: lt.hooksTotal,\n commitIds: lt.commitIds,\n byCommit: lt.byCommit,\n causedBySourceId: lt.causedBySourceId\n ? idMapping.get(lt.causedBySourceId) || lt.causedBySourceId\n : null,\n lastAmplification: lt.lastAmplification,\n };\n })\n .sort((a, b) => getLinkedSortValue(b) - getLinkedSortValue(a) || b.hooksTotal - a.hooksTotal)\n .slice(0, topN);\n\n return {\n ...base,\n amplifiers: Array.from(state.amplifiers.entries())\n .map(([type, s]) => ({ type, ...s }))\n .sort(\n (a, b) =>\n getSortValue(b) - getSortValue(a) ||\n b.hooksTotal - a.hooksTotal ||\n b.maxHooksPerCommit - a.maxHooksPerCommit\n )\n .slice(0, topN),\n amplifierSources,\n };\n }\n\n if (thrashMode === 'counts' && state.thrashCounts) {\n // Add amplifier metrics to meta\n meta.amplifiersMetrics = {\n totalHookThrashes: state.thrashCounts.totalHooks,\n affectedComponentCount: state.thrashCounts.affectedComponents.size,\n };\n }\n\n return base;\n}\n","/**\n * Shared React DevTools renderer discovery.\n *\n * React-DOM registers a renderer object into\n * `window.__REACT_DEVTOOLS_GLOBAL_HOOK__.renderers` at injection time (only when\n * the hook exists before react-dom evaluates). That renderer object is the single\n * entry point for several Chippy capabilities:\n *\n * - `currentDispatcherRef` → debug-render hook replay (see debug-render/core.ts)\n * - `scheduleUpdate` → fiber-schedule-update nudge (see fiber-schedule-update.ts)\n *\n * Both used to walk `hook.renderers` themselves. This module is the one place that\n * knows how to enumerate renderers, so capabilities select the field they need\n * without duplicating the iteration (and its Map/entries quirks).\n */\n\nexport type ReactRenderer = {\n /** `{ current }` on React <=18; `ReactSharedInternals` (`H`) on React 19. */\n currentDispatcherRef?: Record<string, unknown> | null;\n scheduleUpdate?: (fiber: unknown) => void;\n version?: string;\n rendererPackageName?: string;\n [key: string]: unknown;\n};\n\nexport type DevtoolsHookLike = {\n renderers?:\n | Map<number, ReactRenderer>\n | { entries(): IterableIterator<[number, ReactRenderer]> };\n};\n\n/**\n * Enumerate every registered React renderer. Returns [] when the DevTools hook\n * is absent or empty (production builds without the shim, or hook installed too\n * late for react-dom to register).\n */\nexport function getReactRenderers(\n scope: typeof globalThis = globalThis,\n): ReactRenderer[] {\n const g = scope as unknown as { __REACT_DEVTOOLS_GLOBAL_HOOK__?: DevtoolsHookLike };\n const hook = g.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (!hook || !hook.renderers || typeof (hook.renderers as { entries?: unknown }).entries !== 'function') {\n return [];\n }\n const out: ReactRenderer[] = [];\n for (const [, renderer] of (hook.renderers as Map<number, ReactRenderer>).entries()) {\n if (renderer) out.push(renderer);\n }\n return out;\n}\n\n/**\n * The writable property that holds React's active hooks dispatcher.\n *\n * React <=18 injects `ReactCurrentDispatcher`, whose dispatcher lives at\n * `current`. React 19 injects `ReactSharedInternals`, whose dispatcher lives\n * at `H` (`current` does not exist there). React DevTools makes the same\n * distinction in its own `getDispatcherRef`.\n */\nexport type DispatcherSlot = { owner: Record<string, unknown>; key: 'current' | 'H' };\n\nexport function dispatcherSlotOf(injected: unknown): DispatcherSlot | null {\n if (!injected || typeof injected !== 'object') return null;\n const owner = injected as Record<string, unknown>;\n if (typeof owner.H !== 'undefined') return { owner, key: 'H' };\n if ('current' in owner) return { owner, key: 'current' };\n return null;\n}\n\n/**\n * First renderer that exposes a usable dispatcher slot. Used by debug-render\n * when it must trap writes to the exact property React assigns.\n */\nexport function getDispatcherSlot(scope: typeof globalThis = globalThis): DispatcherSlot | null {\n for (const renderer of getReactRenderers(scope)) {\n const slot = dispatcherSlotOf(renderer.currentDispatcherRef);\n if (slot) return slot;\n }\n return null;\n}\n\nconst modernRefs = new WeakMap<object, { current: unknown }>();\n\n/**\n * Normalize a slot to a `{ current }` ref. A legacy ref is returned as-is; a\n * React 19 internals object gets one stable accessor view that reads and\n * writes `H`.\n */\nexport function dispatcherRefOf(slot: DispatcherSlot): { current: unknown } {\n if (slot.key === 'current') return slot.owner as { current: unknown };\n let ref = modernRefs.get(slot.owner);\n if (!ref) {\n const { owner } = slot;\n ref = {\n get current(): unknown { return owner.H; },\n set current(value: unknown) { owner.H = value; },\n };\n modernRefs.set(owner, ref);\n }\n return ref;\n}\n\n/**\n * First renderer's hooks dispatcher as a `{ current }` ref, across React\n * versions. Used by debug replay to swap in its stub dispatcher.\n */\nexport function getDispatcherRef(\n scope: typeof globalThis = globalThis,\n): { current: unknown } | null {\n const slot = getDispatcherSlot(scope);\n return slot ? dispatcherRefOf(slot) : null;\n}\n\n/**\n * First renderer that exposes a callable `scheduleUpdate`. This is the exact\n * function React DevTools uses to force a re-render on a fiber. It is only\n * present on development React builds. Returns null on production builds (or\n * when the DevTools-hook shim was missing at page boot).\n */\nexport function getScheduleUpdate(\n scope: typeof globalThis = globalThis,\n): ((fiber: unknown) => void) | null {\n for (const renderer of getReactRenderers(scope)) {\n if (typeof renderer.scheduleUpdate === 'function') return renderer.scheduleUpdate;\n }\n return null;\n}\n","/**\n * Debug-render module.\n *\n * Single responsibility: capture per-render hook events for components, and\n * expose them losslessly to higher layers (the detector projects them).\n *\n * Capture strategy: dispatcher interception via the DevTools global hook.\n *\n * React 18 routes every hook call through `ReactCurrentDispatcher.current`,\n * which is swapped per render phase by react-dom. We do NOT patch\n * `React.useX` (those are facades to the dispatcher) and we do NOT import\n * React here — this module must not pin a React identity.\n *\n * We discover the *page's* `ReactCurrentDispatcher` ref via the React DevTools\n * global hook contract:\n *\n * __REACT_DEVTOOLS_GLOBAL_HOOK__.renderers.get(id).currentDispatcherRef\n *\n * That ref is page-React-owned and lives where react-dom actually writes.\n * Bootstrap requirement: a DevTools hook shim must already be installed when\n * react-dom evaluates so it calls `hook.inject(internals)`. That bootstrap is\n * Chippy's responsibility (handled by the extension content-script / helper\n * inject path); this module only consumes the result.\n *\n * Capture is intentionally lossless: raw stack + parsed frames are stored.\n * Projection (component name, custom-hook path, loc) is done downstream so\n * the original evidence can be re-projected without re-capturing.\n */\n\nimport {\n dispatcherRefOf,\n getDispatcherRef,\n getDispatcherSlot,\n getReactRenderers,\n type DispatcherSlot,\n} from '../chippy-bridge/react-renderer';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type StackFrame = { name: string; loc: string };\n\nexport type HookCallEvent = {\n primitive: string;\n stack: string;\n frames: StackFrame[];\n componentName: string;\n args: unknown[];\n};\n\nexport type CaptureEngineStatus = {\n ok: boolean;\n installed: boolean;\n hasDevtoolsHook: boolean;\n rendererCount: number;\n hasDispatcherRef: boolean;\n totalCapturedComponents: number;\n totalCapturedEvents: number;\n reason?: string;\n hint?: string;\n};\n\nexport type DebugRenderModule = {\n install(): { ok: boolean; reason?: string };\n uninstall(): void;\n reset(): void;\n isInstalled(): boolean;\n dispatcherRef(): DispatcherRef | null;\n rawEvents(componentName: string): HookCallEvent[];\n allComponents(): string[];\n status(): CaptureEngineStatus;\n recordEventForTest?(event: HookCallEvent): void;\n};\n\n// ---------------------------------------------------------------------------\n// Stack parsing — zero-loss. Caller decides what to filter.\n// ---------------------------------------------------------------------------\n\nexport function parseStackFrames(stack: string): StackFrame[] {\n return stack\n .split('\\n')\n .slice(1)\n .map((line) => {\n const m =\n line.match(/^\\s*at\\s+([^\\s(]+)\\s*\\(([^)]+)\\)/) ||\n line.match(/^\\s*at\\s+()(.+)$/);\n if (!m) return null;\n const name = (m[1] || '').trim();\n const locRaw = (m[2] || '').trim();\n const tail = locRaw.match(/:(\\d+):(\\d+)\\)?$/);\n const loc = tail ? `${tail[1]}:${tail[2]}` : locRaw;\n return name ? { name, loc } : null;\n })\n .filter((f): f is StackFrame => !!f);\n}\n\n// ---------------------------------------------------------------------------\n// Dispatcher interception\n// ---------------------------------------------------------------------------\n\n// Hook methods we instrument on the dispatcher. This list intentionally\n// mirrors React 18's HooksDispatcher surface; unknown methods are passed\n// through untouched so future React versions degrade gracefully instead\n// of crashing.\nconst HOOK_METHODS: ReadonlyArray<string> = [\n 'useCallback',\n 'useContext',\n 'useDebugValue',\n 'useDeferredValue',\n 'useEffect',\n 'useImperativeHandle',\n 'useInsertionEffect',\n 'useLayoutEffect',\n 'useMemo',\n 'useReducer',\n 'useRef',\n 'useState',\n 'useSyncExternalStore',\n 'useTransition',\n 'useId',\n 'useCacheRefresh',\n 'useMemoCache',\n];\n\nconst HOOK_PRIMITIVE: Record<string, string> = {\n useCallback: 'Callback',\n useContext: 'Context',\n useDebugValue: 'DebugValue',\n useDeferredValue: 'DeferredValue',\n useEffect: 'Effect',\n useImperativeHandle: 'ImperativeHandle',\n useInsertionEffect: 'InsertionEffect',\n useLayoutEffect: 'LayoutEffect',\n useMemo: 'Memo',\n useReducer: 'Reducer',\n useRef: 'Ref',\n useState: 'State',\n useSyncExternalStore: 'SyncExternalStore',\n useTransition: 'Transition',\n useId: 'Id',\n useCacheRefresh: 'CacheRefresh',\n useMemoCache: 'MemoCache',\n};\n\ntype DispatcherRef = { current: unknown };\n\n/**\n * Find the page's `ReactCurrentDispatcher` ref.\n *\n * Renderer discovery is shared with the fiber-schedule-update capability — one\n * place (`chippy-bridge/react-renderer`) knows how to enumerate\n * `__REACT_DEVTOOLS_GLOBAL_HOOK__.renderers`. react-dom registers its renderer\n * (with its own `currentDispatcherRef`) on evaluation IF the global hook existed\n * before react-dom was loaded; Chippy installs that shim before page boot.\n *\n * We do NOT touch any bundled React module identity here. There is no React\n * import in this file by design.\n */\n\n// componentName extraction: walk frames and pick the last non-`use*` frame.\n// This is a projection step; raw frames are still kept on the event so a\n// caller can re-derive a different name if this heuristic is wrong.\nfunction isReactInternalFrameName(name: string): boolean {\n return name === 'atlDispatcherHook' ||\n name === 'record' ||\n name.startsWith('Object.') ||\n name === 'renderWithHooks' ||\n name === 'updateFunctionComponent' ||\n name === 'mountIndeterminateComponent' ||\n name === 'beginWork' ||\n /^beginWork\\$/.test(name) ||\n name === 'performUnitOfWork' ||\n name === 'workLoopSync' ||\n name === 'renderRootSync' ||\n name === 'performConcurrentWorkOnRoot' ||\n name === 'workLoop' ||\n name === 'flushWork';\n}\n\n/**\n * True for a hook frame, including qualified names. React 19's CommonJS build\n * defines `exports.useState = function (...) {}`, which V8 names\n * `exports.useState`; bundlers can produce similar `ns.useX` names.\n */\nexport function isHookFrameName(name: string): boolean {\n return /^use[A-Z0-9_]/.test(name.slice(name.lastIndexOf('.') + 1));\n}\n\nfunction deriveComponentName(frames: StackFrame[]): string {\n for (const { name } of frames) {\n if (!name) continue;\n if (isReactInternalFrameName(name)) continue;\n if (isHookFrameName(name)) continue; // skip use-prefixed (custom + primitive)\n return name;\n }\n return 'Unknown';\n}\n\n// ---------------------------------------------------------------------------\n// Module factory\n// ---------------------------------------------------------------------------\n\nexport function createDebugRender(options: { maxEventsPerComponent?: number } = {}): DebugRenderModule {\n const maxEventsPerComponent = options.maxEventsPerComponent ?? 600;\n\n const eventsByComponent = new Map<string, HookCallEvent[]>();\n\n // We keep a WeakMap of dispatcher object -> patched-method-restore so we\n // can patch each new dispatcher exactly once and never double-wrap. React\n // re-uses dispatcher objects across renders, so this is small and bounded.\n const patchedDispatchers = new WeakMap<object, Map<string, unknown>>();\n\n let installed = false;\n let originalDescriptor: PropertyDescriptor | null | undefined = undefined;\n let dispatcherSlot: DispatcherSlot | null = null;\n let lastSeenDispatcher: unknown = null;\n\n function record(primitive: string, args: unknown[]): void {\n // Capture once. No filtering. Filtering is a projection concern.\n const stack = new Error().stack || '';\n const frames = parseStackFrames(stack);\n const componentName = deriveComponentName(frames);\n const event: HookCallEvent = {\n primitive,\n stack,\n frames,\n componentName,\n args,\n };\n const list = eventsByComponent.get(componentName) || [];\n list.push(event);\n if (list.length > maxEventsPerComponent) {\n list.splice(0, list.length - maxEventsPerComponent);\n }\n eventsByComponent.set(componentName, list);\n }\n\n function patchDispatcher(dispatcher: unknown): void {\n if (!dispatcher || typeof dispatcher !== 'object') return;\n const obj = dispatcher as Record<string, unknown>;\n if (patchedDispatchers.has(obj)) return; // already wrapped\n\n // React swaps dispatcher objects between render phases. Patch each object\n // once and retain the original methods so uninstall can return ownership\n // to React without leaving wrappers on a dispatcher used later.\n const restoreMap = new Map<string, unknown>();\n for (const methodName of HOOK_METHODS) {\n const original = obj[methodName];\n if (typeof original !== 'function') continue;\n restoreMap.set(methodName, original);\n const primitive = HOOK_PRIMITIVE[methodName] || methodName;\n // Named function so it is identifiable in stack traces and can be\n // skipped by callers that post-process frames.\n obj[methodName] = function atlDispatcherHook(this: unknown, ...args: unknown[]) {\n try {\n record(primitive, args);\n } catch (_) {\n // Recording must never throw inside React render.\n }\n return (original as Function).apply(this, args);\n };\n }\n patchedDispatchers.set(obj, restoreMap);\n }\n\n function unpatchDispatcher(dispatcher: unknown): void {\n if (!dispatcher || typeof dispatcher !== 'object') return;\n const obj = dispatcher as Record<string, unknown>;\n const restoreMap = patchedDispatchers.get(obj);\n if (!restoreMap) return;\n for (const [methodName, fn] of restoreMap.entries()) {\n obj[methodName] = fn;\n }\n patchedDispatchers.delete(obj);\n }\n\n function install(): { ok: boolean; reason?: string } {\n if (installed) return { ok: true };\n const slot = getDispatcherSlot();\n if (!slot) return { ok: false, reason: 'ReactCurrentDispatcher not found' };\n dispatcherSlot = slot;\n const { owner, key } = slot;\n\n // Patch whatever is already current (likely the no-op ContextOnlyDispatcher\n // outside render, but patching it is harmless: it will only be called when\n // React swaps it in). Then trap subsequent assignments.\n patchDispatcher(owner[key]);\n lastSeenDispatcher = owner[key];\n\n // Intercept the slot's setter rather than React's hook facades. React owns\n // this property (`current` on <=18, `H` on 19) and changes it at render\n // boundaries; observing those transitions is what lets us patch the\n // correct phase-specific dispatcher.\n originalDescriptor = Object.getOwnPropertyDescriptor(owner, key) || null;\n\n let stored: unknown = owner[key];\n try {\n Object.defineProperty(owner, key, {\n configurable: true,\n get(): unknown {\n return stored;\n },\n set(next: unknown) {\n stored = next;\n if (next !== lastSeenDispatcher) {\n lastSeenDispatcher = next;\n patchDispatcher(next);\n }\n },\n });\n } catch (e) {\n dispatcherSlot = null;\n return { ok: false, reason: 'cannot define property on ReactCurrentDispatcher' };\n }\n\n installed = true;\n return { ok: true };\n }\n\n function uninstall(): void {\n if (!installed) return;\n if (dispatcherSlot) {\n // Restore original property descriptor (if any) so React owns the slot again.\n const { owner, key } = dispatcherSlot;\n try {\n if (originalDescriptor) {\n Object.defineProperty(owner, key, originalDescriptor);\n } else {\n // Fall back to a plain data property holding the latest dispatcher.\n Object.defineProperty(owner, key, {\n configurable: true,\n writable: true,\n enumerable: true,\n value: lastSeenDispatcher,\n });\n }\n } catch (_) {\n /* tolerate */\n }\n }\n // Best-effort unpatch of the last dispatcher we touched. Other dispatchers\n // patched earlier remain wrapped until GC; the wrappers are cheap.\n unpatchDispatcher(lastSeenDispatcher);\n installed = false;\n dispatcherSlot = null;\n originalDescriptor = undefined;\n lastSeenDispatcher = null;\n }\n\n function reset(): void {\n eventsByComponent.clear();\n }\n\n function rawEvents(componentName: string): HookCallEvent[] {\n return (eventsByComponent.get(componentName) || []).slice();\n }\n\n function allComponents(): string[] {\n return Array.from(eventsByComponent.keys());\n }\n\n function status(): CaptureEngineStatus {\n const g = globalThis as unknown as { __REACT_DEVTOOLS_GLOBAL_HOOK__?: unknown };\n const hasDevtoolsHook = !!g.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n // Renderer enumeration is shared with the fiber-schedule-update capability.\n const rendererCount = getReactRenderers().length;\n const hasDispatcherRef = !!(dispatcherSlot || getDispatcherSlot());\n let totalCapturedEvents = 0;\n for (const list of eventsByComponent.values()) totalCapturedEvents += list.length;\n\n let reason: string | undefined;\n let hint: string | undefined;\n if (!hasDevtoolsHook) {\n reason = 'no __REACT_DEVTOOLS_GLOBAL_HOOK__ on window';\n hint = 'devtools-hook-shim must run before react-dom evaluates (extension document_start, or Playwright addInitScript)';\n } else if (rendererCount === 0) {\n reason = '__REACT_DEVTOOLS_GLOBAL_HOOK__ present but renderers Map is empty';\n hint = 'react-dom evaluated before the hook shim was installed; reload the page after installing the shim, or use addInitScript before navigation';\n } else if (!hasDispatcherRef) {\n reason = 'renderer registered but no currentDispatcherRef';\n hint = 'unsupported react-dom version, or hook was replaced after registration';\n } else if (!installed) {\n reason = 'debug-render not installed';\n hint = 'detector did not call debugRender.install() — check avalanche install() lifecycle';\n } else if (totalCapturedEvents === 0) {\n reason = 'capture engine installed but no hook events recorded yet';\n hint = 'trigger at least one render of the component you want to inspect after install';\n }\n\n const ok = installed && hasDispatcherRef && totalCapturedEvents > 0;\n return {\n ok,\n installed,\n hasDevtoolsHook,\n rendererCount,\n hasDispatcherRef,\n totalCapturedComponents: eventsByComponent.size,\n totalCapturedEvents,\n reason,\n hint,\n };\n }\n\n return {\n install,\n uninstall,\n reset,\n isInstalled: () => installed,\n dispatcherRef: () => (dispatcherSlot ? dispatcherRefOf(dispatcherSlot) : getDispatcherRef()),\n rawEvents,\n allComponents,\n status,\n recordEventForTest(event: HookCallEvent) {\n const list = eventsByComponent.get(event.componentName) || [];\n list.push(event);\n eventsByComponent.set(event.componentName, list);\n },\n };\n}\n","export interface CommitRoot {\n current: object;\n}\n\n// A seeded metrics slot cannot select the capture owner. The first actual\n// adapter callback can arrive before or after DevTools for the same committed\n// fiber.\nexport function createCommitSurfaceOwnership<T>() {\n let adapterObserved = false;\n let devtoolsCaptures = new WeakMap<CommitRoot, { current: object; capture: T }>();\n return {\n get adapterObserved() { return adapterObserved; },\n recordDevtools(root: CommitRoot, capture: T) {\n devtoolsCaptures.set(root, { current: root.current, capture });\n },\n observeAdapter(root: CommitRoot): T | null {\n const previous = devtoolsCaptures.get(root);\n adapterObserved = true;\n devtoolsCaptures.delete(root);\n return previous?.current === root.current ? previous.capture : null;\n },\n reset() {\n adapterObserved = false;\n devtoolsCaptures = new WeakMap();\n },\n };\n}\n","/**\n * Pure fiber-walk helpers extracted from layout-lab.js.\n * No DOM writes, no side effects — read-only introspection of React fiber trees.\n */\n\nimport {\n getFiberSource as readFiberSource,\n resolveFiberSource as resolveSourceLocation,\n} from '../chippy-bridge/fiber-source';\n\n/**\n * Minimal duck-typed Fiber shape.\n * Only fields used by these helpers are typed; rest may exist but are not read.\n */\nexport type Fiber = {\n type?: unknown;\n elementType?: unknown;\n key?: string | null;\n memoizedState?: unknown;\n memoizedProps?: Record<string, unknown> | null;\n stateNode?: Element | null;\n return?: Fiber | null;\n child?: Fiber | null;\n sibling?: Fiber | null;\n _debugOwner?: Fiber | null;\n _debugSource?: SourceLocation | null;\n _debugStack?: unknown;\n};\n\nexport type SourceLocation = {\n fileName?: string | null;\n lineNumber?: number | null;\n columnNumber?: number | null;\n};\n\nexport type DescribedSource = {\n fileName: string | null;\n lineNumber: number | null;\n columnNumber: number | null;\n};\n\nexport type HookSummary = {\n hookCount: number;\n hookCountTruncated: boolean;\n hookCountMax: number;\n};\n\nexport type OwnerEntry = {\n name: string | null;\n key: string | null;\n props: string[];\n} & HookSummary & {\n source: DescribedSource | null;\n};\n\nexport type FiberTarget = {\n domTag: string | null;\n domText: string;\n fiberType: string | null;\n source: DescribedSource | null;\n};\n\nexport type ComponentDescription = {\n name: string | null;\n key: string | null;\n props: Record<string, unknown>;\n source: DescribedSource | null;\n stateNode: string | null;\n owners: OwnerEntry[];\n parents: OwnerEntry[];\n} & HookSummary;\n\n/**\n * Find the React fiber key in a DOM node's own properties.\n * Returns the property name (e.g. '__reactFiber$abc123') or null.\n */\nexport function getFiberKey(node: Node | Element | null | undefined): string | null {\n if (!node) return null;\n const keys = Object.getOwnPropertyNames(node as object);\n const key = keys.find((k) => k.startsWith('__reactFiber$'));\n return key || null;\n}\n\n/**\n * Get the React fiber attached to a DOM node, or null if not a React host node.\n */\nexport function getFiber(node: Node | Element | null | undefined): Fiber | null {\n if (!node) return null;\n const key = getFiberKey(node);\n // React stores the fiber as an expando property on the host node.\n return key ? ((node as unknown as Record<string, unknown>)[key] as Fiber | null) : null;\n}\n\n/**\n * Extract display name from a React type (class, function, or string).\n * Returns displayName > name > null for functions; 'string' for primitives.\n */\nexport function getDisplayName(type: unknown): string | null {\n if (!type) return null;\n if (typeof type === 'string') return type;\n const obj = type as { displayName?: unknown; name?: unknown };\n return (obj.displayName as string) || (obj.name as string) || null;\n}\n\n/**\n * True if fiber is a user-defined component (not a DOM string, not a hook-internal wrapper).\n */\nexport function isUserComponent(fiber: Fiber | null | undefined): boolean {\n if (!fiber) return false;\n const name = getDisplayName(fiber.type);\n if (!name || typeof fiber.type === 'string') return false;\n if (['hookified', 'unboundStoryFn', 'Anonymous'].includes(name)) return false;\n return true;\n}\n\n/**\n * Walk DOM parents to find the nearest fiber-attached element.\n */\nexport function getNearestFiber(domNode: Node | Element | null | undefined): Fiber | null {\n let current = domNode as Element | null;\n while (current) {\n const fiber = getFiber(current);\n if (fiber) return fiber;\n current = (current as Element).parentElement;\n }\n return null;\n}\n\n/**\n * Walk DOM parents, then walk fiber return chain, to find the nearest user component.\n */\nexport function getNearestComponent(domNode: Node | Element | null | undefined): Fiber | null {\n let fiber = getNearestFiber(domNode);\n while (fiber) {\n if (isUserComponent(fiber)) return fiber;\n fiber = fiber.return || null;\n }\n return null;\n}\n\n/**\n * Count hooks in fiber.memoizedState linked list; detect cycle.\n */\nexport function getHookSummary(fiber: Fiber | null | undefined): HookSummary {\n const MAX_HOOKS = 500;\n const seen = new Set<unknown>();\n let hookNode = fiber?.memoizedState || null;\n let hookCount = 0;\n let hookCountTruncated = false;\n\n while (hookNode) {\n if (seen.has(hookNode)) break;\n if (hookCount >= MAX_HOOKS) {\n hookCountTruncated = true;\n break;\n }\n seen.add(hookNode);\n hookCount += 1;\n hookNode = (hookNode as { next?: unknown }).next || null;\n }\n\n return { hookCount, hookCountTruncated, hookCountMax: MAX_HOOKS };\n}\n\n/**\n * Walk fiber._debugOwner chain; collect all user components with metadata.\n * Returns empty array if fiber or owner chain is null.\n */\nexport function getOwnerChain(fiber: Fiber | null | undefined): OwnerEntry[] {\n const chain: OwnerEntry[] = [];\n let current = fiber?._debugOwner || null;\n while (current) {\n if (isUserComponent(current)) {\n chain.push({\n name: getDisplayName(current.type),\n key: current.key || null,\n props: current.memoizedProps ? Object.keys(current.memoizedProps) : [],\n ...getHookSummary(current),\n source: describeFiberSource(current),\n });\n }\n current = current._debugOwner || null;\n }\n return chain;\n}\n\n/**\n * Walk fiber._debugOwner chain; return raw fiber nodes (for navigation).\n */\nexport function getOwnerFibers(fiber: Fiber | null | undefined): Fiber[] {\n const fibers: Fiber[] = [];\n let current = fiber?._debugOwner || null;\n while (current) {\n if (isUserComponent(current)) fibers.push(current);\n current = current._debugOwner || null;\n }\n return fibers;\n}\n\n/**\n * Recursively walk fiber.child/sibling to find the first host DOM element rendered by this subtree.\n */\nexport function getFiberDomNode(fiber: Fiber | null | undefined): Element | null {\n if (!fiber) return null;\n // Host fiber — stateNode is a DOM element\n if (fiber.stateNode instanceof Element) return fiber.stateNode;\n // Walk children\n let child = fiber.child || null;\n while (child) {\n const found = getFiberDomNode(child);\n if (found) return found;\n child = child.sibling || null;\n }\n return null;\n}\n\n/**\n * Walk fiber.return chain; collect all user component parents with metadata.\n */\nexport function getReturnComponentChain(fiber: Fiber | null | undefined): OwnerEntry[] {\n const chain: OwnerEntry[] = [];\n let current = fiber?.return || null;\n while (current) {\n if (isUserComponent(current)) {\n chain.push({\n name: getDisplayName(current.type),\n key: current.key || null,\n props: current.memoizedProps ? Object.keys(current.memoizedProps) : [],\n ...getHookSummary(current),\n source: describeFiberSource(current),\n });\n }\n current = current.return || null;\n }\n return chain;\n}\n\n/**\n * Walk fiber.return chain; return raw fiber nodes (for navigation).\n */\nexport function getReturnComponentFibers(fiber: Fiber | null | undefined): Fiber[] {\n const fibers: Fiber[] = [];\n let current = fiber?.return || null;\n while (current) {\n if (isUserComponent(current)) fibers.push(current);\n current = current.return || null;\n }\n return fibers;\n}\n\n/**\n * Normalize source location object to canonical shape.\n */\nexport function describeSource(source: SourceLocation | null | undefined): DescribedSource | null {\n if (!source) return null;\n return {\n fileName: source.fileName || null,\n lineNumber: source.lineNumber || null,\n columnNumber: source.columnNumber || null,\n };\n}\n\n/**\n * Read a fiber source across React versions.\n *\n * React <=18 exposes `_debugSource`. React 19 exposes `_debugStack`; its first\n * non-vendor frame is returned synchronously and may later be upgraded from the\n * bundle position to the original source position by `resolveFiberSource`.\n */\nexport function describeFiberSource(fiber: Fiber | null | undefined): DescribedSource | null {\n return describeSource(readFiberSource(fiber));\n}\n\nexport async function resolveFiberSource(fiber: Fiber | null | undefined): Promise<DescribedSource | null> {\n return describeSource(await resolveSourceLocation(fiber));\n}\n\n/**\n * Describe a fiber + DOM node pair; used for inspection UI.\n */\nexport function describeFiberTarget(fiber: Fiber | null | undefined, domNode: Element | null | undefined): FiberTarget | null {\n if (!fiber && !domNode) return null;\n return {\n domTag: domNode?.tagName?.toLowerCase() || null,\n domText: domNode?.textContent?.trim().slice(0, 60) || '',\n fiberType: getDisplayName(fiber?.type) || getDisplayName(fiber?.elementType) || null,\n source: describeFiberSource(fiber),\n };\n}\n\n/**\n * Full component description: name, props, hook summary, source, owners, parents.\n */\nexport function describeComponent(fiber: Fiber | null | undefined): ComponentDescription | null {\n if (!fiber) return null;\n return {\n name: getDisplayName(fiber.type),\n key: fiber.key || null,\n props: fiber.memoizedProps || {},\n ...getHookSummary(fiber),\n source: describeFiberSource(fiber),\n stateNode: fiber.stateNode instanceof Element ? fiber.stateNode.tagName.toLowerCase() : null,\n owners: getOwnerChain(fiber),\n parents: getReturnComponentChain(fiber),\n };\n}\n","/**\n * Records user-side interaction anchors while Avalanche records commits.\n * Capture is intentionally DOM-event based: the detector owns fiber/commit\n * evidence, while this module owns the only signal that a human interaction\n * preceded it. `linkRecent` joins the two later using performance timestamps;\n * it is evidence of temporal proximity, not proof that the event caused every\n * render in the commit.\n */\n\nimport { isComponentFiber, type Fiber } from './internals';\nimport { describeComponent, describeFiberTarget } from '../layout-lab/fiber-walk';\nimport type { CommitInteractionAction, InteractionAction, InteractionCaptureLevel } from './reporter';\n\nconst EXPLICIT_INTERACTION_EVENTS = ['click', 'keydown', 'keyup', 'input', 'change', 'submit'];\nconst NOISY_INTERACTION_EVENTS = ['wheel', 'scroll', 'pointermove', 'mousemove', 'touchmove'];\nconst ALL_INTERACTION_EVENTS = [\n ...EXPLICIT_INTERACTION_EVENTS,\n 'pointerdown',\n 'pointerup',\n 'dblclick',\n 'focusin',\n 'focusout',\n ...NOISY_INTERACTION_EVENTS,\n];\nconst MAX_INTERACTION_ACTIONS = 200;\n\nexport interface InteractionCaptureOptions {\n interactionCapture?: InteractionCaptureLevel;\n interactionEvents?: string[];\n interactionWindowMs?: number;\n}\n\nexport interface InteractionCaptureState {\n actions: InteractionAction[];\n byCommit: Record<number, CommitInteractionAction[]>;\n}\n\nexport function createInteractionCapture(options: InteractionCaptureOptions = {}) {\n const {\n interactionCapture = 'explicit',\n interactionEvents = [],\n interactionWindowMs = 1000,\n } = options;\n\n const state: InteractionCaptureState = {\n actions: [],\n byCommit: {},\n };\n let nextActionId = 1;\n let installed = false;\n\n function eventNames(): string[] {\n const base =\n interactionCapture === 'off' ? [] :\n interactionCapture === 'explicit' ? EXPLICIT_INTERACTION_EVENTS :\n interactionCapture === 'noisy' ? EXPLICIT_INTERACTION_EVENTS.concat(NOISY_INTERACTION_EVENTS) :\n ALL_INTERACTION_EVENTS;\n return Array.from(new Set(base.concat(interactionEvents).map((name) => String(name).trim()).filter(Boolean)));\n }\n\n function findReactFiberKey(node: Element): string | null {\n return Object.getOwnPropertyNames(node).find((key) => key.startsWith('__reactFiber$')) || null;\n }\n\n function nearestFiberFromNode(node: EventTarget | null): Fiber | null {\n let current = node instanceof Element ? node : null;\n while (current) {\n const key = findReactFiberKey(current);\n if (key) return (current as unknown as Record<string, Fiber | undefined>)[key] || null;\n current = current.parentElement;\n }\n return null;\n }\n\n function nearestComponentFiber(node: EventTarget | null): Fiber | null {\n let fiber = nearestFiberFromNode(node);\n while (fiber) {\n if (isComponentFiber(fiber.tag)) return fiber;\n fiber = fiber.return || null;\n }\n return null;\n }\n\n function nearestTestId(node: EventTarget | null): string | null {\n let current = node instanceof Element ? node : null;\n while (current) {\n const value = current.getAttribute('data-testid');\n if (value) return value;\n current = current.parentElement;\n }\n return null;\n }\n\n function describeActionLocation(target: EventTarget | null): InteractionAction['location'] {\n const domTarget = target instanceof Element ? target : null;\n const fiber = nearestComponentFiber(target);\n const describedTarget = describeFiberTarget(fiber as any, domTarget);\n const describedComponent = describeComponent(fiber as any);\n return {\n dom: {\n tag: describedTarget?.domTag || null,\n text: describedTarget?.domText || '',\n nearestTestId: nearestTestId(target),\n },\n targetFiber: describedComponent ? {\n name: describedComponent.name,\n key: describedComponent.key,\n source: describedComponent.source,\n ownerStackKind: describedComponent.owners.length > 0 ? 'owners' : 'parents',\n ownerStack: describedComponent.owners.length > 0 ? describedComponent.owners : describedComponent.parents,\n } : null,\n };\n }\n\n function capture(event: Event): void {\n const pathTarget = typeof event.composedPath === 'function' ? event.composedPath()[0] : null;\n const target = pathTarget instanceof Element ? pathTarget : event.target;\n // Keep a bounded queue because a long-lived page can receive noisy events\n // continuously. Older anchors cannot link to a future commit once they\n // fall outside the configured window.\n state.actions.push({\n id: nextActionId++,\n action: event.type,\n timestamp: performance.now(),\n location: describeActionLocation(target),\n });\n if (state.actions.length > MAX_INTERACTION_ACTIONS) {\n state.actions.splice(0, state.actions.length - MAX_INTERACTION_ACTIONS);\n }\n }\n\n return {\n state,\n\n install(): void {\n if (installed) return;\n const names = eventNames();\n if (names.length === 0 || typeof document === 'undefined') return;\n for (const name of names) document.addEventListener(name, capture, true);\n installed = true;\n },\n\n uninstall(): void {\n if (!installed || typeof document === 'undefined') return;\n for (const name of eventNames()) document.removeEventListener(name, capture, true);\n installed = false;\n },\n\n reset(): void {\n state.actions.length = 0;\n for (const key of Object.keys(state.byCommit)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete state.byCommit[Number(key)];\n }\n nextActionId = 1;\n },\n\n linkRecent(commitId: number, commitTime: number): void {\n const windowMs = Math.max(0, Number(interactionWindowMs) || 0);\n if (windowMs === 0 || state.actions.length === 0) return;\n // Link only events at or before the commit. A later event may be close in\n // wall-clock time but cannot explain work that already committed.\n const linked = state.actions\n .filter((action) => action.timestamp <= commitTime && commitTime - action.timestamp <= windowMs)\n .map((action) => ({\n id: action.id,\n lastCommitId: Math.max(0, commitId - 1),\n deltaTime: Math.round((commitTime - action.timestamp) * 100) / 100,\n action: action.action,\n location: action.location,\n }));\n if (linked.length > 0) state.byCommit[commitId] = linked;\n while (state.actions.length > 0 && commitTime - state.actions[0].timestamp > windowMs) {\n state.actions.shift();\n }\n },\n };\n}\n","/**\n * Headless Profiler - React commit profiler (headless / no UI).\n *\n * This file intentionally keeps the commit traversal (`recordTree`) monolithic.\n * It runs on every React commit, and even small function-call overhead inside the\n * fiber-walk loops shows up in perf. We refactor everything *around* it.\n *\n * Detection Levels:\n * - Level 1 (STATS): Only commitStats - <1% overhead (~0.8ms avg)\n * - Level 2 (SOURCES): + source tracking - ~1-2% overhead (~1.3ms avg)\n * - Level 3 (AMPLIFIERS/FULL): + amplifier detection - ~2-3% overhead (~2.4ms avg)\n *\n * Peer FAQ\n * - Why is `recordTree()` huge? Performance: it's on the hot path (every commit).\n * - Why per-hook actionability? React can leave alternate hook memoizedState\n * undefined (Suspense/Offscreen/concurrent artifacts) causing false positives.\n * - Why WeakMaps everywhere? To auto-GC tracked values/fibers without leaks.\n * - Why so few null checks? Debug tool: fail fast and loud on misuse/internals drift.\n * - Production? Use LEVEL1_STATS or LEVEL2_SOURCES for minimal overhead.\n */\n\nimport {\n ChildDeletion,\n detectHookThrashing,\n didContextValueChange,\n didFiberSelfUpdate,\n didFiberUpdate,\n didSuspenseStateChange,\n Hydrating,\n isComponentFiber,\n getComponentName,\n isContextProviderFiber,\n isDevelopment,\n isReactInternalComponentType,\n isSuspenseFiber,\n PerformedWork,\n Placement,\n Update,\n type ChangedHook,\n type ComponentType,\n type DepOrigin,\n type Fiber,\n type ThrashInfo,\n} from './internals';\n\nimport {\n buildReport,\n type DetectorOptions,\n type ProfilerState,\n type PropChangeEvidence,\n type PropValueSummary,\n type RenderedComponentEvidence,\n type Report,\n type ReportOptions,\n type SortBy,\n type Source,\n type SuspenseBoundaryEvent,\n type ThrashMode,\n type UnmountSample,\n} from './reporter';\n\nimport { createDebugRender, type HookCallEvent, type StackFrame } from '../debug-render/core';\nimport { getFiberSourceCandidate } from '../chippy-bridge/fiber-source';\nimport {\n type CommitMetricsAdapter,\n type CommitMetricsSnapshot,\n type IntegrationMode,\n getCommitMetricsAdapter,\n} from './commit-metrics-adapter';\nimport { createCommitSurfaceOwnership } from './commit-surface-ownership';\nimport { createInteractionCapture } from './interaction-capture';\nimport {\n CS_UNMOUNTED_COMPONENTS,\n CS_UNMOUNTED_SUBTREES,\n CS_RESTARTS,\n} from './commit-stats-indices';\n\nfunction summarizeFiberSource(fiber: Fiber): { fileName: string; lineNumber: number } | null {\n const source = getFiberSourceCandidate(fiber);\n return source ? { fileName: source.fileName, lineNumber: source.lineNumber } : null;\n}\n\n/**\n * Installable detector.\n */\nexport function createAvalancheDetector(options: DetectorOptions = {}) {\n const {\n ignore = [],\n effectThrashMode = 'non-primitive',\n captureFibers = isDevelopment(),\n detectionMode = isDevelopment() ? 'full' : 'amplifiers',\n historySize = isDevelopment() ? 10 : 1,\n } = options;\n\n const mode = detectionMode;\n\n // Resolved on install(), so an adapter registered after the detector was\n // created still applies. `metricsAdapter: null` opts out of adapters.\n let metricsAdapter: CommitMetricsAdapter | null = null;\n const resolveMetricsAdapter = (): CommitMetricsAdapter | null =>\n options.metricsAdapter === undefined ? getCommitMetricsAdapter() : options.metricsAdapter;\n\n const ignoreSet = new Set(ignore);\n\n // Normalize detection mode to level\n // Level 1 (stats): Only commitStats with restarts - super fast\n // Level 2 (sources): Stats + source tracking - adds overhead for source detection\n // Level 3a (amplifierMetrics): Sources + aggregate amplifier counts - lightweight\n // Level 3b (amplifiers): Sources + full amplifier arrays - more detail\n // Legacy: 'full' is alias for 'amplifiers' (kept for backward compatibility)\n // TODO: Replace this open conditional chain with an exhaustive runtime\n // normalizer or fail-closed branch. TypeScript protects typed callers only;\n // unchecked shell/helper input can leave both variables undefined.\n let detectionLevel: 'stats' | 'sources' | 'amplifierMetrics' | 'amplifiers' | 'full';\n let thrashMode: ThrashMode;\n\n if (mode === true) {\n detectionLevel = 'full';\n thrashMode = 'full';\n } else if (mode === false) {\n detectionLevel = 'stats';\n thrashMode = false;\n } else if (mode === 'stats') {\n detectionLevel = 'stats';\n thrashMode = false;\n } else if (mode === 'sources') {\n detectionLevel = 'sources';\n thrashMode = false;\n } else if (mode === 'amplifiers') {\n detectionLevel = 'amplifiers';\n thrashMode = 'full';\n } else if (mode === 'amplifierMetrics') {\n detectionLevel = 'amplifierMetrics';\n thrashMode = 'counts';\n } else if (mode === 'full') {\n detectionLevel = 'full';\n thrashMode = 'full';\n }\n\n const enableSourceTracking = detectionLevel !== 'stats';\n const enableAmplifiers = thrashMode !== false;\n\n // Global WeakMap: value -> provenance. WeakMap ensures automatic GC.\n const valueProvenance = new WeakMap<object | Function, DepOrigin>();\n\n // Stable source ID manager - handles fiber alternate swaps\n // Uses WeakMap to track types and generate stable numeric IDs (fast, no string ops!)\n class StableSourceIdManager {\n private idMap = new WeakMap<Fiber, string>();\n // WeakMap only accepts objects/functions, not symbols. Store only valid keys.\n private typeToId = new WeakMap<object | Function, number>();\n private instanceCounters = new Map<string, number>(); // \"typeId@depth\" -> instance count\n private nextTypeId = 1;\n\n getSourceId(fiber: Fiber, type: ComponentType, depth: number): string {\n // Check if we already have an ID for this fiber\n let sourceId = this.idMap.get(fiber);\n if (sourceId) return sourceId;\n\n // Check if the alternate has an ID (same logical instance)\n if (fiber.alternate) {\n sourceId = this.idMap.get(fiber.alternate);\n if (sourceId) {\n // Map current fiber to the same ID\n this.idMap.set(fiber, sourceId);\n return sourceId;\n }\n }\n\n // Get or assign a numeric ID for this type (avoid stringifying functions!)\n // WeakMap keys must be objects/functions only. Strings/symbols/null get an\n // ephemeral numeric id for this pass but are never inserted into the WeakMap.\n const canBeWeakMapKey = (typeof type === 'object' && type !== null) || typeof type === 'function';\n const weakKey = canBeWeakMapKey ? (type as object | Function) : null;\n let typeId = weakKey ? this.typeToId.get(weakKey) : undefined;\n\n if (typeId === undefined) {\n typeId = this.nextTypeId++;\n if (weakKey) {\n this.typeToId.set(weakKey, typeId);\n }\n }\n\n // New instance - create ID with per-component-type counter\n const baseKey = `${typeId}@${depth}`;\n const instanceNum = this.instanceCounters.get(baseKey) || 1;\n this.instanceCounters.set(baseKey, instanceNum + 1);\n sourceId = `T${typeId}#${instanceNum}@${depth}`;\n\n // Map both current and alternate to this ID\n this.idMap.set(fiber, sourceId);\n if (fiber.alternate) {\n this.idMap.set(fiber.alternate, sourceId);\n }\n\n return sourceId;\n }\n\n clear() {\n this.instanceCounters.clear();\n this.typeToId = new WeakMap();\n this.nextTypeId = 1;\n }\n }\n\n const sourceIdManager = new StableSourceIdManager();\n const debugRender = createDebugRender();\n const interactionCapture = createInteractionCapture(options);\n\n function getComponentDisplayName(type: ComponentType | null | undefined): string {\n if (!type) return 'Unknown';\n return (type as { displayName?: string; name?: string }).displayName ||\n (type as { displayName?: string; name?: string }).name ||\n String(type);\n }\n\n function isDebugInternalFrame(frame: StackFrame, componentName: string): boolean {\n const name = frame.name || '';\n // Replay can run before install(), so fall back to the configured adapter.\n return !!(metricsAdapter ?? resolveMetricsAdapter())?.frameFilters?.includes(name) ||\n name === 'record' ||\n name === componentName ||\n name.includes('react-dom') ||\n name.includes('renderWithHooks') ||\n name.includes('mount') ||\n name.includes('update');\n }\n\n function parentFramesForEvent(event: HookCallEvent, componentName: string): StackFrame[] {\n return event.frames.filter((frame) => !isDebugInternalFrame(frame, componentName));\n }\n\n /** Snapshot the adapter's counters, or null when no adapter surface is live. */\n function captureMetricsSnapshot(): CommitMetricsSnapshot | null {\n return metricsAdapter?.snapshot() ?? null;\n }\n\n /**\n * ┌─────────────────────────────────────────────────────────────────────────┐\n * │ CRITICAL: Understanding fiber.alternate and the \"swap\" problem │\n * └─────────────────────────────────────────────────────────────────────────┘\n *\n * WHAT WE THOUGHT:\n * \"fiber and fiber.alternate swap on every commit, so alternate always\n * has state from the previous commit.\"\n *\n * WHAT ACTUALLY HAPPENS (from React Fiber Architecture docs):\n * \"At any time, a component instance has at most two fibers:\n * the current (flushed) fiber, and the work-in-progress fiber.\n * The alternate of the current fiber is the work-in-progress,\n * and the alternate of the work-in-progress is the current fiber.\"\n *\n * THE TRAP:\n * The alternate is only UPDATED when React uses it as work-in-progress.\n * If a component re-renders due to parent/context (not self-update),\n * React may or may NOT touch its alternate depending on:\n * - Whether the component is on the \"render path\"\n * - Whether React chose to clone vs reuse the fiber\n * - Concurrent mode interruptions\n * - Suspense/Offscreen boundaries\n *\n * CONCRETE EXAMPLE:\n * Commit 1: Component mounts, state = 'initial'\n * Commit 2: Component calls setState('loaded') via useEffect\n * Commit 3-10: Parent re-renders, component re-renders (but no state change)\n *\n * On commit 10, if we compare fiber vs alternate:\n * - fiber.memoizedState = 'loaded' (current)\n * - alternate.memoizedState = ???\n * - MIGHT be 'loaded' (if alternate was used as work-in-progress recently)\n * - MIGHT be 'initial' (if alternate is stale from commit 1!)\n *\n * Result: FALSE POSITIVE - we detect \"state changed\" when it didn't!\n *\n * SYMPTOMS OF THIS BUG:\n * - causedUpdates: 6 when real updates were 1\n * - updateHistory full of \"repeat\" entries\n * - collateralByCommit has entries for commits where component wasn't initiator\n * - memoizedUpdaters disagrees with our detection\n *\n * ┌─────────────────────────────────────────────────────────────────────────┐\n * │ WHY CAN'T WE JUST USE memoizedUpdaters? │\n * └─────────────────────────────────────────────────────────────────────────┘\n *\n * You might think: \"React has `root.memoizedUpdaters` - a Set<Fiber> of\n * components that triggered updates. Why not just use that?\"\n *\n * THE CATCH: memoizedUpdaters is ONLY populated when React DevTools is present!\n *\n * From react-dom source:\n * var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';\n *\n * function addFiberToLanesMap(root, fiber, lanes) {\n * if (!isDevToolsPresent) {\n * return; // ← EARLY RETURN! updaters never populated!\n * }\n * // ... adds to pendingUpdatersLaneMap, eventually to memoizedUpdaters\n * }\n *\n * This means:\n * - Users WITH React DevTools installed: memoizedUpdaters works ✅\n * - Users WITHOUT DevTools: memoizedUpdaters is EMPTY ❌\n *\n * THE ADOPTION DILEMMA:\n * To force memoizedUpdaters to work, we'd need to inject:\n * globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__ = { ... }\n *\n * Problems with this approach:\n * - Must be done BEFORE React loads (timing sensitive)\n * - Side effect that might interfere with real DevTools\n * - Side effect that might block tool adoption/approval\n * - Cannot be done lazily (React checks once at startup)\n *\n * SOLUTION:\n * Track our own \"last seen state\" per fiber. Update it on EVERY commit\n * where the fiber renders. Compare against OUR snapshot, not alternate.\n * This gives us accurate \"previous state\" regardless of alternate staleness.\n *\n * DUAL-MODE STRATEGY:\n * - When memoizedUpdaters available (DevTools users): Trust React completely\n * - When memoizedUpdaters empty (everyone else): Use lastSeenHookState\n *\n * This approach:\n * ✅ Zero side effects - no DevTools hook injection required\n * ✅ Zero false positives - accurate for all users\n * ✅ Adoptable by any project - no special requirements\n * ✅ Graceful dual-mode - best of both worlds\n *\n * The ~100 lines of lastSeenHookState code are NOT over-engineering.\n * Without them, users without DevTools would see 10x false positives\n * (e.g., 100 source detections instead of 10 in typical scenarios).\n *\n * References:\n * - https://github.com/acdlite/react-fiber-architecture\n * - https://jser.dev/2023-07-18-how-react-rerenders/\n * - https://jser.dev/2023-06-19-how-does-usestate-work/\n */\n const lastSeenHookState = new WeakMap<Fiber, unknown[]>();\n\n /**\n * Capture current hook state chain as an array of memoizedState values.\n * Used to track what state we've \"seen\" for this fiber.\n */\n function captureHookStateSnapshot(fiber: Fiber): unknown[] {\n const snapshot: unknown[] = [];\n let hook = fiber.memoizedState;\n while (hook) {\n snapshot.push(hook.memoizedState);\n hook = hook.next;\n }\n return snapshot;\n }\n\n /**\n * Compare current hook state against our last-seen snapshot.\n * Returns indices of hooks that changed since we last saw this fiber.\n */\n function detectChangesFromLastSeen(\n fiber: Fiber,\n currentSnapshot: unknown[]\n ): { changedIndices: number[]; changedHooks: ChangedHook[] } {\n const lastSeen =\n lastSeenHookState.get(fiber) || (fiber.alternate && lastSeenHookState.get(fiber.alternate));\n\n const changedIndices: number[] = [];\n const changedHooks: ChangedHook[] = [];\n\n if (!lastSeen) {\n // First time seeing this fiber - no changes to report\n return { changedIndices, changedHooks };\n }\n\n // Compare each hook\n const maxLen = Math.max(lastSeen.length, currentSnapshot.length);\n for (let i = 0; i < maxLen; i++) {\n const prev = lastSeen[i];\n const curr = currentSnapshot[i];\n\n if (!Object.is(prev, curr)) {\n changedIndices.push(i);\n changedHooks.push({ prevValue: prev, currentValue: curr });\n }\n }\n\n return { changedIndices, changedHooks };\n }\n\n const state: ProfilerState = {\n commits: 0,\n sources: new Map(),\n amplifiers: new Map(),\n amplifierSources: new Map(),\n thrashCounts:\n thrashMode === 'counts'\n ? { totalHooks: 0, affectedComponents: new Set<ComponentType>() }\n : null,\n memoizedUpdatersAvailable: false,\n commitsWithMemoizedUpdaters: 0,\n // Per-commit stats: [collateral, effects, memos, callbacks]\n commitStats: {},\n // Per-commit adapter counter deltas\n metricsByCommit: {},\n lastMetricsSnapshot: null,\n // Per-commit timing data\n commitTimings: {},\n lastCommitEndTime: performance.now(),\n // Per-commit Suspense boundary transitions\n suspenseByCommit: {},\n unmountsByCommit: {},\n interactionActions: interactionCapture.state.actions,\n interactionsByCommit: interactionCapture.state.byCommit,\n renderedByCommit: {},\n };\n\n // Helper: push to history and trim if needed (called in aggregation, not hot path)\n function _pushToHistory<T>(history: T[], item: T, limit: number): void {\n history.push(item);\n if (history.length > limit) {\n history.splice(0, history.length - limit);\n }\n }\n\n type UpdateHistory = Record<\n number,\n Record<number, import('./internals.tsx').ChangedHook> | 'repeat' | string\n >;\n\n function trimHistoryToSize(updHistory: UpdateHistory, limit: number): UpdateHistory {\n const keys = Object.keys(updHistory)\n .map(Number)\n .sort((a, b) => a - b);\n const keysToKeep = keys.slice(keys.length - limit);\n const trimmed: UpdateHistory = {};\n keysToKeep.forEach((key) => {\n trimmed[key] = updHistory[key];\n });\n return trimmed;\n }\n\n function findLastConcreteHook(\n history: UpdateHistory,\n hookIndex: number,\n beforeCommitId: number\n ): ChangedHook | null {\n const commitIds = Object.keys(history)\n .map(Number)\n .filter((id) => id < beforeCommitId)\n .sort((a, b) => b - a);\n\n for (const commitId of commitIds) {\n const entry = history[commitId];\n if (entry && entry !== 'repeat' && typeof entry !== 'string') {\n const prev = entry[hookIndex];\n if (prev && prev !== 'repeat' && typeof prev === 'object') return prev;\n }\n }\n\n return null;\n }\n\n function summarizePropValue(value: unknown): PropValueSummary {\n const isArray = Array.isArray(value);\n const type = value === null ? 'null' : isArray ? 'array' : typeof value;\n const isFunction = typeof value === 'function';\n const isNull = value === null;\n const isPrimitive = value == null ||\n type === 'string' ||\n type === 'number' ||\n type === 'boolean' ||\n type === 'undefined' ||\n type === 'symbol' ||\n type === 'bigint';\n const primitiveDisplay = isPrimitive ? String(value) : undefined;\n const summary: PropValueSummary = {\n type,\n isArray,\n isFunction,\n isNull,\n preview: primitiveDisplay || (isFunction ? 'function' : isArray ? `array(${value.length})` : 'object'),\n };\n\n if (primitiveDisplay !== undefined) {\n summary.display = primitiveDisplay;\n }\n if (typeof value === 'string' || isArray) {\n summary.length = value.length;\n }\n if (isArray) {\n summary.sample = value.slice(0, 3).map((item) => summarizePropValue(item).preview);\n } else if (value && typeof value === 'object') {\n const keys = Object.keys(value as Record<string, unknown>).slice(0, 5);\n summary.keysTop = keys;\n summary.length = Object.keys(value as Record<string, unknown>).length;\n if (keys.length > 0) {\n summary.preview = `object{${keys.join(',')}}`;\n }\n } else if (isFunction) {\n const fn = value as Function;\n summary.preview = fn.name ? `function ${fn.name}` : 'function';\n }\n return summary;\n }\n\n function diffProps(prevProps: unknown, currentProps: unknown): PropChangeEvidence[] {\n const changes: PropChangeEvidence[] = [];\n const prev = prevProps && typeof prevProps === 'object' ? prevProps as Record<string, unknown> : {};\n const current = currentProps && typeof currentProps === 'object' ? currentProps as Record<string, unknown> : {};\n const keys = new Set([...Object.keys(prev), ...Object.keys(current)]);\n\n keys.forEach((name) => {\n const prevHas = Object.prototype.hasOwnProperty.call(prev, name);\n const currentHas = Object.prototype.hasOwnProperty.call(current, name);\n const prevValue = prev[name];\n const currentValue = current[name];\n if (!prevHas && currentHas) {\n changes.push({ name, kind: 'added', prev: summarizePropValue(undefined), current: summarizePropValue(currentValue) });\n } else if (prevHas && !currentHas) {\n changes.push({ name, kind: 'removed', prev: summarizePropValue(prevValue), current: summarizePropValue(undefined) });\n } else if (Object.is(prevValue, currentValue)) {\n // Evidence surface records changes only; unchanged props stay implicit.\n } else if (\n prevValue !== null && currentValue !== null &&\n (typeof prevValue === 'object' || typeof prevValue === 'function' ||\n typeof currentValue === 'object' || typeof currentValue === 'function')\n ) {\n changes.push({ name, kind: 'ref-changed', prev: summarizePropValue(prevValue), current: summarizePropValue(currentValue) });\n } else {\n changes.push({ name, kind: 'scalar-changed', prev: summarizePropValue(prevValue), current: summarizePropValue(currentValue) });\n }\n });\n\n return changes;\n }\n\n function pushUpdateHistory(\n updHistory: UpdateHistory,\n commitId: number,\n changedHookIndices: number[],\n changedHooks: import('./internals.tsx').ChangedHook[]\n ): UpdateHistory {\n const entry: Record<number, import('./internals.tsx').ChangedHook> = {};\n\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n for (let i = 0; i < changedHookIndices.length; i++) {\n const hookIndex = changedHookIndices[i];\n const hook = changedHooks[i];\n\n if (hook === 'repeat') {\n entry[hookIndex] = 'repeat';\n } else {\n const prevConcrete = findLastConcreteHook(updHistory, hookIndex, commitId);\n entry[hookIndex] =\n prevConcrete &&\n typeof prevConcrete === 'object' &&\n Object.is(hook.prevValue, prevConcrete.prevValue) &&\n Object.is(hook.currentValue, prevConcrete.currentValue)\n ? 'repeat'\n : hook;\n }\n }\n\n const newEntry = Object.values(entry).every((v) => v === 'repeat') ? 'repeat' : entry;\n return { ...updHistory, [commitId]: newEntry };\n }\n\n function recordTree(rootFiber: Fiber, memoizedUpdaters: Set<Fiber> | null = null): number {\n // NOTE: This function is intentionally monolithic for performance.\n // Keep inner loops allocation-free and avoid helper calls.\n\n // Track if memoizedUpdaters is available\n if (memoizedUpdaters && memoizedUpdaters.size > 0) {\n state.memoizedUpdatersAvailable = true;\n state.commitsWithMemoizedUpdaters++;\n }\n\n const perCommit = {\n selfUpdated: new Map<\n string,\n {\n type: ComponentType;\n depth: number;\n count: number;\n changedHookIndices: number[];\n changedHooks: ChangedHook[];\n fiber?: Fiber;\n isUpdater: boolean;\n }\n >(),\n thrashing: new Map<\n ComponentType,\n {\n instanceCount: number;\n hookCount: number;\n lastAmplification: { depth: number; thrashedHooks: ThrashInfo[]; fiber?: Fiber };\n }\n >(),\n /** Linked thrashing: keyed by sourceId, tracks per-component thrashing with linkage */\n linkedThrashing: new Map<\n string,\n {\n type: ComponentType;\n depth: number;\n effects: number;\n callbacks: number;\n memos: number;\n causedBySourceId: string | null;\n lastAmplification: { depth: number; thrashedHooks: ThrashInfo[]; fiber?: Fiber };\n }\n >(),\n rendered: [] as RenderedComponentEvidence[],\n selfFibers: new WeakMap<Fiber, number>(),\n sourceFibers: new Set<Fiber>(), // Track source fibers to exclude from collateral count\n blastBySourceId: new Map<string, number>(),\n depthBySourceId: new Map<string, number>(),\n // Simple counts for commitStats\n totalCollateral: 0,\n committedComponentCount: 0, // Components with PerformedWork that committed\n effectCount: 0,\n memoCount: 0,\n callbackCount: 0,\n contextUpdates: 0,\n // Unmount tracking (populated by deletions-array walk in visit())\n unmountedComponents: 0,\n unmountedSubtrees: 0,\n // Bounded identity samples for branch starts (topmost component fibers in\n // each deleted subtree). Cap to keep payload small.\n unmountSamples: null as UnmountSample[] | null,\n // Suspense boundary transition events collected during this commit's visit pass\n suspenseEvents: null as SuspenseBoundaryEvent[] | null,\n };\n\n // -------------------------------------------------------------------------\n // COMBINED PASS: Identify sources + attribute blast (O(n) not O(n*depth))\n // -------------------------------------------------------------------------\n function visit(\n fiber: Fiber | null,\n depth: number = 0,\n currentOwnerSourceId: string | null = null\n ) {\n if (!fiber) return;\n\n // OPTIMIZATION: Skip subtrees with no PerformedWork using subtreeFlags\n // React uses subtreeFlags to propagate flags up the tree. If neither the fiber\n // nor its subtree have PerformedWork (flag 0x1), we can skip this entire branch.\n // This matches React's own optimization during commit phase.\n //\n // Exception 1: Suspense fibers use DidCapture (128) not PerformedWork when suspending.\n // Exception 2: Fibers with ChildDeletion in subtreeFlags have deletions to track.\n // eslint-disable-next-line no-bitwise -- React fiber flags are bitmasks, bitwise AND is required\n const hasWorkInSubtree =\n // eslint-disable-next-line no-bitwise -- React fiber flags are bitmasks, bitwise AND is required\n (fiber.flags & PerformedWork) !== 0 ||\n // eslint-disable-next-line no-bitwise\n (fiber.subtreeFlags & PerformedWork) !== 0 ||\n // fiber.flags & ChildDeletion = this fiber has children being deleted this commit\n // (React sets ChildDeletion on fiber.flags, NOT subtreeFlags, at commit time)\n // eslint-disable-next-line no-bitwise\n (fiber.flags & ChildDeletion) !== 0 ||\n // subtreeFlags propagation — some descendant has deletions\n // eslint-disable-next-line no-bitwise\n (fiber.subtreeFlags & ChildDeletion) !== 0 ||\n // Suspense transitioning: React sets Update (4) on the Suspense fiber's flags at commit.\n // eslint-disable-next-line no-bitwise\n (isSuspenseFiber(fiber.tag) && (fiber.flags & Update) !== 0) ||\n // subtreeFlags & Update: a descendant (e.g. Suspense) received an Update this commit.\n // React propagates subtreeFlags upward — HostRoot and all intermediate host fibers\n // will have Update bit set if any descendant has it. This ensures we don't skip\n // the path to a Suspense boundary when no PerformedWork exists higher in the tree.\n // eslint-disable-next-line no-bitwise\n (fiber.subtreeFlags & Update) !== 0;\n if (!hasWorkInSubtree) {\n // No work in this fiber or its descendants - skip entire subtree\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n if (fiber.sibling) visit(fiber.sibling, depth, currentOwnerSourceId);\n return;\n }\n\n // Check for context provider value changes\n if (isContextProviderFiber(fiber.tag) && didContextValueChange(fiber)) {\n perCommit.contextUpdates++;\n }\n\n // Unmount detection via fiber.deletions.\n // React populates fiber.deletions[] during the render phase for fibers that\n // will be deleted in this commit. At commit time, React sets ChildDeletion (16)\n // on fiber.flags (NOT subtreeFlags) of the parent holding the deletions.\n // fiber.deletions is the list of child fibers being removed.\n // eslint-disable-next-line no-bitwise\n if ((fiber.flags & ChildDeletion) !== 0 && fiber.deletions && fiber.deletions.length > 0) {\n for (let di = 0; di < fiber.deletions.length; di++) {\n const deleted = fiber.deletions[di];\n // Walk the entire deleted subtree to collect all component fibers being removed.\n // We track whether a fiber's parent (in the deleted subtree) is also a component\n // so we can identify branch starts.\n function collectDeletions(\n df: Fiber,\n parentIsComponent: boolean,\n branchStartDepth: number,\n currentBranch: { count: number; sample: typeof perCommit.unmountSamples extends (infer A)[] | null ? A : never } | null\n ): void {\n const dfIsComponent = isComponentFiber(df.tag);\n let nextBranch = currentBranch;\n if (dfIsComponent) {\n perCommit.unmountedComponents++;\n if (!parentIsComponent) {\n // This is a branch start: topmost component in the deleted subtree\n perCommit.unmountedSubtrees++;\n if (perCommit.unmountSamples == null) perCommit.unmountSamples = [];\n if (perCommit.unmountSamples.length < 30) {\n const fiberKey = (df as unknown as { key?: string | number | null }).key;\n const sample = {\n name: getComponentName(df),\n key: fiberKey == null ? null : String(fiberKey),\n depth: branchStartDepth,\n count: 1,\n source: summarizeFiberSource(df),\n host: summarizeHostSubtree(df),\n };\n perCommit.unmountSamples.push(sample);\n nextBranch = { count: 1, sample } as any;\n } else {\n nextBranch = null;\n }\n } else if (currentBranch && currentBranch.sample) {\n currentBranch.sample.count++;\n }\n // Clean up last-seen hook state so future remounts start fresh\n lastSeenHookState.delete(df);\n if (df.alternate) lastSeenHookState.delete(df.alternate);\n }\n if (df.child) collectDeletions(df.child, dfIsComponent, branchStartDepth + 1, nextBranch);\n if (df.sibling) collectDeletions(df.sibling, parentIsComponent, branchStartDepth, currentBranch);\n }\n // Add one branch-level sample for the deleted subtree. React can hand us\n // a host/text wrapper as the deletion root, so find the first component\n // descendant to label the branch.\n if (perCommit.unmountSamples == null) perCommit.unmountSamples = [];\n if (perCommit.unmountSamples.length < 30) {\n let labelFiber: Fiber | null = deleted;\n if (!isComponentFiber(labelFiber.tag)) {\n const stack: Fiber[] = [labelFiber];\n labelFiber = null;\n while (stack.length) {\n const f = stack.pop()!;\n if (isComponentFiber(f.tag)) { labelFiber = f; break; }\n if (f.child) stack.push(f.child);\n if (f.sibling) stack.push(f.sibling);\n }\n }\n if (labelFiber) {\n const counts = countUnmountedComponentSubtree(deleted);\n const fiberKey = (labelFiber as unknown as { key?: string | number | null }).key;\n perCommit.unmountSamples.push({\n name: getComponentName(labelFiber),\n key: fiberKey == null ? null : String(fiberKey),\n depth,\n count: counts.components,\n source: summarizeFiberSource(labelFiber),\n host: summarizeHostSubtree(deleted),\n });\n }\n }\n collectDeletions(deleted, false, depth, null);\n }\n }\n\n const isComponent = isComponentFiber(fiber.tag);\n let ownerSourceId = currentOwnerSourceId;\n\n // Suspense boundary transition detection.\n // Only fires when the boundary actually entered or left the fallback state.\n // Boundaries that render without delay (memoizedState stays null) are silent.\n if (isSuspenseFiber(fiber.tag)) {\n const suspenseChange = didSuspenseStateChange(fiber);\n if (suspenseChange) {\n // Record the boundary transition for this commit\n if (!perCommit.suspenseEvents) {\n perCommit.suspenseEvents = [];\n }\n const event: SuspenseBoundaryEvent = {\n depth,\n entered: suspenseChange.entered,\n left: suspenseChange.left,\n ...(captureFibers && { fiber }),\n };\n perCommit.suspenseEvents.push(event);\n\n // Treat a Suspense boundary state-change as a source.\n // We use a synthetic stable key that encodes type+depth so the same boundary\n // accumulates across commits (same logic as regular sources).\n // The type sentinel is the React.Suspense symbol on the fiber.\n if (enableSourceTracking) {\n const suspenseType = fiber.type; // symbol — stable across renders\n const sourceId = sourceIdManager.getSourceId(fiber, suspenseType, depth);\n const suspenseHook: ChangedHook = {\n prevValue: suspenseChange.left ? 'suspended' : null,\n currentValue: suspenseChange.entered ? 'suspended' : null,\n info: suspenseChange.entered ? 'suspense:entered-fallback' : 'suspense:left-fallback',\n };\n perCommit.selfUpdated.set(sourceId, {\n type: suspenseType,\n depth,\n count: 1,\n changedHookIndices: [0],\n changedHooks: [suspenseHook],\n fiber: captureFibers ? fiber : undefined,\n isUpdater: true,\n });\n ownerSourceId = sourceId;\n }\n }\n }\n\n if (isComponent) {\n const type = fiber.type;\n\n // Count components with PerformedWork (committed work)\n if (didFiberUpdate(fiber)) {\n perCommit.committedComponentCount++;\n }\n\n // Early bailout: skip components that didn't update (no PerformedWork flag)\n if (!didFiberUpdate(fiber)) {\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n if (fiber.child) visit(fiber.child, depth + 1, ownerSourceId);\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n if (fiber.sibling) visit(fiber.sibling, depth, currentOwnerSourceId);\n return;\n }\n\n if (!ignoreSet.has(type) && !isReactInternalComponentType(type)) {\n const componentSourceId = sourceIdManager.getSourceId(fiber, type, depth);\n const parentFiber = fiber.return && isComponentFiber(fiber.return.tag) ? fiber.return : null;\n const parentSourceId = parentFiber\n ? sourceIdManager.getSourceId(parentFiber, parentFiber.type, depth - 1)\n : null;\n const existingRenderEvidenceIndex = perCommit.rendered.findIndex(\n (entry) => entry.sourceId === componentSourceId\n );\n const initialRenderEvidence: RenderedComponentEvidence = {\n sourceId: componentSourceId,\n name: getComponentName(fiber),\n depth,\n parentSourceId,\n ownerSourceId,\n isSelfSource: false,\n propChanges: fiber.alternate ? diffProps(fiber.alternate.memoizedProps, fiber.memoizedProps) : [],\n hasPropChanges: false,\n trasherCounts: { effects: 0, callbacks: 0, memos: 0 },\n };\n initialRenderEvidence.hasPropChanges = initialRenderEvidence.propChanges.length > 0;\n if (existingRenderEvidenceIndex >= 0) {\n perCommit.rendered[existingRenderEvidenceIndex] = initialRenderEvidence;\n } else {\n perCommit.rendered.push(initialRenderEvidence);\n }\n\n // Track provenance of useCallback/useMemo results (only if amplifier detection enabled)\n if (enableAmplifiers) {\n let hook = fiber.memoizedState;\n let hookIndex = 0;\n\n while (hook) {\n const ms = hook.memoizedState;\n if (Array.isArray(ms) && ms.length === 2 && Array.isArray(ms[1])) {\n const result = ms[0];\n if (\n result != null &&\n (typeof result === 'object' || typeof result === 'function')\n ) {\n valueProvenance.set(result, {\n type,\n hookIndex,\n depth,\n hookType: typeof result === 'function' ? 'useCallback' : 'useMemo',\n });\n }\n }\n\n hook = hook.next;\n hookIndex++;\n }\n }\n\n // Source tracking (Level 2+): Capture hook state and detect sources\n // Skip entirely in 'stats' mode for maximum performance\n let currentHookSnapshot: unknown[] | null = null;\n if (enableSourceTracking) {\n currentHookSnapshot = captureHookStateSnapshot(fiber);\n }\n\n // Source detection strategy (Level 2+):\n // 1. If memoizedUpdaters available (development): trust it completely\n // 2. If memoizedUpdaters NOT available (production): use our own lastSeenHookState\n // to avoid fiber.alternate lag false positives\n // Skip entirely in 'stats' mode (Level 1)\n\n let isRealSource = false;\n let changedIndices: number[] = [];\n let changedHooks: ChangedHook[] = [];\n\n if (enableSourceTracking) {\n const inMemoizedUpdaters = memoizedUpdaters\n ? memoizedUpdaters.has(fiber) ||\n (fiber.alternate && memoizedUpdaters.has(fiber.alternate))\n : null;\n\n if (memoizedUpdaters) {\n // DEVELOPMENT: Trust memoizedUpdaters completely\n if (inMemoizedUpdaters) {\n isRealSource = true;\n // Use didFiberSelfUpdate for the hook change details\n const selfUpdateResult = didFiberSelfUpdate(fiber);\n if (selfUpdateResult && selfUpdateResult.actionable) {\n changedIndices = selfUpdateResult.changedIndices;\n changedHooks = selfUpdateResult.changedHooks;\n }\n }\n // If not in memoizedUpdaters, skip this fiber as source\n } else {\n // PRODUCTION: Use our own tracking to avoid alternate lag\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const changes = detectChangesFromLastSeen(fiber, currentHookSnapshot!);\n if (changes.changedIndices.length > 0) {\n isRealSource = true;\n changedIndices = changes.changedIndices;\n changedHooks = changes.changedHooks;\n }\n }\n\n // Update our last-seen snapshot for this fiber (always, even if not a source)\n // This ensures we have accurate \"previous state\" for next commit\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n lastSeenHookState.set(fiber, currentHookSnapshot!);\n if (fiber.alternate) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n lastSeenHookState.set(fiber.alternate, currentHookSnapshot!);\n }\n }\n\n if (isRealSource && changedIndices.length > 0) {\n const sourceId = componentSourceId;\n\n // Track that this fiber is a source (so we don't count it as its own collateral)\n perCommit.sourceFibers.add(fiber);\n if (fiber.alternate) {\n perCommit.sourceFibers.add(fiber.alternate);\n }\n\n const existing = perCommit.selfUpdated.get(sourceId);\n\n const updateData = {\n type,\n depth,\n count: (existing?.count || 0) + 1,\n changedHookIndices: changedIndices,\n changedHooks: changedHooks,\n fiber: captureFibers ? fiber : undefined,\n isUpdater: true,\n };\n\n perCommit.selfUpdated.set(sourceId, updateData);\n perCommit.selfFibers.set(fiber, depth);\n\n // This fiber is now the owner for all descendants\n ownerSourceId = sourceId;\n }\n\n // Blast radius attribution: if this fiber updated and we have an owner, attribute it\n // ONLY count component fibers (not host nodes like div, span, etc.)\n // DON'T count if this fiber IS the owner (don't count source as its own collateral!)\n const isSourceItself = perCommit.sourceFibers.has(fiber);\n\n // Don't count mount/hydration work as \"collateral\" (not preventable).\n // eslint-disable-next-line no-bitwise\n const isNonPreventable = (fiber.flags & (Placement | Hydrating)) !== 0;\n\n if (\n isComponent &&\n fiber.alternate &&\n didFiberUpdate(fiber) &&\n ownerSourceId &&\n !isSourceItself &&\n !isNonPreventable\n ) {\n perCommit.blastBySourceId.set(\n ownerSourceId,\n (perCommit.blastBySourceId.get(ownerSourceId) || 0) + 1\n );\n\n const currentMax = perCommit.depthBySourceId.get(ownerSourceId) || 0;\n if (depth > currentMax) {\n perCommit.depthBySourceId.set(ownerSourceId, depth);\n }\n\n // Count total collateral for commitStats\n perCommit.totalCollateral++;\n }\n\n const renderedEntry = perCommit.rendered.find((entry) => entry.sourceId === componentSourceId);\n if (renderedEntry) {\n renderedEntry.ownerSourceId = ownerSourceId;\n renderedEntry.isSelfSource = isRealSource && changedIndices.length > 0;\n }\n\n // Amplifier detection (Level 3: counts/full).\n // Skip in 'stats' and 'sources' modes for better performance\n if (enableAmplifiers && didFiberUpdate(fiber) && fiber.alternate) {\n const thrashResult = detectHookThrashing(\n fiber.alternate.memoizedState,\n fiber.memoizedState,\n effectThrashMode,\n valueProvenance\n );\n\n const totalThrashing =\n thrashResult.effects.length +\n thrashResult.callbacks.length +\n thrashResult.memos.length;\n\n if (totalThrashing > 0) {\n if (thrashMode === 'counts') {\n if (state.thrashCounts) {\n state.thrashCounts.affectedComponents.add(type);\n state.thrashCounts.totalHooks += totalThrashing;\n }\n } else if (thrashMode === 'full') {\n const allThrashedHooks: ThrashInfo[] = [\n ...thrashResult.effects,\n ...thrashResult.callbacks,\n ...thrashResult.memos,\n ];\n\n // Legacy amplifiers (keyed by type)\n const existing = perCommit.thrashing.get(type);\n const thrashData = {\n instanceCount: (existing?.instanceCount || 0) + 1,\n hookCount: (existing?.hookCount || 0) + totalThrashing,\n lastAmplification: {\n depth,\n thrashedHooks: allThrashedHooks,\n fiber: captureFibers ? fiber : undefined,\n },\n };\n\n perCommit.thrashing.set(type, thrashData);\n\n // NEW: Linked amplification (keyed by sourceId)\n // Get or create sourceId for this fiber (even if not a source)\n const amplifierSourceId = sourceIdManager.getSourceId(fiber, type, depth);\n const existingLinked = perCommit.linkedThrashing.get(amplifierSourceId);\n\n const effects = (existingLinked?.effects || 0) + thrashResult.effects.length;\n const callbacks = (existingLinked?.callbacks || 0) + thrashResult.callbacks.length;\n const memos = (existingLinked?.memos || 0) + thrashResult.memos.length;\n perCommit.linkedThrashing.set(amplifierSourceId, {\n type,\n depth,\n effects,\n callbacks,\n memos,\n // If this fiber is a source, causedBySourceId is null (self-caused)\n // If this fiber is collateral, ownerSourceId is who caused it\n causedBySourceId: isRealSource ? null : ownerSourceId,\n lastAmplification: {\n depth,\n thrashedHooks: allThrashedHooks,\n fiber: captureFibers ? fiber : undefined,\n },\n });\n\n const renderedEntry = perCommit.rendered.find((entry) => entry.sourceId === amplifierSourceId);\n if (renderedEntry) {\n renderedEntry.trasherCounts = { effects, callbacks, memos };\n }\n\n // Count amplifiers for commitStats\n perCommit.effectCount += thrashResult.effects.length;\n perCommit.memoCount += thrashResult.memos.length;\n perCommit.callbackCount += thrashResult.callbacks.length;\n }\n }\n }\n }\n }\n\n // Propagate current owner to children (depth changes)\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n if (fiber.child) visit(fiber.child, depth + 1, ownerSourceId);\n // Siblings stay at same depth and inherit parent's owner\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n if (fiber.sibling) visit(fiber.sibling, depth, currentOwnerSourceId);\n }\n\n visit(rootFiber);\n\n // -------------------------------------------------------------------------\n // PASS 3: Update global aggregates (not hot loop).\n // -------------------------------------------------------------------------\n state.commits++;\n\n for (const [sourceId, data] of perCommit.selfUpdated.entries()) {\n const { type, depth, count, changedHookIndices, fiber } = data;\n\n let s = state.sources.get(sourceId);\n if (!s) {\n s = {\n type,\n depth,\n renderCount: 0,\n causedUpdates: 0,\n collateralUpdates: 0,\n maxCollateralUpdates: 0,\n maxPenetrationDepth: 0,\n updateHistory: {},\n collateralByCommit: {}, // Per-commit collateral for this source\n debugHookIndices: changedHookIndices.slice(),\n };\n state.sources.set(sourceId, s);\n }\n\n s.renderCount++;\n s.debugHookIndices = changedHookIndices.slice();\n\n // Store update history for this commit - this determines if it's a \"repeat\" or new update\n const historyWithUpdate = pushUpdateHistory(\n s.updateHistory,\n state.commits,\n changedHookIndices,\n data.changedHooks\n );\n s.updateHistory = trimHistoryToSize(historyWithUpdate, historySize);\n\n // Check if this commit was a REAL update or just a \"repeat\"\n // Only count causedUpdates and collateral for REAL updates\n const thisCommitEntry = s.updateHistory[state.commits];\n const isRepeat = thisCommitEntry === 'repeat';\n\n if (!isRepeat && data.isUpdater) {\n // This is a NEW update (not a repeat) - count it\n s.causedUpdates += count;\n\n const blast = perCommit.blastBySourceId.get(sourceId) || 0;\n s.collateralUpdates += blast;\n if (blast > s.maxCollateralUpdates) s.maxCollateralUpdates = blast;\n\n // Store per-commit collateral for this source (only for real updates)\n s.collateralByCommit[state.commits] = blast;\n\n const penetrationDepth = perCommit.depthBySourceId.get(sourceId) || 0;\n if (penetrationDepth > s.maxPenetrationDepth) {\n s.maxPenetrationDepth = penetrationDepth;\n }\n }\n\n if (captureFibers && fiber) {\n s.fiber = fiber;\n }\n }\n\n if (enableAmplifiers && thrashMode === 'full') {\n // Legacy thrashers (keyed by type)\n for (const [type, data] of perCommit.thrashing.entries()) {\n let s = state.amplifiers.get(type);\n if (!s) {\n s = {\n renderCount: 0,\n instancesTotal: 0,\n maxInstancesPerCommit: 0,\n hooksTotal: 0,\n maxHooksPerCommit: 0,\n effectCount: 0,\n callbackCount: 0,\n memoCount: 0,\n lastAmplification: { depth: 0, thrashedHooks: [] },\n };\n state.amplifiers.set(type, s);\n }\n\n s.renderCount++;\n s.instancesTotal += data.instanceCount;\n s.hooksTotal += data.hookCount;\n if (data.instanceCount > s.maxInstancesPerCommit)\n s.maxInstancesPerCommit = data.instanceCount;\n if (data.hookCount > s.maxHooksPerCommit) s.maxHooksPerCommit = data.hookCount;\n\n // eslint-disable-next-line @atlassian/perf-linting/no-quadratic-complexity\n data.lastAmplification.thrashedHooks.forEach((hook: ThrashInfo) => {\n if (hook.hookType === 'effect') s.effectCount++;\n else if (hook.hookType === 'callback') s.callbackCount++;\n else if (hook.hookType === 'memo') s.memoCount++;\n });\n\n s.lastAmplification = data.lastAmplification;\n }\n\n // NEW: Linked thrashers (keyed by sourceId)\n for (const [sourceId, data] of perCommit.linkedThrashing.entries()) {\n let as = state.amplifierSources.get(sourceId);\n if (!as) {\n as = {\n type: data.type,\n depth: data.depth,\n effectCount: 0,\n callbackCount: 0,\n memoCount: 0,\n hooksTotal: 0,\n commitIds: [],\n byCommit: {},\n causedBySourceId: data.causedBySourceId,\n lastAmplification: { depth: 0, thrashedHooks: [] },\n };\n state.amplifierSources.set(sourceId, as);\n }\n\n // Update counts\n as.effectCount += data.effects;\n as.callbackCount += data.callbacks;\n as.memoCount += data.memos;\n as.hooksTotal += data.effects + data.callbacks + data.memos;\n\n // Track which commits this amplifier fired in\n if (!as.commitIds.includes(state.commits)) {\n as.commitIds.push(state.commits);\n }\n\n // Per-commit breakdown\n as.byCommit[state.commits] = {\n effects: data.effects,\n callbacks: data.callbacks,\n memos: data.memos,\n };\n\n // Update causedBySourceId (use latest if different)\n if (data.causedBySourceId !== null) {\n as.causedBySourceId = data.causedBySourceId;\n }\n\n as.lastAmplification = data.lastAmplification;\n }\n }\n\n // Persist Suspense events for this commit\n if (perCommit.suspenseEvents && perCommit.suspenseEvents.length > 0) {\n state.suspenseByCommit[state.commits] = perCommit.suspenseEvents;\n }\n\n if (perCommit.rendered.length > 0) {\n state.renderedByCommit[state.commits] = perCommit.rendered;\n }\n\n // Store commitStats: [collateral, sources, restarts, performedWork, effects, memos, callbacks, contextUpdates, unmountedComponents, unmountedSubtrees]\n //\n // ALL fiber-walk-derived fields (collateral, sources, performedWork, effects,\n // memos, callbacks, contextUpdates) are real measurements that come from this\n // very recordTree() call. They are populated identically in 'adapter:<id>'\n // and 'devtools' integration modes — the fiber tree is the same in both.\n //\n // The ONLY adapter-exclusive field is `restarts` (index 2). It is\n // initialized to 0 here and overwritten after the adapter's delta\n // calculation in handleCommit. In 'devtools' mode there is no\n // render-counter delta available, so it stays at 0. Consumers should\n // consult report.meta.dataAvailability.restarts to disambiguate \"no\n // restarts measured\" (0 in 'devtools' mode = unknown) from \"zero restarts\n // confirmed\" (0 in 'adapter:<id>' mode = real).\n state.commitStats[state.commits] = [\n perCommit.totalCollateral,\n perCommit.selfUpdated.size, // Number of sources in this commit\n 0, // restarts - will be updated after the adapter's delta calculation\n perCommit.committedComponentCount, // performedWork - components with PerformedWork flag\n perCommit.effectCount,\n perCommit.memoCount,\n perCommit.callbackCount,\n perCommit.contextUpdates,\n perCommit.unmountedComponents,\n perCommit.unmountedSubtrees,\n ];\n\n if (perCommit.unmountSamples && perCommit.unmountSamples.length > 0) {\n state.unmountsByCommit[state.commits] = perCommit.unmountSamples;\n }\n\n // Return committed component count for restart calculation\n return perCommit.committedComponentCount;\n }\n\n function resetState(): void {\n state.commits = 0;\n state.sources.clear();\n state.amplifiers.clear();\n state.amplifierSources.clear();\n if (state.thrashCounts) {\n state.thrashCounts.totalHooks = 0;\n state.thrashCounts.affectedComponents.clear();\n }\n state.memoizedUpdatersAvailable = false;\n state.commitsWithMemoizedUpdaters = 0;\n // Clear commitStats\n for (const key of Object.keys(state.commitStats)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete state.commitStats[Number(key)];\n }\n // Clear adapter per-commit data\n for (const key of Object.keys(state.metricsByCommit)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete state.metricsByCommit[Number(key)];\n }\n // Clear timing data\n for (const key of Object.keys(state.commitTimings)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete state.commitTimings[Number(key)];\n }\n // Clear Suspense boundary transitions\n for (const key of Object.keys(state.suspenseByCommit)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete state.suspenseByCommit[Number(key)];\n }\n // Clear unmount samples\n for (const key of Object.keys(state.unmountsByCommit)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete state.unmountsByCommit[Number(key)];\n }\n // Clear rendered component evidence\n for (const key of Object.keys(state.renderedByCommit)) {\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete state.renderedByCommit[Number(key)];\n }\n interactionCapture.reset();\n // Recapture adapter snapshot as new baseline\n state.lastMetricsSnapshot = captureMetricsSnapshot();\n // Reset timing baseline\n state.lastCommitEndTime = performance.now();\n sourceIdManager.clear();\n }\n\n type DevtoolsHook = {\n onCommitFiberRoot?: (...args: unknown[]) => void;\n onCommitFiberUnmount?: (...args: unknown[]) => void;\n [key: string]: unknown;\n };\n\n type GlobalWithDevtools = typeof globalThis & {\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: DevtoolsHook;\n };\n\n const commitSurface = createCommitSurfaceOwnership<{\n commitId: number;\n committedComponents: number;\n metricsBefore: CommitMetricsSnapshot | null;\n }>();\n\n // Chained predecessor on the DevTools hook (real React DevTools, etc.) — so\n // augmenting the hook never breaks an existing client. Restored on uninstall.\n let devtoolsHookPrev: ((...args: unknown[]) => void) | undefined;\n let devtoolsUnmountPrev: ((...args: unknown[]) => void) | undefined;\n // Was the DevTools hook present before install()? Tells uninstall whether to\n // delete it entirely or just restore the previous handler.\n let devtoolsHookCreatedByUs = false;\n\n // React's DevTools surface reports unmounted fibers via onCommitFiberUnmount.\n // Keep a small buffer between those callbacks and the following root commit;\n // this catches deletion work even if `fiber.deletions[]` has been cleared by\n // the time onCommitFiberRoot runs.\n let pendingDevtoolsUnmounts = { components: 0, subtrees: 0 };\n let pendingDevtoolsUnmountSamples: UnmountSample[] = [];\n\n // Integration mode is OBSERVED, not declared. Starts at 'devtools' (we always\n // own the DevTools surface after install). Promoted to 'adapter:<id>' on the\n // first adapter callback that proves the host surface is actually running.\n // Returns to 'none' only on uninstall.\n let integrationMode: IntegrationMode = 'none';\n\n function countUnmountedComponentSubtree(fiber: Fiber | null, parentIsComponent = false): { components: number; subtrees: number } {\n if (!fiber) return { components: 0, subtrees: 0 };\n const isComponent = isComponentFiber(fiber.tag);\n let components = isComponent ? 1 : 0;\n let subtrees = isComponent && !parentIsComponent ? 1 : 0;\n if (fiber.child) {\n const child = countUnmountedComponentSubtree(fiber.child, isComponent);\n components += child.components;\n subtrees += child.subtrees;\n }\n if (fiber.sibling) {\n const sibling = countUnmountedComponentSubtree(fiber.sibling, parentIsComponent);\n components += sibling.components;\n subtrees += sibling.subtrees;\n }\n return { components, subtrees };\n }\n\n function summarizeHostSubtree(fiber: Fiber | null): {\n elements: number;\n text: number;\n tagsTop: Array<[string, number]>;\n testIdsTop: Array<[string, number]>;\n rolesTop: Array<[string, number]>;\n ariaLabels: string[];\n textHints: string[];\n } {\n const tags = new Map<string, number>();\n const testIds = new Map<string, number>();\n const roles = new Map<string, number>();\n const ariaLabels: string[] = [];\n const textHints: string[] = [];\n let elements = 0;\n let text = 0;\n const add = (map: Map<string, number>, key: unknown) => {\n if (typeof key !== 'string' || !key) return;\n map.set(key, (map.get(key) || 0) + 1);\n };\n const addHint = (arr: string[], value: unknown, max = 6) => {\n if (typeof value !== 'string') return;\n const trimmed = value.replace(/\\s+/g, ' ').trim();\n if (!trimmed || arr.includes(trimmed)) return;\n arr.push(trimmed.length > 80 ? `${trimmed.slice(0, 77)}…` : trimmed);\n if (arr.length > max) arr.length = max;\n };\n const top = (map: Map<string, number>) => Array.from(map.entries()).sort((a, b) => b[1] - a[1]).slice(0, 6);\n const walk = (f: Fiber | null) => {\n if (!f) return;\n if (f.tag === 5) {\n elements++;\n const props = (f.memoizedProps || {}) as Record<string, unknown>;\n add(tags, typeof f.type === 'string' ? f.type : 'host');\n add(testIds, props['data-testid']);\n add(roles, props.role);\n addHint(ariaLabels, props['aria-label']);\n addHint(ariaLabels, props.title);\n addHint(textHints, typeof props.children === 'string' ? props.children : null);\n } else if (f.tag === 6) {\n text++;\n addHint(textHints, f.memoizedProps);\n }\n walk(f.child);\n walk(f.sibling);\n };\n walk(fiber);\n return { elements, text, tagsTop: top(tags), testIdsTop: top(testIds), rolesTop: top(roles), ariaLabels, textHints };\n }\n\n function recordMetricsEvidence(\n commitId: number,\n committedComponents: number,\n before: CommitMetricsSnapshot,\n after: CommitMetricsSnapshot,\n ): void {\n if (!metricsAdapter) return;\n const { delta, restarts } = metricsAdapter.measure(before, after, committedComponents, commitId);\n state.metricsByCommit[commitId] = delta;\n if (state.commitStats[commitId]) {\n state.commitStats[commitId][CS_RESTARTS] = restarts;\n }\n }\n /**\n * Core commit handler — shared by the adapter and DevTools paths.\n * metricsDeltaAvailable: true only when the adapter's counters are live.\n */\n function handleCommit(\n root: { current: Fiber; memoizedUpdaters?: Set<Fiber> },\n metricsDeltaAvailable: boolean\n ): number {\n // Renderer internals are guaranteed to exist by the time commit hooks fire.\n // Installing here arms passive hook stack capture for subsequent real renders\n // without invoking product components during inspection.\n debugRender.install();\n const commitHookStartTime = performance.now();\n const timeSinceLastCommit = commitHookStartTime - state.lastCommitEndTime;\n\n const metricsBefore = state.lastMetricsSnapshot || captureMetricsSnapshot();\n\n const memoizedUpdaters = root.memoizedUpdaters;\n const committedComponents = recordTree(root.current, memoizedUpdaters || null);\n\n // `recordTree` counts deletions from fiber.deletions[]. Some renderers clear\n // that array before the final root callback, while still calling the DevTools\n // unmount hook. We use the DevTools surface as a FALLBACK when recordTree saw\n // no deletions this commit. We do NOT merge with max() — DevTools fires\n // onCommitFiberUnmount per-descendant (not per-subtree-root), so summing\n // produces inflated subtree counts for nested deletions (e.g. Mid > Leaf\n // → DevTools fires twice → counts as 2 subtrees instead of 1).\n const currentStats = state.commitStats[state.commits];\n if (currentStats && (pendingDevtoolsUnmounts.components > 0 || pendingDevtoolsUnmounts.subtrees > 0)) {\n const recordTreeSawDeletions = (currentStats[CS_UNMOUNTED_COMPONENTS] || 0) > 0;\n if (!recordTreeSawDeletions) {\n // Fallback: recordTree didn't see fiber.deletions[] (renderer cleared it\n // before commit). Trust DevTools counts even though they may over-report\n // subtrees for nested deletions — better some signal than none.\n currentStats[CS_UNMOUNTED_COMPONENTS] = pendingDevtoolsUnmounts.components;\n currentStats[CS_UNMOUNTED_SUBTREES] = pendingDevtoolsUnmounts.subtrees;\n }\n pendingDevtoolsUnmounts = { components: 0, subtrees: 0 };\n }\n if (pendingDevtoolsUnmountSamples.length > 0) {\n const existing = state.unmountsByCommit[state.commits];\n if (existing && existing.length > 0) {\n // Prefer deletion-walk samples (have depth). Drop devtools samples to\n // avoid noisy duplicates.\n } else {\n state.unmountsByCommit[state.commits] = pendingDevtoolsUnmountSamples;\n }\n pendingDevtoolsUnmountSamples = [];\n }\n\n const metricsAfter = captureMetricsSnapshot();\n if (metricsDeltaAvailable && metricsBefore && metricsAfter) {\n recordMetricsEvidence(state.commits, committedComponents, metricsBefore, metricsAfter);\n }\n state.lastMetricsSnapshot = metricsAfter;\n\n const commitHookEndTime = performance.now();\n interactionCapture.linkRecent(state.commits, commitHookEndTime);\n state.commitTimings[state.commits] = {\n timeSinceLastCommit,\n detectorOverhead: commitHookEndTime - commitHookStartTime,\n };\n state.lastCommitEndTime = commitHookEndTime;\n return committedComponents;\n }\n\n return {\n /**\n * Start profiling React commits.\n *\n * Integration model is OBSERVED at runtime, not declared at install time.\n *\n * 'devtools' — DevTools `onCommitFiberRoot` is the canonical entry\n * point. We define the hook if absent, augment (chain)\n * if present. On every commit we capture the fiber tree.\n *\n * 'adapter:<id>' — Promoted from 'devtools' the first time the commit\n * metrics adapter's host callback actually fires for a\n * real commit. From then on the adapter is the\n * authoritative processor and the DevTools surface is\n * chained-observer-only. The adapter is preferred when\n * alive because it carries render-counter deltas\n * (restart math, metricsByCommit).\n *\n * 'none' — Only when no DevTools hook surface can be created and\n * no adapter surface is reachable. Practically never\n * hit, since the content-script ships a\n * devtools-hook-shim before react-dom.\n *\n * Double-invocation safety:\n * Once an adapter callback has fired, DevTools remains chained for\n * existing tooling but does not capture commits; the adapter alone calls\n * `handleCommit`. Without a live adapter, DevTools is the capture\n * surface. This avoids duplicate capture without relying on per-root\n * timing heuristics.\n *\n * Side effects:\n * - Defines `__REACT_DEVTOOLS_GLOBAL_HOOK__` if it does not already exist\n * (minimal contract: `onCommitFiberRoot` only). React reads the hook at\n * module-eval time; the content-script shim handles ordering.\n * - Asks the adapter (when one is registered) to route its host commit\n * callback here, *if and when* the host calls it.\n *\n * Safe to call multiple times (idempotent: chains skipped when our wrappers\n * are already in place).\n */\n install(): void {\n interactionCapture.install();\n const devtoolsGlobal = globalThis as GlobalWithDevtools;\n metricsAdapter = resolveMetricsAdapter();\n // Capture an initial adapter snapshot regardless. If the host surface is\n // dead these counters stay at zero and the delta is a no-op.\n state.lastMetricsSnapshot = captureMetricsSnapshot();\n\n // ── 1. Ensure a DevTools hook surface exists ───────────────────────────\n // React calls __REACT_DEVTOOLS_GLOBAL_HOOK__.onCommitFiberRoot on every\n // commit when the hook is present at react-dom eval time. We define a\n // minimal hook if nothing is there; otherwise we augment the existing one.\n let hook = devtoolsGlobal.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (!hook) {\n hook = {} as DevtoolsHook;\n devtoolsGlobal.__REACT_DEVTOOLS_GLOBAL_HOOK__ = hook;\n devtoolsHookCreatedByUs = true;\n } else {\n devtoolsHookCreatedByUs = false;\n }\n\n devtoolsHookPrev = typeof hook.onCommitFiberRoot === 'function'\n ? hook.onCommitFiberRoot\n : undefined;\n devtoolsUnmountPrev = typeof hook.onCommitFiberUnmount === 'function'\n ? hook.onCommitFiberUnmount\n : undefined;\n\n const devtoolsHandler = (...args: unknown[]) => {\n // Always chain whatever was there first (real React DevTools, other\n // tooling). Errors in third-party handlers must not poison React.\n if (devtoolsHookPrev) {\n try { devtoolsHookPrev(...args); } catch (_) { /* swallow */ }\n }\n\n const root = args[1] as { current: Fiber; memoizedUpdaters?: Set<Fiber> } | undefined;\n if (!root) return;\n\n // The adapter is the canonical fast path (it carries the render-counter\n // deltas). Defer only after an adapter callback has proved that the host\n // surface is live. BUT: a host runtime can wipe or replace its surface\n // mid-session (for example `delete window.__ATL_REACT_METRICS`), which\n // orphans our callback on the old object. Re-seed lazily here: if the\n // callback is no longer wired, re-attach so subsequent commits route\n // through the adapter again.\n if (commitSurface.adapterObserved && metricsAdapter) {\n if (!metricsAdapter.isAttached()) {\n metricsAdapter.reattach();\n // Fall through to capture this commit via devtools so we don't lose it.\n const metricsBefore = state.lastMetricsSnapshot || captureMetricsSnapshot();\n const committedComponents = handleCommit(root, /* metricsDeltaAvailable */ false);\n commitSurface.recordDevtools(root, { commitId: state.commits, committedComponents, metricsBefore });\n return;\n }\n // The adapter is still wired — let it own this commit.\n return;\n }\n const metricsBefore = state.lastMetricsSnapshot || captureMetricsSnapshot();\n const committedComponents = handleCommit(root, /* metricsDeltaAvailable */ false);\n commitSurface.recordDevtools(root, { commitId: state.commits, committedComponents, metricsBefore });\n };\n hook.onCommitFiberRoot = devtoolsHandler;\n\n const devtoolsUnmountHandler = (...args: unknown[]) => {\n if (devtoolsUnmountPrev) {\n try { devtoolsUnmountPrev(...args); } catch (_) { /* swallow */ }\n }\n const fiber = args[1] as Fiber | undefined;\n if (!fiber) return;\n const counts = countUnmountedComponentSubtree(fiber);\n pendingDevtoolsUnmounts.components += counts.components;\n pendingDevtoolsUnmounts.subtrees += counts.subtrees;\n if (counts.components > 0 && pendingDevtoolsUnmountSamples.length < 30) {\n // Find the topmost component fiber in the deleted subtree (could be the\n // root fiber itself, or a descendant if React handed us a host wrapper).\n let labelFiber: Fiber | null = fiber;\n if (!isComponentFiber(labelFiber.tag)) {\n const stack: Fiber[] = [labelFiber];\n labelFiber = null;\n while (stack.length) {\n const f = stack.pop()!;\n if (isComponentFiber(f.tag)) { labelFiber = f; break; }\n if (f.child) stack.push(f.child);\n if (f.sibling) stack.push(f.sibling);\n }\n }\n if (labelFiber) {\n const fiberKey = (labelFiber as unknown as { key?: string | number | null }).key;\n pendingDevtoolsUnmountSamples.push({\n name: getComponentName(labelFiber),\n key: fiberKey == null ? null : String(fiberKey),\n depth: null,\n count: counts.components,\n source: summarizeFiberSource(labelFiber),\n host: summarizeHostSubtree(fiber),\n });\n }\n }\n lastSeenHookState.delete(fiber);\n if (fiber.alternate) lastSeenHookState.delete(fiber.alternate);\n };\n hook.onCommitFiberUnmount = devtoolsUnmountHandler;\n\n // Default observed mode until an adapter proves itself.\n integrationMode = 'devtools';\n\n // ── 2. Listen on the adapter surface ───────────────────────────────────\n // We don't probe whether the host surface is alive — we let invocation\n // be the proof. Once the adapter's callback fires, its counters are\n // available for the delta math.\n commitSurface.reset();\n const adapter = metricsAdapter;\n if (adapter) {\n const adapterMode: IntegrationMode = `adapter:${adapter.id}`;\n adapter.attach((root) => {\n const previousCapture = commitSurface.observeAdapter(root);\n // First invocation is proof of life. Promote mode permanently.\n if (integrationMode !== adapterMode) {\n integrationMode = adapterMode;\n }\n\n if (previousCapture) {\n // The host may call DevTools first. Enrich that same commit with\n // adapter counters without traversing or recording it a second time.\n const metricsAfter = captureMetricsSnapshot();\n if (previousCapture.metricsBefore && metricsAfter) {\n recordMetricsEvidence(previousCapture.commitId, previousCapture.committedComponents, previousCapture.metricsBefore, metricsAfter);\n }\n state.lastMetricsSnapshot = metricsAfter;\n } else {\n handleCommit(root, /* metricsDeltaAvailable */ true);\n }\n });\n }\n },\n\n /**\n * Stop profiling React commits. Does not clear accumulated state.\n * Call reset() to clear state.\n *\n * Restores the DevTools hook to its prior state:\n * - hook was created by us → delete the hook entirely\n * - hook had a prior onCommitFiberRoot → restore it\n * - hook had no handler → delete the property\n *\n * Asks the adapter to remove its host callback only if it is still ours\n * (don't stomp a concurrent installer).\n */\n uninstall(): void {\n metricsAdapter?.detach();\n\n // Restore DevTools hook.\n const devtoolsGlobal = globalThis as GlobalWithDevtools;\n const hook = devtoolsGlobal.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (hook) {\n if (devtoolsHookCreatedByUs) {\n // We created it; remove the whole thing.\n delete devtoolsGlobal.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n } else {\n if (devtoolsHookPrev) {\n hook.onCommitFiberRoot = devtoolsHookPrev;\n } else {\n delete hook.onCommitFiberRoot;\n }\n if (devtoolsUnmountPrev) {\n hook.onCommitFiberUnmount = devtoolsUnmountPrev;\n } else {\n delete hook.onCommitFiberUnmount;\n }\n }\n }\n debugRender.uninstall();\n interactionCapture.uninstall();\n commitSurface.reset();\n pendingDevtoolsUnmounts = { components: 0, subtrees: 0 };\n pendingDevtoolsUnmountSamples = [];\n devtoolsHookPrev = undefined;\n devtoolsUnmountPrev = undefined;\n devtoolsHookCreatedByUs = false;\n integrationMode = 'none';\n },\n\n /**\n * Clear all accumulated profiling state. Useful for starting fresh measurements.\n * Does not uninstall the profiler - call uninstall() separately if needed.\n */\n reset(): void {\n resetState();\n debugRender.reset();\n },\n\n /**\n * Generate a report of top update sources and thrashing components.\n * @param topN - Number of top sources to include (default: 10)\n * @param sortBy - Sort thrashers by 'effect', 'callback', 'memo', or 'total' (default: 'effect')\n * @param options - Report filtering options (e.g., minCollateral to hide low-impact sources)\n * @returns Report containing sources, blast radius, and optional thrashing data\n */\n report(topN: number = 10, sortBy: SortBy = 'effect', reportOptions?: ReportOptions): Report {\n return buildReport(state, thrashMode, topN, sortBy, reportOptions, {\n effectThrashMode,\n captureFibers,\n historySize,\n detectionLevel,\n integrationMode,\n });\n },\n\n /**\n * Raw passive hook events captured for a component (debug surface).\n */\n _debugRawHookEvents(componentName: string) {\n const components = debugRender.allComponents();\n const events = componentName === '*' ? [] : debugRender.rawEvents(componentName);\n return {\n ok: true,\n componentName,\n status: debugRender.status(),\n components,\n events,\n };\n },\n\n _debugInjectHookEventsForTest(componentName: string, events: HookCallEvent[]) {\n if (typeof debugRender.recordEventForTest !== 'function') return;\n for (const event of events) {\n debugRender.recordEventForTest({ ...event, componentName });\n }\n },\n\n _debugSetSourceForTest(sourceId: string, source: unknown) {\n state.sources.set(sourceId, source as Omit<Source, 'sourceId'>);\n },\n\n debugHook(sourceId: string, hookIndex: number, windowSize: number = 3) {\n let source = state.sources.get(sourceId);\n let resolvedSourceId = sourceId;\n if (!source) {\n for (const [internalId, candidate] of state.sources.entries()) {\n const candidateHumanId = `${getComponentDisplayName(candidate.type)}#${String(internalId).match(/#(\\d+)@/)?.[1] || '1'}@${candidate.depth}`;\n if (candidateHumanId === sourceId) {\n source = candidate;\n resolvedSourceId = internalId;\n break;\n }\n }\n }\n if (!source) return { ok: false, error: 'sourceId not found', sourceId };\n const componentName = getComponentDisplayName(source.type);\n let events = debugRender.rawEvents(componentName);\n let resolvedComponentName = componentName;\n if (events.length === 0) {\n const candidates = debugRender.allComponents();\n const matching = candidates.find((name) => name === componentName || name.includes(componentName) || componentName.includes(name));\n if (matching) {\n resolvedComponentName = matching;\n events = debugRender.rawEvents(matching);\n }\n }\n\n const sourceHookIndices = Array.isArray(source.debugHookIndices)\n ? source.debugHookIndices\n : [];\n const targetIndex = Math.floor(hookIndex);\n const eventIndex = sourceHookIndices[targetIndex] ?? targetIndex;\n const target = events[eventIndex];\n const radius = Math.max(0, Math.floor(windowSize));\n if (!target) {\n return {\n ok: false,\n error: 'hook event not found',\n sourceId: resolvedSourceId,\n requestedSourceId: sourceId,\n componentName,\n resolvedComponentName,\n hookIndex: targetIndex,\n eventIndex,\n sourceHookIndices,\n eventCount: events.length,\n status: debugRender.status(),\n caveat: 'hook ancestry comes from passive stack capture during real renders; component-name stack parsing can be ambiguous in bundled/minified code',\n };\n }\n const neighborhood = events\n .map((event, index) => ({ event, index }))\n .filter(({ index }) => Math.abs(index - eventIndex) <= radius)\n .map(({ event, index }) => ({\n hookIndex: sourceHookIndices.indexOf(index) >= 0 ? sourceHookIndices.indexOf(index) : index,\n eventIndex: index,\n primitive: event.primitive,\n parents: parentFramesForEvent(event, componentName),\n }));\n return {\n ok: true,\n sourceId: resolvedSourceId,\n requestedSourceId: sourceId,\n componentName,\n resolvedComponentName,\n hookIndex: targetIndex,\n eventIndex,\n sourceHookIndices,\n primitive: target.primitive,\n parents: parentFramesForEvent(target, componentName),\n neighborhood,\n eventCount: events.length,\n status: debugRender.status(),\n caveat: 'hook ancestry comes from passive stack capture during real renders; source-local hook indices are mapped onto the captured component event stream',\n };\n },\n\n /**\n * Returns which commit-hook integration model is currently observed.\n * 'devtools' — DevTools hook is the active processor (no proven adapter callbacks).\n * 'adapter:<id>' — The adapter's host surface has fired; it owns the math now.\n * 'none' — Detector not installed.\n */\n getIntegrationMode(): IntegrationMode {\n return integrationMode;\n },\n\n /** Id of the commit metrics adapter resolved on install, or null. */\n getMetricsAdapterId(): string | null {\n return metricsAdapter?.id ?? null;\n },\n };\n}\n\n/**\n * Detection level constants - use these for clarity about the hierarchy.\n * Higher levels include all features from lower levels.\n */\nexport const DETECTION_LEVEL = {\n /** Level 1: Only commitStats (performedWork for restarts) - minimal overhead */\n LEVEL1_STATS: 'stats' as const,\n /** Level 2: Stats + source tracking (which components caused updates) */\n LEVEL2_SOURCES: 'sources' as const,\n /** Level 3a: Sources + aggregate amplifier counts only (meta.amplifiersMetrics) */\n LEVEL3_AMPLIFIER_METRICS: 'amplifierMetrics' as const,\n /** Level 3b: Sources + full amplifier arrays (report.amplifiers, report.amplifierSources) */\n LEVEL3_AMPLIFIERS: 'amplifiers' as const,\n} as const;\n","/**\n * Best-effort Context inputs for structural hook replay.\n *\n * Values returned here are disposable execution scaffolding. They are never\n * exposed by explain-component or describe-component; they only keep product\n * guards and property reads from aborting custom-hook discovery.\n */\n\nexport type ContextFiber = {\n type?: unknown;\n elementType?: unknown;\n tag?: number;\n memoizedProps?: unknown;\n pendingProps?: unknown;\n alternate?: ContextFiber | null;\n return?: ContextFiber | null;\n dependencies?: {\n firstContext?: { context: unknown; memoizedValue: unknown; next?: unknown } | null;\n };\n};\n\ntype ContextRead = { found: boolean; value: unknown };\n\n// Custom hooks often read a context-derived object and then call or iterate\n// it. Returning `undefined` would stop replay at the first such guard and lose\n// ancestry for all later hooks. This proxy is intentionally disposable: it\n// keeps structural discovery moving, but is never reported as product state.\nconst replayScaffoldingTarget = function chippyReplayScaffolding() {};\nconst replayScaffolding: unknown = new Proxy(replayScaffoldingTarget, {\n get(target, property) {\n const descriptor = Reflect.getOwnPropertyDescriptor(target, property);\n if (descriptor && !descriptor.configurable && 'value' in descriptor && !descriptor.writable) {\n return descriptor.value;\n }\n if (property === 'then') return undefined;\n if (property === Symbol.iterator) return function* emptyReplayIterator() {};\n if (property === Symbol.toPrimitive) return () => 'chippy-replay';\n return replayScaffolding;\n },\n apply() {\n return replayScaffolding;\n },\n construct() {\n return replayScaffolding as object;\n },\n});\n\nfunction readContextDependency(fiber: ContextFiber | null | undefined, contextArg: unknown): ContextRead {\n let item = fiber?.dependencies?.firstContext as\n | { context: unknown; memoizedValue: unknown; next?: unknown }\n | null\n | undefined;\n while (item) {\n if (item.context === contextArg) return { found: true, value: item.memoizedValue };\n item = item.next as typeof item;\n }\n return { found: false, value: undefined };\n}\n\nfunction isContextProvider(fiber: ContextFiber, contextArg: unknown): boolean {\n const type = fiber.type as { _context?: unknown } | null | undefined;\n const elementType = fiber.elementType as { _context?: unknown } | null | undefined;\n return (\n fiber.tag === 10 &&\n (fiber.type === contextArg || fiber.elementType === contextArg || type?._context === contextArg || elementType?._context === contextArg)\n );\n}\n\nfunction readProviderValue(start: ContextFiber | null | undefined, contextArg: unknown): ContextRead {\n const seen = new Set<ContextFiber>();\n // Prefer the fiber's dependency snapshot, then walk providers. Reading the\n // global context current value first would describe the page's latest\n // provider rather than the value this committed fiber actually consumed.\n let fiber = start?.return || null;\n while (fiber && !seen.has(fiber)) {\n seen.add(fiber);\n if (isContextProvider(fiber, contextArg)) {\n const memoizedProps = fiber.memoizedProps as { value?: unknown } | null | undefined;\n const pendingProps = fiber.pendingProps as { value?: unknown } | null | undefined;\n if (memoizedProps && Object.prototype.hasOwnProperty.call(memoizedProps, 'value') && memoizedProps.value != null) {\n return { found: true, value: memoizedProps.value };\n }\n if (pendingProps && Object.prototype.hasOwnProperty.call(pendingProps, 'value')) {\n return { found: true, value: pendingProps.value };\n }\n if (memoizedProps && Object.prototype.hasOwnProperty.call(memoizedProps, 'value')) {\n return { found: true, value: memoizedProps.value };\n }\n }\n fiber = fiber.return || null;\n }\n return { found: false, value: undefined };\n}\n\nexport function readContextValueFromFiber(fiber: ContextFiber, contextArg: unknown): unknown {\n const candidates = [fiber, fiber?.alternate || null];\n for (const candidate of candidates) {\n const dependency = readContextDependency(candidate, contextArg);\n if (dependency.found && dependency.value != null) return dependency.value;\n }\n for (const candidate of candidates) {\n const provider = readProviderValue(candidate, contextArg);\n if (provider.found && provider.value != null) return provider.value;\n }\n if (contextArg && typeof contextArg === 'object') {\n const context = contextArg as { _currentValue?: unknown; _currentValue2?: unknown };\n if (Object.prototype.hasOwnProperty.call(context, '_currentValue') && context._currentValue != null) {\n return context._currentValue;\n }\n if (Object.prototype.hasOwnProperty.call(context, '_currentValue2') && context._currentValue2 != null) {\n return context._currentValue2;\n }\n }\n return replayScaffolding;\n}\n","/**\n * Replay engine — re-executes a committed React fiber's render function\n * against its already-committed hook state, WITHOUT triggering any React\n * scheduler activity.\n *\n * This is the inspector half of the debug-render module. The recording half\n * (dispatcher interception during live renders) lives in core.ts.\n *\n * Strategy\n * --------\n * 1. Walk the fiber's memoizedState linked list to collect committed hook\n * nodes in order (the \"fiber-only\" path — always available).\n * 2. Attempt to re-execute the component's render function with a stub\n * dispatcher that returns each committed hook value in order. This\n * surfaces custom-hook ancestry through call-stack frames.\n * 3. If replay is not possible (class component, dispatcher busy, React in\n * flight) fall back to fiber-only records.\n *\n * No React import. No bridge globals. Pure functions + a single runtime\n * seam (getDispatcherRef) that is injected via globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__.\n */\n\nimport { isHookFrameName, parseStackFrames, type StackFrame } from './core';\nimport { readContextValueFromFiber, type ContextFiber } from './context-replay';\n// Renderer discovery is shared with the fiber-schedule-update capability — one\n// place knows how to enumerate __REACT_DEVTOOLS_GLOBAL_HOOK__.renderers.\nimport { getDispatcherRef } from '../chippy-bridge/react-renderer';\nexport { getDispatcherRef, readContextValueFromFiber };\n\n// ---------------------------------------------------------------------------\n// Fiber shape — minimal surface, not the full internal type\n// ---------------------------------------------------------------------------\n\n/** A React fiber node (minimal shape we need). */\nexport type Fiber = ContextFiber & {\n memoizedState?: HookNode | null;\n ref?: unknown;\n _debugSource?: { fileName?: string; lineNumber?: number } | null;\n};\n\n/** One node in the memoizedState linked list. */\nexport type HookNode = {\n memoizedState: unknown;\n queue: unknown;\n next?: HookNode | null;\n};\n\n// ---------------------------------------------------------------------------\n// Output types\n// ---------------------------------------------------------------------------\n\nexport type HookRecord = {\n id: number | string;\n index: number | null;\n primitive: string;\n value: unknown;\n path: StackFrame[];\n source: null;\n fiberOnly: boolean;\n debugLabel?: unknown;\n};\n\nexport type ClassifiedHook = {\n index: number;\n tag: string;\n value?: unknown;\n current?: unknown;\n deps?: string;\n hasCleanup?: boolean;\n hasQueue?: boolean;\n note?: string;\n};\n\nexport type FiberHooksResult = {\n name: string;\n hookCount: number;\n truncated: boolean;\n maxHooks: number;\n hooks: ClassifiedHook[];\n error?: string;\n};\n\nexport type ReplayResult = {\n componentName: string;\n records: HookRecord[];\n replayAttempted: boolean;\n replayError: string;\n replayErrorDetails: ErrorPayload | null;\n replayStatus: 'complete' | 'partial-replay' | 'fiber-only-fallback';\n __debugCursor?: number;\n __debugTail?: HookRecord[];\n};\n\nexport type ErrorPayload = {\n name: string;\n message: string;\n stack: string;\n};\n\n// ---------------------------------------------------------------------------\n// Primitive helpers\n// ---------------------------------------------------------------------------\n\nexport function noop(): void {}\n\n/**\n * Serialize a value shallowly for safe JSON transport.\n * depth=0 → one level of object/array; functions/symbols become strings.\n */\nexport function safeSerialize(value: unknown, depth: number = 0, seen: Set<unknown> = new Set()): unknown {\n if (value === null || value === undefined) return value;\n if (typeof value === 'string') return value.length > 120 ? value.slice(0, 120) + '…' : value;\n if (typeof value === 'number' || typeof value === 'boolean') return value;\n if (typeof value === 'function') return '[function' + (value.name ? ':' + value.name : '') + ']';\n if (typeof value === 'symbol') return '[symbol:' + value.toString() + ']';\n if (Array.isArray(value)) return '[array:' + value.length + ']';\n if (typeof value === 'object') {\n if (seen.has(value)) return '[circular]';\n if (depth >= 1) return '[object]';\n seen.add(value);\n const result: Record<string, unknown> = {};\n const keys = Object.keys(value as object).slice(0, 8);\n for (const k of keys) {\n try { result[k] = safeSerialize((value as Record<string, unknown>)[k], depth + 1, seen); } catch { result[k] = '[error]'; }\n }\n const total = Object.keys(value as object).length;\n if (total > 8) result['…'] = '[' + (total - 8) + ' more]';\n return result;\n }\n return String(value);\n}\n\nexport function replayErrorPayload(e: unknown): ErrorPayload | null {\n if (!e) return null;\n const err = e as Partial<Error>;\n return {\n name: err.name || 'Error',\n message: err.message || String(e),\n stack: err.stack || '',\n };\n}\n\nexport function logReplayError(label: string, componentName: string, err: unknown): void {\n const payload = replayErrorPayload(err);\n if (!payload) return;\n try {\n console.error('[Chippy replay-error] ' + label + ' ' + componentName, payload.stack || (payload.name + ': ' + payload.message), payload);\n } catch (_) {}\n}\n\n// ---------------------------------------------------------------------------\n// Hook classification — reads committed fiber node shape\n// ---------------------------------------------------------------------------\n\n/**\n * classifyHook\n * ------------\n * Single purpose: tell `consumeSlot` which structural FAMILY a fiber hook\n * slot belongs to, so cursor drift can be detected when the dispatcher's\n * called primitive does not match the stored slot.\n *\n * 5 families (and nothing else):\n * - \"State\" — slot has queue.dispatch (useState, useReducer, useTransition's\n * internal isPending queue)\n * - \"Ref\" — memoizedState is a plain own-property `{ current: x }` and\n * queue is null (useRef)\n * - \"Memo\" — memoizedState is a 2-tuple `[value, deps|null]` and queue is\n * null (useMemo, useCallback)\n * - \"Effect\" — memoizedState is a real React Effect node:\n * numeric `tag`, function `create`, `next` is self-referential\n * (circular ring) (useEffect family + useImperativeHandle)\n * - \"Value\" — slot is consumed but the dispatcher does not push onto a\n * dispatch queue: useId (string), useDeferredValue (raw value),\n * useSyncExternalStore (raw value with non-dispatch queue)\n *\n * `useContext` is intentionally not a family — it does not consume a slot in\n * memoizedState. So no real fiber slot can ever be a context.\n *\n * Heuristic ordering matters: queue.dispatch is the strongest signal and\n * dominates the value's structural shape. After that we use STRUCTURAL\n * own-property checks (no inheritance fallthrough), and we require Effect\n * nodes to look like real React Effect nodes (tag + create + circular next).\n */\nexport function classifyHook(hookNode: HookNode, index: number): ClassifiedHook {\n const ms = hookNode.memoizedState;\n const queue = hookNode.queue as { dispatch?: unknown } | null | undefined;\n const base = { index };\n\n // 1. State family — strongest signal, dominates value shape.\n if (queue && typeof queue.dispatch === 'function') {\n return { ...base, tag: 'State', value: safeSerialize(ms, 0, new Set()) };\n }\n\n // 2. Effect family — must look like a real React Effect node:\n // numeric tag + function create + circular self-referential next.\n if (isEffectNode(ms)) {\n const m = ms as { create?: unknown; destroy?: unknown; deps?: unknown };\n return {\n ...base,\n tag: 'Effect',\n deps: Array.isArray(m.deps) ? '[array:' + (m.deps as unknown[]).length + ']'\n : m.deps === null ? 'null'\n : String(m.deps),\n hasCleanup: typeof m.destroy === 'function',\n };\n }\n\n // 3. Ref family — plain object with OWN-property `current`, queue null.\n if (\n !queue &&\n ms !== null &&\n typeof ms === 'object' &&\n Object.prototype.hasOwnProperty.call(ms, 'current')\n ) {\n return { ...base, tag: 'Ref', current: safeSerialize((ms as { current: unknown }).current, 0, new Set()) };\n }\n\n // 4. Memo family — 2-tuple [value, deps|null], queue null.\n // Both useMemo and useCallback land here. deps may be an array OR null\n // (run-every-render). Anything else in slot[1] disqualifies.\n if (\n !queue &&\n Array.isArray(ms) &&\n (ms as unknown[]).length === 2 &&\n (Array.isArray((ms as unknown[])[1]) || (ms as unknown[])[1] === null)\n ) {\n const arr = ms as [unknown, unknown[] | null];\n const depsTag = arr[1] === null ? 'null' : '[array:' + arr[1].length + ']';\n return {\n ...base,\n tag: 'Memo',\n value: typeof arr[0] === 'function'\n ? '[function' + ((arr[0] as Function).name ? ':' + (arr[0] as Function).name : '') + ']'\n : safeSerialize(arr[0], 0, new Set()),\n deps: depsTag,\n };\n }\n\n // 5. Value family — slot consumed but no dispatch:\n // useId (string), useDeferredValue (raw value), useSyncExternalStore.\n // Identified by the absence of dispatch + the absence of any other\n // family's structural marker. Both queue=null with a primitive AND\n // queue=non-dispatch land here.\n if (queue || ms === null || typeof ms !== 'object' || isUnclaimedObject(ms)) {\n return { ...base, tag: 'Value', value: safeSerialize(ms, 0, new Set()) };\n }\n\n // 6. Anything we cannot classify.\n return {\n ...base,\n tag: 'Unknown',\n hasQueue: !!queue,\n value: safeSerialize(ms, 0, new Set()),\n };\n}\n\n/**\n * Real React Effect node check.\n * Real shape (from ReactFiberHooks.pushEffect):\n * { tag: number, create: function, destroy: function|undefined,\n * deps: array|null, next: <self-or-other-effect> }\n * The circular `next` is the load-bearing structural marker — no user data\n * shape produces a self-referential next pointer by accident.\n */\nfunction isEffectNode(ms: unknown): boolean {\n if (!ms || typeof ms !== 'object') return false;\n const m = ms as { tag?: unknown; create?: unknown; next?: unknown };\n if (typeof m.tag !== 'number') return false;\n if (typeof m.create !== 'function') return false;\n if (m.next === undefined || m.next === null) return false;\n // The effect ring's `next` must point at an Effect-shaped node (or itself).\n const next = m.next as { tag?: unknown; create?: unknown };\n return typeof next.tag === 'number' && typeof next.create === 'function';\n}\n\n/**\n * An object that doesn't fit any known family — used to route oddball\n * useSyncExternalStore-style snapshots into \"Value\" instead of \"Unknown\".\n */\nfunction isUnclaimedObject(_ms: unknown): boolean {\n return false; // placeholder; primitives + queue cases already covered above.\n}\n\n/**\n * Map a dispatcher-called primitive to its expected slot FAMILY.\n *\n * Drift detection rule: when the dispatcher records primitive P and the slot\n * at the same cursor classifies as family F, drift = (primitiveFamily(P) !== F).\n *\n * Returning `null` means \"no slot is consumed\" — the call is free to skip\n * the cursor entirely (currently only useContext, but routed via fiber.deps\n * so it never actually reaches consumeSlot).\n */\nexport function primitiveFamily(primitive: string): string | null {\n switch (primitive) {\n case 'State':\n case 'Reducer':\n case 'Transition':\n return 'State';\n case 'Ref':\n return 'Ref';\n case 'Memo':\n case 'Callback':\n return 'Memo';\n case 'Effect':\n case 'LayoutEffect':\n case 'InsertionEffect':\n case 'ImperativeHandle':\n return 'Effect';\n case 'Id':\n case 'Deferred':\n case 'SyncExternalStore':\n return 'Value';\n default:\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Fiber hook list walking\n// ---------------------------------------------------------------------------\n\nconst MAX_HOOKS = 500;\n\nexport function evalFiberHooks(fiber: Fiber | null | undefined): FiberHooksResult {\n if (!fiber) return { name: 'Unknown', hookCount: 0, truncated: false, maxHooks: MAX_HOOKS, hooks: [], error: 'No fiber available' };\n\n const type = fiber.type as { displayName?: string; name?: string } | undefined;\n const name = type?.displayName || type?.name || 'Unknown';\n const hooks: ClassifiedHook[] = [];\n const seen = new Set<HookNode>();\n let hookNode = fiber.memoizedState as HookNode | null | undefined;\n let index = 0;\n let truncated = false;\n\n while (hookNode) {\n if (seen.has(hookNode)) {\n hooks.push({ index, tag: 'Unknown', note: 'cycle detected in hook list' });\n break;\n }\n if (index >= MAX_HOOKS) { truncated = true; break; }\n seen.add(hookNode);\n hooks.push(classifyHook(hookNode, index));\n hookNode = hookNode.next as HookNode | null | undefined;\n index++;\n }\n\n return { name, hookCount: hooks.length, truncated, maxHooks: MAX_HOOKS, hooks };\n}\n\nexport function readHookValueFromNode(hookNode: HookNode | null | undefined): unknown {\n if (!hookNode) return undefined;\n return hookNode.memoizedState;\n}\n\nexport function fiberOnlyHookRecords(fiber: Fiber): HookRecord[] {\n const raw = evalFiberHooks(fiber);\n return (raw.hooks || []).map((hook) => ({\n id: hook.index,\n index: hook.index,\n primitive: hook.tag,\n value: hook.value,\n path: [],\n source: null,\n fiberOnly: true,\n debugLabel: undefined,\n }));\n}\n\n// ---------------------------------------------------------------------------\n// Stack / custom-hook path helpers\n// ---------------------------------------------------------------------------\n\nexport const PRIMITIVE_HOOK_NAMES = new Set([\n 'useCallback', 'useContext', 'useDebugValue', 'useDeferredValue', 'useEffect',\n 'useImperativeHandle', 'useInsertionEffect', 'useLayoutEffect', 'useMemo',\n 'useReducer', 'useRef', 'useState', 'useSyncExternalStore', 'useTransition',\n 'useId',\n]);\n\n/**\n * Given parsed stack frames and the component's name, return the custom-hook\n * ancestry path (outermost → innermost, relative to the component call site).\n */\nexport function customHookPathFromFrames(frames: StackFrame[], componentName: string): StackFrame[] {\n const compIdx = frames.findIndex((f) => f.name === componentName);\n const relevant = compIdx >= 0 ? frames.slice(0, compIdx) : frames;\n const parentLookup = compIdx >= 0 ? frames.slice(0, compIdx + 1) : frames;\n const out: StackFrame[] = [];\n for (let i = relevant.length - 1; i >= 0; i--) {\n const { name, loc } = relevant[i];\n if (isHookFrameName(name) && !PRIMITIVE_HOOK_NAMES.has(name.slice(name.lastIndexOf('.') + 1))) {\n // V8 frame loc for a custom hook frame points at the line *inside that\n // hook* where it called the next inner hook/primitive. That changes for\n // every primitive and fragments one semantic invocation into many folders.\n // The stable invocation location for this hook is the outer/parent frame:\n // where the parent called this custom hook. Keep the component frame in\n // parentLookup so the outermost custom hook can use the component callsite.\n const parent = i + 1 < parentLookup.length ? parentLookup[i + 1] : null;\n out.push({ name, loc: parent ? parent.loc : loc });\n }\n }\n return out;\n}\n\nexport function customHookPathFromStack(stack: string, componentName: string): StackFrame[] {\n return customHookPathFromFrames(parseStackFrames(stack), componentName);\n}\n\n// ---------------------------------------------------------------------------\n// Dispatcher ref discovery + idle check\n// ---------------------------------------------------------------------------\n\ntype DispatcherRef = { current: unknown };\n\nexport function isDispatcherIdle(ref: DispatcherRef): boolean {\n const current = ref && ref.current;\n if (!current || typeof current !== 'object') return false;\n const name = (current as { constructor?: { name?: string } }).constructor?.name ?? '';\n return !/HooksDispatcher/i.test(name);\n}\n\n// ---------------------------------------------------------------------------\n// replayComponentHooks — the main entry point\n// ---------------------------------------------------------------------------\n\n/**\n * Re-execute a committed React fiber's render function using a stub dispatcher\n * that returns each committed hook's memoizedState value in order.\n *\n * Returns a `ReplayResult` with per-hook records annotated with custom-hook\n * ancestry paths derived from call-stack frames captured during the replay.\n *\n * Falls back to fiber-only records when replay is not safe (React in flight,\n * dispatcher ref unavailable, component is a class, etc.).\n */\nexport function replayComponentHooks(fiber: Fiber): ReplayResult {\n const type = fiber?.type as { displayName?: string; name?: string } | undefined;\n const componentName = type?.displayName || type?.name || 'Unknown';\n const fallbackRecords = fiberOnlyHookRecords(fiber);\n\n const dispatcherRef = getDispatcherRef();\n if (!dispatcherRef) {\n return {\n componentName,\n records: fallbackRecords,\n replayAttempted: false,\n replayError: 'ReactCurrentDispatcher not found',\n replayErrorDetails: null,\n replayStatus: 'fiber-only-fallback',\n };\n }\n\n if (!isDispatcherIdle(dispatcherRef)) {\n return {\n componentName,\n records: fallbackRecords,\n replayAttempted: false,\n replayError: 'React render in progress; refusing dispatcher swap',\n replayErrorDetails: null,\n replayStatus: 'fiber-only-fallback',\n };\n }\n\n // Collect committed hook nodes in order.\n const hookNodes: HookNode[] = [];\n let hookNode = fiber.memoizedState as HookNode | null | undefined;\n const seen = new Set<HookNode>();\n while (hookNode && !seen.has(hookNode)) {\n seen.add(hookNode);\n hookNodes.push(hookNode);\n hookNode = hookNode.next as HookNode | null | undefined;\n }\n\n const originalDispatcher = dispatcherRef.current;\n const originalConsoleError = console.error;\n const records: HookRecord[] = [];\n let cursor = 0;\n let replayError = '';\n let replayErrorDetails: ErrorPayload | null = null;\n let replayAttempted = false;\n let replayDriftError: string | null = null;\n\n // ─── Dispatcher contract ──────────────────────────────────────────────────\n // Each hook below returns what is STORED in the committed fiber's hook node\n // at the current cursor position. That is all it does.\n //\n // It does NOT:\n // - execute the factory/create/selector/reducer function\n // - recompute derived values\n // - compare deps or decide if a value is stale\n // - adjust, infer, or reason about what the value \"should\" be\n //\n // The cursor walks the committed hook list in declaration order.\n // consumeSlot() advances the cursor and reads memoizedState verbatim.\n // The only transformation is structural unwrapping (e.g. [value, deps] → value\n // for Memo) so that callers receive the same shape they would from React.\n // ─────────────────────────────────────────────────────────────────────────\n\n function captureFrames(): StackFrame[] {\n return parseStackFrames(new Error().stack || '');\n }\n\n function currentPath(frames: StackFrame[]): StackFrame[] {\n return customHookPathFromFrames(frames, componentName);\n }\n\n function currentDebugOwner(frames: StackFrame[]): string {\n const path = currentPath(frames);\n return path.length ? path[path.length - 1].name : componentName;\n }\n\n function consumeSlot(primitive: string, frames: StackFrame[]): { node: HookNode; value: unknown; index: number; path: StackFrame[] } {\n const node = hookNodes[cursor];\n if (!node) throw new Error('Hook cursor exhausted at slot ' + cursor + ' for ' + primitive);\n const index = cursor;\n cursor += 1;\n const path = currentPath(frames);\n const value = readHookValueFromNode(node);\n\n // Verify tag matches expected primitive to detect cursor drift.\n // The classifier returns one of 5 families; map each called primitive\n // to its expected family.\n const actualClassified = classifyHook(node, index);\n const actualTag = actualClassified.tag;\n const expectedFamily = primitiveFamily(primitive);\n const tagMatches = expectedFamily === null || actualTag === expectedFamily;\n\n if (!tagMatches) {\n const msg =\n 'Hook cursor drift at slot ' + index + ': expected ' + primitive +\n ' but fiber node is ' + actualTag +\n '. A hook consumed by the live component is not handled by the replay dispatcher.';\n replayDriftError = msg;\n // Throw so the outer try/catch in replayComponentHooks stops the render\n // immediately. Continuing with a fabricated fallback value lets the render\n // function invoke the bad value (e.g. undefined()) which is noisier.\n throw new Error(msg);\n }\n\n records.push({\n id: index,\n index,\n primitive,\n value: safeSerialize(value, 0, new Set()),\n path,\n source: null,\n fiberOnly: false,\n debugLabel: undefined,\n });\n return { node, value, index, path };\n }\n\n function setDebugLabel(frames: StackFrame[], label: unknown): void {\n const owner = currentDebugOwner(frames);\n for (let i = records.length - 1; i >= 0; i--) {\n const rec = records[i];\n const tail = rec.path && rec.path.length ? rec.path[rec.path.length - 1].name : componentName;\n if (tail === owner) {\n rec.debugLabel = safeSerialize(label, 1, new Set());\n return;\n }\n }\n records.push({\n id: 'debug:' + records.length,\n index: null,\n primitive: 'DebugValue',\n value: undefined,\n path: currentPath(frames),\n source: null,\n fiberOnly: false,\n debugLabel: safeSerialize(label, 1, new Set()),\n });\n }\n\n const stubDispatcher: Record<string, unknown> = {\n useState(initialValue: unknown) {\n const frames = captureFrames();\n const slot = consumeSlot('State', frames);\n return [slot.value, noop];\n },\n useReducer(_reducer: unknown, _initialArg: unknown, _init?: unknown) {\n const frames = captureFrames();\n const slot = consumeSlot('Reducer', frames);\n return [slot.value, noop];\n },\n useRef(_initialValue: unknown) {\n const frames = captureFrames();\n const slot = consumeSlot('Ref', frames);\n return slot.value; // memoizedState is { current: x }\n },\n useMemo(_create: unknown, _deps: unknown) {\n const frames = captureFrames();\n const slot = consumeSlot('Memo', frames);\n return (slot.value as [unknown, unknown])[0]; // memoizedState is [value, deps]\n },\n useCallback(_callback: unknown, _deps: unknown) {\n const frames = captureFrames();\n const slot = consumeSlot('Callback', frames);\n return (slot.value as [unknown, unknown])[0]; // memoizedState is [callback, deps]\n },\n useDeferredValue(_value: unknown) {\n const frames = captureFrames();\n const slot = consumeSlot('Deferred', frames);\n return slot.value;\n },\n useTransition() {\n const frames = captureFrames();\n consumeSlot('Transition', frames);\n return [false, noop];\n },\n useSyncExternalStore(_subscribe: unknown, _getSnapshot: unknown, _getServerSnapshot?: unknown) {\n const frames = captureFrames();\n const slot = consumeSlot('SyncExternalStore', frames);\n // React DOM 18 stores useSyncExternalStore as two committed hook nodes:\n // 1. snapshot/value node: mount/updateSyncExternalStore calls\n // mount/updateWorkInProgressHook and stores hook.memoizedState = snapshot\n // 2. subscription Effect node: the same implementation immediately calls\n // mountEffect/updateEffect(subscribeToStore..., [subscribe])\n // See node_modules/react-dom/umd/react-dom.development.js:\n // mountSyncExternalStore lines 15966-16041\n // updateSyncExternalStore lines 16044-16097\n // The following pushEffect(updateStoreInstance...) is not a hook node.\n // Replay must therefore consume the subscription Effect to keep the cursor\n // aligned, while returning only the public snapshot value.\n consumeSlot('Effect', frames);\n return slot.value;\n },\n useContext(contextArg: unknown) {\n return readContextValueFromFiber(fiber, contextArg);\n },\n useDebugValue(value: unknown, formatter?: unknown) {\n const frames = captureFrames();\n let label = value;\n try { label = typeof formatter === 'function' ? (formatter as (v: unknown) => unknown)(value) : value; } catch (_) { label = value; }\n setDebugLabel(frames, label);\n },\n useEffect(_create: unknown, _deps?: unknown) {\n const frames = captureFrames();\n consumeSlot('Effect', frames);\n },\n useLayoutEffect(_create: unknown, _deps?: unknown) {\n const frames = captureFrames();\n consumeSlot('LayoutEffect', frames);\n },\n useInsertionEffect(_create: unknown, _deps?: unknown) {\n const frames = captureFrames();\n consumeSlot('InsertionEffect', frames);\n },\n useImperativeHandle(_ref: unknown, _create: unknown, _deps?: unknown) {\n const frames = captureFrames();\n consumeSlot('ImperativeHandle', frames);\n },\n useId() {\n const frames = captureFrames();\n const slot = consumeSlot('Id', frames);\n return slot.value; // memoizedState is the committed id string\n },\n };\n\n try {\n replayAttempted = true;\n dispatcherRef.current = stubDispatcher;\n console.error = function (...args: unknown[]) {\n try { return originalConsoleError.apply(console, args as Parameters<typeof console.error>); } catch (_) {}\n };\n const renderFn = fiber && fiber.type;\n if (typeof renderFn !== 'function') throw new Error('Fiber type is not executable');\n (renderFn as (props: unknown, ref: unknown) => unknown)(fiber.memoizedProps, fiber.ref);\n } catch (e) {\n replayError = (e as Error)?.message || String(e);\n replayErrorDetails = replayErrorPayload(e);\n logReplayError('structure-render', componentName, e);\n } finally {\n try { dispatcherRef.current = originalDispatcher; } catch (_) {}\n console.error = originalConsoleError;\n }\n\n // Surface drift error even when replay did not throw (graceful fallback path).\n if (!replayError && replayDriftError) {\n replayError = replayDriftError;\n }\n\n return {\n componentName,\n records: records.length ? records : fallbackRecords,\n replayAttempted,\n replayError,\n replayErrorDetails,\n replayStatus: replayError ? 'partial-replay' : 'complete',\n __debugCursor: cursor,\n __debugTail: records.slice(Math.max(0, records.length - 5)),\n };\n}\n","/**\n * Fiber-native declarative boundaries.\n *\n * Error boundaries and Suspense are React primitives — they exist on every\n * React page. This module detects them generically from the fiber tree,\n * independent of any product. App-specific enrichment (ownership markers,\n * error-boundary props) is layered on top by context providers registered\n * with ./marker-context.\n *\n * \"Distance\" is the signal: how many fiber hops above the probed fiber the\n * boundary sits. Together, the nearest error + suspense boundaries define the\n * collateral scope around a probe.\n */\nimport { type Fiber, getDisplayName } from './fiber-walk';\n\nexport type ErrorBoundaryInfo = {\n componentName: string;\n /** How the boundary was identified — lifecycle proof vs. name heuristic. */\n detectedBy: 'lifecycle' | 'name';\n};\n\nexport type SuspenseBoundaryInfo = {\n componentName: string;\n};\n\n/** A boundary plus its fiber-hop distance from the probed fiber. */\nexport type BoundaryRef<T> = T & { distance: number };\n\nexport type FiberBoundaries = {\n error: BoundaryRef<ErrorBoundaryInfo> | null;\n suspense: BoundaryRef<SuspenseBoundaryInfo> | null;\n};\n\n// Ancestry walks in Jira can be deep: the nearest Suspense boundary may sit\n// ~170+ return-hops above a leaf. Callers early-exit once all wanted boundaries\n// are found, so this ceiling only bounds pathological / cyclic trees.\nexport const MAX_BOUNDARY_FIBERS = 400;\n\n// React SuspenseComponent fiber tag.\nconst SUSPENSE_TAG = 13;\n// React ClassComponent fiber tag (error boundaries are class components).\nconst CLASS_COMPONENT_TAG = 1;\n\nfunction fiberTag(fiber: Fiber): number | undefined {\n return (fiber as { tag?: number }).tag;\n}\n\n/**\n * Generic error-boundary detection. An error boundary is a class component that\n * implements getDerivedStateFromError and/or componentDidCatch. That lifecycle\n * check is the React-native definition and works on any React app. As a\n * fallback for minified/edge builds where the constructor is not introspectable,\n * a display name ending in \"ErrorBoundary\" is accepted.\n */\nexport function describeErrorBoundary(fiber: Fiber): ErrorBoundaryInfo | null {\n const componentName = getDisplayName(fiber.type) || getDisplayName(fiber.elementType);\n const type = fiber.type as\n | { getDerivedStateFromError?: unknown; prototype?: { componentDidCatch?: unknown } }\n | null\n | undefined;\n\n const hasLifecycle =\n !!type &&\n (typeof type.getDerivedStateFromError === 'function' ||\n typeof type.prototype?.componentDidCatch === 'function');\n\n if (hasLifecycle && (fiberTag(fiber) === CLASS_COMPONENT_TAG || fiberTag(fiber) === undefined)) {\n return { componentName: componentName || 'ErrorBoundary', detectedBy: 'lifecycle' };\n }\n\n // Name heuristic fallback (covers builds where the type is not introspectable).\n if (componentName && /ErrorBoundary$/.test(componentName)) {\n return { componentName, detectedBy: 'name' };\n }\n\n return null;\n}\n\n/**\n * Generic Suspense detection. React marks a Suspense fiber with tag 13; we also\n * accept a display name resolving to Suspense/SuspenseList for builds where the\n * tag is unavailable.\n */\nexport function describeSuspenseBoundary(fiber: Fiber): SuspenseBoundaryInfo | null {\n const displayName = getDisplayName(fiber.type) || getDisplayName(fiber.elementType);\n const isSuspense =\n fiberTag(fiber) === SUSPENSE_TAG ||\n displayName === 'Suspense' ||\n displayName === 'SuspenseComponent' ||\n displayName === 'SuspenseList';\n if (!isSuspense) return null;\n return { componentName: displayName || 'Suspense' };\n}\n\n/**\n * Walk an ordered ancestry list and return the nearest error + suspense\n * boundaries with their distances. The list is expected to be ordered from the\n * probed fiber outward, so the index is the fiber-hop distance.\n */\nexport function collectFiberBoundaries(fibers: Fiber[]): FiberBoundaries {\n const boundaries: FiberBoundaries = { error: null, suspense: null };\n for (let distance = 0; distance < fibers.length; distance += 1) {\n const entry = fibers[distance];\n if (!boundaries.error) {\n const error = describeErrorBoundary(entry);\n if (error) boundaries.error = { ...error, distance };\n }\n if (!boundaries.suspense) {\n const suspense = describeSuspenseBoundary(entry);\n if (suspense) boundaries.suspense = { ...suspense, distance };\n }\n if (boundaries.error && boundaries.suspense) break;\n }\n return boundaries;\n}\n","/**\n * Product-neutral marker context: the declarative boundaries around a probed\n * fiber, plus whatever registered context providers add on top.\n *\n * The core detects Error and Suspense boundaries from fiber-native signals\n * (./fiber-boundaries). A context provider is a plugin that recognizes\n * app-specific conventions (for example an ownership marker component) and\n * contributes named boundary kinds, error-boundary enrichment, and display\n * hints. Providers never become a prerequisite for inspection: with none\n * registered, a context still reports Error and Suspense boundaries.\n */\n\nimport type { Fiber } from './fiber-walk';\nimport {\n type BoundaryRef,\n type ErrorBoundaryInfo,\n type SuspenseBoundaryInfo,\n collectFiberBoundaries,\n describeErrorBoundary,\n describeSuspenseBoundary,\n} from './fiber-boundaries';\n\n// Some apps nest very deep: the nearest declarative Suspense boundary can sit\n// ~170+ return-hops above a leaf. The cap bounds malformed/cyclic trees, not\n// ordinary depth; a small \"reasonable\" limit would silently turn a real\n// boundary absence into a false negative.\nconst MAX_CONTEXT_FIBERS = 400;\n\n/** A boundary kind a provider adds next to the core `error` and `suspense`. */\nexport type ContextBoundaryKind = {\n kind: string;\n /** Short lozenge label shown in the probe UI, e.g. `owner`. */\n label: string;\n /** CSS color for the lozenge; UIs fall back to a neutral color. */\n accent?: string;\n};\n\nexport type ContextField = { label: string; value: string };\n\n/** What one provider found for one probed fiber. Every part is optional. */\nexport type ContextContribution = {\n /** Boundaries of this provider's declared kinds; `null` records \"looked, not found\". */\n boundaries?: Record<string, BoundaryRef<Record<string, unknown>> | null>;\n /** Fields merged onto the generic error boundary when one was found. */\n errorEnrichment?: Record<string, unknown> | null;\n /** Display title per boundary kind (core or provider kind). */\n titles?: Record<string, string>;\n /** Display fields per boundary kind (core or provider kind). */\n fields?: Record<string, ContextField[]>;\n /** Show the error row even when no error boundary fiber was found. */\n showError?: boolean;\n /** Extra top-level fields on the context, kept for provider-specific consumers. */\n extra?: Record<string, unknown>;\n};\n\nexport type ContextProvider = {\n id: string;\n kinds?: ContextBoundaryKind[];\n /** Inspect the probed fiber's ancestry (nearest first). */\n describe(fibers: Fiber[]): ContextContribution | null;\n /** Return the provider kind this fiber is a boundary of, or null. Used for DOM highlighting. */\n matchBoundary?(fiber: Fiber): string | null;\n};\n\nexport type ContextDisplay = {\n /** Provider kinds that have a boundary on this context, in registration order. */\n kinds: ContextBoundaryKind[];\n titles: Record<string, string>;\n fields: Record<string, ContextField[]>;\n showError: boolean;\n};\n\nexport type MarkerContext = {\n boundaries: {\n error: BoundaryRef<ErrorBoundaryInfo & Record<string, unknown>> | null;\n suspense: BoundaryRef<SuspenseBoundaryInfo> | null;\n [kind: string]: BoundaryRef<Record<string, unknown>> | null;\n };\n display: ContextDisplay;\n /** Ids of the providers that contributed to this context. */\n providers: string[];\n [extra: string]: unknown;\n};\n\nconst CORE_KINDS = new Set(['error', 'suspense']);\nconst providers: ContextProvider[] = [];\n\n/**\n * Register a context provider. Registering an id again replaces the earlier\n * provider, so a re-injected bundle cannot double-count. Returns an unregister\n * function.\n */\nexport function registerContextProvider(provider: ContextProvider): () => void {\n if (!provider || typeof provider.id !== 'string' || typeof provider.describe !== 'function') {\n throw new TypeError('registerContextProvider expects { id: string, describe(fibers) }');\n }\n for (const kind of provider.kinds || []) {\n if (CORE_KINDS.has(kind.kind)) throw new TypeError(`context provider ${provider.id} cannot redefine core kind ${kind.kind}`);\n }\n const existing = providers.findIndex((entry) => entry.id === provider.id);\n if (existing >= 0) providers.splice(existing, 1, provider);\n else providers.push(provider);\n return () => {\n const index = providers.indexOf(provider);\n if (index >= 0) providers.splice(index, 1);\n };\n}\n\nexport function getContextProviders(): Array<{ id: string; kinds: ContextBoundaryKind[] }> {\n return providers.map((provider) => ({ id: provider.id, kinds: [...(provider.kinds || [])] }));\n}\n\nfunction collectChain(start: Fiber | null | undefined, next: (fiber: Fiber) => Fiber | null | undefined, into: Fiber[], seen: Set<Fiber>) {\n let current = start || null;\n const walked = new Set<Fiber>();\n while (current && into.length < MAX_CONTEXT_FIBERS) {\n if (walked.has(current)) break;\n walked.add(current);\n if (!seen.has(current)) {\n seen.add(current);\n into.push(current);\n }\n current = next(current) || null;\n }\n}\n\n/**\n * Collect the selected fiber first, then its rendered parent path, then its\n * debug-owner path. Production builds often lack `_debugOwner`, while\n * development builds benefit from both signals.\n */\nexport function collectContextFibers(fiber: Fiber | null | undefined): Fiber[] {\n if (!fiber) return [];\n const fibers: Fiber[] = [];\n const seen = new Set<Fiber>();\n collectChain(fiber, (entry) => entry.return, fibers, seen);\n collectChain(fiber._debugOwner, (entry) => entry._debugOwner, fibers, seen);\n return fibers;\n}\n\nfunction runProvider(provider: ContextProvider, fibers: Fiber[]): ContextContribution | null {\n try {\n return provider.describe(fibers) || null;\n } catch {\n // A broken plugin must not take down the generic boundary evidence.\n return null;\n }\n}\n\n/**\n * Describe the boundaries around a probed fiber. Returns null when neither the\n * core nor any provider found anything, so non-matching trees pay only one\n * bounded ancestry walk.\n */\nexport function describeContext(fiber: Fiber | null | undefined): MarkerContext | null {\n const fibers = collectContextFibers(fiber);\n if (fibers.length === 0) return null;\n\n const generic = collectFiberBoundaries(fibers);\n const boundaries: MarkerContext['boundaries'] = { error: generic.error, suspense: generic.suspense };\n const display: ContextDisplay = { kinds: [], titles: {}, fields: {}, showError: !!generic.error };\n const contributors: string[] = [];\n const extra: Record<string, unknown> = {};\n\n for (const provider of providers) {\n const contribution = runProvider(provider, fibers);\n if (!contribution) continue;\n contributors.push(provider.id);\n const declared = new Set((provider.kinds || []).map((kind) => kind.kind));\n for (const [kind, ref] of Object.entries(contribution.boundaries || {})) {\n if (!declared.has(kind) || boundaries[kind]) continue;\n boundaries[kind] = ref || null;\n }\n for (const kind of provider.kinds || []) {\n if (boundaries[kind.kind] && !display.kinds.some((entry) => entry.kind === kind.kind)) display.kinds.push(kind);\n }\n if (contribution.errorEnrichment && boundaries.error) {\n boundaries.error = { ...boundaries.error, ...contribution.errorEnrichment, distance: boundaries.error.distance };\n }\n Object.assign(display.titles, contribution.titles || {});\n for (const [kind, fields] of Object.entries(contribution.fields || {})) {\n display.fields[kind] = [...(display.fields[kind] || []), ...fields.filter((field) => field.value != null && field.value !== '')];\n }\n if (contribution.showError) display.showError = true;\n for (const [key, value] of Object.entries(contribution.extra || {})) {\n if (key !== 'boundaries' && key !== 'display' && key !== 'providers') extra[key] = value;\n }\n }\n\n const found = Object.values(boundaries).some(Boolean) || display.showError;\n if (!found) return null;\n return { ...extra, boundaries, display, providers: contributors };\n}\n\n/**\n * Locate the actual boundary FIBERS (not serialized descriptors) for every\n * known kind around a probed fiber. Used in-page to resolve a boundary's DOM\n * node for highlighting; it is not part of the serialized snapshot.\n */\nexport function findBoundaryFibers(fiber: Fiber | null | undefined): Record<string, Fiber | null> {\n const result: Record<string, Fiber | null> = { error: null, suspense: null };\n const matchers = providers.filter((provider) => typeof provider.matchBoundary === 'function');\n for (const provider of matchers) for (const kind of provider.kinds || []) result[kind.kind] = null;\n const wanted = Object.keys(result).length;\n let located = 0;\n for (const entry of collectContextFibers(fiber)) {\n if (!result.error && describeErrorBoundary(entry)) { result.error = entry; located += 1; }\n if (!result.suspense && describeSuspenseBoundary(entry)) { result.suspense = entry; located += 1; }\n for (const provider of matchers) {\n let kind: string | null = null;\n try { kind = provider.matchBoundary!(entry); } catch { kind = null; }\n if (kind && kind in result && !result[kind]) { result[kind] = entry; located += 1; }\n }\n if (located >= wanted) break;\n }\n return result;\n}\n","/**\n * Seed, protect, and guard a host metrics slot such as `__ATL_REACT_METRICS`.\n *\n * The host page owns the slot. Its instrumented react-dom reads the slot before\n * it calls `onCommitFiberRoot`, and its runtime may zero-fill or delete the slot\n * during hydration cleanup. These helpers never lock the slot: every descriptor\n * they write stays `configurable: true`, and a slot the host already locked is\n * left alone.\n */\n\nexport const DEFAULT_METRICS_SLOT = '__ATL_REACT_METRICS';\n\n/** Counters a zeroed slot starts with. */\nexport const METRICS_COUNTER_KEYS = [\n 'mountWorkCount', 'updateWorkCount', 'commitWorkCount', 'interruptedWorkCount',\n 'priorityInterruptedWorkCount', 'externalStoreRestartCount', 'renderRootSyncCount',\n 'renderRootConcurrentCount', 'componentWorkCount', 'componentMountWorkCount',\n 'componentUpdateWorkCount', 'componentRenderWithHooksCount', 'finishClassComponentCount',\n 'domWorkCount', 'totalTickCount', 'totalCommitCount', 'contextUpdateCount',\n 'legacyContextUpdateCount',\n] as const;\n\n/** Counters the accessor checks before accepting a write; adds the detector's totals. */\nconst ACCESSOR_KEYS = [...METRICS_COUNTER_KEYS, 'totalRestarts', 'totalPerformedWork'] as const;\n\ntype SlotTarget = Record<string, unknown>;\nexport type MetricsSlotValue = Record<string, unknown>;\n\nexport function createZeroMetrics(): MetricsSlotValue {\n const metrics: MetricsSlotValue = {};\n for (const key of METRICS_COUNTER_KEYS) metrics[key] = 0;\n metrics.setStateCount = 0;\n return metrics;\n}\n\nfunction isAllZero(value: unknown): boolean {\n if (!value || typeof value !== 'object') return true;\n const record = value as Record<string, unknown>;\n for (const key of ACCESSOR_KEYS) if (((record[key] as number) || 0) !== 0) return false;\n return true;\n}\n\n/** True when the host owns the slot: non-configurable, or an accessor. */\nexport function isSlotHostLocked(target: SlotTarget, slotName = DEFAULT_METRICS_SLOT): boolean {\n const existing = Object.getOwnPropertyDescriptor(target, slotName);\n return !!existing && (existing.configurable === false || typeof existing.get === 'function');\n}\n\n/**\n * Write `metrics` as a plain, deletable data property. Honors a host lock\n * (configurable: false). Falls back to plain assignment.\n */\nexport function protectMetricsSlot(target: SlotTarget, metrics: MetricsSlotValue, slotName = DEFAULT_METRICS_SLOT): void {\n try {\n const existing = Object.getOwnPropertyDescriptor(target, slotName);\n if (existing && existing.configurable === false) return;\n Object.defineProperty(target, slotName, { configurable: true, enumerable: true, writable: true, value: metrics });\n } catch {\n try { target[slotName] = metrics; } catch { /* host wins */ }\n }\n}\n\n/** Seed a fresh zeroed slot. Returns the new metrics object. */\nexport function seedMetricsSlot(target: SlotTarget, slotName = DEFAULT_METRICS_SLOT): MetricsSlotValue {\n const metrics = createZeroMetrics();\n try { target[slotName] = metrics; } catch { /* protect below retries */ }\n protectMetricsSlot(target, metrics, slotName);\n return metrics;\n}\n\n/**\n * Install a configurable accessor on the slot before React evaluates.\n *\n * - `configurable: true`, so a host `delete` succeeds without a TypeError.\n * After a delete the slot is gone until the next detector install re-seeds it.\n * - `set()` ignores null, undefined, and all-zero writes, so host hydration\n * cleanup that zero-fills the slot cannot orphan the live metrics object.\n * - A slot the host already locked is left alone.\n *\n * Returns true when the accessor was installed.\n */\nexport function installMetricsAccessor(target: SlotTarget, slotName = DEFAULT_METRICS_SLOT): boolean {\n try {\n const existing = Object.getOwnPropertyDescriptor(target, slotName);\n if (existing && existing.configurable === false) return false;\n let live = existing && typeof existing.get === 'function'\n ? target[slotName]\n : existing?.value;\n if (!live || typeof live !== 'object') {\n live = { onCommitFiberRoot: null };\n for (const key of ACCESSOR_KEYS) (live as MetricsSlotValue)[key] = 0;\n }\n Object.defineProperty(target, slotName, {\n configurable: true,\n enumerable: true,\n get() { return live; },\n set(next: unknown) {\n if (next === undefined || next === null || isAllZero(next)) return;\n live = next;\n },\n });\n return true;\n } catch {\n // Non-fatal: the detector falls back to DevTools capture.\n return false;\n }\n}\n","/**\n * ATL commit metrics adapter: reads the render counters that Atlassian's\n * patched react-dom writes into `__ATL_REACT_METRICS` and routes that slot's\n * `onCommitFiberRoot` callback to the detector.\n *\n * The slot name is configurable, so a renamed slot needs no core change.\n */\n\nimport type {\n CommitMetricsAdapter,\n CommitMetricsRoot,\n CommitMetricsSnapshot,\n} from '../../avalanche/commit-metrics-adapter';\nimport {\n DEFAULT_METRICS_SLOT,\n installMetricsAccessor,\n isSlotHostLocked,\n seedMetricsSlot,\n} from './metrics-slot';\n\n/**\n * Per-commit ATL delta - work done in a single commit.\n * Enables full reconciliation: ATL work counts ↔ Avalanche component counts.\n *\n * Key relationship (should hold for any commit):\n * componentRenderWithHooksCount + finishClassComponentCount === collateral + sources\n */\nexport type ATLCommitDelta = {\n /** Function components mounted this commit (should be 0 during pure updates!) */\n mountWorkCount: number;\n /** Fiber update work this commit */\n updateWorkCount: number;\n /** Work that reached commit phase */\n commitWorkCount: number;\n performedWorkCount: number;\n /** Work interrupted (priority change) */\n interruptedWorkCount: number;\n /** Component fiber work (class + function) */\n componentWorkCount: number;\n /** Components mounted (should be 0 during pure updates!) */\n componentMountWorkCount: number;\n /** Components updated */\n componentUpdateWorkCount: number;\n /** DOM work (host fibers) */\n domWorkCount: number;\n ticksCount: number;\n /** Context propagation waves */\n contextUpdateCount: number;\n /** Legacy context propagations (tech debt indicator) */\n legacyContextUpdateCount: number;\n /** ALL function components rendered (including hookless) */\n componentRenderWithHooksCount: number;\n /** Class components rendered */\n finishClassComponentCount: number;\n /** useSES-triggered restarts (store mutation detected after concurrent render) */\n externalStoreRestartCount?: number;\n /** Work abandoned due to priority preemption (fibers unwound in prepareFreshStack) */\n priorityInterruptedWorkCount?: number;\n /** Number of sync renderRoot passes in this commit window */\n renderRootSyncCount?: number;\n /** Number of concurrent renderRoot passes in this commit window */\n renderRootConcurrentCount?: number;\n /** useState/useReducer dispatches during this commit (react-dom patch; optional) */\n setStateCount?: number;\n};\n\nexport const ATL_DISPATCHER_FRAME = 'atlDispatcherHook';\n\ntype SlotHandler = (...args: unknown[]) => void;\ntype Slot = Record<string, unknown> & { onCommitFiberRoot?: SlotHandler | null };\n\nconst num = (snapshot: CommitMetricsSnapshot, key: string): number => (snapshot[key] as number | undefined) ?? 0;\nconst diff = (before: CommitMetricsSnapshot, after: CommitMetricsSnapshot, key: string): number => num(after, key) - num(before, key);\n\n/** Counter delta between two ATL snapshots. */\nexport function calculateATLDelta(before: CommitMetricsSnapshot, after: CommitMetricsSnapshot): ATLCommitDelta {\n return {\n // Basic work counters\n mountWorkCount: diff(before, after, 'mountWorkCount'),\n updateWorkCount: diff(before, after, 'updateWorkCount'),\n commitWorkCount: diff(before, after, 'commitWorkCount'),\n performedWorkCount: diff(before, after, 'totalPerformedWork'),\n\n // Interruption/restart counters\n interruptedWorkCount: diff(before, after, 'interruptedWorkCount'),\n externalStoreRestartCount: diff(before, after, 'externalStoreRestartCount'),\n priorityInterruptedWorkCount: diff(before, after, 'priorityInterruptedWorkCount'),\n renderRootSyncCount: diff(before, after, 'renderRootSyncCount'),\n renderRootConcurrentCount: diff(before, after, 'renderRootConcurrentCount'),\n\n // Scheduler\n ticksCount: diff(before, after, 'totalTickCount'),\n\n // Component work counters\n componentWorkCount: diff(before, after, 'componentWorkCount'),\n componentMountWorkCount: diff(before, after, 'componentMountWorkCount'),\n componentUpdateWorkCount: diff(before, after, 'componentUpdateWorkCount'),\n componentRenderWithHooksCount: diff(before, after, 'componentRenderWithHooksCount'),\n finishClassComponentCount: diff(before, after, 'finishClassComponentCount'),\n\n // DOM work\n domWorkCount: diff(before, after, 'domWorkCount'),\n\n // Context updates\n contextUpdateCount: diff(before, after, 'contextUpdateCount'),\n legacyContextUpdateCount: diff(before, after, 'legacyContextUpdateCount'),\n\n // Hook-metric delta (react-dom patch; optional). Omit when neither snapshot\n // carries a numeric setStateCount so we never emit a bogus 0 on unpatched hosts.\n // TODO: Require finite values on both sides or model a counter reset\n // explicitly. Treating a missing/wiped side as zero can emit a negative delta,\n // and typeof NaN === 'number' lets a poisoned counter enter the report.\n ...(typeof after.setStateCount === 'number' || typeof before.setStateCount === 'number'\n ? { setStateCount: diff(before, after, 'setStateCount') }\n : {}),\n };\n}\n\nexport type ATLCommitMetricsAdapterOptions = {\n /** Global slot the patched react-dom writes. Default `__ATL_REACT_METRICS`. */\n slotName?: string;\n /** Object that holds the slot. Default `globalThis`. */\n target?: Record<string, unknown>;\n};\n\nexport function createATLCommitMetricsAdapter(options: ATLCommitMetricsAdapterOptions = {}): CommitMetricsAdapter {\n const slotName = options.slotName ?? DEFAULT_METRICS_SLOT;\n const target = () => options.target ?? (globalThis as unknown as Record<string, unknown>);\n const slot = (): Slot | null => {\n const value = target()[slotName];\n return value && typeof value === 'object' ? (value as Slot) : null;\n };\n let ourHandler: SlotHandler | undefined;\n\n return {\n id: 'atl',\n frameFilters: [ATL_DISPATCHER_FRAME],\n\n prePage() {\n installMetricsAccessor(target(), slotName);\n },\n\n prepare() {\n // Seed only when the slot is absent or a plain configurable data\n // property. A non-configurable slot or an accessor belongs to the host.\n try {\n if (!isSlotHostLocked(target(), slotName)) seedMetricsSlot(target(), slotName);\n } catch { /* host wins */ }\n },\n\n isAvailable: () => !!slot(),\n\n snapshot() {\n const live = slot();\n return live ? { ...live } : null;\n },\n\n measure(before, after, committedComponents, commitId) {\n const delta = calculateATLDelta(before, after);\n delta.performedWorkCount = committedComponents;\n const rendered = (delta.componentRenderWithHooksCount ?? 0) + (delta.finishClassComponentCount ?? 0);\n const restarts = Math.max(0, rendered - committedComponents);\n if (committedComponents > rendered && rendered > 0) {\n // eslint-disable-next-line no-console\n console.warn(\n `[Avalanche] Commit ${commitId}: committedComponents (${committedComponents}) > atlTotal (${rendered}). ` +\n `This indicates a counting bug. Using 0 restarts.`\n );\n }\n // Running totals live on the slot so the next delta covers them.\n const live = slot();\n if (live) {\n live.totalRestarts = ((live.totalRestarts as number) ?? 0) + restarts;\n live.totalPerformedWork = ((live.totalPerformedWork as number) ?? 0) + committedComponents;\n }\n return { delta, restarts };\n },\n\n attach(onCommit) {\n const live = slot();\n if (!live) return false;\n const handler: SlotHandler = (_rendererID, root) => onCommit(root as CommitMetricsRoot);\n live.onCommitFiberRoot = handler;\n ourHandler = handler;\n return true;\n },\n\n isAttached() {\n const live = slot();\n return !!live && !!ourHandler && live.onCommitFiberRoot === ourHandler;\n },\n\n reattach() {\n const fresh = seedMetricsSlot(target(), slotName) as Slot;\n if (ourHandler) fresh.onCommitFiberRoot = ourHandler;\n },\n\n detach() {\n const live = slot();\n if (live && ourHandler && live.onCommitFiberRoot === ourHandler) live.onCommitFiberRoot = undefined;\n ourHandler = undefined;\n },\n };\n}\n\n/** The adapter the shipped bundle registers. */\nexport const atlCommitMetricsAdapter = createATLCommitMetricsAdapter();\n","/**\n * Jira context provider: recognizes Jira's OwnerMark/OwnershipMark ownership\n * markers and JSErrorBoundary props, and layers them onto the generic marker\n * context as an `owner` boundary kind and error-boundary enrichment.\n *\n * Registered by the bundle's composition root; the core marker context works\n * without it.\n */\n\nimport { type Fiber, getDisplayName } from '../../layout-lab/fiber-walk';\nimport {\n type ContextContribution,\n type ContextField,\n type ContextProvider,\n type MarkerContext,\n describeContext,\n} from '../../layout-lab/marker-context';\n\nexport type JiraOwnership = {\n markerName: string;\n type: string | null;\n name: string | null;\n packageName: string | null;\n teamName: string | null;\n variant: string | null;\n source: 'display-name' | 'props';\n};\n\nexport type JiraErrorBoundary = {\n componentName: string;\n id: string | null;\n packageName: string | null;\n fallback: string | null;\n teamName: string | null;\n};\n\nconst OWNER_MARK_NAMES = new Set(['OwnerMark', 'OwnershipMark']);\n\nfunction readScalar(props: Record<string, unknown> | null | undefined, ...keys: string[]): string | null {\n for (const key of keys) {\n const value = props?.[key];\n if (typeof value === 'string' && value.trim()) return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n }\n return null;\n}\n\nfunction displayNameOf(fiber: Fiber): string | null {\n return getDisplayName(fiber.type) || getDisplayName(fiber.elementType) || null;\n}\n\nexport function parseOwnerMarkDisplayName(displayName: string | null | undefined): JiraOwnership | null {\n if (!displayName) return null;\n const parts = displayName.split('___');\n if (!OWNER_MARK_NAMES.has(parts[0])) return null;\n if (parts.length === 1) return null;\n return {\n markerName: displayName,\n type: parts[1] || null,\n name: parts[2] || null,\n packageName: parts[3] || null,\n teamName: null,\n variant: parts[4] || null,\n source: 'display-name',\n };\n}\n\nexport function describeOwnership(fiber: Fiber): JiraOwnership | null {\n const displayName = displayNameOf(fiber);\n const encoded = parseOwnerMarkDisplayName(displayName);\n if (encoded) {\n return {\n ...encoded,\n packageName: encoded.packageName || readScalar(fiber.memoizedProps, 'packageName', 'package'),\n teamName: readScalar(fiber.memoizedProps, 'teamName', 'team'),\n };\n }\n if (!displayName || !OWNER_MARK_NAMES.has(displayName)) return null;\n return {\n markerName: displayName,\n type: readScalar(fiber.memoizedProps, 'type', 'boundaryType'),\n name: readScalar(fiber.memoizedProps, 'name', 'id'),\n packageName: readScalar(fiber.memoizedProps, 'packageName', 'package'),\n teamName: readScalar(fiber.memoizedProps, 'teamName', 'team'),\n variant: readScalar(fiber.memoizedProps, 'variant'),\n source: 'props',\n };\n}\n\n/** Jira enrichment for an error boundary, read from JSErrorBoundary props. */\nfunction jiraErrorBoundary(fiber: Fiber): JiraErrorBoundary | null {\n const componentName = displayNameOf(fiber);\n if (componentName !== 'JSErrorBoundary') return null;\n return {\n componentName,\n id: readScalar(fiber.memoizedProps, 'id'),\n packageName: readScalar(fiber.memoizedProps, 'packageName'),\n fallback: readScalar(fiber.memoizedProps, 'fallback'),\n teamName: readScalar(fiber.memoizedProps, 'teamName'),\n };\n}\n\nfunction field(label: string, value: string | null | undefined): ContextField[] {\n return value ? [{ label, value }] : [];\n}\n\n/**\n * Scan the probed ancestry for OwnerMark ownership, the nearest JSErrorBoundary,\n * and Jira's ErrorComponent fallback marker.\n */\nexport function describeJiraContribution(fibers: Fiber[]): ContextContribution | null {\n let ownership: JiraOwnership | null = null;\n let ownerDistance = -1;\n let errorBoundary: JiraErrorBoundary | null = null;\n let errorComponent = false;\n\n for (let distance = 0; distance < fibers.length; distance += 1) {\n const entry = fibers[distance];\n if (!ownership) {\n const found = describeOwnership(entry);\n if (found) {\n ownership = found;\n ownerDistance = distance;\n }\n }\n if (!errorBoundary) errorBoundary = jiraErrorBoundary(entry);\n const displayName = displayNameOf(entry);\n if (displayName === 'ErrorComponent' || displayName?.endsWith('ErrorComponent')) errorComponent = true;\n if (ownership && errorBoundary && errorComponent) break;\n }\n\n if (!ownership && !errorBoundary && !errorComponent) return null;\n return {\n boundaries: { owner: ownership ? { ...ownership, distance: ownerDistance } : null },\n errorEnrichment: errorBoundary,\n titles: {\n ...(ownership ? { owner: ownership.name || ownership.markerName } : {}),\n ...(errorBoundary ? {} : errorComponent ? { error: 'ErrorComponent' } : {}),\n },\n // Keep only the fields that matter operationally: team and id (the\n // Sentry key). package/fallback stay on the boundary payload.\n fields: errorBoundary ? { error: [...field('team', errorBoundary.teamName), ...field('id', errorBoundary.id)] } : {},\n showError: errorComponent,\n // Legacy Jira-shaped fields, preserved for existing consumers.\n extra: { ownership, errorComponent, errorBoundary },\n };\n}\n\nexport const jiraContextProvider: ContextProvider = {\n id: 'jira',\n kinds: [{ kind: 'owner', label: 'owner', accent: '#0c66e4' }],\n describe: describeJiraContribution,\n matchBoundary: (fiber) => (describeOwnership(fiber) ? 'owner' : null),\n};\n\n/** The marker context with the Jira fields always present. */\nexport function describeJiraContext(fiber: Fiber | null | undefined): MarkerContext | null {\n const context = describeContext(fiber);\n if (!context) return null;\n return {\n ownership: null,\n errorComponent: false,\n errorBoundary: null,\n ...context,\n boundaries: { owner: null, ...context.boundaries },\n };\n}\n","/**\n * Chippy plugin registry. The core runtime has no product knowledge; plugins\n * add it through the context provider and commit metrics adapter seams.\n *\n * The bundle ships the built-in Jira and ATL plugins, and a packed build\n * (`chippy pack`) appends more through `__AVALANCHE__.registerPlugin()`. A\n * plugin runs only once it is both registered and enabled. A page enables\n * plugins through the startup config (`plugins: ['jira', 'atl']`), the\n * `__CHIPPY_PLUGINS` global, or `__AVALANCHE__.enablePlugins()`; a packed\n * build can name defaults for pages that do neither.\n */\n\nimport { type CommitMetricsAdapter, registerCommitMetricsAdapter } from '../avalanche/commit-metrics-adapter';\nimport { type ContextProvider, registerContextProvider } from '../layout-lab/marker-context';\nimport { atlCommitMetricsAdapter } from './atl/commit-metrics-adapter';\nimport { jiraContextProvider } from './jira/context-provider';\n\nexport type ChippyPlugin = {\n /** Stable id used to enable the plugin, e.g. `'jira'`. */\n id: string;\n /** Short name shown in the extension's plugin settings. */\n label?: string;\n contextProvider?: ContextProvider;\n commitMetricsAdapter?: CommitMetricsAdapter;\n};\n\nexport type PluginStatus = { id: string; label: string; enabled: boolean };\n\nexport const BUILTIN_PLUGINS: readonly ChippyPlugin[] = [\n { id: 'jira', label: 'Jira ownership markers', contextProvider: jiraContextProvider },\n { id: 'atl', label: 'ATL commit metrics', commitMetricsAdapter: atlCommitMetricsAdapter },\n];\n\nconst registered = new Map<string, ChippyPlugin>();\nconst requested = new Set<string>();\nconst active = new Map<string, () => void>();\nlet explicitSelection = false;\n\nfunction activate(plugin: ChippyPlugin): void {\n const unregister = [\n plugin.contextProvider && registerContextProvider(plugin.contextProvider),\n plugin.commitMetricsAdapter && registerCommitMetricsAdapter(plugin.commitMetricsAdapter),\n ].filter((fn): fn is () => void => typeof fn === 'function');\n active.set(plugin.id, () => {\n for (const fn of unregister.reverse()) fn();\n });\n}\n\nfunction deactivate(id: string): void {\n active.get(id)?.();\n active.delete(id);\n}\n\nfunction validId(id: unknown): id is string {\n return typeof id === 'string' && id.length > 0;\n}\n\n/**\n * Register a plugin. It starts at once if its id was already enabled.\n * Registering the same id again replaces the earlier plugin.\n */\nexport function registerPlugin(plugin: ChippyPlugin): () => void {\n if (!plugin || !validId(plugin.id)) throw new TypeError('registerPlugin expects a plugin with a non-empty id');\n deactivate(plugin.id);\n registered.set(plugin.id, plugin);\n if (requested.has(plugin.id)) activate(plugin);\n return () => {\n if (registered.get(plugin.id) !== plugin) return;\n deactivate(plugin.id);\n registered.delete(plugin.id);\n };\n}\n\n/**\n * Enable plugins by id. An id that is not registered yet starts when its\n * plugin registers; non-string ids are ignored. Returns the running ids.\n */\nexport function enablePlugins(ids: unknown): string[] {\n for (const id of Array.isArray(ids) ? ids : []) {\n if (!validId(id) || requested.has(id)) continue;\n requested.add(id);\n const plugin = registered.get(id);\n if (plugin && !active.has(id)) activate(plugin);\n }\n return [...active.keys()];\n}\n\n/**\n * Record the page's own plugin selection. Once a page has chosen, build\n * defaults no longer apply, so a user who turned a default off keeps it off.\n */\nexport function selectPlugins(ids: unknown): string[] {\n explicitSelection = true;\n return enablePlugins(ids);\n}\n\n/** Enable a packed build's default plugins unless the page made its own selection. */\nexport function enableDefaultPlugins(ids: unknown): string[] {\n return explicitSelection ? [...active.keys()] : enablePlugins(ids);\n}\n\nexport function listPlugins(): PluginStatus[] {\n return [...registered.values()].map((plugin) => ({\n id: plugin.id,\n label: plugin.label ?? plugin.id,\n enabled: active.has(plugin.id),\n }));\n}\n\n/** Register the built-in plugins. Returns a function that removes them. */\nexport function registerBuiltinPlugins(): () => void {\n const unregister = BUILTIN_PLUGINS.map(registerPlugin);\n return () => {\n for (const fn of unregister.reverse()) fn();\n };\n}\n\n/** Stop every plugin and forget all registrations and selections. Test helper. */\nexport function resetPlugins(): void {\n for (const id of [...active.keys()].reverse()) deactivate(id);\n registered.clear();\n requested.clear();\n explicitSelection = false;\n}\n","export const PROBE_INTENTS = ['explain', 'investigate', 'change'] as const;\n\nexport type ProbeIntent = (typeof PROBE_INTENTS)[number];\n\nexport type ProbeAnnotation = {\n intent: ProbeIntent | null;\n comment: string;\n};\n\nconst MAX_COMMENT_LENGTH = 2000;\nconst INTENT_SET = new Set<string>(PROBE_INTENTS);\n\nexport function normalizeProbeAnnotation(value: unknown): ProbeAnnotation {\n const input = value && typeof value === 'object'\n ? value as { intent?: unknown; comment?: unknown }\n : {};\n const rawIntent = typeof input.intent === 'string' ? input.intent.trim().toLowerCase() : '';\n\n return {\n intent: INTENT_SET.has(rawIntent) ? rawIntent as ProbeIntent : null,\n comment: typeof input.comment === 'string'\n ? input.comment.slice(0, MAX_COMMENT_LENGTH)\n : '',\n };\n}\n\nexport function updateProbeAnnotation(\n current: ProbeAnnotation,\n patch: Partial<ProbeAnnotation>,\n): ProbeAnnotation {\n return normalizeProbeAnnotation({\n intent: patch.intent === undefined ? current.intent : patch.intent,\n comment: patch.comment === undefined ? current.comment : patch.comment,\n });\n}\n","/**\n * Pure data transforms for hook inspection and component tree formatting.\n *\n * These functions are extracted from chippy-page-bridge.js and are testable\n * without DOM or side effects. They format hook metadata into ASCII trees and\n * compact summaries for the Chippy extension.\n */\n\n// ─── Types ───────────────────────────────────────────────────────────────\n\nexport type HookRaw = {\n index: number;\n tag?: string;\n value?: unknown;\n hasCleanup?: boolean;\n};\n\nexport type HookSummary = {\n name: string | null;\n fiberId?: string | null;\n hookCount: number;\n truncated: boolean;\n maxHooks?: number | null;\n counts: Record<string, number>;\n cleanupEffectCount: number;\n cleanupEffects: number[];\n runs: Array<{ start: number; end: number; tag: string; count: number }>;\n valueHints: Array<{ index: number; tag: string; value: unknown }>;\n};\n\n/** Returned by summarizeHookList when the raw hook list is missing or carries an error. */\nexport type HookListError = { error: string };\n\n/** The subset of a hook summary that renderCompactComponentText reads. */\nexport type CompactHookSummary = Pick<HookSummary, 'hookCount' | 'counts' | 'cleanupEffectCount'> &\n Partial<Pick<HookSummary, 'truncated' | 'cleanupEffects'>> & {\n /** Hooks recovered by replay; differs from hookCount when only committed fiber slots were read. */\n replayedHookCount?: number;\n };\n\nexport type PathSegment = {\n name: string;\n loc?: string | null;\n};\n\nexport type TreeGroup = {\n path: PathSegment[];\n hooks: Array<{\n hookId: number | null;\n primitive: string;\n debugLabel?: string | null;\n }>;\n};\n\nexport type Source = {\n fileName?: string | null;\n lineNumber?: number | null;\n};\n\n// ─── Implementation ──────────────────────────────────────────────────────\n\n/**\n * summarizeHookList\n *\n * Transform a raw hook list into counts, runs, cleanup effects, and value hints.\n * Pure data-in-data-out; no side effects.\n */\nexport function summarizeHookList(raw: any): HookSummary | HookListError {\n if (!raw || raw.error) return raw || { error: 'No hook data available' };\n\n const hooks = Array.isArray(raw.hooks) ? (raw.hooks as HookRaw[]) : [];\n const counts: Record<string, number> = {};\n const cleanupEffects: number[] = [];\n const valueHints: Array<{ index: number; tag: string; value: unknown }> = [];\n const runs: Array<{ start: number; end: number; tag: string; count: number }> = [];\n let runStart = 0;\n\n hooks.forEach((hook, index) => {\n const tag = hook?.tag || 'Unknown';\n counts[tag] = (counts[tag] || 0) + 1;\n if (tag === 'Effect' && hook.hasCleanup) cleanupEffects.push(index);\n if (hook && Object.prototype.hasOwnProperty.call(hook, 'value') && hook.value !== undefined && hook.value !== null) {\n valueHints.push({ index, tag, value: hook.value });\n }\n });\n\n for (let i = 1; i <= hooks.length; i++) {\n const prevTag = hooks[runStart]?.tag || 'Unknown';\n const tag = hooks[i]?.tag || 'Unknown';\n if (i === hooks.length || tag !== prevTag) {\n runs.push({ start: runStart, end: i - 1, tag: prevTag, count: i - runStart });\n runStart = i;\n }\n }\n\n return {\n name: raw.name || null,\n fiberId: raw.fiberId || null,\n hookCount: raw.hookCount ?? hooks.length,\n truncated: !!raw.truncated,\n maxHooks: raw.maxHooks ?? null,\n counts,\n cleanupEffectCount: cleanupEffects.length,\n cleanupEffects,\n runs,\n valueHints,\n };\n}\n\n/**\n * formatCounts\n *\n * Format a counts object (tag → count) into a comma-separated string.\n * Used by renderCompactComponentText and other formatters.\n */\nexport function formatCounts(counts: Record<string, number> | null | undefined): string {\n return Object.keys(counts || {})\n .sort()\n .map((k) => k + '=' + counts![k])\n .join(', ');\n}\n\nfunction formatPath(path: PathSegment[] | null | undefined): string {\n return (path || []).map((seg) => seg.name + (seg.loc ? ' @ ' + seg.loc : '')).join(' > ');\n}\n\nfunction renderComplexityText(summary: CompactHookSummary, records: any[]): string[] {\n const out = ['complexity:', ' total hook slots: ' + summary.hookCount + (summary.truncated ? '+' : '')];\n const counts = formatCounts(summary.counts);\n if (counts) out.push(' primitive counts: ' + counts);\n if (summary.cleanupEffectCount) {\n const cleanupIndexes = (summary.cleanupEffects || []).join(', ');\n out.push(' cleanup effects: ' + summary.cleanupEffectCount + (cleanupIndexes ? ' @ hooks ' + cleanupIndexes : ''));\n }\n\n const familyCounts = new Map<string, number>();\n for (const record of records || []) {\n if (record?.index == null) continue;\n const path = (record.path || []) as PathSegment[];\n const key = path.length ? path[0].name + (path[0].loc ? ' @ ' + path[0].loc : '') : '(component body)';\n familyCounts.set(key, (familyCounts.get(key) || 0) + 1);\n }\n const topFamilies = Array.from(familyCounts.entries())\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 8);\n if (topFamilies.length) {\n out.push(' top hook families:');\n topFamilies.forEach(([family, count]) => out.push(' ' + family + ': ' + count));\n }\n\n const debugLandmarks = (records || [])\n .filter((record) => record?.debugLabel)\n .slice(0, 8)\n .map((record) => {\n const path = formatPath(record.path || []);\n const hook = 'hook ' + (record.index == null ? '·' : record.index) + ' ' + record.primitive;\n return ' ' + (path ? path + ' > ' : '') + hook + ' — ' + record.debugLabel;\n });\n if (debugLandmarks.length) {\n out.push(' debug landmarks:');\n out.push(...debugLandmarks);\n }\n return out;\n}\n\n/**\n * renderTreeText\n *\n * Render a component tree with custom-hook ancestry as ASCII.\n * Groups are ordered as they appear, with path depth driving indent.\n */\nexport function renderTreeText(componentName: string, source: Source | null | undefined, groups: TreeGroup[]): string {\n type HookEntry = { kind: 'hooks'; hooks: TreeGroup['hooks'] };\n type FolderEntry = { kind: 'folder'; node: FolderNode };\n type FolderNode = {\n segment: PathSegment | null;\n locs: Set<string>;\n childrenByKey: Map<string, FolderNode>;\n entries: Array<HookEntry | FolderEntry>;\n };\n\n const out: string[] = [];\n const head = source?.fileName\n ? componentName + ' @ ' + source.fileName + (source.lineNumber ? ':' + source.lineNumber : '')\n : componentName;\n out.push(head);\n\n const root: FolderNode = { segment: null, locs: new Set(), childrenByKey: new Map(), entries: [] };\n // Folder identity is custom hook name + stable invocation location. The loc is\n // produced by replay as the parent callsite that invoked this hook, not the\n // hook's internal primitive-call line, so repeated primitive frames inside one\n // hook invocation collapse while distinct same-name invocations stay separate.\n const segmentKey = (seg: PathSegment) => seg.name + '\\u0000' + (seg.loc || '');\n\n for (const group of groups || []) {\n let node = root;\n for (const seg of group.path || []) {\n const key = segmentKey(seg);\n let child = node.childrenByKey.get(key);\n if (!child) {\n child = { segment: seg, locs: new Set(), childrenByKey: new Map(), entries: [] };\n node.childrenByKey.set(key, child);\n node.entries.push({ kind: 'folder', node: child });\n }\n if (seg.loc) child.locs.add(seg.loc);\n node = child;\n }\n if (group.hooks && group.hooks.length) {\n node.entries.push({ kind: 'hooks', hooks: group.hooks });\n }\n }\n\n const renderEntries = (entries: Array<HookEntry | FolderEntry>, prefix: string) => {\n entries.forEach((entry, entryIndex) => {\n const isLastEntry = entryIndex === entries.length - 1;\n const connector = isLastEntry ? '└─' : '├─';\n if (entry.kind === 'folder') {\n const seg = entry.node.segment!;\n out.push(prefix + connector + ' ' + seg.name + (seg.loc ? ' @ ' + seg.loc : ''));\n renderEntries(entry.node.entries, prefix + (isLastEntry ? ' ' : '│ '));\n return;\n }\n\n entry.hooks.forEach((hook, hookIndex) => {\n const isLastHook = hookIndex === entry.hooks.length - 1;\n const hookConnector = isLastEntry && isLastHook ? '└─' : '├─';\n const hid = hook.hookId == null ? '·' : hook.hookId;\n const debugLabel = hook.debugLabel ? ' — ' + hook.debugLabel : '';\n out.push(prefix + hookConnector + ' hook ' + hid + ' ' + hook.primitive + debugLabel);\n });\n });\n };\n\n renderEntries(root.entries, '');\n return out.join('\\n');\n}\n\n/**\n * renderCompactComponentText\n *\n * Render a compact summary of a component's hooks and custom-hook structure.\n * Used by evalExplainComponent.\n */\nexport function renderCompactComponentText(\n componentName: string,\n source: Source | null | undefined,\n summary: CompactHookSummary,\n records: any[],\n warnings: string[],\n): string {\n const out: string[] = [];\n const head = source?.fileName\n ? componentName + ' @ ' + source.fileName + (source.lineNumber ? ':' + source.lineNumber : '')\n : componentName;\n out.push(head);\n out.push('hooks: ' + summary.hookCount + (summary.truncated ? '+' : '') + ' (' + formatCounts(summary.counts) + ')');\n if (summary.cleanupEffectCount) out.push('effects with cleanup: ' + summary.cleanupEffectCount);\n out.push(...renderComplexityText(summary, records || []));\n\n const treeGroups: TreeGroup[] = (records || [])\n .filter((r) => r.index !== null || r.primitive === 'DebugValue')\n .map((r) => ({\n path: r.path || [],\n hooks: [{ hookId: r.index, primitive: r.primitive, debugLabel: r.debugLabel }],\n }));\n if (treeGroups.length) {\n out.push('structure:');\n const treeText = renderTreeText(componentName, null, treeGroups).split('\\n').slice(1);\n out.push(...treeText.map((line) => ' ' + line));\n } else {\n out.push('structure: unavailable from replay; using live hook list only');\n }\n if (summary.replayedHookCount != null && summary.replayedHookCount !== summary.hookCount) {\n out.push('fiber-only: 0 hooks replayed; ' + summary.hookCount + ' committed hook slots read');\n }\n if (warnings && warnings.length) out.push('warnings: ' + warnings.join('; '));\n return out.join('\\n');\n}\n","/**\n * evalDescribeComponent\n *\n * Orchestrate a detailed component description with fiber-only fallback.\n * Depends on injected callables for resolution, memory, evaluation, and replay.\n *\n * Extracted from chippy-page-bridge.js line 1354.\n */\n\nimport type { Source, TreeGroup } from './inspect-formatters';\nimport { renderTreeText } from './inspect-formatters';\nimport { getFiberSource } from './fiber-source';\n\n// ─── Type definitions for injected dependencies ──────────────────────────\n\nexport type Fiber = {\n _debugSource?: Source | null;\n _debugStack?: unknown;\n type?: {\n _debugSource?: Source | null;\n displayName?: string | null;\n name?: string | null;\n } | null;\n // Additional fiber properties may exist; we only care about source + type.\n [key: string]: any;\n};\n\nexport type HookRecord = {\n index: number | null;\n primitive: string;\n path?: Array<{ name: string; loc?: string | null }> | null;\n debugLabel?: string | null;\n};\n\nexport type ReplayResult = {\n componentName: string;\n records: HookRecord[];\n replayAttempted: boolean;\n replayError: string | null;\n replayErrorDetails: unknown;\n replayStatus: string;\n};\n\nexport type EvalFiberHooksResult = {\n hookCount: number;\n [key: string]: any;\n};\n\nexport type DescribeComponentDeps = {\n /**\n * Resolve a fiber by probe, fiberId, or name.\n * Returns { fiber, resolvedBy } or { error }.\n */\n resolveFiberTarget: (probeId: unknown, fiberId: unknown, name: unknown) => { fiber?: Fiber; resolvedBy?: string; error?: string };\n\n /**\n * Store a fiber in a registry and return its string ID.\n */\n rememberFiber: (fiber: Fiber) => string;\n\n /**\n * Retrieve a previously stored fiber by ID.\n */\n getRememberedFiber: (id: string | number) => Fiber | null;\n\n /**\n * Evaluate live hooks for a fiber (from React fiber tree, no replay).\n */\n evalFiberHooks: (fiber: Fiber) => EvalFiberHooksResult;\n\n /**\n * Replay a component's hooks by executing its function.\n * Returns full hook records with custom-hook ancestry if available.\n */\n replayComponentHooks: (fiber: Fiber) => ReplayResult;\n\n /**\n * Render a component tree with custom-hook ancestry as ASCII.\n */\n renderTreeText: (componentName: string, source: Source | null | undefined, groups: TreeGroup[]) => string;\n};\n\nexport type DescribeComponentResult = {\n ok: boolean;\n error?: string;\n componentName?: string;\n fiberId?: string;\n resolvedBy?: string;\n source?: { fileName: string | null; lineNumber: number | null } | null;\n hookCount?: number;\n liveHookCount?: number;\n replayedHookCount?: number;\n replayStatus?: string;\n tree?: TreeGroup[];\n text?: string;\n captureEngineOk?: boolean;\n warnings?: string[];\n replayError?: string;\n replayErrorDetails?: unknown;\n};\n\n// ─── Implementation ──────────────────────────────────────────────────────\n\n/**\n * Describe a component's hook structure in full detail.\n *\n * Accepts a fiberIdRaw and/or nameRaw; resolves via deps.resolveFiberTarget.\n * Groups hook records by custom-hook ancestry path, renders as ASCII tree,\n * and returns full metadata including replay status and warnings.\n */\nexport function evalDescribeComponent(\n fiberIdRaw: unknown,\n nameRaw: unknown,\n deps: DescribeComponentDeps,\n): DescribeComponentResult {\n const target = deps.resolveFiberTarget(null, fiberIdRaw, nameRaw);\n if (target.error) return { ok: false, error: target.error };\n\n const { fiber, resolvedBy } = target as { fiber: Fiber; resolvedBy: string };\n\n const fiberId = fiberIdRaw && deps.getRememberedFiber(String(fiberIdRaw)) ? String(fiberIdRaw) : deps.rememberFiber(fiber);\n const liveHooks = deps.evalFiberHooks(fiber);\n const liveHookCount = liveHooks.hookCount;\n const { componentName, records, replayAttempted, replayError, replayErrorDetails, replayStatus } =\n deps.replayComponentHooks(fiber);\n const source = getFiberSource(fiber);\n const replayedHookCount = records.filter((r) => r.index != null).length;\n const hookCount = liveHookCount;\n\n const captureEngineOk = replayAttempted && records.length > 0;\n const warnings: string[] = [];\n if (!replayAttempted)\n warnings.push('fiber-only: component functions and hooks were not executed; custom-hook ancestry is unavailable unless captured metadata exists');\n if (replayError) warnings.push('replay-error: ' + replayError);\n const anyAncestry = records.some((r) => r.path && r.path.length > 0);\n if (!anyAncestry && hookCount > 0)\n warnings.push('flat-records: no custom-hook ancestry; reload page with devtools-hook-shim injected before react-dom');\n\n // Preserve replay record order. renderTreeText owns the tree/folder grouping;\n // pre-grouping by path here loses interleaving and can move late parent-level\n // hooks before child folders that executed earlier.\n const tree: TreeGroup[] = records.map((r) => ({\n path: (r.path as unknown[] as any) || [],\n hooks: [{ hookId: r.index, primitive: r.primitive, debugLabel: r.debugLabel }],\n }));\n const text = deps.renderTreeText(componentName, source as Source | null, tree);\n\n return {\n ok: true,\n componentName,\n fiberId,\n resolvedBy,\n source: source ? { fileName: (source as any)?.fileName || null, lineNumber: (source as any)?.lineNumber || null } : null,\n hookCount,\n liveHookCount,\n replayedHookCount,\n replayStatus: replayStatus || 'not-run-fiber-only',\n tree,\n text,\n captureEngineOk,\n warnings,\n replayError: replayError || undefined,\n replayErrorDetails: replayErrorDetails || undefined,\n };\n}\n","/**\n * Avalanche API command dispatchers.\n *\n * Faithful port of the original `evalAvalanche` / `readAvalancheStatus` /\n * `getReport` / `tupleToStats` block from chippy-page-bridge.js\n * (lines ~357–565). Action names, return shapes, and edge cases are\n * preserved exactly so the bridge can replace its inline body with a\n * one-line shim and the helper protocol over the WebSocket continues\n * to work unchanged.\n */\n\n// ─── Type definitions ────────────────────────────────────────────────────\n\nexport type AvalancheApiStatus = {\n installed: boolean;\n hasMetricsGlobal: boolean;\n commitCount: number;\n /** `'adapter:<id>'`, `'devtools'`, or `'none'`. Bundles before the adapter seam report `'atl'`. */\n integrationMode: `adapter:${string}` | 'atl' | 'devtools' | 'none';\n /** Active commit metrics adapter id. Absent on bundles before the adapter seam. */\n metricsAdapter?: string | null;\n};\n\nexport type ReadStatusResult =\n | { ok: true; available: true; status: AvalancheApiStatus }\n | { ok: false; available: boolean; error: string; moduleKeys?: string[] | null; status?: undefined };\n\nexport type AvalancheCommand = {\n action?: string;\n options?: Record<string, unknown>;\n count?: number;\n sourceId?: string;\n hookIndex?: number;\n window?: number;\n limit?: number;\n commitId?: number;\n include?: string[];\n maxItems?: number;\n top?: number;\n by?: string;\n [key: string]: unknown;\n};\n\ntype Reportish = { toSerializable?: () => unknown } & Record<string, unknown>;\n\nexport type AvalancheApi = {\n status?: () => AvalancheApiStatus;\n install?: (options?: Record<string, unknown>) => unknown;\n uninstall?: () => unknown;\n reset?: () => unknown;\n exportLast?: (n?: number) => unknown;\n report?: () => Reportish;\n debugHook?: (sourceId: string, hookIndex: number, windowSize?: number) => unknown;\n [key: string]: unknown;\n};\n\nexport type AvalancheModule = Record<string, unknown>;\n\nexport type EvalAvalancheResult = {\n ok: boolean;\n available: boolean;\n action: string;\n status?: AvalancheApiStatus;\n result?: unknown;\n payload?: unknown;\n error?: string;\n count?: number;\n total?: number;\n rows?: unknown[];\n by?: string;\n validBy?: string[];\n validInclude?: string[];\n commitId?: number;\n found?: boolean;\n};\n\n// ─── Constants ───────────────────────────────────────────────────────────\n\nexport const UPSTREAM_COMMIT_STAT_KEYS = [\n 'collateral',\n 'sources',\n 'restarts',\n 'performedWork',\n 'effects',\n 'memos',\n 'callbacks',\n 'contextUpdates',\n 'unmountedComponents',\n 'unmountedSubtrees',\n] as const;\n\n// ─── Helpers ─────────────────────────────────────────────────────────────\n\nexport function tupleToStats(tuple: unknown): Record<string, number> | null {\n if (!Array.isArray(tuple)) return null;\n const out: Record<string, number> = {};\n for (let i = 0; i < UPSTREAM_COMMIT_STAT_KEYS.length; i++) {\n out[UPSTREAM_COMMIT_STAT_KEYS[i]] = Number(tuple[i] || 0);\n }\n return out;\n}\n\nfunction compactLatestAction(action: any): unknown {\n if (!action || typeof action !== 'object') return action ?? null;\n const location = action.location && typeof action.location === 'object' ? action.location : {};\n const dom = location.dom && typeof location.dom === 'object' ? location.dom : {};\n const targetFiber = location.targetFiber && typeof location.targetFiber === 'object' ? location.targetFiber : null;\n const ownerStack = Array.isArray(targetFiber?.ownerStack) ? targetFiber.ownerStack : [];\n return {\n lastCommitId: Number(action.lastCommitId ?? 0),\n deltaTime: Number(action.deltaTime ?? 0),\n action: typeof action.action === 'string' ? action.action : null,\n dom: {\n tag: typeof dom.tag === 'string' ? dom.tag : null,\n text: typeof dom.text === 'string' ? dom.text : '',\n nearestTestId: typeof dom.nearestTestId === 'string' ? dom.nearestTestId : null,\n },\n targetFiber: targetFiber ? {\n name: typeof targetFiber.name === 'string' ? targetFiber.name : null,\n key: targetFiber.key ?? null,\n ownerStackKind: targetFiber.ownerStackKind === 'parents' ? 'parents' : 'owners',\n ownerNames: ownerStack\n .map((entry: any) => (entry && typeof entry.name === 'string' ? entry.name : null))\n .filter(Boolean)\n .slice(0, 10),\n ownerCount: ownerStack.length,\n } : null,\n };\n}\n\ntype ReportSlice = { raw: Reportish; serial: Record<string, unknown> } | { error: string } | null;\n\nexport function getReport(api: AvalancheApi | null | undefined): ReportSlice {\n if (!api || typeof api.report !== 'function') return null;\n try {\n const r = api.report();\n if (r && typeof (r as Reportish).toSerializable === 'function') {\n return { raw: r as Reportish, serial: (r as Reportish).toSerializable!() as Record<string, unknown> };\n }\n return { raw: r as Reportish, serial: r as Record<string, unknown> };\n } catch (e) {\n return { error: (e as { message?: string })?.message || String(e) };\n }\n}\n\n// ─── Status ──────────────────────────────────────────────────────────────\n\nexport function readAvalancheStatus(\n api: AvalancheApi | null | undefined,\n mod: AvalancheModule | null | undefined,\n): ReadStatusResult {\n if (!api || typeof api.status !== 'function') {\n return {\n ok: false,\n available: !!mod,\n error: '__AVALANCHE__ API not available',\n moduleKeys: mod ? Object.keys(mod) : null,\n };\n }\n try {\n const status = api.status();\n return { ok: true, available: true, status };\n } catch (e) {\n return { ok: false, available: true, error: (e as { message?: string })?.message || String(e) };\n }\n}\n\n// ─── Dispatcher ──────────────────────────────────────────────────────────\n\nexport function evalAvalanche(\n command: AvalancheCommand | null | undefined,\n api: AvalancheApi | null | undefined,\n mod: AvalancheModule | null | undefined,\n): EvalAvalancheResult {\n const action = String(command?.action || 'status');\n if (!api) {\n return { ok: false, available: false, action, error: '__AVALANCHE__ not available' };\n }\n try {\n switch (action) {\n case 'install': {\n const opts = command && typeof command.options === 'object' ? command.options : undefined;\n const res = api.install?.(opts);\n return { ok: true, available: true, action, result: res, status: readAvalancheStatus(api, mod).status };\n }\n case 'uninstall':\n api.uninstall?.();\n return { ok: true, available: true, action, status: readAvalancheStatus(api, mod).status };\n case 'reset':\n case 'clear':\n api.reset?.();\n return { ok: true, available: true, action, status: readAvalancheStatus(api, mod).status };\n case 'status':\n return { ok: true, available: true, action, status: readAvalancheStatus(api, mod).status };\n case 'export': {\n const r = getReport(api);\n if (!r) return { ok: false, available: true, action, error: 'report() unavailable' };\n if ('error' in r) return { ok: false, available: true, action, error: r.error };\n return { ok: true, available: true, action, payload: r.serial };\n }\n case 'export-last': {\n const count = Number(command?.count);\n const n = Number.isFinite(count) && count > 0 ? Math.floor(count) : 1;\n let res: unknown;\n try {\n res = api.exportLast?.(n);\n } catch (e) {\n return { ok: false, available: true, action, error: (e as { message?: string })?.message || String(e) };\n }\n if (res && typeof (res as Reportish).toSerializable === 'function') {\n res = (res as Reportish).toSerializable!();\n }\n return { ok: true, available: true, action, count: n, payload: res };\n }\n case 'debug-hook': {\n const sourceId = String(command?.sourceId || '');\n const hookIndex = Number(command?.hookIndex);\n const windowSize = Number(command?.window);\n if (!sourceId || !Number.isFinite(hookIndex)) {\n return { ok: false, available: true, action, error: 'debug-hook requires sourceId and numeric hookIndex' };\n }\n if (typeof api.debugHook !== 'function') {\n return { ok: false, available: true, action, error: 'debugHook() unavailable on __AVALANCHE__ API' };\n }\n const payload = api.debugHook(\n sourceId,\n Math.floor(hookIndex),\n Number.isFinite(windowSize) ? Math.max(0, Math.floor(windowSize)) : undefined,\n );\n return { ok: true, available: true, action, payload };\n }\n case 'hot-sources': {\n const limit = Number(command?.limit);\n const n = Number.isFinite(limit) && limit > 0 ? Math.floor(limit) : 20;\n const r = getReport(api);\n if (!r || 'error' in r) {\n return { ok: false, available: true, action, error: (r && 'error' in r ? r.error : 'report() unavailable') };\n }\n const sources = Array.isArray((r.serial as { sources?: unknown[] }).sources)\n ? ((r.serial as { sources: unknown[] }).sources as Array<Record<string, unknown>>)\n : [];\n const items = sources\n .slice()\n .sort((a, b) => Number(b?.collateralUpdates || 0) - Number(a?.collateralUpdates || 0))\n .slice(0, n)\n .map((s) => ({\n sourceId: s?.sourceId ?? null,\n depth: Number(s?.depth || 0),\n causedUpdates: Number(s?.causedUpdates || 0),\n collateralUpdates: Number(s?.collateralUpdates || 0),\n maxCollateralUpdates: Number(s?.maxCollateralUpdates || 0),\n maxPenetrationDepth: Number(s?.maxPenetrationDepth || 0),\n restartWaste: Number(s?.restartWaste || 0),\n }));\n return { ok: true, available: true, action, total: sources.length, payload: { count: items.length, items } };\n }\n case 'commit-peek': {\n const commitId = Number(command?.commitId);\n if (!Number.isFinite(commitId)) {\n return { ok: false, available: true, action, error: 'commit-peek requires numeric commitId' };\n }\n const include = Array.isArray(command?.include) && command!.include!.length\n ? command!.include!\n : ['stats', 'sources', 'timing', 'metrics'];\n // `atl` is the deprecated alias of `metrics`, kept for one release.\n const allowedInclude = ['stats', 'sources', 'timing', 'metrics', 'atl', 'unmounts', 'actions', 'rendered'];\n const invalidInclude = include.filter((key) => !allowedInclude.includes(key));\n if (invalidInclude.length) {\n return {\n ok: false,\n available: true,\n action,\n error: 'unsupported commit-peek include value(s): ' + invalidInclude.join(','),\n validInclude: allowedInclude,\n };\n }\n const maxItems = Number.isFinite(Number(command?.maxItems))\n ? Math.max(1, Math.floor(Number(command!.maxItems)))\n : 50;\n const r = getReport(api);\n if (!r || 'error' in r) {\n return { ok: false, available: true, action, error: (r && 'error' in r ? r.error : 'report() unavailable') };\n }\n const ser = (r.serial || {}) as Record<string, Record<string, unknown>>;\n const tuple = ser.commitStats?.[commitId] || ser.commitStats?.[String(commitId)] || null;\n const sourceIds = (ser.sourcesByCommit?.[commitId] || ser.sourcesByCommit?.[String(commitId)] || []) as unknown[];\n const timing = ser.commitTimings?.[commitId] || ser.commitTimings?.[String(commitId)] || null;\n // Bundles before the adapter seam serialize only `atlByCommit`.\n const metricsMap = ser.metricsByCommit || ser.atlByCommit;\n const metrics = metricsMap?.[commitId] || metricsMap?.[String(commitId)] || null;\n const actions = (ser.interactionsByCommit?.[commitId] || ser.interactionsByCommit?.[String(commitId)] || []) as unknown[];\n const rendered = (ser.renderedByCommit?.[commitId] || ser.renderedByCommit?.[String(commitId)] || []) as unknown[];\n if (!tuple && !sourceIds.length && !timing && !metrics && !actions.length && !rendered.length) {\n return { ok: true, available: true, action, commitId, found: false };\n }\n const sourcesById = new Map<unknown, Record<string, unknown>>();\n const allSources = (ser.sources as unknown as Array<Record<string, unknown>>) || [];\n for (const s of allSources) {\n if (s && s.sourceId != null) sourcesById.set(s.sourceId, s);\n }\n const out: Record<string, unknown> = { commitId, found: true };\n if (include.includes('stats')) out.stats = tupleToStats(tuple);\n if (include.includes('sources')) {\n const entries = Array.isArray(sourceIds) ? sourceIds : [];\n const slice = entries.slice(0, maxItems).map((entry) => {\n const e = entry as { sourceId?: unknown; collateral?: unknown; rank?: unknown; trashers?: unknown } | unknown;\n const sid = (typeof e === 'object' && e !== null && 'sourceId' in (e as object))\n ? (e as { sourceId: unknown }).sourceId\n : entry;\n const s = sourcesById.get(sid);\n return s\n ? {\n sourceId: s.sourceId,\n depth: s.depth,\n collateralAtCommit: (typeof e === 'object' && e !== null && 'collateral' in (e as object)) ? (e as { collateral: unknown }).collateral : null,\n rankAtCommit: (typeof e === 'object' && e !== null && 'rank' in (e as object)) ? (e as { rank: unknown }).rank : null,\n trashers: (typeof e === 'object' && e !== null && 'trashers' in (e as object)) ? (e as { trashers: unknown }).trashers : undefined,\n causedUpdatesTotal: s.causedUpdates,\n collateralUpdatesTotal: s.collateralUpdates,\n }\n : { sourceId: sid, missing: true };\n });\n out.sources = slice;\n out.sourcesTotal = entries.length;\n }\n if (include.includes('timing')) out.timing = timing;\n if (include.includes('metrics')) out.metrics = metrics;\n if (include.includes('atl')) out.atl = metrics;\n if (include.includes('actions')) {\n out.actions = actions.slice(0, maxItems);\n out.actionsTotal = actions.length;\n }\n if (include.includes('rendered')) {\n out.rendered = rendered.slice(0, maxItems);\n out.renderedTotal = rendered.length;\n }\n if (include.includes('unmounts')) {\n // Live identity samples live on the raw report (not in DTO/export).\n const raw = (r.raw || {}) as { unmountsByCommit?: Record<number | string, unknown> };\n const samples = (raw.unmountsByCommit?.[commitId] || raw.unmountsByCommit?.[String(commitId)] || null) as\n | Array<{ name: string; key: string | null; depth: number | null; count: number; source?: { fileName?: string; lineNumber?: number; columnNumber?: number } | null }>\n | null;\n out.unmounts = samples ? samples.slice(0, maxItems) : [];\n out.unmountsTotal = Array.isArray(samples) ? samples.length : 0;\n }\n return { ok: true, available: true, action, payload: out };\n }\n case 'describe-action': {\n const actionId = Number(command?.actionId);\n if (!Number.isFinite(actionId)) {\n return { ok: false, available: true, action, error: 'describe-action requires numeric actionId' };\n }\n const r = getReport(api);\n if (!r || 'error' in r) {\n return { ok: false, available: true, action, error: (r && 'error' in r ? r.error : 'report() unavailable') };\n }\n const ser = (r.serial || {}) as Record<string, Record<string, unknown>>;\n const byCommit = ser.interactionsByCommit || {};\n for (const [commitId, items] of Object.entries(byCommit)) {\n const actions = Array.isArray(items) ? items : [];\n const found = actions.find((item: any) => Number(item?.id) === actionId);\n if (found) {\n return {\n ok: true,\n available: true,\n action,\n payload: { actionId, commitId: Number(commitId), found: true, action: found },\n };\n }\n }\n return { ok: true, available: true, action, payload: { actionId, found: false } };\n }\n case 'commit-list': {\n const top = Number.isFinite(Number(command?.top)) ? Math.max(1, Math.floor(Number(command!.top))) : 20;\n const by = String(command?.by || 'collateral');\n const allowedKeys: string[] = (UPSTREAM_COMMIT_STAT_KEYS as readonly string[]).concat(['sources']);\n if (!allowedKeys.includes(by)) {\n return {\n ok: false,\n available: true,\n action,\n error: 'unsupported commit-list sort key: ' + by,\n validBy: allowedKeys,\n };\n }\n const sortKey = by;\n const r = getReport(api);\n if (!r || 'error' in r) {\n return { ok: false, available: true, action, error: (r && 'error' in r ? r.error : 'report() unavailable') };\n }\n const ser = (r.serial || {}) as Record<string, Record<string, unknown>>;\n const stats = ser.commitStats || {};\n const sourcesByCommit = ser.sourcesByCommit || {};\n const ids = Object.keys(stats);\n const rows = ids.map((id) => {\n const tuple = stats[id];\n const stat = tupleToStats(tuple);\n const srcs = sourcesByCommit[id] as unknown;\n const sourceCount = Array.isArray(srcs)\n ? srcs.length\n : srcs && typeof srcs === 'object'\n ? Object.keys(srcs).length\n : 0;\n const actions = (ser.interactionsByCommit?.[id] || []) as unknown[];\n return { commitId: Number(id), stat, sourceCount, latestAction: actions.length ? compactLatestAction(actions[actions.length - 1]) : null };\n });\n rows.sort((a, b) => {\n const av = sortKey === 'sources' ? (a.sourceCount || 0) : (a.stat?.[sortKey] || 0);\n const bv = sortKey === 'sources' ? (b.sourceCount || 0) : (b.stat?.[sortKey] || 0);\n return bv - av;\n });\n return { ok: true, available: true, action, by: sortKey, total: rows.length, rows: rows.slice(0, top) };\n }\n // Removed: start, stop, metrics, help — not present on the current public surface.\n default:\n return { ok: false, available: true, action, error: 'Unknown avalanche action: ' + action };\n }\n } catch (error) {\n return { ok: false, available: true, action, error: (error as { message?: string })?.message || String(error) };\n }\n}\n","/**\n * Pure eval helpers — extracted byte-for-byte from chippy-page-bridge.js.\n *\n * Source: .agents/skills/chippy/extension/chippy-page-bridge.js\n * - evalElementDom (lines 681–724)\n * - evalFiberProps (lines 732–795)\n * - evalFiberPropValue (lines 797–845)\n * - evalFindFibers (lines 956–983)\n *\n * Mechanical extraction rules:\n * - Bodies copied verbatim. Logic, branch order, and string literals\n * untouched.\n * - Closure-bound dependencies (`chippy.layoutLab.getHookSummary`,\n * `resolveOwnerFiber`, `safeSerialize`, `buildScriptHelpers`,\n * `rememberFiber`, `window.getComputedStyle`) become explicit\n * parameters. The bridge supplies them at call time.\n * - No re-authoring, no behavior change.\n */\n\n// These are deliberately read-only adapters. The bridge injects page-bound\n// dependencies at call time so the helpers remain testable without a DOM,\n// while the page-specific fiber registry and computed-style access stay owned\n// by the bridge shell.\n\n// ─── Type aliases (intentionally loose; React internals are duck-typed) ───\n\nexport type Fiber = {\n type?: { displayName?: string; name?: string } | unknown;\n memoizedProps?: Record<string, unknown> | null;\n _debugOwner?: Fiber | null;\n [key: string]: unknown;\n};\n\nexport type HookSummary = {\n hookCount: number | null;\n hookCountTruncated: boolean;\n hookCountMax: number | null;\n};\n\nexport type GetHookSummary = (fiber: Fiber) => HookSummary;\n\nexport type ResolveOwnerFiber = (baseFiber: Fiber, ownerIndex: number) => Fiber | null;\n\nexport type SafeSerialize = (value: unknown, depth: number, seen: Set<unknown>) => unknown;\n\nexport type FiberInfo = {\n name?: string;\n source?: { fileName?: string };\n domTestId?: string;\n domText?: string;\n [key: string]: unknown;\n};\n\nexport type ScriptHelpers = {\n walkAll: (visit: (fiber: Fiber) => void, options?: { limit?: number }) => void;\n fiberInfo: (fiber: Fiber) => FiberInfo | null;\n [key: string]: unknown;\n};\n\nexport type RememberFiber = (fiber: Fiber) => string | number;\n\nexport type FindFibersFilters = {\n name?: string;\n file?: string;\n testid?: string;\n text?: string;\n prop?: string;\n max?: number | string;\n} | null | undefined;\n\nexport type GetComputedStyleFn = (el: Element) => CSSStyleDeclaration;\n\n// ─── evalElementDom ──────────────────────────────────────────────────────\n\nexport function evalElementDom(\n element: Element | null | undefined,\n parentLevel: number | string | null | undefined,\n getComputedStyle: GetComputedStyleFn,\n): unknown {\n let el: Element | null = element || null;\n if (!el || el.nodeType !== 1) return { error: 'Target element is not available' };\n\n const level = Number(parentLevel) || 0;\n for (let i = 0; i < level; i++) {\n if (!el.parentElement) return { error: 'parentLevel ' + level + ' exceeds DOM depth (stopped at ' + i + ')' };\n el = el.parentElement;\n }\n\n const tag = el.tagName.toLowerCase();\n const innerText = ((el as HTMLElement).innerText || '').slice(0, 300);\n const innerHTML = el.innerHTML.slice(0, 500);\n\n const attrs: Record<string, string> = {};\n for (const attr of Array.from(el.attributes)) {\n if (attr.name === 'class') continue;\n attrs[attr.name] = attr.value.slice(0, 120);\n }\n\n const cs = getComputedStyle(el);\n const styles = {\n display: cs.display,\n visibility: cs.visibility,\n color: cs.color,\n fontSize: cs.fontSize,\n fontWeight: cs.fontWeight,\n backgroundColor: cs.backgroundColor,\n cursor: cs.cursor,\n };\n\n const parents: Array<{ tag: string; testId: string | null; id: string | null }> = [];\n let p: Element | null = el.parentElement;\n for (let i = 0; i < 3 && p; i++) {\n parents.push({\n tag: p.tagName.toLowerCase(),\n testId: p.getAttribute('data-testid') || null,\n id: p.id || null,\n });\n p = p.parentElement;\n }\n\n return { tag, innerText, innerHTML, attrs, styles, parents };\n}\n\n// ─── evalFiberProps ──────────────────────────────────────────────────────\n\nexport function evalFiberProps(\n baseFiber: Fiber | null | undefined,\n ownerIndex: number | null | undefined,\n getHookSummary: GetHookSummary | null | undefined,\n resolveOwnerFiber: ResolveOwnerFiber,\n): unknown {\n const targetFiber = ownerIndex == null ? baseFiber : resolveOwnerFiber(baseFiber as Fiber, ownerIndex as number);\n if (!targetFiber) return { error: 'Target fiber not available for ownerIndex ' + ownerIndex };\n\n const props = (targetFiber.memoizedProps || {}) as Record<string, unknown>;\n const t = targetFiber.type as { displayName?: string; name?: string } | undefined;\n const name = t?.displayName || t?.name || 'Unknown';\n const hookSummary = getHookSummary\n ? getHookSummary(targetFiber)\n : { hookCount: null, hookCountTruncated: false, hookCountMax: null };\n\n const pod: Record<string, unknown> = {};\n const nonPod: Array<{ prop: string; type: string; ref: string; terminatesAt: unknown }> = [];\n let refCounter = 0;\n\n const ownerFibersChain: Fiber[] = [];\n let oc: Fiber | null = targetFiber._debugOwner || null;\n while (oc) {\n ownerFibersChain.push(oc);\n oc = oc._debugOwner || null;\n }\n\n for (const [k, v] of Object.entries(props)) {\n if (k === 'children') continue;\n if (v === null || v === undefined) { pod[k] = v; continue; }\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') { pod[k] = v; continue; }\n\n refCounter++;\n const ref = 'REF' + refCounter;\n const type = Array.isArray(v) ? 'array' : typeof v;\n\n let terminatesAt: unknown = null;\n for (let i = 0; i < ownerFibersChain.length; i++) {\n const ownerProps = (ownerFibersChain[i].memoizedProps || {}) as Record<string, unknown>;\n const hasRef = Object.values(ownerProps).some((pv) => pv === v);\n if (!hasRef) {\n const prevType = i > 0 ? ownerFibersChain[i - 1].type as { displayName?: string; name?: string } : null;\n terminatesAt = i === 0\n ? { ownerIndex: -1, name: name + ' (probe component)' }\n : { ownerIndex: i - 1, name: prevType?.displayName || prevType?.name || 'Unknown' };\n break;\n }\n if (i === ownerFibersChain.length - 1) {\n const lastType = ownerFibersChain[i].type as { displayName?: string; name?: string };\n terminatesAt = { ownerIndex: i, name: lastType?.displayName || lastType?.name || 'Unknown', note: 'last known owner' };\n }\n }\n if (!terminatesAt) {\n terminatesAt = { ownerIndex: -1, name: name + ' (no owner chain or not traced)' };\n }\n\n nonPod.push({ prop: k, type, ref, terminatesAt });\n }\n\n const children = props.children;\n let childrenSummary: unknown = null;\n if (children !== undefined) {\n if (children === null) childrenSummary = null;\n else if (typeof children === 'string') childrenSummary = { type: 'string', value: children.slice(0, 60) };\n else if (typeof children === 'number' || typeof children === 'boolean') childrenSummary = { type: typeof children, value: children };\n else if (Array.isArray(children)) childrenSummary = { type: 'array', length: children.length };\n else if (typeof children === 'object') childrenSummary = { type: 'element' };\n else childrenSummary = { type: typeof children };\n }\n\n return { name, ownerIndex: ownerIndex ?? null, ...hookSummary, pod, nonPod, children: childrenSummary };\n}\n\n// ─── evalFiberPropValue ──────────────────────────────────────────────────\n\nexport function evalFiberPropValue(\n baseFiber: Fiber | null | undefined,\n propName: string | null | undefined,\n ownerIndex: number | null | undefined,\n getHookSummary: GetHookSummary | null | undefined,\n resolveOwnerFiber: ResolveOwnerFiber,\n safeSerialize: SafeSerialize,\n): unknown {\n if (!propName) return { error: 'prop name required' };\n const targetFiber = ownerIndex == null ? baseFiber : resolveOwnerFiber(baseFiber as Fiber, ownerIndex as number);\n if (!targetFiber) return { error: 'Target fiber not available for ownerIndex ' + ownerIndex };\n\n const props = (targetFiber.memoizedProps || {}) as Record<string, unknown>;\n const t = targetFiber.type as { displayName?: string; name?: string } | undefined;\n const name = t?.displayName || t?.name || 'Unknown';\n const hookSummary = getHookSummary\n ? getHookSummary(targetFiber)\n : { hookCount: null, hookCountTruncated: false, hookCountMax: null };\n\n if (!(propName in props)) return { error: 'Prop \"' + propName + '\" not found on ' + name + '. Available: ' + Object.keys(props).join(', ') };\n\n const value = props[propName];\n const seen = new Set<unknown>();\n\n function serializeProp(v: unknown): unknown {\n if (v === null || v === undefined) return v;\n if (typeof v === 'string') return v.length > 200 ? v.slice(0, 200) + '…' : v;\n if (typeof v === 'number' || typeof v === 'boolean') return v;\n if (typeof v === 'function') return '[function' + ((v as { name?: string }).name ? ':' + (v as { name?: string }).name : '') + ']';\n if (typeof v === 'symbol') return '[symbol:' + v.toString() + ']';\n if (Array.isArray(v)) {\n if (v.length === 0) return [];\n return v.slice(0, 5).map((item) => safeSerialize(item, 0, new Set())).concat(v.length > 5 ? ['[…' + (v.length - 5) + ' more]'] : []);\n }\n if (typeof v === 'object') {\n if (seen.has(v)) return '[circular]';\n seen.add(v);\n const obj = v as Record<string, unknown>;\n const keys = Object.keys(obj);\n const result: Record<string, unknown> = {};\n for (const k of keys.slice(0, 12)) {\n try { result[k] = safeSerialize(obj[k], 0, new Set()); } catch { result[k] = '[error]'; }\n }\n if (keys.length > 12) result['…'] = '[' + (keys.length - 12) + ' more keys]';\n return result;\n }\n return String(v);\n }\n\n return {\n name,\n ownerIndex: ownerIndex ?? null,\n ...hookSummary,\n prop: propName,\n type: Array.isArray(value) ? 'array' : typeof value,\n value: serializeProp(value),\n };\n}\n\n// ─── evalFindFibers ──────────────────────────────────────────────────────\n\nexport function evalFindFibers(\n filters: FindFibersFilters,\n helpers: ScriptHelpers,\n rememberFiber: RememberFiber,\n): { count: number; items: Array<Record<string, unknown>> } {\n const nameRe = filters?.name ? new RegExp(String(filters.name), 'i') : null;\n const fileRe = filters?.file ? new RegExp(String(filters.file), 'i') : null;\n const testIdRe = filters?.testid ? new RegExp(String(filters.testid), 'i') : null;\n const textRe = filters?.text ? new RegExp(String(filters.text), 'i') : null;\n const propName = filters?.prop ? String(filters.prop) : null;\n const max = Number.isFinite(Number(filters?.max)) ? Math.max(1, Math.floor(Number(filters?.max))) : 50;\n const matches: Array<Record<string, unknown>> = [];\n\n helpers.walkAll((fiber) => {\n if (matches.length >= max) return;\n const info = helpers.fiberInfo(fiber);\n if (!info?.name) return;\n if (nameRe && !nameRe.test(info.name)) return;\n if (fileRe && !fileRe.test(info.source?.fileName || '')) return;\n if (testIdRe && !testIdRe.test(info.domTestId || '')) return;\n if (textRe && !textRe.test(info.domText || '')) return;\n if (propName) {\n const props = fiber?.memoizedProps;\n if (!props || typeof props !== 'object' || !(propName in props)) return;\n }\n const fiberId = rememberFiber(fiber);\n matches.push({ fiberId, ...info });\n }, { limit: 200000 });\n\n return { count: matches.length, items: matches };\n}\n\n// ─── resolveFindFiberSources ─────────────────────────────────────────────\n\n/**\n * Replace each `find-fibers` item's synchronous source with the source-mapped\n * one. The walk reads sources synchronously; React 19 call sites and shifted\n * React <=18 `_debugSource` lines need the served module's map first.\n */\nexport async function resolveFindFiberSources<S>(\n items: Array<Record<string, unknown>>,\n getFiber: (fiberId: string) => Fiber | null | undefined,\n resolve: (fiber: Fiber) => Promise<S | null>,\n): Promise<void> {\n await Promise.all(items.map(async (item) => {\n const fiber = item.fiberId == null ? null : getFiber(String(item.fiberId));\n if (!fiber) return;\n try {\n const source = await resolve(fiber);\n if (source) item.source = source;\n } catch {}\n }));\n}\n","/**\n * Fiber introspection helpers — extracted byte-for-byte from chippy-page-bridge.js.\n *\n * Source: .agents/skills/chippy/extension/chippy-page-bridge.js\n * - safeJson (lines 539–559)\n * - resolveOwnerFiber (lines 774–788)\n * - findFiberByName (lines 908–918)\n * - inspectFiberOwners (lines 997–1009; bridge fn name evalInspectFiberOwners)\n * - inspectFiberStructure (lines 858–900; bridge fn name evalInspectFiberStructure)\n *\n * Mechanical extraction rules:\n * - Bodies copied verbatim. Logic, branch order, string literals untouched.\n * - Closure-bound deps (`buildScriptHelpers`, `getRememberedFiber`,\n * `replayComponentHooks`, `evalFiberHooks`) become explicit parameters.\n * The bridge supplies them at call time.\n */\n\n// These helpers are transport-safe read paths. They may inspect React's\n// private fiber objects, but they must not mutate fibers or execute product\n// callbacks; active behavior belongs to fiber-invoke and explicit stimuli.\nimport type { Fiber, ScriptHelpers } from './eval-helpers';\n\n// ─── safeJson ────────────────────────────────────────────────────────────\n\nexport function safeJson(value: unknown, depth: number = 6, seen: WeakSet<object> = new WeakSet()): unknown {\n // Fiber graphs contain cycles and functions, so JSON.stringify is not a\n // safe transport boundary. The depth/item caps make diagnostics terminate\n // even for unusually large props or recursive application objects.\n if (value == null) return value;\n const t = typeof value;\n if (t === 'string' || t === 'number' || t === 'boolean') return value;\n if (t === 'function') return '[Function ' + ((value as { name?: string }).name || 'anonymous') + ']';\n if (t === 'symbol' || t === 'bigint') return String(value);\n if (depth <= 0) return Array.isArray(value) ? '[Array]' : '[Object]';\n if (typeof value === 'object') {\n if (seen.has(value as object)) return '[Circular]';\n seen.add(value as object);\n if (Array.isArray(value)) return value.slice(0, 200).map((v) => safeJson(v, depth - 1, seen));\n const out: Record<string, unknown> = {};\n let n = 0;\n for (const k of Object.keys(value as object)) {\n if (n++ > 200) { out._truncated = true; break; }\n try { out[k] = safeJson((value as Record<string, unknown>)[k], depth - 1, seen); } catch (_) { out[k] = '[Unserializable]'; }\n }\n return out;\n }\n return String(value);\n}\n\n// ─── resolveOwnerFiber ───────────────────────────────────────────────────\n\nexport function resolveOwnerFiber(baseFiber: Fiber | null | undefined, ownerIndex: number | string | null | undefined): Fiber | null {\n let f: Fiber | null = baseFiber?._debugOwner || null;\n let count = 0;\n const target = ownerIndex != null ? Number(ownerIndex) : null;\n while (f) {\n const t = f.type as { $$typeof?: unknown; render?: unknown } | unknown;\n const isComponent =\n typeof t === 'function' ||\n (typeof t === 'object' && t !== null && ((t as { $$typeof?: unknown }).$$typeof || (t as { render?: unknown }).render));\n if (isComponent) {\n if (target !== null && count === target) return f;\n count++;\n }\n f = f._debugOwner || null;\n }\n return null;\n}\n\n// ─── findFiberByName ─────────────────────────────────────────────────────\n\nexport function findFiberByName(name: string, helpers: ScriptHelpers): Fiber | null {\n const re = new RegExp('^' + String(name).replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '$');\n let found: Fiber | null = null;\n helpers.walkAll((fiber: Fiber) => {\n if (found) return;\n const info = helpers.fiberInfo(fiber);\n if (info?.name && re.test(info.name)) found = fiber;\n }, { limit: 200000 });\n return found;\n}\n\n// ─── inspectFiberOwners ──────────────────────────────────────────────────\n\nexport function inspectFiberOwners(fiber: Fiber, fiberId: string | number, helpers: ScriptHelpers): unknown {\n const owners: Array<Record<string, unknown>> = [];\n let owner: Fiber | null = fiber._debugOwner || null;\n let idx = 0;\n while (owner && idx < 100) {\n owners.push({ ownerIndex: idx, ...(helpers.fiberInfo(owner) || {}) });\n owner = owner._debugOwner || null;\n idx++;\n }\n return { fiberId: String(fiberId), count: owners.length, items: owners };\n}\n\n// ─── inspectFiberStructure ───────────────────────────────────────────────\n// Mirrors evalInspectFiberStructure from the bridge. Replay/hookCount are\n// supplied by the caller via injected `replayComponentHooks` and\n// `evalFiberHooks` (both bundled separately in __AVALANCHE__.replay).\n\ntype ReplayResult = {\n componentName: string;\n records: Array<{ index: number; primitive: string; value?: unknown; path?: Array<{ name: string }>; debugLabel?: unknown }>;\n replayAttempted: boolean;\n replayError?: string | null;\n replayErrorDetails?: unknown;\n replayStatus?: string;\n};\n\ntype ReplayFn = (fiber: Fiber) => ReplayResult;\ntype EvalFiberHooksFn = (fiber: Fiber) => { hookCount: number };\n\nexport function inspectFiberStructure(\n fiber: Fiber,\n fiberId: string | number,\n hookIndex: number | string,\n windowSize: number | string | null | undefined,\n replayComponentHooks: ReplayFn,\n evalFiberHooks: EvalFiberHooksFn,\n): unknown {\n const { componentName, records, replayAttempted, replayError, replayErrorDetails, replayStatus } = replayComponentHooks(fiber);\n const targetIndex = Number(hookIndex);\n const target = records.find((r) => r.index === targetIndex);\n const liveHookCount = evalFiberHooks(fiber).hookCount;\n const warnings: string[] = [];\n if (!replayAttempted) warnings.push('fiber-only fallback: component functions were not executed');\n if (replayError) warnings.push('structure-render error: ' + replayError);\n\n if (!target) {\n return { ok: false, status: 'hook-not-found', componentName, fiberId: String(fiberId), requestedHookIndex: targetIndex, hookCount: liveHookCount, liveHookCount, replayedHookCount: 0, replayStatus: 'not-run-fiber-only', captureEngineOk: true, warnings };\n }\n\n const radius = Math.max(0, Number(windowSize) || 3);\n const folderRecs = records.filter((r) => Math.abs(r.index - targetIndex) <= radius);\n const lines = [componentName];\n for (const r of folderRecs) {\n const mark = r.index === targetIndex ? ' ← target' : '';\n lines.push('└─ hook ' + r.index + ' ' + r.primitive + mark);\n }\n\n return {\n ok: true,\n status: 'ok',\n componentName,\n fiberId: String(fiberId),\n requestedHookIndex: targetIndex,\n hookCount: liveHookCount,\n liveHookCount,\n replayedHookCount: 0,\n replayStatus: replayStatus || 'fiber-only-fallback',\n text: lines.join('\\n'),\n target: { hookId: target.index, type: target.primitive, value: target.value, parents: (target.path || []).map((p) => p.name).concat([componentName]), parentsWithLoc: target.path || [], debugLabel: target.debugLabel },\n folder: folderRecs.map((r) => ({ hookId: r.index, type: r.primitive, value: r.value, target: r.index === targetIndex, path: r.path || [], debugLabel: r.debugLabel })),\n captureEngineOk: !!replayAttempted,\n warnings,\n replayError: replayError || undefined,\n replayErrorDetails: replayErrorDetails || undefined,\n };\n}\n","/**\n * fiber-invoke — extract from chippy-page-bridge.js with three correctness fixes.\n *\n * Source: .agents/skills/chippy/extension/chippy-page-bridge.js\n * - readFiberProp (lines 775–790)\n * - getFiberDisplayName (lines 792–794)\n * - functionSourcePreview (lines 796–803)\n * - getFiberSource (lines 805–813)\n * - summarizeFunctionContract (lines 815–826)\n * - evalFiberPropContract (lines 828–848)\n * - evalFiberInvoke (lines 850–880)\n *\n * Fixes vs the shim:\n * 1. `value.apply(null, args)` → `value.apply(thisArg, args)` where thisArg is\n * `fiber.stateNode` for class components and `undefined` otherwise.\n * 2. Wrap `apply` in try/catch and return `{ ok: false, error, threw: true }`.\n * A throwing user callback must not hang the bridge.\n * 3. If the return value is a thenable, await it with a timeout and serialize\n * the resolved value.\n */\n\nimport { getFiberSource as readFiberSource } from './fiber-source';\n\nexport type Fiber = {\n tag?: number;\n type?: { displayName?: string; name?: string } | unknown;\n stateNode?: unknown;\n memoizedProps?: Record<string, unknown> | null;\n _debugSource?: { fileName?: string; lineNumber?: number; columnNumber?: number } | null;\n _debugStack?: unknown;\n [key: string]: unknown;\n};\n\nexport type NormalizeRememberedFiberId = (raw: unknown) => string | null;\nexport type GetRememberedFiber = (id: string) => Fiber | null;\nexport type SafeSerialize = (value: unknown, depth?: number, seen?: Set<unknown>) => unknown;\n\nexport type ReadFiberPropResult =\n | { ok: true; fiberId: string; fiber: Fiber; props: Record<string, unknown>; propName: string; value: unknown; error?: undefined }\n | { ok: false; error: string; fiberId?: string; fiber?: Fiber; props?: Record<string, unknown> };\n\nexport interface FiberInvokeDeps {\n normalizeRememberedFiberId: NormalizeRememberedFiberId;\n getRememberedFiber: GetRememberedFiber;\n safeSerialize: SafeSerialize;\n /** Optional. Default 2000ms. Promise resolution timeout for async callbacks. */\n awaitTimeoutMs?: number;\n}\n\n// Invocation is the explicitly active bridge capability. Its caller must\n// prove the prop is callable first; this module still rechecks the contract so\n// stale fiber IDs and changing props fail as a structured result rather than\n// turning an inspection command into an unhandled page exception.\n\nconst REACT_TAG_CLASS_COMPONENT = 1;\n\nexport function readFiberProp(\n fiberId: unknown,\n propName: unknown,\n deps: Pick<FiberInvokeDeps, 'normalizeRememberedFiberId' | 'getRememberedFiber'>,\n): ReadFiberPropResult {\n const rememberedFiberId = deps.normalizeRememberedFiberId(fiberId);\n if (!rememberedFiberId) return { ok: false, error: 'fiberId is required' };\n const name = String(propName || '').trim();\n if (!name) return { ok: false, error: 'propName is required' };\n const fiber = deps.getRememberedFiber(rememberedFiberId);\n if (!fiber) return { ok: false, error: `fiber ${rememberedFiberId} not found`, fiberId: rememberedFiberId };\n const props = fiber.memoizedProps;\n if (!props || typeof props !== 'object') {\n return { ok: false, error: `fiber ${rememberedFiberId} has no props`, fiberId: rememberedFiberId, fiber };\n }\n if (!(name in props)) {\n return { ok: false, error: `prop ${name} not found on fiber ${rememberedFiberId}`, fiberId: rememberedFiberId, fiber, props: props as Record<string, unknown> };\n }\n return { ok: true, fiberId: rememberedFiberId, fiber, props: props as Record<string, unknown>, propName: name, value: (props as Record<string, unknown>)[name] };\n}\n\nexport function getFiberDisplayName(fiber: Fiber | null | undefined): string {\n const type = fiber?.type as { displayName?: string; name?: string } | undefined;\n return (type && (type.displayName || type.name)) || 'Unknown';\n}\n\nexport function functionSourcePreview(fn: unknown, max = 800): string | null {\n try {\n const source = Function.prototype.toString.call(fn);\n return source.length > max ? source.slice(0, max) + '…' : source;\n } catch (_e) {\n return null;\n }\n}\n\nexport function getFiberSource(fiber: Fiber | null | undefined): { fileName: string | null; lineNumber: number | null; columnNumber: number | null } | null {\n return readFiberSource(fiber);\n}\n\nexport function summarizeFunctionContract(value: unknown): { propType: string; isFunction: boolean; fnLength: number | null; fnName: string | null; fnSourcePreview: string | null } {\n if (typeof value !== 'function') {\n return { propType: typeof value, isFunction: false, fnLength: null, fnName: null, fnSourcePreview: null };\n }\n return {\n propType: 'function',\n isFunction: true,\n fnLength: Number.isFinite((value as { length: number }).length) ? (value as { length: number }).length : null,\n fnName: (value as { name?: string }).name || null,\n fnSourcePreview: functionSourcePreview(value),\n };\n}\n\nexport function evalFiberPropContract(\n fiberId: unknown,\n propName: unknown,\n deps: Pick<FiberInvokeDeps, 'normalizeRememberedFiberId' | 'getRememberedFiber'>,\n): unknown {\n const read = readFiberProp(fiberId, propName, deps);\n if (!read.ok) {\n const fiberName = read.fiber ? getFiberDisplayName(read.fiber) : null;\n return { ok: false, error: read.error, fiberId: read.fiberId, fiberName, propNames: read.props ? Object.keys(read.props) : [] };\n }\n const propNames = Object.keys(read.props);\n const contract = summarizeFunctionContract(read.value);\n return {\n ok: true,\n fiberId: read.fiberId,\n fiberName: getFiberDisplayName(read.fiber),\n source: getFiberSource(read.fiber),\n propName: read.propName,\n propNames,\n ...contract,\n nextStep: contract.isFunction\n ? 'Read the component/owner source to determine the callback argument contract before fiber-invoke.'\n : 'This prop is not callable; do not fiber-invoke it.',\n };\n}\n\nfunction isThenable(value: unknown): value is PromiseLike<unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function') && typeof (value as { then?: unknown }).then === 'function';\n}\n\nfunction pickThisArg(fiber: Fiber): unknown {\n if (fiber.tag === REACT_TAG_CLASS_COMPONENT && fiber.stateNode != null) {\n return fiber.stateNode;\n }\n return undefined;\n}\n\nexport async function evalFiberInvoke(\n fiberId: unknown,\n propName: unknown,\n args: unknown,\n deps: FiberInvokeDeps,\n): Promise<unknown> {\n const read = readFiberProp(fiberId, propName, deps);\n if (!read.ok) {\n const fiberName = read.fiber ? getFiberDisplayName(read.fiber) : null;\n return { ok: false, error: read.error, fiberId: read.fiberId, fiberName };\n }\n const value = read.value;\n if (typeof value !== 'function') {\n return {\n ok: false,\n error: `prop ${read.propName} is not a function`,\n fiberId: read.fiberId,\n fiberName: getFiberDisplayName(read.fiber),\n propName: read.propName,\n propType: typeof value,\n };\n }\n const invokeArgs = Array.isArray(args) ? args : [];\n const thisArg = pickThisArg(read.fiber);\n let result: unknown;\n try {\n result = (value as (...a: unknown[]) => unknown).apply(thisArg, invokeArgs);\n } catch (e) {\n const err = e as { message?: string; stack?: string };\n return {\n ok: false,\n error: err?.message || String(e),\n stack: err?.stack || null,\n threw: true,\n fiberId: read.fiberId,\n fiberName: getFiberDisplayName(read.fiber),\n propName: read.propName,\n propType: 'function',\n args: deps.safeSerialize(invokeArgs, 0, new Set()),\n };\n }\n\n const base = {\n ok: true as const,\n fiberId: read.fiberId,\n fiberName: getFiberDisplayName(read.fiber),\n propName: read.propName,\n propType: 'function' as const,\n fnLength: Number.isFinite((value as { length: number }).length) ? (value as { length: number }).length : null,\n invoked: true as const,\n args: deps.safeSerialize(invokeArgs, 0, new Set()),\n };\n\n if (isThenable(result)) {\n const timeoutMs = Math.max(1, Math.min(30000, deps.awaitTimeoutMs ?? 2000));\n try {\n const resolved = await Promise.race([\n Promise.resolve(result),\n new Promise<never>((_, reject) => setTimeout(() => reject(new Error(`async callback did not resolve within ${timeoutMs}ms`)), timeoutMs)),\n ]);\n return { ...base, async: true, returnValue: deps.safeSerialize(resolved, 0, new Set()) };\n } catch (e) {\n const err = e as { message?: string; stack?: string };\n return {\n ok: false,\n async: true,\n error: err?.message || String(e),\n stack: err?.stack || null,\n threw: false,\n rejected: true,\n fiberId: read.fiberId,\n fiberName: getFiberDisplayName(read.fiber),\n propName: read.propName,\n propType: 'function',\n args: deps.safeSerialize(invokeArgs, 0, new Set()),\n };\n }\n }\n\n return { ...base, async: false, returnValue: deps.safeSerialize(result, 0, new Set()) };\n}\n","/**\n * fiber-schedule-update — force one re-render on a single fiber.\n *\n * This is the CAPABILITY behind the `stability-nudge` procedure. It is core,\n * React-internals-coupled behavior, so it lives in the bundle (not in a dynamic\n * eval snippet): the snippet composes the procedure (probe/testId resolution,\n * owner walk, labels) on top of this one capability.\n *\n * Mechanism: the React DevTools renderer's `scheduleUpdate(fiber)` — the exact\n * call React DevTools itself uses to force a component to re-render. In a dev\n * react-dom build it is:\n *\n * scheduleUpdate = function (fiber) {\n * var root = enqueueConcurrentRenderForLane(fiber, SyncLane);\n * if (root !== null) scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);\n * };\n *\n * Properties that make this the only strategy worth shipping:\n * - Universal: works on ANY composite fiber — function components (including\n * hookless ones), memo, forwardRef, and class components alike.\n * - Zero pollution: marks a lane and schedules; it does NOT mutate any hook\n * value or prop. No \"nudge anchor\" to keep clean.\n * - React-sanctioned: it is the mechanism React ships for DevTools, not a\n * hand-rolled lane write.\n *\n * Dev-build only: `scheduleUpdate` is registered only in development React\n * builds, and only when the DevTools-hook shim was present before react-dom\n * evaluated. On production it is absent → `no-scheduleUpdate`.\n */\n\nimport { getFiberSource as readFiberSource } from './fiber-source';\nimport { getScheduleUpdate, type ReactRenderer } from './react-renderer';\n\nexport type Fiber = {\n type?: { displayName?: string; name?: string } | unknown;\n elementType?: { displayName?: string; name?: string } | unknown;\n _debugSource?: { fileName?: string; lineNumber?: number; columnNumber?: number } | null;\n _debugStack?: unknown;\n _debugOwner?: Fiber | null;\n [key: string]: unknown;\n};\n\nexport type NormalizeRememberedFiberId = (raw: unknown) => string | null;\nexport type GetRememberedFiber = (id: string) => Fiber | null | undefined;\n\nexport interface FiberScheduleUpdateDeps {\n normalizeRememberedFiberId: NormalizeRememberedFiberId;\n getRememberedFiber: GetRememberedFiber;\n /** Optional override for renderer discovery; defaults to the live DevTools hook. */\n getScheduleUpdate?: (scope?: typeof globalThis) => ((fiber: unknown) => void) | null;\n /** Optional scope override (tests). Defaults to globalThis. */\n scope?: typeof globalThis;\n}\n\nexport function getFiberDisplayName(fiber: Fiber | null | undefined): string {\n if (!fiber) return 'Unknown';\n const fromType = fiber.type as { displayName?: string; name?: string } | undefined;\n const fromElement = fiber.elementType as { displayName?: string; name?: string } | undefined;\n return (\n (fromType && (fromType.displayName || fromType.name)) ||\n (fromElement && (fromElement.displayName || fromElement.name)) ||\n 'Unknown'\n );\n}\n\nexport function getFiberSource(\n fiber: Fiber | null | undefined,\n): { fileName: string | null; lineNumber: number | null; columnNumber: number | null } | null {\n return readFiberSource(fiber);\n}\n\n/** Walk N steps up the `_debugOwner` chain. Returns null if it overshoots. */\nfunction walkOwner(fiber: Fiber, ownerIndex: number): Fiber | null {\n let current: Fiber | null = fiber;\n let walked = 0;\n while (walked < ownerIndex && current) {\n current = (current._debugOwner as Fiber | null) || null;\n walked++;\n }\n return current;\n}\n\nexport type FiberScheduleUpdateResult =\n | {\n ok: true;\n fiberId: string;\n fiberName: string;\n source: ReturnType<typeof getFiberSource>;\n ownerIndex: number;\n scheduled: true;\n }\n | {\n ok: false;\n error: string;\n reason: 'no-fiberId' | 'fiber-not-found' | 'owner-out-of-range' | 'no-scheduleUpdate' | 'scheduleUpdate-threw';\n fiberId?: string | null;\n fiberName?: string;\n source?: ReturnType<typeof getFiberSource>;\n ownerIndex?: number;\n stack?: string | null;\n };\n\n/**\n * Resolve a remembered fiber id → fiber, optionally climb `ownerIndex` steps,\n * then call the DevTools renderer's `scheduleUpdate` on it. Schedules exactly\n * one re-render. Mutates nothing.\n */\nexport function evalFiberScheduleUpdate(\n fiberId: unknown,\n ownerIndex: unknown,\n deps: FiberScheduleUpdateDeps,\n): FiberScheduleUpdateResult {\n const rememberedFiberId = deps.normalizeRememberedFiberId(fiberId);\n if (!rememberedFiberId) {\n return { ok: false, reason: 'no-fiberId', error: 'fiberId is required' };\n }\n\n let fiber = deps.getRememberedFiber(rememberedFiberId) as Fiber | null | undefined;\n if (!fiber) {\n return { ok: false, reason: 'fiber-not-found', error: `fiber ${rememberedFiberId} not found`, fiberId: rememberedFiberId };\n }\n\n const idx = Number.isFinite(Number(ownerIndex)) ? Math.max(0, Number(ownerIndex) | 0) : 0;\n const target = walkOwner(fiber, idx);\n if (!target) {\n return {\n ok: false,\n reason: 'owner-out-of-range',\n error: `ownerIndex ${idx} overshoots the owner chain for fiber ${rememberedFiberId}`,\n fiberId: rememberedFiberId,\n ownerIndex: idx,\n };\n }\n\n const fiberName = getFiberDisplayName(target);\n const source = getFiberSource(target);\n\n const resolveSchedule = deps.getScheduleUpdate || getScheduleUpdate;\n const scheduleUpdate = resolveSchedule(deps.scope);\n if (!scheduleUpdate) {\n return {\n ok: false,\n reason: 'no-scheduleUpdate',\n error:\n 'no renderer.scheduleUpdate (production React build, or the DevTools-hook shim was not installed before react-dom evaluated)',\n fiberId: rememberedFiberId,\n fiberName,\n source,\n ownerIndex: idx,\n };\n }\n\n try {\n scheduleUpdate(target);\n } catch (e) {\n const err = e as { message?: string; stack?: string };\n return {\n ok: false,\n reason: 'scheduleUpdate-threw',\n error: err?.message || String(e),\n stack: err?.stack || null,\n fiberId: rememberedFiberId,\n fiberName,\n source,\n ownerIndex: idx,\n };\n }\n\n return { ok: true, fiberId: rememberedFiberId, fiberName, source, ownerIndex: idx, scheduled: true };\n}\n\n// Re-export so the iife bridge can surface renderer discovery if needed.\nexport type { ReactRenderer };\n","/**\n * Compact, read-only React fiber state capture and structural comparison.\n *\n * Captures retain hashes and short previews rather than complete prop values.\n * This makes them suitable for helper-side retention while comparison results\n * stay small enough to use as an investigation index.\n */\n\nimport { getFiberSourceCandidate } from './fiber-source';\n\ntype Fiber = {\n tag?: number;\n key?: unknown;\n type?: unknown;\n elementType?: unknown;\n memoizedProps?: Record<string, unknown> | null;\n child?: Fiber | null;\n sibling?: Fiber | null;\n alternate?: Fiber | null;\n current?: Fiber | null;\n _debugSource?: SourceLike | null;\n _debugStack?: unknown;\n};\n\ntype SourceLike = {\n fileName?: unknown;\n lineNumber?: unknown;\n columnNumber?: unknown;\n};\n\nexport type FiberStateProp = {\n kind: string;\n hash: string;\n preview: string;\n truncated: boolean;\n};\n\nexport type FiberStateEntry = {\n id: string;\n token: string;\n name: string;\n key: string | null;\n tag: number | null;\n source: { fileName: string; lineNumber: number | null; columnNumber: number | null } | null;\n props: Record<string, FiberStateProp>;\n};\n\nexport type FiberStateCapture = {\n version: 1;\n capturedAt: string;\n page: { url: string | null; title: string | null };\n fiberCount: number;\n truncated: boolean;\n fibers: FiberStateEntry[];\n};\n\nexport type CaptureFiberStateDeps = {\n getRootFibers: () => Fiber[];\n getDisplayName: (fiber: Fiber) => string | null;\n};\n\nexport type FiberStateDiff = {\n ok: true;\n before: FiberStateCapture['page'] & { capturedAt: string };\n after: FiberStateCapture['page'] & { capturedAt: string };\n summary: {\n beforeFibers: number;\n afterFibers: number;\n matchedFibers: number;\n changedFibers: number;\n addedFibers: number;\n removedFibers: number;\n propChanges: number;\n returnedChanges: number;\n captureTruncated: boolean;\n changesTruncated: boolean;\n truncated: boolean;\n };\n changes: Array<Record<string, unknown>>;\n};\n\ntype FingerprintBudget = { remaining: number; truncated: boolean };\n\nfunction fnv1a(value: string): string {\n let hash = 0xcbf29ce484222325n;\n for (let i = 0; i < value.length; i++) {\n hash ^= BigInt(value.charCodeAt(i));\n hash = BigInt.asUintN(64, hash * 0x100000001b3n);\n }\n return hash.toString(16).padStart(16, '0');\n}\n\nfunction valueKind(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n if (value instanceof Date) return 'date';\n if (value instanceof RegExp) return 'regexp';\n if (value instanceof Map) return 'map';\n if (value instanceof Set) return 'set';\n if (typeof value === 'object' && value && '$$typeof' in value) return 'element';\n return typeof value;\n}\n\nfunction previewValue(value: unknown): string {\n if (value === null) return 'null';\n if (value === undefined) return 'undefined';\n if (typeof value === 'string') return JSON.stringify(value.length > 100 ? value.slice(0, 100) + '…' : value);\n if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') return String(value);\n if (typeof value === 'function') return `[function:${value.name || 'anonymous'}/${value.length}]`;\n if (typeof value === 'symbol') return String(value);\n if (Array.isArray(value)) {\n const items = value.slice(0, 6).map((item) => {\n if (item === null || item === undefined || ['string', 'number', 'boolean', 'bigint'].includes(typeof item)) {\n return previewValue(item);\n }\n return `[${valueKind(item)}]`;\n });\n return `[${items.join(', ')}${value.length > 6 ? ', …' : ''}]`;\n }\n if (value instanceof Map) return `{Map:${value.size}}`;\n if (value instanceof Set) return `{Set:${value.size}}`;\n if (value instanceof Date) return value.toISOString();\n if (value instanceof RegExp) return String(value);\n if (typeof value === 'object') {\n const object = value as Record<string, unknown>;\n if ('$$typeof' in object) {\n const type = object.type as { displayName?: string; name?: string } | string | undefined;\n const name = typeof type === 'string' ? type : type?.displayName || type?.name || 'element';\n return `<${name}>`;\n }\n let keys: string[] = [];\n try { keys = Object.keys(object); } catch { return '{unreadable}'; }\n const shown = keys.slice(0, 6).map((key) => {\n let item: unknown;\n try { item = object[key]; } catch { return `${key}:[error]`; }\n if (item === null || item === undefined || ['string', 'number', 'boolean', 'bigint'].includes(typeof item)) {\n return `${key}:${previewValue(item)}`;\n }\n return `${key}:[${valueKind(item)}]`;\n });\n return `{${shown.join(', ')}${keys.length > 6 ? ', …' : ''}}`;\n }\n return String(value);\n}\n\nfunction canonicalValue(value: unknown, seen: Map<object, number>, budget: FingerprintBudget, depth = 0): string {\n if (budget.remaining-- <= 0 || depth > 12) {\n budget.truncated = true;\n return '[truncated]';\n }\n if (value === null) return 'null';\n const type = typeof value;\n if (type === 'undefined') return 'undefined';\n if (type === 'string') return `string:${value as string}`;\n if (type === 'number') return `number:${Object.is(value, -0) ? '-0' : String(value)}`;\n if (type === 'boolean' || type === 'bigint') return `${type}:${String(value)}`;\n if (type === 'symbol') return `symbol:${String(value)}`;\n if (type === 'function') {\n const fn = value as Function;\n return `function:${fn.name || 'anonymous'}:${fn.length}`;\n }\n\n const object = value as Record<string, unknown>;\n if (typeof object.nodeType === 'number' && typeof object.nodeName === 'string') {\n const element = object as Record<string, any>;\n return `dom:${object.nodeType}:${object.nodeName}:${String(element.id || '')}:${String(element.getAttribute?.('data-testid') || '')}`;\n }\n if ((object as any).window === object) return '[window]';\n const objectTag = Object.prototype.toString.call(object);\n if (objectTag === '[object Promise]' || objectTag === '[object WeakMap]' || objectTag === '[object WeakSet]') return objectTag;\n const seenId = seen.get(object);\n if (seenId != null) return `[ref:${seenId}]`;\n seen.set(object, seen.size + 1);\n\n if (Array.isArray(object)) {\n return `array:${object.length}:[${object.map((item) => canonicalValue(item, seen, budget, depth + 1)).join(',')}]`;\n }\n if (object instanceof Date) return `date:${object.toISOString()}`;\n if (object instanceof RegExp) return `regexp:${String(object)}`;\n if (object instanceof Map) {\n const entries = Array.from(object.entries()).map(([key, item]) =>\n `${canonicalValue(key, seen, budget, depth + 1)}=>${canonicalValue(item, seen, budget, depth + 1)}`,\n ).sort();\n return `map:${object.size}:{${entries.join(',')}}`;\n }\n if (object instanceof Set) {\n const entries = Array.from(object.values()).map((item) => canonicalValue(item, seen, budget, depth + 1)).sort();\n return `set:${object.size}:{${entries.join(',')}}`;\n }\n if ('$$typeof' in object) {\n const elementType = object.type as { displayName?: string; name?: string } | string | undefined;\n const name = typeof elementType === 'string' ? elementType : elementType?.displayName || elementType?.name || 'element';\n return `element:${name}:${String(object.key ?? '')}:${canonicalValue(object.props, seen, budget, depth + 1)}`;\n }\n\n let keys: string[];\n try { keys = Object.keys(object).sort(); } catch {\n budget.truncated = true;\n return '[unreadable-object]';\n }\n const fields: string[] = [];\n for (const key of keys) {\n if (budget.remaining <= 0) { budget.truncated = true; break; }\n let item: unknown;\n try { item = object[key]; } catch { item = '[getter-threw]'; }\n fields.push(`${key}:${canonicalValue(item, seen, budget, depth + 1)}`);\n }\n const ctor = object.constructor && object.constructor !== Object ? object.constructor.name : 'object';\n return `${ctor}:{${fields.join(',')}}`;\n}\n\nexport function fingerprintFiberProp(value: unknown): FiberStateProp {\n const budget: FingerprintBudget = { remaining: 10_000, truncated: false };\n const canonical = canonicalValue(value, new Map(), budget);\n return {\n kind: valueKind(value),\n hash: fnv1a(canonical),\n preview: previewValue(value),\n truncated: budget.truncated,\n };\n}\n\nfunction readSource(fiber: Fiber): FiberStateEntry['source'] {\n // Capture identity must not change merely because an async map lookup warmed\n // between two captures. The generated React 19 call site is stable for this\n // structural token; presentation paths may use the mapped location.\n return getFiberSourceCandidate(fiber);\n}\n\nfunction fiberToken(fiber: Fiber, name: string, source: FiberStateEntry['source']): string {\n const sourceKey = source ? `${source.fileName}:${source.lineNumber ?? ''}:${source.columnNumber ?? ''}` : '';\n return [String(fiber.tag ?? ''), name, String(fiber.key ?? ''), sourceKey].join('|');\n}\n\nexport function captureFiberState(\n options: { page?: { url?: unknown; title?: unknown }; maxFibers?: unknown } | null | undefined,\n deps: CaptureFiberStateDeps,\n): FiberStateCapture {\n const maxFibers = Number.isFinite(Number(options?.maxFibers))\n ? Math.max(1, Math.floor(Number(options?.maxFibers)))\n : 100_000;\n const fibers: FiberStateEntry[] = [];\n let truncated = false;\n\n type Pending = { fiber: Fiber; parentPath: string };\n const stack: Pending[] = deps.getRootFibers().slice().reverse().map((root) => ({ fiber: root.current || root, parentPath: 'root' }));\n const siblingOccurrences = new Map<string, number>();\n const visited = new Set<Fiber>();\n\n while (stack.length) {\n const { fiber, parentPath } = stack.pop()!;\n if (visited.has(fiber) || (fiber.alternate && visited.has(fiber.alternate))) continue;\n visited.add(fiber);\n if (fiber.alternate) visited.add(fiber.alternate);\n const name = deps.getDisplayName(fiber);\n let nextParentPath = parentPath;\n if (name) {\n if (fibers.length >= maxFibers) { truncated = true; break; }\n const source = readSource(fiber);\n const token = fiberToken(fiber, name, source);\n const occurrenceKey = `${parentPath}\\u0000${token}`;\n const occurrence = siblingOccurrences.get(occurrenceKey) || 0;\n siblingOccurrences.set(occurrenceKey, occurrence + 1);\n const id = `${parentPath}/${fnv1a(token)}:${occurrence}`;\n const props: Record<string, FiberStateProp> = {};\n const memoizedProps = fiber.memoizedProps;\n if (memoizedProps && typeof memoizedProps === 'object') {\n let propNames: string[] = [];\n try { propNames = Object.keys(memoizedProps).sort(); } catch { propNames = []; }\n for (const propName of propNames) {\n let value: unknown;\n try { value = memoizedProps[propName]; } catch { value = '[getter-threw]'; }\n props[propName] = fingerprintFiberProp(value);\n }\n }\n fibers.push({\n id,\n token,\n name,\n key: fiber.key == null ? null : String(fiber.key),\n tag: Number.isFinite(Number(fiber.tag)) ? Number(fiber.tag) : null,\n source,\n props,\n });\n nextParentPath = id;\n }\n\n const children: Fiber[] = [];\n let child = fiber.child || null;\n while (child) { children.push(child); child = child.sibling || null; }\n for (let i = children.length - 1; i >= 0; i--) stack.push({ fiber: children[i], parentPath: nextParentPath });\n }\n\n return {\n version: 1,\n capturedAt: new Date().toISOString(),\n page: {\n url: options?.page?.url == null ? null : String(options.page.url),\n title: options?.page?.title == null ? null : String(options.page.title),\n },\n fiberCount: fibers.length,\n truncated,\n fibers,\n };\n}\n\nfunction publicFiber(entry: FiberStateEntry): Record<string, unknown> {\n return { id: entry.id, name: entry.name, key: entry.key, source: entry.source };\n}\n\nexport function compareFiberStates(\n before: FiberStateCapture,\n after: FiberStateCapture,\n options?: { maxChanges?: unknown },\n): FiberStateDiff | { ok: false; error: string } {\n if (before?.version !== 1 || after?.version !== 1 || !Array.isArray(before?.fibers) || !Array.isArray(after?.fibers)) {\n return { ok: false, error: 'Two valid fiber state captures are required' };\n }\n const maxChanges = Number.isFinite(Number(options?.maxChanges))\n ? Math.max(1, Math.floor(Number(options?.maxChanges)))\n : 200;\n const beforeById = new Map(before.fibers.map((entry) => [entry.id, entry]));\n const afterById = new Map(after.fibers.map((entry) => [entry.id, entry]));\n const matched = new Map<FiberStateEntry, { after: FiberStateEntry; confidence: 'path' | 'unique-token' }>();\n const usedAfter = new Set<FiberStateEntry>();\n\n for (const entry of before.fibers) {\n const candidate = afterById.get(entry.id);\n if (candidate && candidate.token === entry.token) {\n matched.set(entry, { after: candidate, confidence: 'path' });\n usedAfter.add(candidate);\n }\n }\n\n const unmatchedBeforeByToken = new Map<string, FiberStateEntry[]>();\n const unmatchedAfterByToken = new Map<string, FiberStateEntry[]>();\n for (const entry of before.fibers) {\n if (matched.has(entry)) continue;\n const list = unmatchedBeforeByToken.get(entry.token) || [];\n list.push(entry); unmatchedBeforeByToken.set(entry.token, list);\n }\n for (const entry of after.fibers) {\n if (usedAfter.has(entry)) continue;\n const list = unmatchedAfterByToken.get(entry.token) || [];\n list.push(entry); unmatchedAfterByToken.set(entry.token, list);\n }\n for (const [token, beforeEntries] of unmatchedBeforeByToken) {\n const afterEntries = unmatchedAfterByToken.get(token);\n if (beforeEntries.length === 1 && afterEntries?.length === 1) {\n matched.set(beforeEntries[0], { after: afterEntries[0], confidence: 'unique-token' });\n usedAfter.add(afterEntries[0]);\n }\n }\n\n const allChanges: Array<Record<string, unknown>> = [];\n let changedFibers = 0;\n let propChanges = 0;\n for (const [beforeEntry, match] of matched) {\n const added: Array<Record<string, unknown>> = [];\n const removed: Array<Record<string, unknown>> = [];\n const changed: Array<Record<string, unknown>> = [];\n const names = new Set([...Object.keys(beforeEntry.props), ...Object.keys(match.after.props)]);\n for (const name of Array.from(names).sort()) {\n const left = beforeEntry.props[name];\n const right = match.after.props[name];\n if (!left) added.push({ name, after: right });\n else if (!right) removed.push({ name, before: left });\n else if (left.hash !== right.hash || left.kind !== right.kind || left.truncated !== right.truncated) {\n changed.push({ name, before: left, after: right });\n }\n }\n const count = added.length + removed.length + changed.length;\n if (!count) continue;\n changedFibers++;\n propChanges += count;\n allChanges.push({\n kind: 'props-changed',\n match: match.confidence,\n fiber: { before: publicFiber(beforeEntry), after: publicFiber(match.after) },\n props: { added, removed, changed },\n });\n }\n\n const removedFibers = before.fibers.filter((entry) => !matched.has(entry));\n const addedFibers = after.fibers.filter((entry) => !usedAfter.has(entry));\n for (const entry of addedFibers) {\n allChanges.push({ kind: 'fiber-added', fiber: publicFiber(entry), propNames: Object.keys(entry.props) });\n }\n for (const entry of removedFibers) {\n allChanges.push({ kind: 'fiber-removed', fiber: publicFiber(entry), propNames: Object.keys(entry.props) });\n }\n\n const rankChange = (change: Record<string, any>): number => {\n if (change.kind !== 'props-changed') return change.kind === 'fiber-added' ? 5 : 4;\n const propRows = [\n ...(change.props?.added || []).map((row: any) => row.after),\n ...(change.props?.removed || []).map((row: any) => row.before),\n ...(change.props?.changed || []).flatMap((row: any) => [row.before, row.after]),\n ].filter(Boolean);\n const complete = propRows.some((row: FiberStateProp) => !row.truncated) ? 100 : 0;\n const primitive = propRows.some((row: FiberStateProp) => ['string', 'number', 'boolean', 'null', 'undefined'].includes(row.kind)) ? 40 : 0;\n const sourced = change.fiber?.after?.source || change.fiber?.before?.source ? 20 : 0;\n return 10 + complete + primitive + sourced;\n };\n allChanges.sort((left, right) => rankChange(right) - rankChange(left));\n const changes = allChanges.slice(0, maxChanges);\n const captureTruncated = before.truncated || after.truncated;\n const changesTruncated = allChanges.length > changes.length;\n return {\n ok: true,\n before: { ...before.page, capturedAt: before.capturedAt },\n after: { ...after.page, capturedAt: after.capturedAt },\n summary: {\n beforeFibers: before.fibers.length,\n afterFibers: after.fibers.length,\n matchedFibers: matched.size,\n changedFibers,\n addedFibers: addedFibers.length,\n removedFibers: removedFibers.length,\n propChanges,\n returnedChanges: changes.length,\n captureTruncated,\n changesTruncated,\n truncated: captureTruncated || changesTruncated,\n },\n changes,\n };\n}\n","/**\n * Converts React's complete fiber trees into boundary-only evidence for the\n * bridge. Ordinary components are omitted from the page-wide view, but their\n * containment is retained by attaching each boundary to the nearest surviving\n * boundary ancestor. This keeps the output useful for partitioning a page\n * without making agents walk thousands of unrelated fibers themselves.\n */\n\nimport {\n MAX_BOUNDARY_FIBERS,\n describeErrorBoundary,\n describeSuspenseBoundary,\n} from '../layout-lab/fiber-boundaries';\nimport { describeFiberSource, type Fiber } from '../layout-lab/fiber-walk';\n\nexport type DeclarativeBoundaryKind = 'error' | 'suspense';\n\nexport type DeclarativeBoundaryStatus =\n | 'showing-content'\n | 'showing-fallback'\n | 'unknown';\n\nexport type DeclarativeBoundarySource = {\n fileName: string | null;\n lineNumber: number | null;\n columnNumber: number | null;\n};\n\nexport type DeclarativeBoundaryDom = {\n tag: string | null;\n testId: string | null;\n text: string | null;\n};\n\nexport type DeclarativeBoundarySummary = {\n fiberId: string;\n kind: DeclarativeBoundaryKind;\n componentName: string;\n detectedBy: 'lifecycle' | 'name' | 'fiber-tag' | 'display-name';\n status: DeclarativeBoundaryStatus;\n source: DeclarativeBoundarySource | null;\n dom: DeclarativeBoundaryDom | null;\n};\n\nexport type DeclarativeBoundaryChainItem = DeclarativeBoundarySummary & {\n /** Fiber hops from the inspected fiber; zero means the target is a boundary. */\n distance: number;\n};\n\nexport type DeclarativeBoundaryTreeNode = DeclarativeBoundarySummary & {\n /** Fiber depth from the discovered React root. */\n fiberDepth: number;\n /** Fiber hops from the containing declarative boundary, or null at the forest root. */\n distanceFromParent: number | null;\n children: DeclarativeBoundaryTreeNode[];\n};\n\nexport type DeclarativeBoundaryDeps = {\n rememberFiber: (fiber: Fiber) => string | number;\n getFiberDomNode: (fiber: Fiber) => Element | null;\n getRootFibers: () => Fiber[];\n};\n\ntype FiberWithCurrent = Fiber & {\n current?: Fiber | null;\n alternate?: Fiber | null;\n tag?: number;\n};\n\nfunction alreadyVisited(fiber: Fiber, seen: Set<Fiber>): boolean {\n // React keeps current and work-in-progress alternates as separate objects.\n // Treating them as different roots would duplicate boundaries and inflate\n // scanned counts when both sides are reachable during a transition.\n const alternate = (fiber as FiberWithCurrent).alternate || null;\n return seen.has(fiber) || !!(alternate && seen.has(alternate));\n}\n\nfunction markVisited(fiber: Fiber, seen: Set<Fiber>): void {\n seen.add(fiber);\n const alternate = (fiber as FiberWithCurrent).alternate || null;\n if (alternate) seen.add(alternate);\n}\n\nfunction normalizeSource(fiber: Fiber): DeclarativeBoundarySource | null {\n return describeFiberSource(fiber);\n}\n\nfunction summarizeDom(element: Element | null): DeclarativeBoundaryDom | null {\n if (!element) return null;\n return {\n tag: element.tagName?.toLowerCase() || null,\n testId: element.getAttribute?.('data-testid') || null,\n text: element.textContent ? String(element.textContent).trim().slice(0, 120) : null,\n };\n}\n\nfunction suspenseDetectedBy(fiber: Fiber): 'fiber-tag' | 'display-name' {\n return (fiber as FiberWithCurrent).tag === 13 ? 'fiber-tag' : 'display-name';\n}\n\nfunction describeBoundary(\n fiber: Fiber,\n deps: Pick<DeclarativeBoundaryDeps, 'rememberFiber' | 'getFiberDomNode'>,\n): DeclarativeBoundarySummary | null {\n const error = describeErrorBoundary(fiber);\n if (error) {\n return {\n fiberId: String(deps.rememberFiber(fiber)),\n kind: 'error',\n componentName: error.componentName,\n detectedBy: error.detectedBy,\n status: 'unknown',\n source: normalizeSource(fiber),\n dom: summarizeDom(deps.getFiberDomNode(fiber)),\n };\n }\n\n const suspense = describeSuspenseBoundary(fiber);\n if (!suspense) return null;\n return {\n fiberId: String(deps.rememberFiber(fiber)),\n kind: 'suspense',\n componentName: suspense.componentName,\n detectedBy: suspenseDetectedBy(fiber),\n status: fiber.memoizedState == null ? 'showing-content' : 'showing-fallback',\n source: normalizeSource(fiber),\n dom: summarizeDom(deps.getFiberDomNode(fiber)),\n };\n}\n\nfunction normalizeLimit(value: number | string | null | undefined, fallback: number): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? Math.max(1, Math.min(5000, Math.floor(parsed))) : fallback;\n}\n\n/**\n * Return every declarative boundary on the rendered parent path, not only the\n * nearest error + Suspense pair. Items are ordered from the target outward.\n */\nexport function inspectDeclarativeBoundaryChain(\n fiber: Fiber | null | undefined,\n max: number | string | null | undefined,\n deps: Pick<DeclarativeBoundaryDeps, 'rememberFiber' | 'getFiberDomNode'>,\n): {\n ok: true;\n count: number;\n scannedFibers: number;\n truncated: boolean;\n items: DeclarativeBoundaryChainItem[];\n} | { ok: false; error: string } {\n if (!fiber) return { ok: false, error: 'No fiber available' };\n\n const limit = normalizeLimit(max, 100);\n const items: DeclarativeBoundaryChainItem[] = [];\n const seen = new Set<Fiber>();\n let current: Fiber | null = fiber;\n let distance = 0;\n let omitted = false;\n\n while (current && distance < MAX_BOUNDARY_FIBERS && !seen.has(current)) {\n seen.add(current);\n const boundary = describeBoundary(current, deps);\n if (boundary) {\n if (items.length < limit) items.push({ ...boundary, distance });\n else omitted = true;\n }\n current = current.return || null;\n distance += 1;\n }\n\n return {\n ok: true,\n count: items.length,\n scannedFibers: seen.size,\n truncated: omitted || !!current,\n items,\n };\n}\n\n/**\n * Traverse all current React roots and prune the component tree down to only\n * declarative boundaries. Nesting between surviving nodes preserves rendered\n * containment even when many ordinary components were removed in between.\n */\nexport function inspectPageDeclarativeBoundaries(\n max: number | string | null | undefined,\n deps: DeclarativeBoundaryDeps,\n): {\n ok: true;\n count: number;\n scannedFibers: number;\n rootCount: number;\n rootsWithBoundaries: number;\n truncated: boolean;\n items: DeclarativeBoundaryTreeNode[];\n} {\n const limit = normalizeLimit(max, 1000);\n const rawRoots = deps.getRootFibers();\n const items: DeclarativeBoundaryTreeNode[] = [];\n const seen = new Set<Fiber>();\n let count = 0;\n let scannedFibers = 0;\n let rootsWithBoundaries = 0;\n let truncated = false;\n\n // Walk roots independently: multi-root pages (portals, Storybook manager +\n // preview, or embedded widgets) must not let one root's limit or ancestry\n // hide boundaries belonging to another root.\n for (const rawRoot of rawRoots) {\n if (count >= limit) {\n truncated = true;\n break;\n }\n const root = (rawRoot as FiberWithCurrent)?.current || rawRoot;\n if (!root || alreadyVisited(root, seen)) continue;\n\n const rootItems: DeclarativeBoundaryTreeNode[] = [];\n const stack: Array<{\n fiber: Fiber;\n fiberDepth: number;\n parentBoundary: DeclarativeBoundaryTreeNode | null;\n }> = [{ fiber: root, fiberDepth: 0, parentBoundary: null }];\n\n while (stack.length > 0) {\n if (count >= limit) {\n truncated = true;\n break;\n }\n const frame = stack.pop()!;\n const current = frame.fiber;\n if (alreadyVisited(current, seen)) continue;\n markVisited(current, seen);\n scannedFibers += 1;\n\n let nextParentBoundary = frame.parentBoundary;\n const summary = describeBoundary(current, deps);\n if (summary) {\n const node: DeclarativeBoundaryTreeNode = {\n ...summary,\n fiberDepth: frame.fiberDepth,\n distanceFromParent: frame.parentBoundary\n ? frame.fiberDepth - frame.parentBoundary.fiberDepth\n : null,\n children: [],\n };\n if (frame.parentBoundary) frame.parentBoundary.children.push(node);\n else rootItems.push(node);\n nextParentBoundary = node;\n count += 1;\n }\n\n if (current.sibling) {\n stack.push({\n fiber: current.sibling,\n fiberDepth: frame.fiberDepth,\n parentBoundary: frame.parentBoundary,\n });\n }\n if (current.child) {\n stack.push({\n fiber: current.child,\n fiberDepth: frame.fiberDepth + 1,\n parentBoundary: nextParentBoundary,\n });\n }\n }\n\n if (rootItems.length > 0) {\n rootsWithBoundaries += 1;\n items.push(...rootItems);\n }\n }\n\n return {\n ok: true,\n count,\n scannedFibers,\n rootCount: rawRoots.length,\n rootsWithBoundaries,\n truncated,\n items,\n };\n}\n","/**\n * Page-side composition root for Chippy and Avalanche.\n *\n * This file is intentionally the only place that assembles the public\n * `__AVALANCHE__` surface. The extension/import integrations can therefore\n * share the same React-internals implementation while their bridge shells\n * remain small and replaceable. Keep implementation in domain modules; a\n * bridge shim must not grow a second copy of a capability.\n */\n\nimport { createAvalancheDetector, DETECTION_LEVEL } from './avalanche/detector';\nimport {\n type IntegrationMode,\n getCommitMetricsAdapter,\n registerCommitMetricsAdapter,\n runPrePageHooks,\n} from './avalanche/commit-metrics-adapter';\nimport {\n replayComponentHooks,\n evalFiberHooks,\n fiberOnlyHookRecords,\n classifyHook,\n safeSerialize,\n getDispatcherRef,\n isDispatcherIdle,\n customHookPathFromFrames,\n customHookPathFromStack,\n readContextValueFromFiber,\n readHookValueFromNode,\n PRIMITIVE_HOOK_NAMES,\n replayErrorPayload,\n logReplayError,\n} from './debug-render/replay';\nimport {\n getFiberKey,\n getFiber,\n getDisplayName,\n isUserComponent,\n getNearestFiber,\n getNearestComponent,\n getHookSummary,\n getOwnerChain,\n getOwnerFibers,\n getFiberDomNode,\n getReturnComponentChain,\n getReturnComponentFibers,\n describeSource,\n describeFiberSource,\n resolveFiberSource,\n describeFiberTarget,\n describeComponent,\n} from './layout-lab/fiber-walk';\nimport {\n describeContext,\n findBoundaryFibers,\n getContextProviders,\n registerContextProvider,\n} from './layout-lab/marker-context';\nimport { enableDefaultPlugins, enablePlugins, listPlugins, registerBuiltinPlugins, registerPlugin, selectPlugins } from './plugins';\nimport {\n PROBE_INTENTS,\n normalizeProbeAnnotation,\n updateProbeAnnotation,\n} from './layout-lab/probe-intent';\nimport {\n summarizeHookList,\n formatCounts,\n renderTreeText,\n renderCompactComponentText,\n} from './chippy-bridge/inspect-formatters';\nimport { evalDescribeComponent as evalDescribeComponentImpl } from './chippy-bridge/describe-component';\nimport { readAvalancheStatus as readAvalancheStatusImpl, evalAvalanche as evalAvalancheImpl } from './chippy-bridge/avalanche-commands';\nimport {\n evalElementDom as evalElementDomImpl,\n evalFiberProps as evalFiberPropsImpl,\n evalFiberPropValue as evalFiberPropValueImpl,\n evalFindFibers as evalFindFibersImpl,\n resolveFindFiberSources as resolveFindFiberSourcesImpl,\n} from './chippy-bridge/eval-helpers';\nimport {\n safeJson as safeJsonImpl,\n resolveOwnerFiber as resolveOwnerFiberImpl,\n findFiberByName as findFiberByNameImpl,\n inspectFiberOwners as inspectFiberOwnersImpl,\n inspectFiberStructure as inspectFiberStructureImpl,\n} from './chippy-bridge/fiber-introspect';\nimport {\n evalFiberInvoke as evalFiberInvokeImpl,\n evalFiberPropContract as evalFiberPropContractImpl,\n} from './chippy-bridge/fiber-invoke';\nimport { evalFiberScheduleUpdate as evalFiberScheduleUpdateImpl } from './chippy-bridge/fiber-schedule-update';\nimport { captureFiberState as captureFiberStateImpl, compareFiberStates as compareFiberStatesImpl } from './chippy-bridge/fiber-state';\nimport {\n inspectDeclarativeBoundaryChain as inspectDeclarativeBoundaryChainImpl,\n inspectPageDeclarativeBoundaries as inspectPageDeclarativeBoundariesImpl,\n} from './chippy-bridge/declarative-boundaries';\nimport type { DescribeComponentDeps } from './chippy-bridge/describe-component';\n\ntype StartupConfig = {\n /** Plugin ids to enable before React evaluates, e.g. `['jira', 'atl']`. */\n plugins?: string[];\n avalanche?: {\n autoStart?: boolean;\n /** Detector options applied when autoStart installs Avalanche. */\n options?: Pick<NonNullable<Parameters<typeof createAvalancheDetector>[0]>, 'detectionMode' | 'captureFibers'>;\n /** History size for the auto-started detector. */\n max?: number;\n };\n};\n\ntype DevtoolsRenderer = {\n currentDispatcherRef?: unknown;\n};\n\ntype DevtoolsHook = {\n supportsFiber: boolean;\n renderers: Map<number, DevtoolsRenderer>;\n inject(renderer: DevtoolsRenderer): number;\n onScheduleFiberRoot(): void;\n onCommitFiberRoot(): void;\n onCommitFiberUnmount(): void;\n onPostCommitFiberRoot(): void;\n};\n\ntype GlobalWithChippyRuntime = typeof globalThis & {\n // Another Chippy copy may have published this, so its methods are not guaranteed.\n __AVALANCHE__?: Partial<AvalancheApi>;\n __CHIPPY_STARTUP_CONFIG?: StartupConfig;\n /** Plugin ids for pages that load the bundle without a startup config. */\n __CHIPPY_PLUGINS?: string[];\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: DevtoolsHook;\n top?: typeof globalThis & {\n __REACT_DEVTOOLS_GLOBAL_HOOK__?: DevtoolsHook;\n };\n};\n\nconst runtime = globalThis as GlobalWithChippyRuntime;\n// A second injection must reuse the already-published runtime. Replacing it\n// would strand the bridge's references to the first detector and can create\n// two commit listeners observing the same React root. An armed extension\n// reload evaluates this bundle twice: once from the one-shot document_start\n// registration and once from the background's navigation injection.\nconst publishedApi = runtime.__AVALANCHE__;\n\n// Product-specific recognizers (Jira ownership markers, ATL commit metrics)\n// are plugins. None is enabled unless the page opts in or a packed build names\n// it as a default; enabling here, before early bootstrap calls\n// runPrePageHooks(), lets an adapter's pre-page setup run.\nregisterBuiltinPlugins();\n{\n const fromConfig = runtime.__CHIPPY_STARTUP_CONFIG?.plugins;\n const fromGlobal = runtime.__CHIPPY_PLUGINS;\n if (Array.isArray(fromConfig) || Array.isArray(fromGlobal)) {\n selectPlugins([...(fromConfig ?? []), ...(fromGlobal ?? [])]);\n }\n}\n\n// Do NOT seed a commit metrics adapter's host surface at bundle-load time.\n// The host page owns that surface and defines/deletes it on its own\n// lifecycle. Racing it causes a non-configurable descriptor conflict that\n// makes host `delete` throw TypeError in strict mode. The adapter prepares\n// its surface lazily inside api.install() only when Avalanche is started, and\n// pre-page setup runs only when early bootstrap calls runPrePageHooks().\n\n// React only registers its renderer when the DevTools hook exists while\n// react-dom evaluates. The shim is deliberately minimal: it records the\n// renderer object but does not pretend to be a DevTools client.\n(function installDevtoolsShim() {\n if (runtime.__REACT_DEVTOOLS_GLOBAL_HOOK__) return;\n const hook: DevtoolsHook = {\n supportsFiber: true,\n renderers: new Map(),\n inject(renderer) {\n const id = (this.renderers.size || 0) + 1;\n this.renderers.set(id, renderer);\n return id;\n },\n onScheduleFiberRoot() {},\n onCommitFiberRoot() {},\n onCommitFiberUnmount() {},\n onPostCommitFiberRoot() {},\n };\n try {\n if (runtime.top && !runtime.top.__REACT_DEVTOOLS_GLOBAL_HOOK__) runtime.top.__REACT_DEVTOOLS_GLOBAL_HOOK__ = hook;\n } catch (_) { /* cross-origin */ }\n runtime.__REACT_DEVTOOLS_GLOBAL_HOOK__ = runtime.top?.__REACT_DEVTOOLS_GLOBAL_HOOK__ || hook;\n})();\n\nconst startupConfig = runtime.__CHIPPY_STARTUP_CONFIG;\nconst __auto = !!startupConfig?.avalanche?.autoStart;\n\nlet detector: ReturnType<typeof createAvalancheDetector> | null = null;\nlet installed = false;\n\ntype AvalancheApi = {\n install: (options?: Parameters<typeof createAvalancheDetector>[0]) => { ok: true; detectionLevel: string } | { ok: false; error: string };\n uninstall: () => { ok: true };\n reset: () => { ok: true };\n report: (topN?: number, sortBy?: 'effect' | 'callback' | 'memo' | 'total', options?: Record<string, unknown>) => unknown;\n exportLast: (n?: number) => unknown;\n debugHook: (sourceId: string, hookIndex: number, windowSize?: number) => unknown;\n _debugRawHookEvents: (componentName: string) => unknown;\n status: () => {\n installed: boolean;\n hasMetricsGlobal: boolean;\n commitCount: number;\n integrationMode: IntegrationMode;\n metricsAdapter: string | null;\n };\n registerCommitMetricsAdapter: typeof registerCommitMetricsAdapter;\n /** Enable plugins by id (built-in: `'jira'`, `'atl'`); returns the running ids. */\n enablePlugins: typeof enablePlugins;\n /** Register a plugin; `chippy pack` appends these calls to the bundle. */\n registerPlugin: typeof registerPlugin;\n /** Enable a packed build's defaults unless the page chose its own plugins. */\n enableDefaultPlugins: typeof enableDefaultPlugins;\n listPlugins: typeof listPlugins;\n runPrePageHooks: typeof runPrePageHooks;\n DETECTION_LEVEL: typeof DETECTION_LEVEL;\n replay: {\n replayComponentHooks: typeof replayComponentHooks;\n evalFiberHooks: typeof evalFiberHooks;\n fiberOnlyHookRecords: typeof fiberOnlyHookRecords;\n classifyHook: typeof classifyHook;\n safeSerialize: typeof safeSerialize;\n getDispatcherRef: typeof getDispatcherRef;\n isDispatcherIdle: typeof isDispatcherIdle;\n customHookPathFromFrames: typeof customHookPathFromFrames;\n customHookPathFromStack: typeof customHookPathFromStack;\n readContextValueFromFiber: typeof readContextValueFromFiber;\n readHookValueFromNode: typeof readHookValueFromNode;\n PRIMITIVE_HOOK_NAMES: typeof PRIMITIVE_HOOK_NAMES;\n replayErrorPayload: typeof replayErrorPayload;\n logReplayError: typeof logReplayError;\n };\n layoutLab: {\n getFiberKey: typeof getFiberKey;\n getFiber: typeof getFiber;\n getDisplayName: typeof getDisplayName;\n isUserComponent: typeof isUserComponent;\n getNearestFiber: typeof getNearestFiber;\n getNearestComponent: typeof getNearestComponent;\n getHookSummary: typeof getHookSummary;\n getOwnerChain: typeof getOwnerChain;\n getOwnerFibers: typeof getOwnerFibers;\n getFiberDomNode: typeof getFiberDomNode;\n getReturnComponentChain: typeof getReturnComponentChain;\n getReturnComponentFibers: typeof getReturnComponentFibers;\n describeSource: typeof describeSource;\n describeFiberSource: typeof describeFiberSource;\n resolveFiberSource: typeof resolveFiberSource;\n describeFiberTarget: typeof describeFiberTarget;\n describeComponent: typeof describeComponent;\n describeContext: typeof describeContext;\n registerContextProvider: typeof registerContextProvider;\n getContextProviders: typeof getContextProviders;\n findBoundaryFibers: typeof findBoundaryFibers;\n PROBE_INTENTS: typeof PROBE_INTENTS;\n normalizeProbeAnnotation: typeof normalizeProbeAnnotation;\n updateProbeAnnotation: typeof updateProbeAnnotation;\n };\n bridge: {\n summarizeHookList: typeof summarizeHookList;\n formatCounts: typeof formatCounts;\n renderTreeText: typeof renderTreeText;\n renderCompactComponentText: typeof renderCompactComponentText;\n evalDescribeComponent: (fiberIdRaw: unknown, nameRaw: unknown, deps: DescribeComponentDeps) => unknown;\n readAvalancheStatus: (api: unknown, mod: unknown) => unknown;\n evalAvalanche: (command: unknown, api: unknown, mod: unknown) => unknown;\n evalElementDom: typeof evalElementDomImpl;\n evalFiberProps: typeof evalFiberPropsImpl;\n evalFiberPropValue: typeof evalFiberPropValueImpl;\n evalFindFibers: typeof evalFindFibersImpl;\n resolveFindFiberSources: typeof resolveFindFiberSourcesImpl;\n safeJson: typeof safeJsonImpl;\n resolveOwnerFiber: typeof resolveOwnerFiberImpl;\n findFiberByName: typeof findFiberByNameImpl;\n inspectFiberOwners: typeof inspectFiberOwnersImpl;\n inspectFiberStructure: typeof inspectFiberStructureImpl;\n evalFiberInvoke: typeof evalFiberInvokeImpl;\n evalFiberPropContract: typeof evalFiberPropContractImpl;\n evalFiberScheduleUpdate: typeof evalFiberScheduleUpdateImpl;\n describeFiberSource: typeof describeFiberSource;\n resolveFiberSource: typeof resolveFiberSource;\n captureFiberState: typeof captureFiberStateImpl;\n compareFiberStates: typeof compareFiberStatesImpl;\n inspectDeclarativeBoundaryChain: typeof inspectDeclarativeBoundaryChainImpl;\n inspectPageDeclarativeBoundaries: typeof inspectPageDeclarativeBoundariesImpl;\n };\n};\n\nconst api: AvalancheApi = {\n install(options) {\n // The adapter seeds its host surface unless the host already owns it.\n try { getCommitMetricsAdapter()?.prepare?.(); } catch (_) { /* swallow */ }\n\n if (detector) {\n try { detector.uninstall(); } catch (_) {}\n }\n detector = createAvalancheDetector(options);\n console.log('[avalanche] start', { detectionMode: (options && (options as any).detectionMode) || 'default' });\n detector.install();\n installed = true;\n return { ok: true, detectionLevel: (options && (options as any).detectionMode) || 'default' };\n },\n uninstall() {\n console.log('[avalanche] stop');\n if (detector) detector.uninstall();\n installed = false;\n return { ok: true };\n },\n reset() {\n console.log('[avalanche] reset');\n if (detector) detector.reset();\n return { ok: true };\n },\n report(topN, sortBy, options) {\n if (!detector) return { ok: false, error: 'not installed' };\n return detector.report(topN, sortBy as any, options as any);\n },\n exportLast(n) {\n if (!detector) return { ok: false, error: 'not installed' };\n const r = detector.report();\n if (n != null && (r as any).commits && Array.isArray((r as any).commits)) {\n return { ...(r as any), commits: (r as any).commits.slice(-n) };\n }\n return r;\n },\n debugHook(sourceId, hookIndex, windowSize) {\n if (!detector) return { ok: false, error: 'not installed' };\n const fn = (detector as any).debugHook;\n if (typeof fn !== 'function') return { ok: false, error: 'debugHook unavailable' };\n return fn(sourceId, hookIndex, windowSize);\n },\n _debugRawHookEvents(componentName) {\n if (!detector) return { ok: false, error: 'not installed' };\n const fn = (detector as any)._debugRawHookEvents;\n if (typeof fn !== 'function') return { ok: false, error: '_debugRawHookEvents unavailable' };\n return fn(componentName);\n },\n status() {\n let hasMetricsGlobal = false;\n try { hasMetricsGlobal = !!getCommitMetricsAdapter()?.isAvailable(); } catch (_) {}\n let commitCount = 0;\n try {\n const r = detector ? (detector.report() as any) : null;\n if (r && r.meta && typeof r.meta.commits === 'number') {\n commitCount = r.meta.commits;\n } else if (r && Array.isArray(r.commits)) {\n commitCount = r.commits.length;\n }\n } catch (_) {}\n const integrationMode = detector\n ? (detector as any).getIntegrationMode?.() ?? 'none'\n : 'none';\n const metricsAdapter = detector\n ? (detector as any).getMetricsAdapterId?.() ?? null\n : getCommitMetricsAdapter()?.id ?? null;\n return { installed, hasMetricsGlobal, commitCount, integrationMode, metricsAdapter };\n },\n registerCommitMetricsAdapter,\n enablePlugins,\n registerPlugin,\n enableDefaultPlugins,\n listPlugins,\n runPrePageHooks,\n DETECTION_LEVEL,\n replay: {\n replayComponentHooks,\n evalFiberHooks,\n fiberOnlyHookRecords,\n classifyHook,\n safeSerialize,\n getDispatcherRef,\n isDispatcherIdle,\n customHookPathFromFrames,\n customHookPathFromStack,\n readContextValueFromFiber,\n readHookValueFromNode,\n PRIMITIVE_HOOK_NAMES,\n replayErrorPayload,\n logReplayError,\n },\n layoutLab: {\n getFiberKey,\n getFiber,\n getDisplayName,\n isUserComponent,\n getNearestFiber,\n getNearestComponent,\n getHookSummary,\n getOwnerChain,\n getOwnerFibers,\n getFiberDomNode,\n getReturnComponentChain,\n getReturnComponentFibers,\n describeSource,\n describeFiberSource,\n resolveFiberSource,\n describeFiberTarget,\n describeComponent,\n describeContext,\n registerContextProvider,\n getContextProviders,\n findBoundaryFibers,\n PROBE_INTENTS,\n normalizeProbeAnnotation,\n updateProbeAnnotation,\n },\n bridge: {\n summarizeHookList,\n formatCounts,\n renderTreeText,\n renderCompactComponentText,\n evalDescribeComponent: evalDescribeComponentImpl,\n readAvalancheStatus: readAvalancheStatusImpl,\n evalAvalanche: evalAvalancheImpl,\n evalElementDom: evalElementDomImpl,\n evalFiberProps: evalFiberPropsImpl,\n evalFiberPropValue: evalFiberPropValueImpl,\n evalFindFibers: evalFindFibersImpl,\n resolveFindFiberSources: resolveFindFiberSourcesImpl,\n safeJson: safeJsonImpl,\n resolveOwnerFiber: resolveOwnerFiberImpl,\n findFiberByName: findFiberByNameImpl,\n inspectFiberOwners: inspectFiberOwnersImpl,\n inspectFiberStructure: inspectFiberStructureImpl,\n evalFiberInvoke: evalFiberInvokeImpl,\n evalFiberPropContract: evalFiberPropContractImpl,\n evalFiberScheduleUpdate: evalFiberScheduleUpdateImpl,\n describeFiberSource,\n resolveFiberSource,\n captureFiberState: captureFiberStateImpl,\n compareFiberStates: compareFiberStatesImpl,\n inspectDeclarativeBoundaryChain: inspectDeclarativeBoundaryChainImpl,\n inspectPageDeclarativeBoundaries: inspectPageDeclarativeBoundariesImpl,\n },\n};\n\nif (__auto) {\n try {\n const requested = startupConfig?.avalanche?.options || {};\n const targetApi = publishedApi && typeof publishedApi.install === 'function' ? publishedApi : api;\n const alreadyInstalled = !!(targetApi.status && targetApi.status().installed);\n if (!alreadyInstalled) {\n targetApi.install({\n detectionMode: requested.detectionMode || 'sources',\n historySize: startupConfig?.avalanche?.max || 1000,\n captureFibers: requested.captureFibers !== false,\n } as any);\n }\n } catch (e) { /* swallow */ }\n}\n\n// The IIFE build assigns this export to `__AVALANCHE__`, so a later evaluation\n// exports the runtime that is already published instead of replacing it.\nexport default (publishedApi ?? api) as typeof api;\n"],"names":["field","_a","_b","_d","_c","parseStackFrames","getFiberSource","resolveFiberSource","pending","active","installed","MAX_HOOKS","readFiberSource","resolveSourceLocation","renderedEntry","metricsBefore","committedComponents","api","getHookSummary","resolveOwnerFiber","safeSerialize","getFiber","replayComponentHooks","evalFiberHooks","getFiberDisplayName","requested"],"mappings":"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"}
|