doppeldiff 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/core/verify/session.ts", "../src/core/materialize/bundle.ts", "../src/core/runner/pool.ts", "../src/core/runner/netguard.ts", "../src/core/runner/tags.ts", "../src/core/arbitraries/mine.ts", "../src/core/arbitraries/compile.ts", "../src/core/arbitraries/regex.ts", "../src/core/analyze/locate.ts", "../src/core/detect/toplevel.ts", "../src/core/explore/explore.ts", "../src/core/compare/compare.ts", "../src/core/format/format.ts", "../src/core/util/stableKey.ts", "../src/core/explore/cluster.ts", "../src/core/explore/humanize.ts", "../src/core/types/fromType.ts", "../src/core/types/spec.ts", "../src/core/analyze/guards.ts", "../src/core/explore/realism.ts", "../src/core/verify/verifyFunction.ts", "../src/core/types/accepts.ts", "../src/core/run.ts", "../src/core/claims/suggest.ts", "../src/core/detect/detect.ts", "../src/core/git/git.ts", "../src/core/analyze/usage.ts", "../src/core/git/deps.ts", "../src/core/git/worktree.ts", "../src/core/report/behaviors.ts", "../src/core/claims/rules.ts", "../src/core/report/codegen.ts", "../src/core/report/model.ts", "../src/core/report/build.ts", "../src/core/report/markdown.ts", "../src/core/report/terminal.ts", "../src/core/report/testgen.ts", "../src/config.ts"],
4
- "sourcesContent": ["import { existsSync, realpathSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { dirname, join, relative, resolve, sep } from 'node:path';\nimport { Project, ts, type SourceFile } from 'ts-morph';\nimport { bundleModule } from '../materialize/bundle.js';\nimport { RunnerPool, type LoadResult } from '../runner/pool.js';\n\nexport type Side = 'base' | 'head';\n\nexport interface SessionOptions {\n /** Root directory of the base version (repo root or worktree). */\n baseRoot: string;\n /** Root directory of the head version. */\n headRoot: string;\n timeoutMs: number;\n freeze: boolean;\n /** Frozen clock value; default 2025-01-15T12:00:00Z. */\n now?: number;\n seed: number;\n poolSize?: number;\n memoryMb?: number;\n showConsole?: boolean;\n noSandbox?: boolean;\n /** Extra directories the runners may read (e.g. node_modules real paths). */\n extraReadPaths?: string[];\n /** The user's working copy (whose node_modules both versions share), for monorepo workspace mapping. */\n sourceRepo?: string;\n}\n\nexport interface LoadedModule {\n moduleId: string;\n load: LoadResult;\n}\n\nexport const DEFAULT_NOW = Date.UTC(2025, 0, 15, 12, 0, 0);\n\nfunction readPathsFor(root: string, extra: string[]): string[] {\n const paths = [root, join(tmpdir(), 'doppeldiff-bundles'), ...extra];\n const nm = join(root, 'node_modules');\n if (existsSync(nm)) paths.push(realpathSync(nm));\n return paths;\n}\n\n/**\n * Nearest directory at or above `file` (but not above `root`) that contains a tsconfig.json or\n * package.json: the \"package root\" used for type analysis and bundling.\n */\nexport function packageRootOf(root: string, file: string): string {\n const absRoot = resolve(root);\n let dir = dirname(resolve(file));\n while (dir.startsWith(absRoot)) {\n if (existsSync(join(dir, 'tsconfig.json')) || existsSync(join(dir, 'package.json'))) return dir;\n if (dir === absRoot) break;\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return absRoot;\n}\n\n/** Repo-relative, forward-slash path. */\nexport function relPath(root: string, file: string): string {\n return relative(root, file).split(sep).join('/');\n}\n\n/**\n * Holds everything shared across functions of one run: the two runner pools (base/head), a ts-morph\n * project per package root and version, and the bundled modules.\n */\nexport class VerifySession {\n readonly pools: Record<Side, RunnerPool>;\n readonly roots: Record<Side, string>;\n private readonly projects = new Map<string, Project>();\n private readonly modules = new Map<string, Promise<LoadedModule>>();\n\n constructor(readonly options: SessionOptions) {\n this.roots = { base: options.baseRoot, head: options.headRoot };\n const common = {\n timeoutMs: options.timeoutMs,\n freeze: options.freeze,\n now: options.now ?? DEFAULT_NOW,\n seed: options.seed,\n ...(options.poolSize !== undefined ? { size: options.poolSize } : {}),\n ...(options.memoryMb !== undefined ? { memoryMb: options.memoryMb } : {}),\n ...(options.showConsole !== undefined ? { showConsole: options.showConsole } : {}),\n ...(options.noSandbox !== undefined ? { noSandbox: options.noSandbox } : {}),\n };\n const extra = options.extraReadPaths ?? [];\n this.pools = {\n base: new RunnerPool({ ...common, label: 'base', readPaths: readPathsFor(options.baseRoot, extra) }),\n head: new RunnerPool({ ...common, label: 'head', readPaths: readPathsFor(options.headRoot, extra) }),\n };\n }\n\n /** ts-morph project for the package containing `file` in the given version. */\n project(side: Side, file: string): Project {\n const pkg = packageRootOf(this.roots[side], file);\n const key = `${side}:${pkg}`;\n let p = this.projects.get(key);\n if (!p) {\n const tsconfig = join(pkg, 'tsconfig.json');\n const fallback = () =>\n new Project({\n compilerOptions: {\n strict: true,\n allowJs: true,\n checkJs: false,\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n },\n });\n try {\n p = existsSync(tsconfig)\n ? new Project({\n tsConfigFilePath: tsconfig,\n skipAddingFilesFromTsConfig: true,\n compilerOptions: { allowJs: true, noEmit: true },\n })\n : fallback();\n } catch {\n // e.g. `extends` pointing into a package that is not installed: analyze with strict defaults.\n p = fallback();\n }\n this.projects.set(key, p);\n }\n return p;\n }\n\n /** Parsed source file (with its imports resolved for the type checker). */\n sourceFile(side: Side, file: string): SourceFile {\n const project = this.project(side, file);\n const existing = project.getSourceFile(file);\n if (existing) return existing;\n // No resolveSourceFileDependencies(): the TypeScript program loads imported files for the type checker on\n // its own, and re-resolving the whole project per file was O(files\u00B2) on large repositories.\n return project.addSourceFileAtPath(file);\n }\n\n /** Bundle and load a module in the side's runner pool (memoized). */\n loadModule(side: Side, file: string): Promise<LoadedModule> {\n const key = `${side}:${file}`;\n let p = this.modules.get(key);\n if (!p) {\n p = (async () => {\n const ws = this.options.sourceRepo\n ? { workspace: { sourceRepo: this.options.sourceRepo, versionRepo: this.roots[side] } }\n : {};\n const bundle = await bundleModule(packageRootOf(this.roots[side], file), file, side, ws);\n const load = await this.pools[side].load(key, bundle.path);\n return { moduleId: key, load };\n })();\n this.modules.set(key, p);\n }\n return p;\n }\n\n close(): void {\n this.pools.base.close();\n this.pools.head.close();\n }\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';\nimport { builtinModules } from 'node:module';\nimport { tmpdir } from 'node:os';\nimport { isAbsolute, join, relative, sep } from 'node:path';\nimport * as esbuild from 'esbuild';\n\nexport interface BundleResult {\n /** Absolute path of the bundled ESM module. */\n path: string;\n /** Directory the runner must be allowed to read. */\n dir: string;\n /** Bare package imports left external. */\n externals: string[];\n}\n\nconst BUILTINS = new Set(builtinModules.flatMap((m) => [m, `node:${m}`]));\n\n/** ESM output that still supports `require()` of external packages from bundled CommonJS code. */\nconst REQUIRE_SHIM =\n \"import { createRequire as __ddCreateRequire } from 'node:module'; const require = __ddCreateRequire(import.meta.url);\";\n\n/**\n * Bundle one module of one version of the project with esbuild: TypeScript, JSX, ESM/CJS interop and\n * tsconfig `paths` are handled here. Packages stay external and resolve against the version's own\n * node_modules, so the bundle is written inside `<root>/node_modules/.cache/doppeldiff/` when the module\n * imports packages, and to the OS temp dir otherwise.\n */\nexport interface BundleOptions {\n /**\n * Monorepo support: the working copy whose node_modules are shared with this version, and this version's\n * repo root. Bare imports that resolve (through workspace symlinks) to source files inside the working\n * copy are redirected to the same path in this version's tree and bundled, so each version uses its own\n * workspace packages.\n */\n workspace?: { sourceRepo: string; versionRepo: string };\n}\n\nfunction isInside(child: string, parent: string): boolean {\n const rel = relative(parent, child);\n return rel !== '' && !rel.startsWith('..') && !isAbsolute(rel);\n}\n\n/** Workspace globs from package.json `workspaces` (array or `{ packages }`) or pnpm-workspace.yaml. */\nfunction workspaceGlobs(repo: string): string[] {\n const globs: string[] = [];\n try {\n const pkg = JSON.parse(readFileSync(join(repo, 'package.json'), 'utf8')) as { workspaces?: unknown };\n const w = pkg.workspaces;\n if (Array.isArray(w)) globs.push(...w.filter((x): x is string => typeof x === 'string'));\n else if (w && typeof w === 'object' && Array.isArray((w as { packages?: unknown }).packages)) {\n globs.push(\n ...(w as { packages: unknown[] }).packages.filter((x): x is string => typeof x === 'string'),\n );\n }\n } catch {\n /* no root package.json */\n }\n try {\n const yaml = readFileSync(join(repo, 'pnpm-workspace.yaml'), 'utf8');\n for (const m of yaml.matchAll(/^\\s*-\\s*['\"]?([^'\"#\\n]+?)['\"]?\\s*$/gm)) globs.push(m[1]!);\n } catch {\n /* not pnpm */\n }\n return globs.filter((g) => !g.startsWith('!'));\n}\n\n/** Workspace package name \u2192 directory, read from a version's own tree (supports `dir`, `dir/*`, `dir/**`). */\nexport function workspacePackages(repo: string): Map<string, string> {\n const out = new Map<string, string>();\n const add = (dir: string) => {\n try {\n const name = (JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8')) as { name?: unknown }).name;\n if (typeof name === 'string') out.set(name, dir);\n } catch {\n /* not a package */\n }\n };\n for (const glob of workspaceGlobs(repo)) {\n const clean = glob.replace(/\\/+$/, '');\n const star = clean.search(/\\*/);\n if (star === -1) {\n add(join(repo, clean));\n continue;\n }\n const base = join(repo, clean.slice(0, star).replace(/\\/+$/, ''));\n try {\n for (const e of readdirSync(base, { withFileTypes: true }))\n if (e.isDirectory()) add(join(base, e.name));\n } catch {\n /* missing dir */\n }\n }\n return out;\n}\n\nfunction packageNameOf(spec: string): string {\n const parts = spec.split('/');\n return spec.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0]!;\n}\n\nfunction workspacePlugin(ws: NonNullable<BundleOptions['workspace']>): esbuild.Plugin {\n const sourceRepo = realpathSync(ws.sourceRepo);\n const versionRepo = realpathSync(ws.versionRepo);\n // Workspace packages are resolved from this version's own tree, never through node_modules links\n // (which point at the working copy and are junction chains on Windows).\n const packages = workspacePackages(ws.versionRepo);\n return {\n name: 'doppeldiff-workspaces',\n setup(build) {\n build.onResolve({ filter: /^[^./]|^\\.[^./]|^\\.\\.[^/]/ }, async (args) => {\n if (args.pluginData === 'doppeldiff-skip' || BUILTINS.has(args.path) || args.kind === 'entry-point')\n return undefined;\n const name = packageNameOf(args.path);\n const pkgDir = packages.get(name);\n if (pkgDir) {\n const sub = args.path.slice(name.length).replace(/^\\//, '');\n const target = sub ? join(pkgDir, sub) : pkgDir;\n const w = await build.resolve(`./${relative(args.resolveDir, target).split(sep).join('/')}`, {\n resolveDir: args.resolveDir,\n kind: args.kind,\n pluginData: 'doppeldiff-skip',\n });\n if (w.errors.length === 0 && w.path) return { path: w.path };\n }\n const r = await build.resolve(args.path, {\n resolveDir: args.resolveDir,\n kind: args.kind,\n pluginData: 'doppeldiff-skip',\n });\n if (r.errors.length > 0 || !r.path) return { path: args.path, external: true };\n let real: string;\n try {\n real = realpathSync(r.path);\n } catch {\n return { path: args.path, external: true };\n }\n if (real.split(sep).includes('node_modules')) return { path: args.path, external: true };\n // tsconfig `paths` aliases and similar: already inside this version's tree.\n if (isInside(real, versionRepo) || isInside(r.path, ws.versionRepo)) return { path: r.path };\n if (!isInside(real, sourceRepo)) return { path: args.path, external: true };\n // A workspace package symlinked from the shared node_modules: bundle this version's copy of it.\n const mapped = join(ws.versionRepo, relative(sourceRepo, real));\n return { path: existsSync(mapped) ? mapped : real };\n });\n },\n };\n}\n\nexport async function bundleModule(\n root: string,\n entry: string,\n label: string,\n options: BundleOptions = {},\n): Promise<BundleResult> {\n const tsconfig = existsSync(join(root, 'tsconfig.json')) ? join(root, 'tsconfig.json') : undefined;\n const build = (withTsconfig: boolean) =>\n esbuild.build({\n entryPoints: [entry],\n absWorkingDir: root,\n bundle: true,\n platform: 'node',\n format: 'esm',\n target: 'node22',\n ...(options.workspace\n ? { plugins: [workspacePlugin(options.workspace)] }\n : { packages: 'external' as const }),\n write: false,\n metafile: true,\n logLevel: 'silent',\n banner: { js: REQUIRE_SHIM },\n ...(tsconfig && withTsconfig ? { tsconfig } : {}),\n });\n let result: Awaited<ReturnType<typeof build>>;\n try {\n result = await build(true);\n } catch (e) {\n // A tsconfig that cannot be loaded (e.g. `extends` from an uninstalled package): retry without it.\n if (!tsconfig) throw e;\n result = await build(false);\n }\n const code = result.outputFiles[0]!.text;\n const externals = new Set<string>();\n for (const out of Object.values(result.metafile.outputs)) {\n for (const imp of out.imports) if (imp.external && !BUILTINS.has(imp.path)) externals.add(imp.path);\n }\n const hash = createHash('sha256').update(code).digest('hex').slice(0, 12);\n const name = `${label}-${relative(root, entry).replace(/[^\\w.-]+/g, '_')}-${hash}.mjs`;\n const dir =\n externals.size > 0 && existsSync(join(root, 'node_modules'))\n ? join(root, 'node_modules', '.cache', 'doppeldiff')\n : join(tmpdir(), 'doppeldiff-bundles');\n mkdirSync(dir, { recursive: true });\n const path = join(dir, name);\n if (!existsSync(path)) writeFileSync(path, code);\n return { path, dir, externals: [...externals] };\n}\n", "import { fork, type ChildProcess } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';\nimport { availableParallelism, tmpdir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { Outcome } from '../compare/observed.js';\nimport { nativeNetPermission } from './netguard.js';\nimport type { ChildMessage, LoadedMessage, ParentMessage } from './protocol.js';\nimport { toWire } from './tags.js';\n\nexport interface PoolOptions {\n /** Number of runner processes (default: max(1, floor(cpus / 2))). */\n size?: number;\n /** Directories the code under test may read (module bundles, node_modules, project root). */\n readPaths: string[];\n /** Per-call timeout in ms. */\n timeoutMs: number;\n /** V8 old-space limit per runner in MB (default 512). */\n memoryMb?: number;\n freeze: boolean;\n now: number;\n seed: number;\n showConsole?: boolean;\n /** Disable the Node permission model (debugging only). */\n noSandbox?: boolean;\n /** Label for diagnostics, e.g. \"base\" / \"head\". */\n label: string;\n}\n\nexport interface LoadResult {\n ok: boolean;\n error?: LoadedMessage['error'];\n exports: string[];\n}\n\n/** Resolve (and if running from source, build) the runner child entry script. */\nlet childEntryCache: string | undefined;\nexport async function resolveChildEntry(): Promise<string> {\n if (childEntryCache) return childEntryCache;\n const here = dirname(fileURLToPath(import.meta.url));\n const built = [join(here, 'child.js'), join(here, 'runner-child.js')].find((p) => existsSync(p));\n if (built) return (childEntryCache = built);\n const source = join(here, 'child.ts');\n if (!existsSync(source)) throw new Error(`doppeldiff: runner entry not found next to ${here}`);\n // Running from TypeScript sources (development/tests): bundle the child once into a temp cache.\n const esbuild = await import('esbuild');\n const result = await esbuild.build({\n entryPoints: [source],\n bundle: true,\n platform: 'node',\n format: 'esm',\n target: 'node22',\n write: false,\n logLevel: 'silent',\n });\n const code = result.outputFiles[0]!.text;\n const hash = createHash('sha256').update(code).digest('hex').slice(0, 16);\n const dir = join(tmpdir(), 'doppeldiff-runner');\n mkdirSync(dir, { recursive: true });\n const file = join(dir, `child-${hash}.mjs`);\n if (!existsSync(file) || readFileSync(file, 'utf8') !== code) writeFileSync(file, code);\n return (childEntryCache = file);\n}\n\nfunction realpaths(paths: string[]): string[] {\n const out = new Set<string>();\n for (const p of paths) {\n out.add(p);\n try {\n out.add(realpathSync(p));\n } catch {\n /* ignore */\n }\n }\n return [...out];\n}\n\ninterface Job {\n moduleId: string;\n exportName: string;\n inputs: unknown[][];\n}\n\n/** One sandboxed runner process, respawned transparently after timeouts and crashes. */\nclass RunnerProcess {\n private child: ChildProcess | undefined;\n private reqCounter = 0;\n private stderrTail = '';\n private listeners = new Set<(msg: ChildMessage) => void>();\n private exitListeners = new Set<(reason: string) => void>();\n spawns = 0;\n\n constructor(\n private readonly entry: string,\n private readonly options: PoolOptions,\n private readonly loads: Map<string, string>,\n /** Functions that hung synchronously once; their calls run in vm-guarded mode from then on. */\n private readonly guarded: Set<string>,\n ) {}\n\n private execArgv(): string[] {\n const args = [`--max-old-space-size=${this.options.memoryMb ?? 512}`];\n if (!this.options.noSandbox) {\n args.push('--permission');\n for (const p of realpaths([dirname(this.entry), ...this.options.readPaths]))\n args.push(`--allow-fs-read=${p}`);\n }\n return args;\n }\n\n async start(): Promise<void> {\n this.spawns++;\n const child = fork(this.entry, [], {\n execArgv: this.execArgv(),\n serialization: 'advanced',\n stdio: ['ignore', 'ignore', 'pipe', 'ipc'],\n env: { TZ: 'UTC', LANG: 'en_US.UTF-8', NODE_ENV: 'test', DOPPELDIFF_RUNNER: '1' },\n });\n this.child = child;\n child.stderr?.on('data', (d: Buffer) => {\n this.stderrTail = (this.stderrTail + d.toString()).slice(-2000);\n });\n child.on('message', (m) => {\n for (const l of [...this.listeners]) l(m as ChildMessage);\n });\n child.on('exit', (code, signal) => {\n if (this.child !== child) return;\n this.child = undefined;\n const reason = signal ? `killed by ${signal}` : `exited with code ${code}`;\n const oom = /heap out of memory|Allocation failed/i.test(this.stderrTail) ? ' (out of memory)' : '';\n for (const l of [...this.exitListeners]) l(reason + oom);\n });\n await this.request(\n {\n t: 'init',\n freeze: this.options.freeze,\n now: this.options.now,\n seed: this.options.seed,\n netGuard: !nativeNetPermission(),\n showConsole: this.options.showConsole ?? false,\n },\n (m) => m.t === 'ready',\n );\n for (const [moduleId, path] of this.loads) await this.loadModule(moduleId, path);\n }\n\n /** Send a message and wait for the first reply matching `done`. Rejects if the process exits. */\n private request<T extends ChildMessage>(\n msg: ParentMessage,\n done: (m: ChildMessage) => boolean,\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const onMsg = (m: ChildMessage) => {\n if (!done(m)) return;\n cleanup();\n resolve(m as T);\n };\n const onExit = (reason: string) => {\n cleanup();\n reject(new Error(`runner (${this.options.label}) ${reason}: ${this.stderrTail.trim().slice(-500)}`));\n };\n const cleanup = () => {\n this.listeners.delete(onMsg);\n this.exitListeners.delete(onExit);\n };\n this.listeners.add(onMsg);\n this.exitListeners.add(onExit);\n this.child!.send(msg);\n });\n }\n\n async loadModule(moduleId: string, path: string): Promise<LoadResult> {\n const m = await this.request<LoadedMessage>(\n { t: 'load', moduleId, path: realpathSync(path) },\n (r) => r.t === 'loaded' && r.moduleId === moduleId,\n );\n return { ok: m.ok, exports: m.exports, ...(m.error ? { error: m.error } : {}) };\n }\n\n kill(): void {\n const c = this.child;\n this.child = undefined;\n c?.removeAllListeners('exit');\n c?.kill('SIGKILL');\n }\n\n /** Execute a job; timeouts and crashes become outcomes, and the process is respawned. */\n async run(job: Job): Promise<Outcome[]> {\n const { timeoutMs } = this.options;\n const watchdogMs = timeoutMs + Math.max(150, Math.round(timeoutMs * 0.3));\n const guardKey = `${job.moduleId}#${job.exportName}`;\n const outcomes: Outcome[] = new Array(job.inputs.length);\n let next = 0;\n while (next < job.inputs.length) {\n if (!this.child) await this.start();\n const reqId = ++this.reqCounter;\n const offset = next;\n const segment = job.inputs.slice(offset);\n const received = await new Promise<{ count: number; failure?: Outcome }>((resolve) => {\n let count = 0;\n let timer: NodeJS.Timeout;\n const arm = () => {\n clearTimeout(timer);\n timer = setTimeout(\n () => finish({ count, failure: { kind: 'timeout', ms: timeoutMs } }, true),\n watchdogMs,\n );\n };\n const onMsg = (m: ChildMessage) => {\n if (m.t === 'result' && m.reqId === reqId) {\n outcomes[offset + m.index] = m.outcome;\n count = m.index + 1;\n arm();\n } else if (m.t === 'done' && m.reqId === reqId) {\n finish({ count }, false);\n }\n };\n const onExit = (reason: string) => finish({ count, failure: { kind: 'crash', reason } }, false);\n const finish = (r: { count: number; failure?: Outcome }, kill: boolean) => {\n clearTimeout(timer);\n this.listeners.delete(onMsg);\n this.exitListeners.delete(onExit);\n if (kill) this.kill();\n resolve(r);\n };\n this.listeners.add(onMsg);\n this.exitListeners.add(onExit);\n arm();\n try {\n this.child!.send({\n t: 'run',\n reqId,\n moduleId: job.moduleId,\n exportName: job.exportName,\n inputs: segment.map((input) => input.map((a) => toWire(a))),\n timeoutMs,\n guard: this.guarded.has(guardKey),\n });\n } catch (e) {\n // Non-serializable input: report every remaining input as a crash rather than hanging.\n for (let i = 0; i < segment.length; i++) {\n outcomes[offset + i] = {\n kind: 'crash',\n reason: `input not serializable: ${(e as Error).message}`,\n };\n }\n finish({ count: segment.length }, false);\n }\n });\n next = offset + received.count;\n if (received.failure && next < job.inputs.length) {\n if (received.failure.kind === 'timeout') this.guarded.add(guardKey);\n outcomes[next] = received.failure;\n next++;\n if (this.child) this.kill();\n }\n }\n return outcomes;\n }\n}\n\n/** A pool of runner processes for one version (base or head) of the code. */\nexport class RunnerPool {\n private procs: RunnerProcess[] = [];\n private readonly loads = new Map<string, string>();\n private readonly guarded = new Set<string>();\n private started = false;\n private lock: Promise<unknown> = Promise.resolve();\n\n constructor(private readonly options: PoolOptions) {}\n\n get size(): number {\n return this.options.size ?? Math.max(1, Math.floor(availableParallelism() / 2));\n }\n\n /** Total number of process spawns so far (initial + respawns after timeouts/crashes). */\n get spawns(): number {\n return this.procs.reduce((s, p) => s + p.spawns, 0);\n }\n\n async start(): Promise<void> {\n if (this.started) return;\n // Real paths: on macOS the temp dir is under /var -> /private/var, and resolving a symlinked path makes\n // Node read the symlink itself, which the permission model denies.\n const entry = realpathSync(await resolveChildEntry());\n this.procs = Array.from(\n { length: this.size },\n () => new RunnerProcess(entry, this.options, this.loads, this.guarded),\n );\n await Promise.all(this.procs.map((p) => p.start()));\n this.started = true;\n }\n\n async load(moduleId: string, path: string): Promise<LoadResult> {\n await this.start();\n this.loads.set(moduleId, path);\n const results = await Promise.all(this.procs.map((p) => p.loadModule(moduleId, path)));\n return results[0]!;\n }\n\n /** Run inputs, spreading them across processes. Outcomes are returned in input order. */\n run(moduleId: string, exportName: string, inputs: unknown[][]): Promise<Outcome[]> {\n const result = this.lock.then(() => this.runUnlocked(moduleId, exportName, inputs));\n this.lock = result.catch(() => undefined);\n return result;\n }\n\n private async runUnlocked(moduleId: string, exportName: string, inputs: unknown[][]): Promise<Outcome[]> {\n await this.start();\n const chunkSize = Math.max(16, Math.ceil(inputs.length / this.procs.length));\n const chunks: unknown[][][] = [];\n for (let i = 0; i < inputs.length; i += chunkSize) chunks.push(inputs.slice(i, i + chunkSize));\n const results = await Promise.all(\n chunks.map((c, i) => this.procs[i]!.run({ moduleId, exportName, inputs: c })),\n );\n return results.flat();\n }\n\n close(): void {\n for (const p of this.procs) p.kill();\n this.procs = [];\n this.started = false;\n }\n}\n", "import { createRequire, syncBuiltinESMExports } from 'node:module';\n\n/**\n * Network guard for Node versions whose permission model does not restrict network access.\n * This is a guardrail against accidental network use by code under test, NOT a security boundary.\n */\nexport function installNetGuard(): void {\n const require = createRequire(import.meta.url);\n const deny = (what: string) =>\n function denied(): never {\n const err = new Error(`doppeldiff: network access denied (${what})`) as Error & { code: string };\n err.code = 'ERR_ACCESS_DENIED';\n throw err;\n };\n const patch = (mod: Record<string, unknown>, keys: string[], label: string) => {\n for (const k of keys) {\n if (typeof mod[k] === 'function') {\n try {\n mod[k] = deny(`${label}.${k}`);\n } catch {\n /* ignore */\n }\n }\n }\n };\n const net = require('node:net') as Record<string, unknown> & {\n Socket: { prototype: Record<string, unknown> };\n };\n patch(net, ['connect', 'createConnection', 'createServer'], 'net');\n net.Socket.prototype.connect = deny('net.Socket.connect');\n patch(require('node:tls') as Record<string, unknown>, ['connect', 'createServer'], 'tls');\n patch(require('node:http') as Record<string, unknown>, ['request', 'get', 'createServer'], 'http');\n patch(require('node:https') as Record<string, unknown>, ['request', 'get', 'createServer'], 'https');\n patch(require('node:http2') as Record<string, unknown>, ['connect', 'createServer'], 'http2');\n patch(require('node:dgram') as Record<string, unknown>, ['createSocket'], 'dgram');\n const dnsKeys = [\n 'lookup',\n 'resolve',\n 'resolve4',\n 'resolve6',\n 'resolveAny',\n 'resolveMx',\n 'resolveTxt',\n 'reverse',\n ];\n const dns = require('node:dns') as Record<string, unknown>;\n patch(dns, dnsKeys, 'dns');\n if (dns.promises) patch(dns.promises as Record<string, unknown>, dnsKeys, 'dns.promises');\n const g = globalThis as Record<string, unknown>;\n for (const k of ['fetch', 'WebSocket', 'EventSource']) {\n if (typeof g[k] === 'function') g[k] = deny(k);\n }\n syncBuiltinESMExports();\n}\n\n/** True if this Node's permission model restricts network access natively (`--allow-net` exists). */\nexport function nativeNetPermission(): boolean {\n return process.allowedNodeEnvironmentFlags.has('--allow-net');\n}\n", "/**\n * Values that cannot cross the IPC boundary (functions) are sent as tagged descriptors and\n * materialized inside the runner.\n */\nexport const FN_TAG = '__doppeldiff_fn__';\n\nexport interface FnDescriptor {\n [FN_TAG]: { returns: unknown; async: boolean };\n}\n\nexport function isFnDescriptor(v: unknown): v is FnDescriptor {\n return typeof v === 'object' && v !== null && Object.prototype.hasOwnProperty.call(v, FN_TAG);\n}\n\n/**\n * Objects with inherited enumerable properties cannot cross IPC (structured clone drops prototypes): they are sent\n * as `{ [PROTO_TAG]: { proto, own } }` and rebuilt in the runner as `Object.assign(Object.create(proto), own)`.\n */\nexport const PROTO_TAG = '__doppeldiff_proto__';\n\nexport interface ProtoDescriptor {\n [PROTO_TAG]: { proto: Record<string, unknown>; own: Record<string, unknown> };\n}\n\nexport function isProtoDescriptor(v: unknown): v is ProtoDescriptor {\n return typeof v === 'object' && v !== null && Object.prototype.hasOwnProperty.call(v, PROTO_TAG);\n}\n\n/** Bytes of an ArrayBuffer or of the window of an ArrayBufferView. */\nexport function viewBytes(v: ArrayBuffer | ArrayBufferView): number[] {\n // `ArrayBuffer.isView` works across realms (values from the sandbox context); `instanceof` does not.\n return ArrayBuffer.isView(v)\n ? Array.from(new Uint8Array(v.buffer, v.byteOffset, v.byteLength))\n : Array.from(new Uint8Array(v));\n}\n\n/**\n * Typed arrays and DataViews cannot cross IPC faithfully: Node deserializes a view as a window into the whole\n * message buffer, so `view.buffer` would contain unrelated bytes that change from batch to batch. They are sent as\n * `{ [VIEW_TAG]: { ctor, buffer, byteOffset, length } }` (an ArrayBuffer crosses as an exact copy) and rebuilt.\n */\nexport const VIEW_TAG = '__doppeldiff_view__';\n\nexport interface ViewDescriptor {\n [VIEW_TAG]: { ctor: string; buffer: ArrayBuffer; byteOffset: number; length: number };\n}\n\nexport function isViewDescriptor(v: unknown): v is ViewDescriptor {\n return typeof v === 'object' && v !== null && Object.prototype.hasOwnProperty.call(v, VIEW_TAG);\n}\n\n/** Prepare an input for IPC: replace typed arrays and DataViews (at any depth) with view descriptors. */\nexport function toWire(value: unknown, depth = 0): unknown {\n if (typeof value !== 'object' || value === null || depth > 32) return value;\n if (ArrayBuffer.isView(value)) {\n const v = value as ArrayBufferView & { length?: number };\n return {\n [VIEW_TAG]: {\n ctor: v.constructor.name,\n buffer: (v.buffer as ArrayBuffer).slice(0),\n byteOffset: v.byteOffset,\n length: v instanceof DataView ? v.byteLength : (v.length ?? 0),\n },\n } satisfies ViewDescriptor;\n }\n if (Array.isArray(value)) return value.map((x) => toWire(x, depth + 1));\n if (value instanceof Map)\n return new Map([...value].map(([k, x]) => [toWire(k, depth + 1), toWire(x, depth + 1)]));\n if (value instanceof Set) return new Set([...value].map((x) => toWire(x, depth + 1)));\n if (Object.getPrototypeOf(value) !== Object.prototype) return value;\n const out: Record<string, unknown> = {};\n for (const [k, x] of Object.entries(value)) out[k] = toWire(x, depth + 1);\n return out;\n}\n", "import { Node, SyntaxKind } from 'ts-morph';\nimport type { MinedRegex } from './regex.js';\n\n/** Values mined from source code, used to bias generation towards interesting regions. */\nexport interface MinedValues {\n /** Numeric literals and their neighbours (v, v\u00B11, v\u00B10.01, -v) plus universal boundaries. */\n numbers: number[];\n /** Numeric literals that appear as an operand of a comparison: decision boundaries. */\n thresholds: number[];\n /** String literals and simple variants. */\n strings: string[];\n /** Property names the code reads (`options.min`, `obj[\"key\"]`, destructured names): keys for untyped objects. */\n keys: string[];\n /** Short string literals as-is: fragments for composing structured strings (paths, URLs, formats). */\n fragments: string[];\n /** Regular expressions in the code: inputs in the format the code parses. */\n regexes: MinedRegex[];\n /** Strings that a changed regex classifies differently in the two versions (see `regexDiffStrings`). */\n distinguishing?: string[];\n}\n\nexport const NUMBER_BOUNDARIES: readonly number[] = [\n 0,\n -0,\n 1,\n -1,\n 0.5,\n NaN,\n Infinity,\n -Infinity,\n Number.MAX_SAFE_INTEGER,\n Number.MIN_SAFE_INTEGER,\n Number.MIN_VALUE,\n Number.EPSILON,\n];\n\nexport const STRING_BOUNDARIES: readonly string[] = ['', ' ', 'a', 'A', '0', '-', ' a ', '\u00E9', '\uD83D\uDE00', '\\n'];\n\nconst COMPARISON_OPERATORS = new Set([\n SyntaxKind.LessThanToken,\n SyntaxKind.LessThanEqualsToken,\n SyntaxKind.GreaterThanToken,\n SyntaxKind.GreaterThanEqualsToken,\n SyntaxKind.EqualsEqualsEqualsToken,\n SyntaxKind.EqualsEqualsToken,\n SyntaxKind.ExclamationEqualsEqualsToken,\n SyntaxKind.ExclamationEqualsToken,\n]);\n\nconst MAX_STRING_LITERAL = 64;\nconst MAX_MINED = 200;\n\nfunction numericValue(node: Node): number | undefined {\n if (Node.isNumericLiteral(node)) {\n const v = node.getLiteralValue();\n const parent = node.getParent();\n if (\n parent &&\n Node.isPrefixUnaryExpression(parent) &&\n parent.getOperatorToken() === SyntaxKind.MinusToken\n ) {\n return -v;\n }\n return v;\n }\n if (Node.isPrefixUnaryExpression(node) && node.getOperatorToken() === SyntaxKind.MinusToken) {\n const operand = node.getOperand();\n if (Node.isNumericLiteral(operand)) return -operand.getLiteralValue();\n }\n return undefined;\n}\n\nfunction round(v: number): number {\n return Math.round(v * 1e9) / 1e9;\n}\n\n/** Mine literals from a set of nodes (both versions of a function and helpers it reaches). */\nexport function mineValues(nodes: Node[]): MinedValues {\n const literals = new Set<number>();\n const thresholds = new Set<number>();\n const strings = new Set<string>();\n const keys = new Set<string>();\n const regexes = new Map<string, MinedRegex>();\n\n for (const root of nodes) {\n root.forEachDescendant((node) => {\n if (Node.isNumericLiteral(node)) {\n const v = numericValue(node);\n if (v !== undefined && Number.isFinite(v)) literals.add(v);\n } else if (Node.isStringLiteral(node) || Node.isNoSubstitutionTemplateLiteral(node)) {\n // Skip import specifiers and property keys in object literals that are pure syntax.\n const parent = node.getParent();\n if (parent && (Node.isImportDeclaration(parent) || Node.isExportDeclaration(parent))) return;\n const v = node.getLiteralValue();\n if (v.length <= MAX_STRING_LITERAL) strings.add(v);\n } else if (Node.isRegularExpressionLiteral(node)) {\n const text = node.getText();\n const end = text.lastIndexOf('/');\n const r = { source: text.slice(1, end), flags: text.slice(end + 1) };\n if (r.source.length <= 400) regexes.set(text, r);\n } else if (Node.isNewExpression(node) && node.getExpression().getText() === 'RegExp') {\n const [src, fl] = node.getArguments();\n if (src && Node.isStringLiteral(src)) {\n const r = {\n source: src.getLiteralValue(),\n flags: fl && Node.isStringLiteral(fl) ? fl.getLiteralValue() : '',\n };\n if (r.source.length <= 400) regexes.set(`${r.source}/${r.flags}`, r);\n }\n } else if (Node.isPropertyAccessExpression(node)) {\n // Property names the code reads (`options.min`): keys for untyped objects.\n const name = node.getName();\n if (name.length <= 32 && !BUILTIN_MEMBERS.has(name)) keys.add(name);\n } else if (Node.isBindingElement(node)) {\n const prop = node.getPropertyNameNode()?.getText() ?? node.getName();\n if (/^[A-Za-z_$][\\w$]*$/.test(prop) && prop.length <= 32) keys.add(prop);\n } else if (\n Node.isBinaryExpression(node) &&\n COMPARISON_OPERATORS.has(node.getOperatorToken().getKind())\n ) {\n for (const side of [node.getLeft(), node.getRight()]) {\n const v = numericValue(side);\n if (v !== undefined && Number.isFinite(v)) thresholds.add(v);\n }\n }\n });\n }\n\n const numbers = new Set<number>(NUMBER_BOUNDARIES);\n for (const v of [...literals, ...thresholds]) {\n for (const n of [v, -v, v + 1, v - 1, round(v + 0.01), round(v - 0.01), v * 10, v / 10]) {\n if (Number.isFinite(n)) numbers.add(n);\n }\n }\n for (const t of thresholds) {\n // The nearest representable doubles around a decision boundary.\n numbers.add(nextAfter(t, Infinity));\n numbers.add(nextAfter(t, -Infinity));\n }\n\n const strs = new Set<string>(STRING_BOUNDARIES);\n for (const s of strings) {\n for (const v of [s, ` ${s} `, s.toUpperCase(), s.toLowerCase(), s + s, s.slice(0, 1)]) strs.add(v);\n }\n\n return {\n numbers: [...numbers].slice(0, MAX_MINED),\n thresholds: [...thresholds].sort((a, b) => a - b),\n strings: [...strs].slice(0, MAX_MINED),\n keys: [...keys].slice(0, 40),\n fragments: [...strings].filter((x) => x.length > 0 && x.length <= 12).slice(0, 60),\n regexes: [...regexes.values()].slice(0, 20),\n };\n}\n\n/** Members of built-ins that say nothing about the shape of inputs. */\nconst BUILTIN_MEMBERS = new Set([\n 'length',\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'slice',\n 'splice',\n 'map',\n 'filter',\n 'reduce',\n 'forEach',\n 'some',\n 'every',\n 'find',\n 'findIndex',\n 'includes',\n 'indexOf',\n 'join',\n 'split',\n 'replace',\n 'replaceAll',\n 'trim',\n 'trimStart',\n 'trimEnd',\n 'toLowerCase',\n 'toUpperCase',\n 'startsWith',\n 'endsWith',\n 'charAt',\n 'charCodeAt',\n 'codePointAt',\n 'substring',\n 'substr',\n 'concat',\n 'match',\n 'test',\n 'exec',\n 'keys',\n 'values',\n 'entries',\n 'assign',\n 'freeze',\n 'isArray',\n 'isInteger',\n 'isNaN',\n 'isFinite',\n 'floor',\n 'ceil',\n 'round',\n 'abs',\n 'min',\n 'max',\n 'pow',\n 'sqrt',\n 'toString',\n 'toFixed',\n 'valueOf',\n 'call',\n 'apply',\n 'bind',\n 'prototype',\n 'hasOwnProperty',\n 'get',\n 'set',\n 'has',\n 'add',\n 'delete',\n 'size',\n 'then',\n 'catch',\n 'log',\n 'normalize',\n 'padStart',\n 'padEnd',\n 'repeat',\n 'sort',\n 'reverse',\n 'flat',\n 'flatMap',\n 'fill',\n 'from',\n 'of',\n 'parse',\n 'stringify',\n 'getTime',\n 'now',\n 'create',\n 'defineProperty',\n]);\n\n/** Smallest double strictly after `x` in the direction of `toward`. */\nexport function nextAfter(x: number, toward: number): number {\n if (Number.isNaN(x) || Number.isNaN(toward)) return NaN;\n if (x === toward) return toward;\n if (x === 0) return toward > 0 ? Number.MIN_VALUE : -Number.MIN_VALUE;\n const buf = new DataView(new ArrayBuffer(8));\n buf.setFloat64(0, x);\n let bits = buf.getBigUint64(0);\n bits += toward > x === x > 0 ? 1n : -1n;\n buf.setBigUint64(0, bits);\n return buf.getFloat64(0);\n}\n\nexport function emptyMined(): MinedValues {\n return {\n numbers: [...NUMBER_BOUNDARIES],\n thresholds: [],\n strings: [...STRING_BOUNDARIES],\n keys: [],\n fragments: [],\n regexes: [],\n };\n}\n", "import fc, { type Arbitrary } from 'fast-check';\nimport type { ArbSpec, BinaryCtor, SignatureSpec } from '../types/spec.js';\nimport { FN_TAG, PROTO_TAG, type FnDescriptor, type ProtoDescriptor } from '../runner/tags.js';\nimport { emptyMined, type MinedValues } from './mine.js';\nimport { regexArbitraries } from './regex.js';\n\nexport interface CompileOptions {\n mined?: MinedValues;\n /** Max nesting of recursive types (default 3). */\n maxRecursionDepth?: number;\n /** Max array / collection length (default 8). */\n maxLength?: number;\n /** Relative weight of mined values vs type-driven values, 0..1 (default 0.3). */\n minedWeight?: number;\n}\n\ninterface Ctx {\n mined: MinedValues;\n defs: Map<string, ArbSpec>;\n depth: Map<string, number>;\n maxDepth: number;\n maxLength: number;\n minedWeight: number;\n /** When true, references are not followed (used to build terminating base cases). */\n terminal: boolean;\n}\n\n/** UTF-16 edge cases that random code points almost never hit. */\nconst UTF16_EDGES = [\n '\\uD800',\n '\\uDBFF',\n '\\uDC00',\n '\\uDFFF',\n '\\uD83D\\uDE00',\n '\\u0301',\n '\\u200B',\n '\\uFEFF',\n 'a',\n '\u00E9',\n];\n\n/** Structural fragments common in paths, URLs, queries and formats. */\nconst STRUCTURAL_FRAGMENTS = [\n '/',\n '//',\n '?',\n '#',\n '&',\n '=',\n ':',\n '.',\n '..',\n '-',\n '_',\n ' ',\n 'a',\n 'b',\n '1',\n '%20',\n '@',\n ',',\n];\n\nconst INTERESTING_CHARS = [\n ' ',\n '-',\n '_',\n '.',\n '/',\n 'a',\n 'Z',\n '0',\n '9',\n '\u00E9',\n '\u00DF',\n '\u0130',\n '\uD83D\uDE00',\n '\\t',\n '\u00A0',\n '&',\n \"'\",\n];\n\nconst SPECIAL_DATES = [\n new Date(0),\n new Date('2024-02-29T00:00:00.000Z'),\n new Date('2024-12-31T23:59:59.999Z'),\n new Date('2025-03-30T01:30:00.000Z'),\n new Date('2025-10-26T00:59:59.000Z'),\n new Date('1999-12-31T23:59:59.000Z'),\n new Date(NaN),\n];\n\nfunction weighted(typeDriven: Arbitrary<unknown>, mined: readonly unknown[], ctx: Ctx): Arbitrary<unknown> {\n if (mined.length === 0 || ctx.minedWeight <= 0) return typeDriven;\n const w = Math.round(ctx.minedWeight * 100);\n return fc.oneof(\n { arbitrary: typeDriven, weight: 100 - w },\n { arbitrary: fc.constantFrom(...mined), weight: w },\n );\n}\n\nfunction numberArb(ctx: Ctx): Arbitrary<unknown> {\n // Mostly realistic magnitudes; the full double range (NaN, \u00B1Infinity, 1e308, 5e-324) stays in the mix.\n const typeDriven = fc.oneof(\n { arbitrary: fc.integer({ min: -1000, max: 1000 }), weight: 4 },\n { arbitrary: fc.integer({ min: -100_000_000, max: 100_000_000 }).map((n) => n / 100), weight: 4 },\n { arbitrary: fc.double(), weight: 2 },\n );\n return weighted(typeDriven, ctx.mined.numbers, ctx);\n}\n\nconst regexCache = new WeakMap<object, Arbitrary<string>[]>();\n\nconst sampleCache = new WeakMap<object, string[]>();\n\n/** A few short strings per code regex, as fragments: composed strings then contain format-shaped words. */\nfunction regexSamples(arbs: Arbitrary<string>[]): string[] {\n let out = sampleCache.get(arbs);\n if (!out) {\n out = [];\n arbs.forEach((arb, i) => {\n try {\n out!.push(\n ...fc\n .sample(arb, { numRuns: 6, seed: 7 + i })\n .filter((x) => x.length > 0 && x.length <= 12)\n .slice(0, 3),\n );\n } catch {\n /* skip */\n }\n });\n sampleCache.set(arbs, out);\n }\n return out;\n}\n\nfunction stringArb(ctx: Ctx): Arbitrary<unknown> {\n // Strings in the formats the code parses (its own regex literals), when there are any.\n let fromRegexes = regexCache.get(ctx.mined.regexes);\n if (!fromRegexes) {\n fromRegexes = regexArbitraries(ctx.mined.regexes);\n regexCache.set(ctx.mined.regexes, fromRegexes);\n }\n // Strings composed from a small shared pool of fragments (mined literals + structural characters): two\n // independently generated arguments then often share prefixes/suffixes, as paths and URLs do in real calls.\n const fragments = [\n ...new Set([...ctx.mined.fragments, ...STRUCTURAL_FRAGMENTS, ...regexSamples(fromRegexes)]),\n ];\n const composed = fc\n .array(fc.constantFrom(...fragments), { minLength: 1, maxLength: 5 })\n .map((xs) => xs.join(''));\n const typeDriven = fc.oneof(\n { arbitrary: fc.string({ maxLength: 16 }), weight: 3 },\n { arbitrary: fc.string({ unit: fc.constantFrom(...INTERESTING_CHARS), maxLength: 12 }), weight: 2 },\n { arbitrary: composed, weight: 3 },\n { arbitrary: fc.string({ unit: 'grapheme', maxLength: 8 }), weight: 1 },\n // UTF-16 edge cases: lone high/low surrogates, a valid pair, combining marks, zero-width and BOM.\n {\n arbitrary: fc.string({ unit: fc.constantFrom(...UTF16_EDGES), minLength: 1, maxLength: 6 }),\n weight: 1,\n },\n ...(fromRegexes.length > 0 ? [{ arbitrary: fc.oneof(...fromRegexes), weight: 3 }] : []),\n ...(ctx.mined.distinguishing?.length\n ? [{ arbitrary: fc.constantFrom(...ctx.mined.distinguishing), weight: 3 }]\n : []),\n );\n return weighted(typeDriven, ctx.mined.strings, ctx);\n}\n\nfunction dateArb(ctx: Ctx): Arbitrary<unknown> {\n const typeDriven = fc.date({\n min: new Date('1900-01-01T00:00:00.000Z'),\n max: new Date('2200-01-01T00:00:00.000Z'),\n noInvalidDate: true,\n });\n return weighted(typeDriven, SPECIAL_DATES, { ...ctx, minedWeight: 0.2 });\n}\n\nconst TYPED_ARRAYS = {\n Uint8Array,\n Uint8ClampedArray,\n Int8Array,\n Uint16Array,\n Int16Array,\n Uint32Array,\n Int32Array,\n Float32Array,\n Float64Array,\n BigInt64Array,\n BigUint64Array,\n} as const;\n\n/**\n * Typed arrays, ArrayBuffers and DataViews. Views are often windows into a larger buffer (non-zero `byteOffset`,\n * shorter `byteLength`): code that copies `view.buffer` without the window is a classic bug.\n */\nfunction binaryArb(ctor: BinaryCtor, ctx: Ctx): Arbitrary<unknown> {\n const max = Math.max(1, ctx.maxLength);\n const bytes = fc.uint8Array({ maxLength: max * 2 });\n if (ctor === 'ArrayBuffer')\n return bytes.map((b) => b.buffer.slice(b.byteOffset, b.byteOffset + b.byteLength));\n if (ctor === 'DataView') {\n return fc\n .tuple(fc.uint8Array({ minLength: 0, maxLength: max * 2 }), fc.noBias(fc.nat(4)), fc.noBias(fc.nat(4)))\n .map(([b, before, after]) => {\n const buf = new Uint8Array(before + b.length + after);\n buf.set(b, before);\n return new DataView(buf.buffer, before, b.length);\n });\n }\n const Ctor = TYPED_ARRAYS[ctor];\n const size = Ctor.BYTES_PER_ELEMENT;\n return fc\n .tuple(\n fc.nat(max),\n fc.noBias(fc.nat(2)),\n fc.noBias(fc.nat(2)),\n fc.uint8Array({ minLength: max * size, maxLength: max * size }),\n )\n .map(([len, before, after, raw]) => {\n // Elements from random bytes (covers NaN/negative values), viewed through a window of a larger buffer.\n const buf = new ArrayBuffer((before + len + after) * size);\n new Uint8Array(buf, before * size, len * size).set(raw.subarray(0, len * size));\n return new Ctor(buf, before * size, len);\n });\n}\n\n/**\n * Objects with enumerable properties on their prototype (`Object.create({ inherited: 1 })`): `for...in` sees them,\n * `Object.keys` does not. Sent to the runner as a descriptor (structured clone drops prototypes).\n */\nfunction protoObjectArb(key: Arbitrary<string>, value: Arbitrary<unknown>): Arbitrary<unknown> {\n const dict = (min: number) =>\n fc.dictionary(key, value, { minKeys: min, maxKeys: 3, noNullPrototype: true });\n return fc.tuple(dict(1), dict(0)).map(([proto, own]): ProtoDescriptor => ({ [PROTO_TAG]: { proto, own } }));\n}\n\n/** Rarer object kinds that untyped code handles specially: binary data and objects with inherited properties. */\nfunction zooArb(ctx: Ctx, key: Arbitrary<string>, value: Arbitrary<unknown>): Arbitrary<unknown> {\n return fc.oneof(\n binaryArb('Uint8Array', ctx),\n binaryArb('Float64Array', ctx),\n binaryArb('ArrayBuffer', ctx),\n binaryArb('DataView', ctx),\n protoObjectArb(key, value),\n );\n}\n\nfunction anythingArb(ctx: Ctx): Arbitrary<unknown> {\n // Untyped parameters (`any`, plain JS): objects use the property names the code reads as keys, and leaves\n // reuse the number/string generators (with mined values).\n const key =\n ctx.mined.keys.length > 0\n ? fc.oneof(fc.constantFrom(...ctx.mined.keys), fc.string({ maxLength: 6 }))\n : fc.string({ maxLength: 6 });\n const leaves = [numberArb(ctx), stringArb(ctx), fc.boolean(), fc.constant(undefined), fc.constant(null)];\n const shaped = fc.anything({\n maxDepth: 2,\n maxKeys: 4,\n key,\n values: leaves,\n withDate: true,\n withMap: false,\n withSet: false,\n });\n const anything = fc.anything({\n maxDepth: 2,\n maxKeys: 4,\n withBigInt: true,\n withDate: true,\n withMap: true,\n withSet: true,\n withTypedArray: false,\n withSparseArray: false,\n withNullPrototype: false,\n withBoxedValues: false,\n withObjectString: false,\n });\n const leaf = fc.oneof(numberArb(ctx), stringArb(ctx), fc.boolean());\n const mixed = fc.oneof(\n { arbitrary: anything, weight: 4 },\n { arbitrary: shaped, weight: 6 },\n { arbitrary: numberArb(ctx), weight: 4 },\n { arbitrary: stringArb(ctx), weight: 4 },\n { arbitrary: zooArb(ctx, key, leaf), weight: 2 },\n );\n return weighted(mixed, [...ctx.mined.numbers.slice(0, 20), ...ctx.mined.strings.slice(0, 20)], ctx);\n}\n\nfunction compile(spec: ArbSpec, ctx: Ctx): Arbitrary<unknown> | null {\n switch (spec.kind) {\n case 'number':\n return numberArb(ctx);\n case 'bigint':\n return fc.oneof(fc.bigInt({ min: -1000n, max: 1000n }), fc.bigInt());\n case 'string':\n return stringArb(ctx);\n case 'boolean':\n return fc.boolean();\n case 'undefined':\n return fc.constant(undefined);\n case 'null':\n return fc.constant(null);\n case 'literal':\n return fc.constant(spec.value);\n case 'bigintLiteral':\n return fc.constant(BigInt(spec.value));\n case 'union': {\n const options = spec.options\n .map((o) => compile(o, ctx))\n .filter((a): a is Arbitrary<unknown> => a !== null);\n if (options.length === 0) return null;\n return options.length === 1 ? options[0]! : fc.oneof(...options);\n }\n case 'array': {\n const items = compile(spec.items, ctx);\n if (!items) return fc.constant([]);\n return ctx.terminal ? fc.constant([]) : fc.array(items, { maxLength: ctx.maxLength });\n }\n case 'tuple': {\n const items = spec.items.map((i) => compile(i, ctx));\n if (items.some((i) => i === null)) return null;\n const fixed = fc.tuple(...(items as Arbitrary<unknown>[]));\n const restArb = spec.rest ? compile(spec.rest, ctx) : null;\n const withRest: Arbitrary<unknown[]> = restArb\n ? fc\n .tuple(fixed, fc.array(restArb, { maxLength: Math.min(4, ctx.maxLength) }))\n .map(([f, r]) => [...f, ...r])\n : fixed;\n if (spec.optionalFrom === undefined) return withRest;\n const min = spec.optionalFrom;\n return fc\n .tuple(withRest, fc.integer({ min, max: spec.items.length }))\n .map(([vals, len]) => (len < spec.items.length ? vals.slice(0, len) : vals));\n }\n case 'object': {\n const model: Record<string, Arbitrary<unknown>> = {};\n const required: string[] = [];\n for (const p of spec.props) {\n const a = compile(p.spec, ctx);\n if (!a) {\n if (p.optional) continue;\n return null;\n }\n model[p.name] = a;\n if (!p.optional) required.push(p.name);\n }\n return fc.record(model, { requiredKeys: required, noNullPrototype: true });\n }\n case 'record': {\n const values = compile(spec.values, ctx);\n if (!values || ctx.terminal) return fc.constant({});\n const key =\n spec.key === 'number'\n ? fc.integer({ min: 0, max: 99 }).map(String)\n : fc.string({ maxLength: 8 }).filter((k) => k !== '__proto__');\n return fc.dictionary(key, values, { maxKeys: Math.min(5, ctx.maxLength), noNullPrototype: true });\n }\n case 'date':\n return dateArb(ctx);\n case 'binary':\n return binaryArb(spec.ctor, ctx);\n case 'map': {\n const k = compile(spec.key, ctx);\n const v = compile(spec.value, ctx);\n if (!k || !v || ctx.terminal) return fc.constant(new Map());\n return fc.array(fc.tuple(k, v), { maxLength: Math.min(5, ctx.maxLength) }).map((es) => new Map(es));\n }\n case 'set': {\n const i = compile(spec.items, ctx);\n if (!i || ctx.terminal) return fc.constant(new Set());\n return fc.array(i, { maxLength: Math.min(5, ctx.maxLength) }).map((xs) => new Set(xs));\n }\n case 'function': {\n const ret = compile(spec.returns, ctx) ?? fc.constant(undefined);\n return ret.map((v): FnDescriptor => ({ [FN_TAG]: { returns: v, async: spec.async } }));\n }\n case 'recursive': {\n ctx.defs.set(spec.id, spec.spec);\n return compileRef(spec.id, ctx);\n }\n case 'ref':\n return compileRef(spec.id, ctx);\n case 'anything':\n return anythingArb(ctx);\n case 'unsupported':\n return null;\n }\n}\n\nfunction compileRef(id: string, ctx: Ctx): Arbitrary<unknown> | null {\n const def = ctx.defs.get(id);\n if (!def) return null;\n const d = ctx.depth.get(id) ?? 0;\n if (ctx.terminal) return null;\n if (d >= ctx.maxDepth) return compile(def, { ...ctx, terminal: true });\n ctx.depth.set(id, d + 1);\n try {\n return compile(def, ctx);\n } finally {\n ctx.depth.set(id, d);\n }\n}\n\nfunction makeCtx(options: CompileOptions): Ctx {\n return {\n mined: options.mined ?? emptyMined(),\n defs: new Map(),\n depth: new Map(),\n maxDepth: options.maxRecursionDepth ?? 3,\n maxLength: options.maxLength ?? 8,\n minedWeight: options.minedWeight ?? 0.3,\n terminal: false,\n };\n}\n\n/** Compile a single spec. Returns null if the spec cannot produce any value. */\nexport function compileSpec(spec: ArbSpec, options: CompileOptions = {}): Arbitrary<unknown> | null {\n return compile(spec, makeCtx(options));\n}\n\n/** Compile a signature into an arbitrary of argument lists. */\nexport function compileSignature(\n sig: SignatureSpec,\n options: CompileOptions = {},\n): Arbitrary<unknown[]> | null {\n const ctx = makeCtx(options);\n const fixed: Arbitrary<unknown>[] = [];\n let rest: Arbitrary<unknown> | null = null;\n for (const p of sig.params) {\n const a = compile(p.spec, ctx);\n if (p.rest) {\n rest = a;\n continue;\n }\n if (!a) {\n if (p.optional) {\n fixed.push(fc.constant(undefined));\n continue;\n }\n return null;\n }\n fixed.push(a);\n }\n const base: Arbitrary<unknown[]> = fc.tuple(...fixed);\n if (!rest) return base;\n return fc.tuple(base, fc.array(rest, { maxLength: 4 })).map(([f, r]) => [...f, ...r]);\n}\n", "import fc, { type Arbitrary } from 'fast-check';\n\n/** A regular expression found in the code under test (serializable). */\nexport interface MinedRegex {\n source: string;\n flags: string;\n}\n\n/**\n * Remove lookaround groups `(?=\u2026)`, `(?!\u2026)`, `(?<=\u2026)`, `(?<!\u2026)` (unsupported by fast-check's stringMatching).\n * The result describes a superset-ish shape of the original, which is what we want: inputs in the right format,\n * including near misses.\n */\nexport function stripLookarounds(source: string): string {\n let out = '';\n for (let i = 0; i < source.length; i++) {\n const c = source[i]!;\n if (c === '\\\\') {\n out += c + (source[i + 1] ?? '');\n i++;\n continue;\n }\n if (c === '(' && /^\\(\\?<?[=!]/.test(source.slice(i, i + 4))) {\n let depth = 0;\n let inClass = false;\n for (; i < source.length; i++) {\n const d = source[i]!;\n if (d === '\\\\') {\n i++;\n continue;\n }\n if (inClass) {\n if (d === ']') inClass = false;\n continue;\n }\n if (d === '[') inClass = true;\n else if (d === '(') depth++;\n else if (d === ')' && --depth === 0) break;\n }\n continue;\n }\n out += c;\n }\n return out;\n}\n\n/**\n * Replace backreferences (`\\\\3`) with a copy of the group they refer to (`(?:-?)`): fast-check cannot generate\n * backreferences. The copy matches a superset of what the backreference matches; that is fine for generating\n * inputs in the right format (the real regex still decides).\n */\nexport function inlineBackreferences(source: string): string {\n const groups: string[] = [];\n // Open groups: index into `groups` (-1 for non-capturing) and start position.\n const open: { idx: number; start: number }[] = [];\n let inClass = false;\n for (let i = 0; i < source.length; i++) {\n const c = source[i]!;\n if (c === '\\\\') {\n i++;\n continue;\n }\n if (inClass) {\n if (c === ']') inClass = false;\n continue;\n }\n if (c === '[') inClass = true;\n else if (c === '(') {\n const capturing = source[i + 1] !== '?' || /^\\(\\?<[A-Za-z_$]/.test(source.slice(i, i + 4));\n open.push({ idx: capturing ? groups.push('') - 1 : -1, start: i });\n } else if (c === ')') {\n const g = open.pop();\n if (g && g.idx >= 0) groups[g.idx] = source.slice(g.start, i + 1);\n }\n }\n if (groups.length === 0 || !/\\\\[1-9]/.test(source)) return source;\n let out = '';\n inClass = false;\n for (let i = 0; i < source.length; i++) {\n const c = source[i]!;\n if (c === '\\\\') {\n const m = /^[1-9]\\d*/.exec(source.slice(i + 1));\n const n = m ? Number(m[0]) : 0;\n if (!inClass && m && n <= groups.length) {\n // Drop capturing/named-ness: `(?<x>a)` / `(a)` become `(?:a)`.\n const g = groups[n - 1]!.replace(/^\\((?:\\?<[A-Za-z_$][\\w$]*>)?/, '(?:');\n out += g.includes('\\\\') && /\\\\[1-9]/.test(g) ? '(?:)' : g;\n i += m[0].length;\n continue;\n }\n out += c + (source[i + 1] ?? '');\n i++;\n continue;\n }\n if (inClass) {\n if (c === ']') inClass = false;\n } else if (c === '[') inClass = true;\n out += c;\n }\n return out;\n}\n\n/** Readable stand-ins for common Unicode property classes (generation only; the real regex still decides). */\nconst PROPERTY_CLASSES: [RegExp, string][] = [\n [/^(?:L|Letter|Alphabetic|Alpha|ID_Start|ID_Continue)$/, 'a-zA-Z\\\\u00e9\\\\u00df\\\\u0130'],\n [/^(?:Lu|Uppercase_Letter|Uppercase|Upper)$/, 'A-Z\\\\u00c9\\\\u0130'],\n [/^(?:Ll|Lowercase_Letter|Lowercase|Lower)$/, 'a-z\\\\u00e9\\\\u00df'],\n [/^(?:N|Nd|Number|Decimal_Number|digit)$/, '0-9'],\n [/^(?:P|Punctuation|Po)$/, '.,!?;:\\\\-'],\n [/^(?:Z|Zs|White_Space|Space_Separator)$/, ' '],\n [/^(?:M|Mark|Mn)$/, '\\\\u0301'],\n];\n\n/**\n * Replace `\\p{Alphabetic}`, `\\p{Lu}`, \u2026 with small readable classes. fast-check generates from the full Unicode\n * class, which yields mostly unassigned astral code points: valid, but nothing like real input.\n */\nexport function approximateProperties(source: string): string {\n let out = '';\n let inClass = false;\n for (let i = 0; i < source.length; i++) {\n const c = source[i]!;\n if (c === '\\\\') {\n const m = /^([pP])\\{([^}]+)\\}/.exec(source.slice(i + 1));\n const name = m?.[2]?.replace(/^(?:General_Category|gc|Script|sc)=/, '');\n const cls = name ? PROPERTY_CLASSES.find(([re]) => re.test(name))?.[1] : undefined;\n if (m && cls && !(inClass && m[1] === 'P')) {\n out += inClass ? cls : m[1] === 'p' ? `[${cls}]` : `[^${cls}]`;\n i += m[0].length;\n continue;\n }\n out += c + (source[i + 1] ?? '');\n i++;\n continue;\n }\n if (inClass) {\n if (c === ']') inClass = false;\n } else if (c === '[') inClass = true;\n out += c;\n }\n return out;\n}\n\n/** Arbitraries generating strings that match regexes from the code (skipping ones fast-check cannot handle). */\nexport function regexArbitraries(regexes: readonly MinedRegex[]): Arbitrary<string>[] {\n const out: Arbitrary<string>[] = [];\n for (const r of regexes) {\n try {\n const flags = r.flags.replace(/[gyi]/g, '');\n const re = new RegExp(approximateProperties(stripLookarounds(inlineBackreferences(r.source))), flags);\n const arb = fc.stringMatching(re, { size: 'small' });\n // Probe once: some patterns construct fine but fail on generation.\n fc.sample(arb, { numRuns: 3, seed: 1 });\n out.push(arb);\n } catch {\n /* unsupported pattern: skip */\n }\n }\n return out;\n}\n\nconst MUTATION_CHARS = [...'0123456789aZ-_. /:'];\n\nfunction testable(r: MinedRegex): RegExp | undefined {\n try {\n return new RegExp(r.source, r.flags.replace(/[gy]/g, ''));\n } catch {\n return undefined;\n }\n}\n\n/**\n * Strings that the regexes of one version classify differently from the regexes of the other version. When a fix\n * changes a regex (`3([0-5]\\d|6[1-6])` to `3([0-5]\\d|6[0-6])`), random strings in the format almost never land\n * on the few inputs where the two disagree; sampling both regexes and keeping the strings where they disagree\n * finds them directly. Only regexes that differ between the versions take part.\n */\nexport function regexDiffStrings(\n base: readonly MinedRegex[],\n head: readonly MinedRegex[],\n options: { samples?: number; seed?: number; max?: number } = {},\n): string[] {\n const key = (r: MinedRegex) => `${r.source}/${r.flags}`;\n const headKeys = new Set(head.map(key));\n const baseKeys = new Set(base.map(key));\n const oldOnly = base.filter((r) => !headKeys.has(key(r)));\n const newOnly = head.filter((r) => !baseKeys.has(key(r)));\n if (oldOnly.length === 0 || newOnly.length === 0) return [];\n const oldRes = oldOnly.map(testable).filter((r): r is RegExp => !!r);\n const newRes = newOnly.map(testable).filter((r): r is RegExp => !!r);\n if (oldRes.length === 0 || newRes.length === 0) return [];\n const verdict = (res: RegExp[], s: string) => res.map((r) => r.test(s)).join();\n // Pairwise when the counts match (the usual case: each changed regex has one counterpart), otherwise \"any\".\n const differs = (s: string) =>\n oldRes.length === newRes.length\n ? verdict(oldRes, s) !== verdict(newRes, s)\n : oldRes.some((r) => r.test(s)) !== newRes.some((r) => r.test(s));\n const max = options.max ?? 30;\n const samples = options.samples ?? 400;\n const out = new Set<string>();\n const arbs = regexArbitraries([...oldOnly, ...newOnly]);\n arbs.forEach((arb, i) => {\n let xs: string[];\n try {\n xs = fc.sample(arb, { numRuns: samples, seed: (options.seed ?? 1) + i });\n } catch {\n return;\n }\n for (const s of xs) if (differs(s)) out.add(s);\n // Local search: the disagreement is usually one character away from a sample (\"2009-361\" -> \"2009-360\").\n for (const s of xs.slice(0, 120)) {\n if (s.length > 40 || out.size >= max * 4) break;\n const alphabet = [...new Set([...MUTATION_CHARS, ...s])];\n for (let p = 0; p < s.length; p++) {\n for (const ch of alphabet) {\n if (ch === s[p]) continue;\n const v = s.slice(0, p) + ch + s.slice(p + 1);\n if (differs(v)) out.add(v);\n }\n }\n }\n });\n return [...out].sort((a, b) => a.length - b.length || (a < b ? -1 : 1)).slice(0, max);\n}\n", "import { Node, SyntaxKind, type SourceFile, type VariableDeclaration } from 'ts-morph';\nimport type { FunctionLikeNode } from '../types/fromType.js';\n\nexport type LocateResult =\n | { ok: true; node: FunctionLikeNode | VariableDeclaration; declaration: Node; callable?: boolean }\n | { ok: false; reason: string; missing?: boolean };\n\nfunction unwrapExpression(node: Node | undefined): Node | undefined {\n let cur = node;\n while (\n cur &&\n (Node.isParenthesizedExpression(cur) ||\n Node.isAsExpression(cur) ||\n Node.isSatisfiesExpression(cur) ||\n Node.isTypeAssertion(cur) ||\n Node.isNonNullExpression(cur))\n ) {\n cur = cur.getExpression();\n }\n return cur;\n}\n\n/** Resolve a declaration node to the function-like node that implements it, or a skip reason. */\nexport function asFunctionLike(decl: Node): LocateResult {\n if (Node.isFunctionDeclaration(decl)) {\n if (decl.isGenerator()) return { ok: false, reason: 'generator function' };\n if (decl.getOverloads().length > 0) return { ok: false, reason: 'overloaded function' };\n if (!decl.hasBody()) return { ok: false, reason: 'declaration without body' };\n return { ok: true, node: decl, declaration: decl };\n }\n if (Node.isVariableDeclaration(decl)) {\n const init = unwrapExpression(decl.getInitializer());\n if (init && (Node.isArrowFunction(init) || Node.isFunctionExpression(init))) {\n if (Node.isFunctionExpression(init) && init.isGenerator())\n return { ok: false, reason: 'generator function' };\n return { ok: true, node: init, declaration: decl };\n }\n // A value whose type is callable, e.g. `export const defu = createDefu()` or `export const f = memoize(g)`.\n try {\n const sigs = decl.getType().getCallSignatures();\n if (sigs.length === 1 && decl.getType().getConstructSignatures().length === 0) {\n return { ok: true, node: decl, declaration: decl, callable: true };\n }\n if (sigs.length > 1) return { ok: false, reason: 'callable value with overloaded signatures' };\n } catch {\n /* fall through */\n }\n return { ok: false, reason: 'not a function (exported value)' };\n }\n if (Node.isClassDeclaration(decl))\n return { ok: false, reason: 'class (class methods are out of scope in v1)' };\n if (\n Node.isInterfaceDeclaration(decl) ||\n Node.isTypeAliasDeclaration(decl) ||\n Node.isEnumDeclaration(decl)\n ) {\n return { ok: false, reason: 'type-only export' };\n }\n if (Node.isExportAssignment(decl)) {\n const expr = unwrapExpression(decl.getExpression());\n if (expr && (Node.isArrowFunction(expr) || Node.isFunctionExpression(expr))) {\n return { ok: true, node: expr, declaration: decl };\n }\n return { ok: false, reason: 'default export is not a function' };\n }\n if (Node.isArrowFunction(decl) || Node.isFunctionExpression(decl)) {\n return { ok: true, node: decl, declaration: decl };\n }\n return { ok: false, reason: `unsupported declaration kind (${decl.getKindName()})` };\n}\n\n/** Find an exported function by export name (follows re-exports). */\nexport function findExportedFunction(sf: SourceFile, exportName: string): LocateResult {\n const decls = sf.getExportedDeclarations().get(exportName);\n if (!decls || decls.length === 0)\n return { ok: false, reason: `no export named \\`${exportName}\\``, missing: true };\n const funcs = decls.filter((d) => !Node.isInterfaceDeclaration(d) && !Node.isTypeAliasDeclaration(d));\n if (funcs.length === 0) return { ok: false, reason: 'type-only export' };\n return asFunctionLike(funcs[0]!);\n}\n\n/** Uses of `this` or `arguments` inside a function body (not nested functions). */\nexport function usesThis(fn: FunctionLikeNode | VariableDeclaration): boolean {\n if (Node.isArrowFunction(fn) || Node.isVariableDeclaration(fn)) return false;\n return fn\n .getDescendantsOfKind(SyntaxKind.ThisKeyword)\n .some((t) => t.getFirstAncestor((a) => Node.isFunctionLikeDeclaration(a)) === fn);\n}\n\n/**\n * Top-level functions in the same file reachable from `fn` through identifier references,\n * up to `depth` hops. Used for literal mining (and for transitive impact in change detection).\n */\nexport function reachableLocalFunctions(fn: Node, depth: number): Node[] {\n const sf = fn.getSourceFile();\n const result = new Set<Node>();\n let frontier: Node[] = [fn];\n for (let d = 0; d < depth && frontier.length > 0; d++) {\n const next: Node[] = [];\n for (const node of frontier) {\n for (const id of node.getDescendantsOfKind(SyntaxKind.Identifier)) {\n const sym = id.getSymbol();\n for (const decl of sym?.getDeclarations() ?? []) {\n if (decl.getSourceFile() !== sf) continue;\n const loc = asFunctionLike(decl);\n if (!loc.ok || loc.node === fn || result.has(loc.node)) continue;\n // Only module-level declarations.\n if (loc.declaration.getFirstAncestor((a) => Node.isFunctionLikeDeclaration(a))) continue;\n result.add(loc.node);\n next.push(loc.node);\n }\n }\n }\n frontier = next;\n }\n return [...result];\n}\n\n/**\n * Declarations of module-level constants (in the same file) that `nodes` reference and that are not functions:\n * `const iso8601 = /^.../`, `const UNITS = { ms: 1, s: 1000 }`. Their literals describe the inputs the code expects.\n */\nexport function referencedModuleValues(nodes: Node[]): Node[] {\n const result = new Set<Node>();\n for (const node of nodes) {\n const sf = node.getSourceFile();\n for (const id of node.getDescendantsOfKind(SyntaxKind.Identifier)) {\n for (const decl of id.getSymbol()?.getDeclarations() ?? []) {\n if (decl.getSourceFile() !== sf || !Node.isVariableDeclaration(decl)) continue;\n if (decl.getFirstAncestor((a) => Node.isFunctionLikeDeclaration(a))) continue;\n const init = decl.getInitializer();\n if (!init || Node.isArrowFunction(init) || Node.isFunctionExpression(init) || result.has(decl))\n continue;\n if (init.getText().length > 20_000) continue;\n // The declaration, not the initializer: miners visit descendants, and a bare literal has none.\n result.add(decl);\n }\n }\n }\n return [...result];\n}\n", "import { Node, SyntaxKind, ts, type SourceFile } from 'ts-morph';\n\n/** A module-level runtime binding: function, variable, class, enum, import or default export. */\nexport interface TopLevel {\n name: string;\n kind: 'function' | 'variable' | 'class' | 'enum' | 'import' | 'default';\n /** The declaration node (for imports: the import specifier/clause). */\n node: Node;\n /** Normalized source text (comments and formatting removed). */\n normalized: string;\n /** Raw source text. */\n raw: string;\n}\n\nexport interface ModuleIndex {\n sf: SourceFile;\n decls: Map<string, TopLevel>;\n /** Normalized text of top-level statements that are not declarations (module side effects). */\n sideEffects: string[];\n /** Export name \u2192 top-level name declared in this file (re-exports from other files excluded). */\n exports: Map<string, string>;\n}\n\n/**\n * Normalized text of a node: its leaf tokens joined by single spaces. Comments, JSDoc and whitespace are\n * dropped and string literals are compared by value, so formatting-only edits normalize to the same text.\n */\nexport function normalize(node: Node): string {\n const sf = node.getSourceFile().compilerNode;\n const out: string[] = [];\n const walk = (n: ts.Node) => {\n if (ts.isJSDoc(n) || n.kind === ts.SyntaxKind.JSDocComment) return;\n const children = n.getChildren(sf);\n if (children.length === 0) {\n if (ts.isStringLiteral(n) || ts.isNoSubstitutionTemplateLiteral(n)) out.push(JSON.stringify(n.text));\n else if (n.kind !== ts.SyntaxKind.EndOfFileToken) out.push(n.getText(sf));\n return;\n }\n for (const c of children) walk(c);\n };\n walk(node.compilerNode);\n return out.join(' ');\n}\n\nfunction topLevelNameOf(decl: Node): string | undefined {\n if (Node.isFunctionDeclaration(decl) || Node.isClassDeclaration(decl) || Node.isEnumDeclaration(decl)) {\n return decl.getName() ?? 'default';\n }\n if (Node.isVariableDeclaration(decl)) return decl.getName();\n if (Node.isExportAssignment(decl)) return 'default';\n return undefined;\n}\n\n/** Index all top-level runtime bindings of a module. */\nexport function indexModule(sf: SourceFile): ModuleIndex {\n const decls = new Map<string, TopLevel>();\n const sideEffects: string[] = [];\n const cjsExports = new Map<string, string>();\n const cjsStatements: Node[] = [];\n const add = (name: string, kind: TopLevel['kind'], node: Node, printed: Node = node) =>\n decls.set(name, { name, kind, node, normalized: normalize(printed), raw: printed.getText() });\n\n for (const st of sf.getStatements()) {\n if (Node.isFunctionDeclaration(st)) {\n const name = st.getName() ?? 'default';\n // Overloads: keep the implementation, but include all signatures in the normalized text.\n const prev = decls.get(name);\n add(name, 'function', st);\n if (prev && prev.kind === 'function') {\n const cur = decls.get(name)!;\n cur.normalized = prev.normalized + cur.normalized;\n cur.raw = prev.raw + cur.raw;\n }\n } else if (Node.isVariableStatement(st)) {\n for (const d of st.getDeclarations()) {\n const nameNode = d.getNameNode();\n if (Node.isIdentifier(nameNode)) {\n add(d.getName(), 'variable', d);\n } else {\n for (const id of nameNode.getDescendantsOfKind(SyntaxKind.Identifier))\n add(id.getText(), 'variable', d);\n }\n }\n } else if (Node.isClassDeclaration(st)) {\n add(st.getName() ?? 'default', 'class', st);\n } else if (Node.isEnumDeclaration(st)) {\n add(st.getName(), 'enum', st);\n } else if (Node.isImportDeclaration(st)) {\n if (st.isTypeOnly()) continue;\n const spec = st.getModuleSpecifierValue();\n const def = st.getDefaultImport();\n if (def)\n decls.set(def.getText(), {\n name: def.getText(),\n kind: 'import',\n node: st,\n normalized: `import default from ${spec}`,\n raw: `default from ${spec}`,\n });\n const ns = st.getNamespaceImport();\n if (ns)\n decls.set(ns.getText(), {\n name: ns.getText(),\n kind: 'import',\n node: st,\n normalized: `import * from ${spec}`,\n raw: `* from ${spec}`,\n });\n for (const n of st.getNamedImports()) {\n if (n.isTypeOnly()) continue;\n const local = n.getAliasNode()?.getText() ?? n.getName();\n decls.set(local, {\n name: local,\n kind: 'import',\n node: n,\n normalized: `import ${n.getName()} from ${spec}`,\n raw: `${n.getName()} from ${spec}`,\n });\n }\n } else if (Node.isExportAssignment(st)) {\n add('default', 'default', st);\n } else if (isCjsExport(st)) {\n // Handled after the loop: `module.exports = parse` may precede the (hoisted) `function parse`.\n cjsStatements.push(st);\n continue;\n } else if (\n Node.isInterfaceDeclaration(st) ||\n Node.isTypeAliasDeclaration(st) ||\n Node.isExportDeclaration(st) ||\n Node.isModuleDeclaration(st) ||\n Node.isEmptyStatement(st)\n ) {\n continue;\n } else {\n sideEffects.push(normalize(st));\n }\n }\n\n for (const st of cjsStatements) cjsExport(st, decls, cjsExports, add);\n\n const exports = new Map<string, string>(cjsExports);\n for (const [exportName, ds] of sf.getExportedDeclarations()) {\n for (const d of ds) {\n if (d.getSourceFile() !== sf) continue;\n const top = topLevelNameOf(d);\n if (top && decls.has(top)) {\n exports.set(exportName, top);\n break;\n }\n }\n }\n return { sf, decls, sideEffects, exports };\n}\n\nfunction isCjsExport(st: Node): boolean {\n if (!Node.isExpressionStatement(st)) return false;\n const expr = st.getExpression();\n return (\n Node.isBinaryExpression(expr) &&\n expr.getOperatorToken().getKind() === SyntaxKind.EqualsToken &&\n cjsTarget(expr.getLeft()) !== undefined\n );\n}\n\n/** `module.exports` / `exports` target of an assignment's left side: undefined, '' (whole object) or a name. */\nfunction cjsTarget(left: Node): string | undefined {\n const text = left.getText().replace(/\\s+/g, '');\n if (text === 'module.exports') return '';\n const m =\n /^(?:module\\.)?exports\\.([A-Za-z_$][\\w$]*)$/.exec(text) ??\n /^(?:module\\.)?exports\\[['\"]([^'\"]+)['\"]\\]$/.exec(text);\n return m ? m[1] : undefined;\n}\n\n/**\n * Recognize CommonJS export statements. Functions defined inline become synthetic top-level bindings\n * named `exports.<name>` so they can be compared and tested like ESM exports.\n */\nfunction cjsExport(\n st: Node,\n decls: Map<string, TopLevel>,\n exportsMap: Map<string, string>,\n add: (name: string, kind: TopLevel['kind'], node: Node, printed?: Node) => void,\n): boolean {\n if (!Node.isExpressionStatement(st)) return false;\n const expr = st.getExpression();\n if (!Node.isBinaryExpression(expr) || expr.getOperatorToken().getKind() !== SyntaxKind.EqualsToken)\n return false;\n const target = cjsTarget(expr.getLeft());\n if (target === undefined) return false;\n const bind = (exportName: string, value: Node) => {\n if (Node.isIdentifier(value) && decls.has(value.getText())) {\n exportsMap.set(exportName, value.getText());\n return;\n }\n const synthetic = `exports.${exportName}`;\n const isFn = Node.isArrowFunction(value) || Node.isFunctionExpression(value);\n add(synthetic, isFn ? 'function' : 'variable', value);\n exportsMap.set(exportName, synthetic);\n };\n const rhs = expr.getRight();\n if (target !== '') {\n bind(target, rhs);\n return true;\n }\n if (Node.isObjectLiteralExpression(rhs)) {\n for (const prop of rhs.getProperties()) {\n if (Node.isShorthandPropertyAssignment(prop)) bind(prop.getName(), prop.getNameNode());\n else if (Node.isPropertyAssignment(prop))\n bind(prop.getName().replace(/^['\"]|['\"]$/g, ''), prop.getInitializerOrThrow());\n else if (Node.isMethodDeclaration(prop)) {\n add(`exports.${prop.getName()}`, 'variable', prop);\n exportsMap.set(prop.getName(), `exports.${prop.getName()}`);\n }\n }\n return true;\n }\n bind('default', rhs);\n return true;\n}\n\n/** Names whose normalized declaration differs between two module versions (including added/removed). */\nexport function changedTopLevel(base: ModuleIndex | undefined, head: ModuleIndex | undefined): Set<string> {\n const changed = new Set<string>();\n const names = new Set([...(base?.decls.keys() ?? []), ...(head?.decls.keys() ?? [])]);\n for (const n of names) {\n const a = base?.decls.get(n);\n const b = head?.decls.get(n);\n if (!a || !b || a.normalized !== b.normalized) changed.add(n);\n }\n return changed;\n}\n\nexport interface Reach {\n /** Top-level names of this module reachable from the start node, with the path that reached them. */\n local: Map<string, string[]>;\n /** Imported bindings reachable: local name \u2192 resolved declaration (file + top-level name). */\n imported: Map<string, { file: string; name: string; via: string[] }>;\n}\n\n/** References from a node to module-level bindings, followed transitively up to `depth` hops. */\nexport function reach(index: ModuleIndex, start: Node, depth: number): Reach {\n const local = new Map<string, string[]>();\n const imported = new Map<string, { file: string; name: string; via: string[] }>();\n let frontier: { node: Node; path: string[] }[] = [{ node: start, path: [] }];\n for (let d = 0; d < depth && frontier.length > 0; d++) {\n const next: { node: Node; path: string[] }[] = [];\n for (const { node, path } of frontier) {\n for (const id of node.getDescendantsOfKind(SyntaxKind.Identifier)) {\n const name = id.getText();\n const top = index.decls.get(name);\n if (!top || local.has(name) || top.node === start) continue;\n // Make sure the identifier really refers to the module-level binding (not a shadowing local).\n const sym = id.getSymbol();\n const decls = sym?.getDeclarations() ?? [];\n if (sym && !decls.some((dn) => isWithin(dn, top.node))) continue;\n if (top.kind === 'import') {\n const aliased = sym?.isAlias() ? sym.getAliasedSymbol() : undefined;\n for (const ad of aliased?.getDeclarations() ?? []) {\n const target = topLevelNameOf(ad);\n if (target)\n imported.set(name, {\n file: ad.getSourceFile().getFilePath(),\n name: target,\n via: [...path, name],\n });\n }\n local.set(name, [...path, name]);\n continue;\n }\n local.set(name, [...path, name]);\n next.push({ node: top.node, path: [...path, name] });\n }\n }\n frontier = next;\n }\n return { local, imported };\n}\n\nfunction isWithin(node: Node, ancestor: Node): boolean {\n for (let cur: Node | undefined = node; cur; cur = cur.getParent()) if (cur === ancestor) return true;\n return false;\n}\n", "import fc, { type Arbitrary } from 'fast-check';\nimport { xoroshiro128plus } from 'pure-rand/generator/xoroshiro128plus';\nimport { diffOutcome, type CompareOptions, type OutcomeDiff } from '../compare/compare.js';\nimport type { Outcome } from '../compare/observed.js';\nimport { formatArgs } from '../format/format.js';\nimport { stableKey } from '../util/stableKey.js';\nimport { clusterKey, describeTransition, inputFeatures } from './cluster.js';\nimport { humanize, inputComplexity } from './humanize.js';\nimport type { Realism } from './realism.js';\n\nexport interface PairOutcome {\n base: Outcome;\n head: Outcome;\n}\n\n/** Runs inputs on both versions. Must return outcomes in input order. */\nexport type Evaluator = (inputs: unknown[][]) => Promise<PairOutcome[]>;\n\nexport interface ExploreOptions {\n arbitrary: Arbitrary<unknown[]>;\n evaluate: Evaluator;\n seed: number;\n /** Max number of distinct generated inputs to run during exploration. */\n runs: number;\n /** Wall-clock deadline (epoch ms) for exploration; shrinking gets a small grace period. */\n deadline?: number;\n /** Explicit inputs evaluated first (e.g. mined from existing tests). */\n examples?: unknown[][];\n compare?: CompareOptions;\n /** Numeric decision thresholds used for input features. */\n thresholds?: readonly number[];\n maxClusters?: number;\n /** Max shrink evaluations per cluster. */\n shrinkBudget?: number;\n /** Max witnesses kept per cluster. */\n maxWitnesses?: number;\n /** Stop exploring after this many timeouts/crashes (they are expensive: the runner is respawned). */\n maxFailures?: number;\n /** Number of inputs run twice per version to detect nondeterminism. */\n selfCheck?: number;\n /** Max evaluations of the humanizing pass per witness. */\n humanizeBudget?: number;\n /**\n * Input domain: generated inputs outside it are skipped. Strict (config `where`) skips all of them; otherwise\n * (guards inferred from the old version) 3 of 4 are skipped, so changed validation is still exercised.\n */\n inDomain?: (input: unknown[]) => boolean;\n strictDomain?: boolean;\n /** Realism of an input; witnesses are chosen most-realistic first. */\n realism?: (input: unknown[]) => Realism;\n onProgress?: (p: { inputsRun: number; clusters: number }) => void;\n}\n\nexport interface Witness {\n input: unknown[];\n base: Outcome;\n head: Outcome;\n diff: OutcomeDiff;\n /** True for the simplest example of the cluster (after shrinking and humanizing). */\n minimal: boolean;\n /** How realistic the input is (see realism.ts). */\n realism?: Realism;\n}\n\nexport interface Cluster {\n key: string;\n transition: string;\n features: string[];\n /** Number of explored inputs that fell into this cluster. */\n count: number;\n witnesses: Witness[];\n}\n\nexport interface NondeterminismReport {\n side: 'base' | 'head';\n input: unknown[];\n first: Outcome;\n second: Outcome;\n}\n\nexport interface ExploreResult {\n inputsRun: number;\n differingInputs: number;\n clusters: Cluster[];\n nondeterministic?: NondeterminismReport;\n /** Clusters dropped because a re-run did not reproduce them. */\n flakyClusters: number;\n stoppedBy: 'runs' | 'deadline' | 'failures' | 'exhausted';\n shrinkEvaluations: number;\n failures: number;\n}\n\ninterface Pending {\n value: fc.Value<unknown[]>;\n key: string;\n}\n\n/** fast-check's own bias schedule: strongly biased towards small values first, then broader. */\nfunction biasFor(runIndex: number): number {\n return 2 + Math.floor(Math.log(runIndex + 1) / Math.log(10));\n}\n\nconst size = (input: unknown[]) => formatArgs(input, 10_000).length;\n\nexport async function explore(options: ExploreOptions): Promise<ExploreResult> {\n const {\n arbitrary,\n evaluate,\n seed,\n runs,\n deadline,\n compare = {},\n maxClusters = 24,\n shrinkBudget = 500,\n maxWitnesses = 3,\n maxFailures = 20,\n selfCheck = 50,\n humanizeBudget = 150,\n } = options;\n const thresholds = options.thresholds ?? [0];\n const mrng = new fc.Random(xoroshiro128plus(seed));\n\n const realismCache = new Map<string, number>();\n const tierOf = (input: unknown[]): number => {\n if (!options.realism) return 0;\n const k = stableKey(input);\n let t = realismCache.get(k);\n if (t === undefined) {\n t = options.realism(input).tier;\n realismCache.set(k, t);\n }\n return t;\n };\n let outOfDomain = 0;\n /** Domain filter for generated inputs (see `inDomain`). */\n const wanted = (input: unknown[]): boolean => {\n if (!options.inDomain || options.inDomain(input)) return true;\n if (options.strictDomain) return false;\n return outOfDomain++ % 4 === 0;\n };\n const cache = new Map<string, PairOutcome>();\n /** Values that came from explicit examples have no shrink context. */\n const exampleValues = new WeakSet<fc.Value<unknown[]>>();\n const exampleValue = (ex: unknown[]) => {\n const v = new fc.Value(ex, undefined);\n exampleValues.add(v);\n return v;\n };\n const seen = new Set<string>();\n const clusters = new Map<string, Cluster & { seed: fc.Value<unknown[]> }>();\n let inputsRun = 0;\n let differingInputs = 0;\n let failures = 0;\n let shrinkEvaluations = 0;\n let stoppedBy: ExploreResult['stoppedBy'] = 'runs';\n\n /** Inputs that timed out or crashed on either side (each one is expensive). */\n const countFailures = (r: PairOutcome) => {\n if ([r.base, r.head].some((o) => o.kind === 'timeout' || o.kind === 'crash')) failures++;\n };\n\n const evalCached = async (inputs: unknown[][]): Promise<PairOutcome[]> => {\n const keys = inputs.map(stableKey);\n const missing: unknown[][] = [];\n const missingKeys: string[] = [];\n keys.forEach((k, i) => {\n if (!cache.has(k) && !missingKeys.includes(k)) {\n missing.push(inputs[i]!);\n missingKeys.push(k);\n }\n });\n if (missing.length > 0) {\n const results = await evaluate(missing);\n results.forEach((r, i) => {\n cache.set(missingKeys[i]!, r);\n countFailures(r);\n });\n }\n return keys.map((k) => cache.get(k)!);\n };\n\n const classify = (\n input: unknown[],\n r: PairOutcome,\n ): { key: string; transition: string; features: string[]; diff: OutcomeDiff } | null => {\n const diff = diffOutcome(r.base, r.head, compare);\n if (!diff) return null;\n const transition = describeTransition(r.base, r.head, diff);\n const features = inputFeatures(input, thresholds);\n return { key: clusterKey(transition, features), transition, features, diff };\n };\n\n const record = (value: fc.Value<unknown[]>, r: PairOutcome) => {\n const c = classify(value.value, r);\n if (!c) return;\n differingInputs++;\n const existing = clusters.get(c.key);\n const witness: Witness = { input: value.value, base: r.base, head: r.head, diff: c.diff, minimal: false };\n if (existing) {\n existing.count++;\n existing.witnesses.push(witness);\n existing.witnesses.sort((a, b) => tierOf(b.input) - tierOf(a.input) || size(a.input) - size(b.input));\n existing.witnesses.length = Math.min(existing.witnesses.length, maxWitnesses);\n return;\n }\n if (clusters.size >= maxClusters) return;\n clusters.set(c.key, {\n key: c.key,\n transition: c.transition,\n features: c.features,\n count: 1,\n witnesses: [witness],\n seed: value,\n });\n };\n\n // 1. Self-consistency check on the first inputs: run them twice per version.\n const first: fc.Value<unknown[]>[] = [];\n for (const ex of options.examples ?? []) {\n if (first.length >= selfCheck) break;\n const k = stableKey(ex);\n if (seen.has(k)) continue;\n seen.add(k);\n first.push(exampleValue(ex));\n }\n let runIndex = 0;\n let stale = 0;\n while (first.length < Math.min(selfCheck, runs) && stale < 100) {\n const v = arbitrary.generate(mrng, biasFor(runIndex++));\n const k = stableKey(v.value);\n if (seen.has(k) || !wanted(v.value)) {\n stale++;\n continue;\n }\n seen.add(k);\n first.push(v);\n }\n if (first.length > 0) {\n const inputs = first.map((v) => v.value);\n const twice = await evaluate([...inputs, ...inputs]);\n const a = twice.slice(0, inputs.length);\n const b = twice.slice(inputs.length);\n for (let i = 0; i < inputs.length; i++) {\n for (const side of ['base', 'head'] as const) {\n const x = a[i]![side];\n const y = b[i]![side];\n if (x.kind === 'timeout' || x.kind === 'crash' || y.kind === 'timeout' || y.kind === 'crash')\n continue;\n if (diffOutcome(x, y, compare)) {\n return {\n inputsRun: inputs.length,\n differingInputs: 0,\n clusters: [],\n nondeterministic: { side, input: inputs[i]!, first: x, second: y },\n flakyClusters: 0,\n stoppedBy: 'runs',\n shrinkEvaluations: 0,\n failures,\n };\n }\n }\n cache.set(stableKey(inputs[i]!), a[i]!);\n countFailures(a[i]!);\n record(first[i]!, a[i]!);\n }\n inputsRun = inputs.length;\n }\n\n // 2. Remaining explicit examples, then batched exploration.\n const pendingExamples = (options.examples ?? []).filter((ex) => !seen.has(stableKey(ex))).map(exampleValue);\n let batchSize = 64;\n let staleBatches = 0;\n while (inputsRun < runs) {\n if (deadline !== undefined && Date.now() >= deadline) {\n stoppedBy = 'deadline';\n break;\n }\n if (failures >= maxFailures) {\n stoppedBy = 'failures';\n break;\n }\n const batch: Pending[] = [];\n const want = Math.min(batchSize, runs - inputsRun);\n let attempts = 0;\n while (batch.length < want && attempts < want * 4) {\n attempts++;\n const example = pendingExamples.shift();\n const v = example ?? arbitrary.generate(mrng, biasFor(runIndex++));\n if (!example && !wanted(v.value)) continue;\n const k = stableKey(v.value);\n if (seen.has(k)) continue;\n seen.add(k);\n batch.push({ value: v, key: k });\n }\n if (batch.length === 0) {\n if (++staleBatches >= 3) {\n stoppedBy = 'exhausted';\n break;\n }\n continue;\n }\n staleBatches = 0;\n const results = await evaluate(batch.map((p) => p.value.value));\n results.forEach((r, i) => {\n cache.set(batch[i]!.key, r);\n countFailures(r);\n record(batch[i]!.value, r);\n });\n inputsRun += batch.length;\n batchSize = Math.min(256, batchSize * 2);\n options.onProgress?.({ inputsRun, clusters: clusters.size });\n }\n\n // 3. Shrink one witness per cluster, accepting only candidates that stay in the same cluster.\n for (const cluster of clusters.values()) {\n let cur = cluster.seed;\n let evals = 0;\n if (exampleValues.has(cur) && !arbitrary.canShrinkWithoutContext(cur.value)) continue;\n let improved = true;\n while (improved && evals < shrinkBudget) {\n improved = false;\n const it = arbitrary.shrink(cur.value, cur.context)[Symbol.iterator]();\n let done = false;\n while (!done && evals < shrinkBudget) {\n const chunk: fc.Value<unknown[]>[] = [];\n while (chunk.length < 16) {\n const n = it.next();\n if (n.done) {\n done = true;\n break;\n }\n chunk.push(n.value);\n }\n if (chunk.length === 0) break;\n const results = await evalCached(chunk.map((c) => c.value));\n evals += chunk.length;\n const hit = chunk.findIndex((c, i) => classify(c.value, results[i]!)?.key === cluster.key);\n if (hit !== -1) {\n cur = chunk[hit]!;\n improved = true;\n break;\n }\n }\n if (failures >= maxFailures * 2) break;\n }\n shrinkEvaluations += evals;\n // Humanize the shrunk witness and the other kept witnesses, then keep the simplest distinct ones.\n const sameCluster = async (candidates: unknown[][]) => {\n const results = await evalCached(candidates);\n return candidates.map((c, i) => classify(c, results[i]!)?.key === cluster.key);\n };\n const starts = [cur.value, ...cluster.witnesses.map((w) => w.input)];\n const finals = new Map<string, unknown[]>();\n for (const start of starts.slice(0, maxWitnesses + 1)) {\n const h = await humanize(start, { sameCluster, thresholds, budget: humanizeBudget });\n shrinkEvaluations += h.evaluations;\n finals.set(stableKey(h.input), h.input);\n finals.set(stableKey(start), start);\n }\n const ranked = [...finals.values()]\n .filter((input) => classify(input, cache.get(stableKey(input))!)?.key === cluster.key)\n .sort((a, b) => tierOf(b) - tierOf(a) || inputComplexity(a) - inputComplexity(b))\n .slice(0, maxWitnesses);\n cluster.witnesses = ranked.map((input, i) => {\n const r = cache.get(stableKey(input))!;\n const w: Witness = {\n input,\n base: r.base,\n head: r.head,\n diff: classify(input, r)!.diff,\n minimal: i === 0,\n };\n if (options.realism) w.realism = options.realism(input);\n return w;\n });\n }\n\n // Score every witness (including clusters that could not be shrunk) and order them most realistic first.\n if (options.realism) {\n for (const cluster of clusters.values()) {\n for (const w of cluster.witnesses) w.realism ??= options.realism(w.input);\n cluster.witnesses.sort(\n (a, b) => b.realism!.tier - a.realism!.tier || inputComplexity(a.input) - inputComplexity(b.input),\n );\n cluster.witnesses.forEach((w, i) => (w.minimal = i === 0));\n }\n }\n\n // 4. Confirmation: re-run every reported witness once more (uncached) and drop clusters that do not reproduce.\n let flakyClusters = 0;\n const confirmed: Cluster[] = [];\n const all = [...clusters.values()];\n const witnessInputs = all.flatMap((c) => c.witnesses.map((w) => w.input));\n const rerun = witnessInputs.length > 0 ? await evaluate(witnessInputs) : [];\n let idx = 0;\n for (const c of all) {\n let stable = true;\n for (const w of c.witnesses) {\n const r = rerun[idx++]!;\n if (diffOutcome(w.base, r.base, compare) || diffOutcome(w.head, r.head, compare)) stable = false;\n }\n if (!stable) {\n flakyClusters++;\n continue;\n }\n const { seed: _seed, ...rest } = c;\n confirmed.push(rest);\n }\n confirmed.sort((a, b) => b.count - a.count);\n\n return {\n inputsRun,\n differingInputs,\n clusters: confirmed,\n flakyClusters,\n stoppedBy,\n shrinkEvaluations,\n failures,\n };\n}\n", "import type { Enc, Outcome } from './observed.js';\n\nexport interface CompareOptions {\n /** Treat `{a: undefined}` and `{}` as different (default false: equal). */\n strictUndefined?: boolean;\n /** Compare thrown errors by class only (default false: class + message). */\n ignoreErrorMessages?: boolean;\n /** Absolute/relative tolerance for numbers (default 0: exact, but NaN equals NaN). */\n epsilon?: number;\n /** Compare argument mutations (default true). */\n compareMutations?: boolean;\n}\n\nexport type DiffPath = (string | number)[];\n\n/** Returns null if equal, otherwise the path to the first difference. */\nexport function diffEnc(a: Enc, b: Enc, opts: CompareOptions = {}, path: DiffPath = []): DiffPath | null {\n if (a.t !== b.t) return path;\n switch (a.t) {\n case 'undefined':\n case 'null':\n case 'promise':\n return null;\n case 'boolean':\n case 'bigint':\n case 'string':\n return a.v === (b as typeof a).v ? null : path;\n case 'number':\n return numbersEqual(a.v, (b as typeof a).v, opts.epsilon ?? 0) ? null : path;\n case 'date': {\n const bv = (b as typeof a).v;\n return Object.is(a.v, bv) || (Number.isNaN(a.v) && Number.isNaN(bv)) ? null : path;\n }\n case 'symbol':\n return a.d === (b as typeof a).d ? null : path;\n case 'regexp': {\n const bb = b as typeof a;\n return a.source === bb.source && a.flags === bb.flags ? null : path;\n }\n case 'function': {\n const bb = b as typeof a;\n return a.name === bb.name && a.length === bb.length ? null : path;\n }\n case 'cycle':\n return a.up === (b as typeof a).up ? null : path;\n case 'truncated':\n return a.reason === (b as typeof a).reason ? null : path;\n case 'typed': {\n const bb = b as typeof a;\n if (a.ctor !== bb.ctor || a.items.length !== bb.items.length) return path;\n for (let i = 0; i < a.items.length; i++) {\n if (!numbersEqual(a.items[i]!, bb.items[i]!, opts.epsilon ?? 0)) return [...path, i];\n }\n return null;\n }\n case 'array': {\n const bb = b as typeof a;\n const n = Math.max(a.items.length, bb.items.length);\n for (let i = 0; i < n; i++) {\n const x = a.items[i];\n const y = bb.items[i];\n if (!x || !y) return [...path, 'length'];\n const d = diffEnc(x, y, opts, [...path, i]);\n if (d) return d;\n }\n return null;\n }\n case 'object': {\n const bb = b as typeof a;\n if (a.ctor !== bb.ctor) return [...path, '[[prototype]]'];\n return diffEntries(a.entries, bb.entries, opts, path);\n }\n case 'error': {\n const bb = b as typeof a;\n if (a.ctor !== bb.ctor) return [...path, '[[class]]'];\n if (!opts.ignoreErrorMessages && a.message !== bb.message) return [...path, 'message'];\n return opts.ignoreErrorMessages ? null : diffEntries(a.props, bb.props, opts, path);\n }\n case 'map': {\n const bb = b as typeof a;\n if (a.entries.length !== bb.entries.length) return [...path, 'size'];\n // Order-insensitive: every key of a must exist in b with an equal value.\n for (const [k, v] of a.entries) {\n const match = bb.entries.find(([k2]) => diffEnc(k, k2, opts) === null);\n if (!match) return [...path, `key ${shortEnc(k)}`];\n const d = diffEnc(v, match[1], opts, [...path, `get(${shortEnc(k)})`]);\n if (d) return d;\n }\n return null;\n }\n case 'set': {\n const bb = b as typeof a;\n if (a.items.length !== bb.items.length) return [...path, 'size'];\n const used = new Set<number>();\n for (const x of a.items) {\n const j = bb.items.findIndex((y, idx) => !used.has(idx) && diffEnc(x, y, opts) === null);\n if (j === -1) return [...path, `has(${shortEnc(x)})`];\n used.add(j);\n }\n return null;\n }\n }\n}\n\nfunction diffEntries(\n a: [string, Enc][],\n b: [string, Enc][],\n opts: CompareOptions,\n path: DiffPath,\n): DiffPath | null {\n const keep = (e: [string, Enc]) => opts.strictUndefined || e[1].t !== 'undefined';\n const am = new Map(a.filter(keep));\n const bm = new Map(b.filter(keep));\n for (const [k, v] of am) {\n const w = bm.get(k);\n if (!w) return [...path, k];\n const d = diffEnc(v, w, opts, [...path, k]);\n if (d) return d;\n }\n for (const k of bm.keys()) if (!am.has(k)) return [...path, k];\n return null;\n}\n\nfunction numbersEqual(x: number, y: number, epsilon: number): boolean {\n if (Number.isNaN(x) && Number.isNaN(y)) return true;\n if (Object.is(x, y)) return true;\n if (epsilon > 0 && Number.isFinite(x) && Number.isFinite(y)) {\n // With a tolerance, -0 and 0 are considered equal.\n return Math.abs(x - y) <= epsilon * Math.max(1, Math.abs(x), Math.abs(y));\n }\n return false;\n}\n\nfunction shortEnc(e: Enc): string {\n switch (e.t) {\n case 'string':\n return JSON.stringify(e.v);\n case 'number':\n return Object.is(e.v, -0) ? '-0' : String(e.v);\n case 'boolean':\n case 'bigint':\n return String(e.v);\n default:\n return e.t;\n }\n}\n\nexport interface OutcomeDiff {\n /** Which aspect differs. */\n aspect: 'kind' | 'value' | 'error' | 'mutation' | 'async';\n /** Path inside the value (for value/error) or `[argIndex, ...]` for mutations. */\n path: DiffPath;\n}\n\n/** Compare two outcomes. Returns null if behavior is the same. */\nexport function diffOutcome(a: Outcome, b: Outcome, opts: CompareOptions = {}): OutcomeDiff | null {\n if (a.kind !== b.kind) return { aspect: 'kind', path: [] };\n switch (a.kind) {\n case 'timeout':\n return null;\n case 'crash':\n return null;\n case 'return': {\n const bb = b as typeof a;\n if (a.async !== bb.async) return { aspect: 'async', path: [] };\n const d = diffEnc(a.value, bb.value, opts);\n if (d) return { aspect: 'value', path: d };\n return diffArgs(a.args, bb.args, opts);\n }\n case 'throw': {\n const bb = b as typeof a;\n if (a.async !== bb.async) return { aspect: 'async', path: [] };\n const d = diffEnc(a.error, bb.error, opts);\n if (d) return { aspect: 'error', path: d };\n return diffArgs(a.args, bb.args, opts);\n }\n }\n}\n\nfunction diffArgs(a: Enc[], b: Enc[], opts: CompareOptions): OutcomeDiff | null {\n if (opts.compareMutations === false) return null;\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const x = a[i];\n const y = b[i];\n if (!x || !y) return { aspect: 'mutation', path: [i] };\n const d = diffEnc(x, y, opts, [i]);\n if (d) return { aspect: 'mutation', path: d };\n }\n return null;\n}\n", "import type { Enc, Outcome } from '../compare/observed.js';\nimport { FN_TAG, isFnDescriptor, isProtoDescriptor, PROTO_TAG, viewBytes } from '../runner/tags.js';\n\nconst MAX_LEN = 120;\n\nfunction clip(s: string, max = MAX_LEN): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}\u2026`;\n}\n\nfunction num(n: number): string {\n if (Object.is(n, -0)) return '-0';\n return String(n);\n}\n\nconst IDENT = /^[A-Za-z_$][\\w$]*$/;\nconst key = (k: string) => (IDENT.test(k) ? k : JSON.stringify(k));\n\n/** Render a raw JavaScript value (a generated input) as a JS-like literal. */\nexport function formatValue(v: unknown, max = MAX_LEN): string {\n const seen = new Set<unknown>();\n const f = (x: unknown): string => {\n if (isFnDescriptor(x)) {\n const { returns, async } = x[FN_TAG];\n return `${async ? 'async ' : ''}() => ${f(returns)}`;\n }\n switch (typeof x) {\n case 'undefined':\n return 'undefined';\n case 'number':\n return num(x);\n case 'bigint':\n return `${x}n`;\n case 'string':\n return JSON.stringify(x);\n case 'boolean':\n return String(x);\n case 'symbol':\n return x.toString();\n case 'function':\n return `[Function ${x.name || 'anonymous'}]`;\n }\n if (x === null) return 'null';\n if (seen.has(x)) return '[Circular]';\n seen.add(x);\n try {\n if (Array.isArray(x)) return `[${x.map(f).join(', ')}]`;\n if (x instanceof Date)\n return Number.isNaN(x.getTime()) ? 'new Date(NaN)' : `new Date(${JSON.stringify(x.toISOString())})`;\n if (x instanceof Map)\n return `new Map([${[...x].map(([k, val]) => `[${f(k)}, ${f(val)}]`).join(', ')}])`;\n if (x instanceof Set) return `new Set([${[...x].map(f).join(', ')}])`;\n if (x instanceof RegExp) return String(x);\n if (isProtoDescriptor(x)) {\n const { proto, own } = x[PROTO_TAG];\n return `Object.assign(Object.create(${f(proto)}), ${f(own)})`;\n }\n if (x instanceof ArrayBuffer) return `new Uint8Array([${viewBytes(x).join(', ')}]).buffer`;\n if (x instanceof DataView) {\n return `new DataView(new Uint8Array([${viewBytes(new Uint8Array(x.buffer)).join(', ')}]).buffer, ${x.byteOffset}, ${x.byteLength})`;\n }\n if (ArrayBuffer.isView(x))\n return `new ${x.constructor.name}([${Array.from(x as unknown as ArrayLike<number>).join(', ')}])`;\n const entries = Object.entries(x as Record<string, unknown>);\n if (entries.length === 0) return '{}';\n return `{ ${entries.map(([k, val]) => `${key(k)}: ${f(val)}`).join(', ')} }`;\n } finally {\n seen.delete(x);\n }\n };\n return clip(f(v), max);\n}\n\nexport function formatArgs(args: unknown[], max = MAX_LEN): string {\n return clip(args.map((a) => formatValue(a, max)).join(', '), max);\n}\n\n/** Render an encoded value as a JS-like literal. */\nexport function formatEnc(e: Enc, max = MAX_LEN): string {\n const f = (x: Enc): string => {\n switch (x.t) {\n case 'undefined':\n return 'undefined';\n case 'null':\n return 'null';\n case 'boolean':\n return String(x.v);\n case 'number':\n return num(x.v);\n case 'bigint':\n return `${x.v}n`;\n case 'string':\n return JSON.stringify(x.v);\n case 'symbol':\n return `Symbol(${x.d})`;\n case 'array':\n return `[${x.items.map(f).join(', ')}]`;\n case 'object': {\n const prefix = x.ctor && x.ctor !== 'null-prototype' ? `${x.ctor} ` : '';\n if (x.entries.length === 0) return `${prefix}{}`;\n return `${prefix}{ ${x.entries.map(([k, v]) => `${key(k)}: ${f(v)}`).join(', ')} }`;\n }\n case 'date':\n return Number.isNaN(x.v) ? 'Invalid Date' : new Date(x.v).toISOString();\n case 'map':\n return `Map(${x.entries.length}) { ${x.entries.map(([k, v]) => `${f(k)} => ${f(v)}`).join(', ')} }`;\n case 'set':\n return `Set(${x.items.length}) { ${x.items.map(f).join(', ')} }`;\n case 'regexp':\n return `/${x.source}/${x.flags}`;\n case 'function':\n return `[Function ${x.name || 'anonymous'}]`;\n case 'error':\n return `${x.ctor}: ${x.message}`;\n case 'typed':\n return `${x.ctor} [${x.items.join(', ')}]`;\n case 'promise':\n return 'Promise';\n case 'cycle':\n return '[Circular]';\n case 'truncated':\n return `<${x.reason}>`;\n }\n };\n return clip(f(e), max);\n}\n\n/** Short behavior summary, e.g. `1104.99`, `throws RangeError: bad price`, `timeout`. */\nexport function formatOutcome(o: Outcome, max = MAX_LEN): string {\n switch (o.kind) {\n case 'return':\n return o.async ? `resolves ${formatEnc(o.value, max)}` : formatEnc(o.value, max);\n case 'throw': {\n const e = o.error.t === 'error' ? `${o.error.ctor}: ${o.error.message}` : formatEnc(o.error, max);\n return clip(`${o.async ? 'rejects' : 'throws'} ${e}`, max);\n }\n case 'timeout':\n return `timeout (>${o.ms}ms)`;\n case 'crash':\n return `crash (${o.reason})`;\n }\n}\n\n/** Coarse category of a value, used to describe outcome transitions (e.g. \"number \u2192 NaN\"). */\nexport function encCategory(e: Enc): string {\n switch (e.t) {\n case 'number':\n if (Number.isNaN(e.v)) return 'NaN';\n if (!Number.isFinite(e.v)) return e.v > 0 ? 'Infinity' : '-Infinity';\n if (Object.is(e.v, -0)) return '-0';\n if (e.v === 0) return '0';\n return e.v < 0 ? 'negative number' : 'positive number';\n case 'object':\n return e.ctor && e.ctor !== 'null-prototype' ? e.ctor : 'object';\n case 'date':\n return Number.isNaN(e.v) ? 'Invalid Date' : 'Date';\n case 'string':\n return e.v.length === 0 ? 'empty string' : 'string';\n case 'array':\n return e.items.length === 0 ? 'empty array' : 'array';\n case 'error':\n return e.ctor;\n default:\n return e.t;\n }\n}\n\n/** Category of a whole outcome, e.g. `returns number`, `throws RangeError`, `timeout`. */\nexport function outcomeCategory(o: Outcome): string {\n switch (o.kind) {\n case 'return':\n return `${o.async ? 'resolves' : 'returns'} ${encCategory(o.value)}`;\n case 'throw':\n return `${o.async ? 'rejects' : 'throws'} ${encCategory(o.error)}`;\n case 'timeout':\n return 'timeout';\n case 'crash':\n return 'crash';\n }\n}\n", "import { FN_TAG, isFnDescriptor, isProtoDescriptor, PROTO_TAG, viewBytes } from '../runner/tags.js';\n\n/**\n * Deterministic string key for a generated JavaScript value. Distinguishes -0/0, NaN, undefined,\n * Dates, Maps, Sets and bigint; used for de-duplicating inputs and caching evaluations.\n */\nexport function stableKey(value: unknown): string {\n const seen = new Set<unknown>();\n const k = (v: unknown): string => {\n switch (typeof v) {\n case 'undefined':\n return 'u';\n case 'number':\n return Object.is(v, -0) ? '-0' : Number.isNaN(v) ? 'NaN' : `#${v}`;\n case 'bigint':\n return `${v}n`;\n case 'string':\n return JSON.stringify(v);\n case 'boolean':\n return v ? 'T' : 'F';\n case 'symbol':\n return `sym(${v.description ?? ''})`;\n case 'function':\n return `fn(${v.name})`;\n }\n if (v === null) return 'null';\n if (seen.has(v)) return '<cycle>';\n seen.add(v);\n try {\n if (isFnDescriptor(v)) return `fn->${k(v[FN_TAG].returns)}${v[FN_TAG].async ? 'a' : ''}`;\n if (Array.isArray(v)) return `[${v.map(k).join(',')}]`;\n if (v instanceof Date) return `D${v.getTime()}`;\n if (isProtoDescriptor(v)) return `P{${k(v[PROTO_TAG].proto)}|${k(v[PROTO_TAG].own)}}`;\n if (v instanceof ArrayBuffer) return `AB[${viewBytes(v).join(',')}]`;\n if (ArrayBuffer.isView(v))\n return `V:${v.constructor.name}:${v.byteOffset}:${v.byteLength}:[${viewBytes(new Uint8Array(v.buffer)).join(',')}]`;\n if (v instanceof Map) return `M{${[...v].map(([a, b]) => `${k(a)}=>${k(b)}`).join(',')}}`;\n if (v instanceof Set) return `S{${[...v].map(k).join(',')}}`;\n const proto = Object.getPrototypeOf(v) as unknown;\n const tag =\n proto === Object.prototype\n ? ''\n : proto === null\n ? 'N'\n : `C:${(proto as { constructor?: { name?: string } }).constructor?.name ?? '?'}`;\n return `${tag}{${Object.entries(v as Record<string, unknown>)\n .map(([a, b]) => `${JSON.stringify(a)}:${k(b)}`)\n .join(',')}}`;\n } finally {\n seen.delete(v);\n }\n };\n return k(value);\n}\n\n/** 32-bit FNV-1a hash of a string. */\nexport function fnv1a(s: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return h >>> 0;\n}\n", "import type { OutcomeDiff } from '../compare/compare.js';\nimport type { Outcome } from '../compare/observed.js';\nimport { outcomeCategory } from '../format/format.js';\nimport { isFnDescriptor, isProtoDescriptor } from '../runner/tags.js';\n\n/**\n * A behavior difference is described by (a) the outcome transition, e.g. \"returns number \u2192 returns NaN\",\n * and (b) a coarse input feature vector, e.g. \"arg0>1000\". Together they form the cluster key.\n */\nexport function describeTransition(base: Outcome, head: Outcome, diff: OutcomeDiff): string {\n const a = outcomeCategory(base);\n const b = outcomeCategory(head);\n if (a !== b) return `${a} \u2192 ${b}`;\n switch (diff.aspect) {\n case 'value':\n return `${a}: value changed`;\n case 'error':\n return `${a}: ${diff.path.includes('message') ? 'message changed' : 'error changed'}`;\n case 'mutation':\n return `${a}: argument ${String(diff.path[0])} mutated differently`;\n case 'async':\n return `${a}: sync/async changed`;\n default:\n return `${a} \u2192 ${b}`;\n }\n}\n\nfunction fmtThreshold(t: number): string {\n return Object.is(t, -0) ? '-0' : String(t);\n}\n\n/** Coarse feature of a single argument. Numeric features are relative to mined decision thresholds. */\nexport function argFeature(v: unknown, thresholds: readonly number[]): string {\n switch (typeof v) {\n case 'number': {\n if (Number.isNaN(v)) return 'NaN';\n if (v === Infinity) return '+Inf';\n if (v === -Infinity) return '-Inf';\n if (Object.is(v, -0)) return '-0';\n const ts = thresholds.length > 0 ? thresholds : [0];\n const eq = ts.find((t) => t === v);\n if (eq !== undefined) return `=${fmtThreshold(eq)}`;\n const below = ts.find((t) => v < t);\n const above = [...ts].reverse().find((t) => v > t);\n if (above === undefined) return `<${fmtThreshold(below!)}`;\n if (below === undefined) return `>${fmtThreshold(above)}`;\n return `(${fmtThreshold(above)},${fmtThreshold(below)})`;\n }\n case 'string':\n return v.length === 0 ? 'empty' : v.trim().length === 0 ? 'blank' : 'text';\n case 'boolean':\n return String(v);\n case 'undefined':\n return 'undefined';\n case 'bigint':\n return v < 0n ? 'neg' : v === 0n ? '0n' : 'pos';\n case 'object':\n if (v === null) return 'null';\n if (isFnDescriptor(v)) return 'fn';\n if (isProtoDescriptor(v)) return 'inherited{\u2026}';\n if (v instanceof ArrayBuffer || ArrayBuffer.isView(v)) return 'binary';\n if (Array.isArray(v)) return v.length === 0 ? 'empty[]' : '[\u2026]';\n if (v instanceof Date) return Number.isNaN(v.getTime()) ? 'InvalidDate' : 'Date';\n if (v instanceof Map || v instanceof Set) return v.size === 0 ? 'empty' : 'nonempty';\n return Object.keys(v).length === 0 ? '{}' : '{\u2026}';\n default:\n return typeof v;\n }\n}\n\nexport function inputFeatures(input: unknown[], thresholds: readonly number[]): string[] {\n return input.map((v) => argFeature(v, thresholds));\n}\n\nexport function clusterKey(transition: string, features: string[]): string {\n return `${transition} | ${features.join(' ')}`;\n}\n", "import { isFnDescriptor, isProtoDescriptor } from '../runner/tags.js';\n\n/**\n * \"Humanizing\" shrink pass. fast-check's shrinker minimizes structurally, but a minimal double such as\n * 9007199254740991 or 2.220446049250313e-16 is not what a reviewer wants to read. This pass tries to\n * replace each numeric/string leaf of an input with a simpler value (0, 1, 0.5, 1001, \"a\", \u2026) while the\n * input stays in the same behavior cluster.\n */\nexport type LeafPath = (string | number)[];\n\nexport interface Leaf {\n path: LeafPath;\n value: number | string;\n}\n\n/** Enumerate numeric and string leaves of an input (arrays and plain objects only). */\nexport function leaves(input: unknown[]): Leaf[] {\n const out: Leaf[] = [];\n const walk = (v: unknown, path: LeafPath, depth: number) => {\n if (depth > 6) return;\n if (typeof v === 'number' || typeof v === 'string') {\n out.push({ path, value: v });\n return;\n }\n if (typeof v !== 'object' || v === null || isFnDescriptor(v)) return;\n if (Array.isArray(v)) {\n v.forEach((x, i) => walk(x, [...path, i], depth + 1));\n return;\n }\n if (Object.getPrototypeOf(v) !== Object.prototype) return;\n for (const [k, x] of Object.entries(v as Record<string, unknown>)) walk(x, [...path, k], depth + 1);\n };\n input.forEach((v, i) => walk(v, [i], 0));\n return out;\n}\n\n/** Copy of `input` with the leaf at `path` replaced. Only arrays and plain objects along the path are copied. */\nexport function setLeaf(input: unknown[], path: LeafPath, value: unknown): unknown[] {\n const copy = (node: unknown, i: number): unknown => {\n if (i === path.length) return value;\n const key = path[i]!;\n if (Array.isArray(node)) {\n const arr = node.slice();\n arr[key as number] = copy(node[key as number], i + 1);\n return arr;\n }\n const obj = { ...(node as Record<string, unknown>) };\n obj[key as string] = copy(obj[key as string], i + 1);\n return obj;\n };\n return copy(input, 0) as unknown[];\n}\n\n/** Lower is simpler. 0 < small integers < round decimals < long or special values. */\nexport function numberComplexity(n: number): number {\n if (Object.is(n, 0)) return 0;\n if (Number.isNaN(n) || !Number.isFinite(n)) return 6;\n if (Object.is(n, -0)) return 3;\n const s = String(Math.abs(n));\n if (s.includes('e')) return 25;\n const digits = s.replace('.', '').replace(/^0+/, '').replace(/0+$/, '').length || 1;\n return digits + (n < 0 ? 1 : 0) + (Number.isInteger(n) ? 0 : 1);\n}\n\nexport function stringComplexity(s: string): number {\n let c = s.length;\n for (const ch of s) if (!/[a-z0-9 ]/.test(ch)) c += 1;\n return c;\n}\n\nexport function valueComplexity(v: number | string): number {\n return typeof v === 'number' ? numberComplexity(v) : stringComplexity(v);\n}\n\n/** Total complexity of an input: used to rank witnesses. */\nexport function inputComplexity(input: unknown[]): number {\n return (\n leaves(input).reduce((s, l) => s + valueComplexity(l.value), 0) +\n exoticObjects(input) * 4 +\n JSON.stringify(input, (_k, v) => (typeof v === 'bigint' ? String(v) : v))?.length / 100\n );\n}\n\n/** Binary data, objects with inherited properties, Maps, Sets and Dates: harder to read than plain values. */\nfunction exoticObjects(v: unknown, depth = 0): number {\n if (typeof v !== 'object' || v === null || depth > 6) return 0;\n if (v instanceof ArrayBuffer || ArrayBuffer.isView(v) || isProtoDescriptor(v)) return 1;\n if (v instanceof Map || v instanceof Set || v instanceof Date) return 0.5;\n if (Array.isArray(v)) return v.reduce((n: number, x) => n + exoticObjects(x, depth + 1), 0);\n if (Object.getPrototypeOf(v) !== Object.prototype) return 0;\n return Object.values(v).reduce((n: number, x) => n + exoticObjects(x, depth + 1), 0);\n}\n\nconst NICE_NUMBERS = [\n 0, 1, -1, 2, 0.5, 10, 0.1, 0.15, 0.25, 0.2, 3, 5, 100, -10, 1.5, 0.01, 1000, 0.99, 99.99,\n];\n\nfunction round(n: number, decimals: number): number {\n const f = 10 ** decimals;\n return Math.round(n * f) / f;\n}\n\nexport function numberCandidates(n: number, thresholds: readonly number[]): number[] {\n const set = new Set<number>(NICE_NUMBERS);\n if (Number.isFinite(n)) {\n for (const d of [0, 1, 2]) set.add(round(n, d));\n set.add(Math.trunc(n));\n if (n !== 0) {\n const mag = 10 ** Math.floor(Math.log10(Math.abs(n)));\n for (const m of [1, 2, 5]) set.add(Math.sign(n) * m * mag);\n set.add(-n);\n }\n }\n for (const t of thresholds) {\n for (const d of [0, 1, -1, 0.5, -0.5, 0.01, -0.01, 0.07, -0.07, 0.99, 0.1]) set.add(round(t + d, 2));\n set.add(t * 2);\n }\n const c = numberComplexity(n);\n return [...set]\n .filter((x) => Number.isFinite(x) && !Object.is(x, n) && numberComplexity(x) < c)\n .sort((a, b) => numberComplexity(a) - numberComplexity(b) || Math.abs(a) - Math.abs(b))\n .slice(0, 40);\n}\n\nexport function stringCandidates(s: string): string[] {\n const set = new Set<string>(['', 'a', ' ', '-', 'A', '0', 'a b', '\u00E9']);\n const ascii = s.replace(/[^\\x20-\\x7e]/g, '');\n set.add(ascii);\n set.add(s.trim());\n for (let k = 1; k < Math.min(s.length, 8); k++) set.add(s.slice(0, k));\n for (const ch of new Set(s)) set.add(ch);\n const c = stringComplexity(s);\n return [...set]\n .filter((x) => x !== s && stringComplexity(x) < c)\n .sort((a, b) => stringComplexity(a) - stringComplexity(b))\n .slice(0, 24);\n}\n\nexport interface HumanizeOptions {\n /** True if `candidate` still exhibits the same behavior difference. Evaluates in batches. */\n sameCluster: (candidates: unknown[][]) => Promise<boolean[]>;\n thresholds: readonly number[];\n budget: number;\n}\n\n/** Simplify leaves one at a time until no leaf can be simplified or the budget is used. */\nexport async function humanize(\n input: unknown[],\n options: HumanizeOptions,\n): Promise<{ input: unknown[]; evaluations: number }> {\n let cur = input;\n let evaluations = 0;\n let improved = true;\n while (improved && evaluations < options.budget) {\n improved = false;\n for (const leaf of leaves(cur)) {\n if (evaluations >= options.budget) break;\n const values =\n typeof leaf.value === 'number'\n ? numberCandidates(leaf.value, options.thresholds)\n : stringCandidates(leaf.value);\n if (values.length === 0) continue;\n const take = values.slice(0, Math.max(1, options.budget - evaluations));\n const candidates = take.map((v) => setLeaf(cur, leaf.path, v));\n const ok = await options.sameCluster(candidates);\n evaluations += candidates.length;\n const hit = ok.findIndex(Boolean);\n if (hit !== -1) {\n cur = candidates[hit]!;\n improved = true;\n }\n }\n }\n return { input: cur, evaluations };\n}\n", "import {\n Node,\n ts,\n type ArrowFunction,\n type FunctionDeclaration,\n type FunctionExpression,\n type ParameterDeclaration,\n type Type,\n type VariableDeclaration,\n} from 'ts-morph';\nimport {\n BINARY_CTORS,\n type ArbSpec,\n type BinaryCtor,\n type ParamSpec,\n type PropSpec,\n type SignatureSpec,\n} from './spec.js';\n\n/** Function-like nodes we can test. */\nexport type FunctionLikeNode = FunctionDeclaration | ArrowFunction | FunctionExpression;\n\nconst MAX_UNION_OPTIONS = 64;\nconst MAX_PROPS = 40;\n\n/** Built-in (lib.d.ts) types we know how to generate; everything else from the default lib is unsupported. */\nconst HANDLED_BUILTINS = new Set([\n 'Date',\n 'Map',\n 'ReadonlyMap',\n 'Set',\n 'ReadonlySet',\n 'Array',\n 'ReadonlyArray',\n]);\n\ninterface Ctx {\n /** Node used as location for resolving property types. */\n location: Node;\n /** Object type ids currently being expanded, mapped to the recursion id assigned (if referenced). */\n stack: Map<number, { id: string; referenced: boolean }>;\n nextId: { n: number };\n}\n\nfunction typeId(type: Type): number {\n return (type.compilerType as unknown as { id: number }).id;\n}\n\nfunction isFromDefaultLib(type: Type): boolean {\n const symbol = type.getSymbol() ?? type.getAliasSymbol();\n const decls = symbol?.getDeclarations() ?? [];\n if (decls.length === 0) return false;\n return decls.every((d) => {\n const sf = d.getSourceFile();\n return (\n sf.getProject().getProgram().compilerObject.isSourceFileDefaultLibrary(sf.compilerNode) ||\n /[\\\\/]typescript[\\\\/]lib[\\\\/]lib\\./.test(sf.getFilePath())\n );\n });\n}\n\nfunction symbolName(type: Type): string | undefined {\n return type.getSymbol()?.getName();\n}\n\n/** Derive the ArbSpec for a TypeScript type. */\nexport function specFromType(type: Type, location: Node): ArbSpec {\n return fromType(type, { location, stack: new Map(), nextId: { n: 0 } });\n}\n\nfunction fromType(type: Type, ctx: Ctx): ArbSpec {\n const flags = type.getFlags();\n\n if (flags & ts.TypeFlags.Any || flags & ts.TypeFlags.Unknown) return { kind: 'anything' };\n if (flags & ts.TypeFlags.Never) return { kind: 'unsupported', reason: 'never' };\n if (flags & ts.TypeFlags.Void || flags & ts.TypeFlags.Undefined) return { kind: 'undefined' };\n if (flags & ts.TypeFlags.Null) return { kind: 'null' };\n if (type.isBoolean()) return { kind: 'boolean' };\n if (type.isBooleanLiteral()) return { kind: 'literal', value: type.getText() === 'true' };\n if (type.isStringLiteral() || type.isNumberLiteral()) {\n const v = type.getLiteralValue();\n if (typeof v === 'string' || typeof v === 'number') return { kind: 'literal', value: v };\n }\n if (flags & ts.TypeFlags.BigIntLiteral) {\n const v = (type.compilerType as ts.BigIntLiteralType).value;\n return { kind: 'bigintLiteral', value: `${v.negative ? '-' : ''}${v.base10Value}` };\n }\n if (type.isEnumLiteral()) {\n const v = type.getLiteralValue();\n if (typeof v === 'string' || typeof v === 'number') return { kind: 'literal', value: v };\n }\n if (flags & ts.TypeFlags.Number) return { kind: 'number' };\n if (flags & ts.TypeFlags.String) return { kind: 'string' };\n if (flags & ts.TypeFlags.TemplateLiteral) return { kind: 'string' };\n if (flags & ts.TypeFlags.BigInt) return { kind: 'bigint' };\n if (flags & ts.TypeFlags.ESSymbol || flags & ts.TypeFlags.UniqueESSymbol)\n return { kind: 'unsupported', reason: 'symbol' };\n\n if (type.isTypeParameter()) {\n const c = type.getConstraint();\n return c ? fromType(c, ctx) : { kind: 'anything' };\n }\n\n if (type.isUnion()) {\n const parts = type.getUnionTypes();\n if (parts.length > MAX_UNION_OPTIONS) {\n return { kind: 'union', options: parts.slice(0, MAX_UNION_OPTIONS).map((t) => fromType(t, ctx)) };\n }\n return simplifyUnion(parts.map((t) => fromType(t, ctx)));\n }\n\n if (type.isIntersection()) {\n // Branded primitives: `number & { __brand: 'Cents' }` -> number.\n const prim = type.getIntersectionTypes().find((t) => {\n const f = t.getFlags();\n return (\n f &\n (ts.TypeFlags.NumberLike |\n ts.TypeFlags.StringLike |\n ts.TypeFlags.BigIntLike |\n ts.TypeFlags.BooleanLike)\n );\n });\n if (prim) return fromType(prim, ctx);\n return objectSpec(type, ctx);\n }\n\n if (type.isObject()) return objectLike(type, ctx);\n\n if (flags & ts.TypeFlags.NonPrimitive) return { kind: 'anything' }; // `object`\n return { kind: 'unsupported', reason: `type \\`${type.getText()}\\`` };\n}\n\nfunction simplifyUnion(options: ArbSpec[]): ArbSpec {\n const seen = new Set<string>();\n const out: ArbSpec[] = [];\n for (const o of options.flatMap((o) => (o.kind === 'union' ? o.options : [o]))) {\n const key = JSON.stringify(o);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(o);\n }\n // `true | false` from e.g. `boolean | undefined` arrives as two literals.\n const hasTrue = out.some((o) => o.kind === 'literal' && o.value === true);\n const hasFalse = out.some((o) => o.kind === 'literal' && o.value === false);\n const merged =\n hasTrue && hasFalse\n ? [\n ...out.filter((o) => !(o.kind === 'literal' && typeof o.value === 'boolean')),\n { kind: 'boolean' } as ArbSpec,\n ]\n : out;\n return merged.length === 1 ? merged[0]! : { kind: 'union', options: merged };\n}\n\nfunction objectLike(type: Type, ctx: Ctx): ArbSpec {\n if (type.isArray() || type.isReadonlyArray?.()) {\n const el = type.getArrayElementType() ?? type.getTypeArguments()[0];\n return { kind: 'array', items: el ? fromType(el, ctx) : { kind: 'anything' } };\n }\n if (type.isTuple()) return tupleSpec(type, ctx);\n\n const callSigs = type.getCallSignatures();\n if (callSigs.length > 0 && type.getProperties().length === 0) {\n const ret = callSigs[0]!.getReturnType();\n const promised = unwrapPromise(ret);\n return {\n kind: 'function',\n returns: fromType(promised ?? ret, ctx),\n async: promised !== undefined,\n };\n }\n\n const name = symbolName(type);\n if (name && isFromDefaultLib(type)) {\n if (name === 'Date') return { kind: 'date' };\n if ((BINARY_CTORS as readonly string[]).includes(name))\n return { kind: 'binary', ctor: name as BinaryCtor };\n if (name === 'Map' || name === 'ReadonlyMap') {\n const [k, v] = type.getTypeArguments();\n return {\n kind: 'map',\n key: k ? fromType(k, ctx) : { kind: 'anything' },\n value: v ? fromType(v, ctx) : { kind: 'anything' },\n };\n }\n if (name === 'Set' || name === 'ReadonlySet') {\n const [t] = type.getTypeArguments();\n return { kind: 'set', items: t ? fromType(t, ctx) : { kind: 'anything' } };\n }\n // JSDoc `{Object}` (the global Object interface): any object.\n if (name === 'Object') return { kind: 'anything' };\n if (!HANDLED_BUILTINS.has(name) && name !== '__type' && name !== '__object') {\n return { kind: 'unsupported', reason: `built-in type \\`${name}\\`` };\n }\n }\n if (type.isClass() || isClassInstance(type)) {\n return { kind: 'unsupported', reason: `class instance \\`${name ?? type.getText()}\\`` };\n }\n return objectSpec(type, ctx);\n}\n\nfunction isClassInstance(type: Type): boolean {\n const decls = type.getSymbol()?.getDeclarations() ?? [];\n return decls.some((d) => Node.isClassDeclaration(d) || Node.isClassExpression(d));\n}\n\nfunction unwrapPromise(type: Type): Type | undefined {\n const name = symbolName(type);\n if ((name === 'Promise' || name === 'PromiseLike') && isFromDefaultLib(type)) {\n return type.getTypeArguments()[0];\n }\n return undefined;\n}\n\nfunction tupleSpec(type: Type, ctx: Ctx): ArbSpec {\n const target = (type.compilerType as ts.TypeReference).target as ts.TupleType | undefined;\n const elementFlags = target?.elementFlags ?? [];\n const elems = type.getTupleElements();\n const items: ArbSpec[] = [];\n let optionalFrom: number | undefined;\n let rest: ArbSpec | undefined;\n elems.forEach((el, i) => {\n const f = elementFlags[i] ?? ts.ElementFlags.Required;\n if (f & ts.ElementFlags.Rest || f & ts.ElementFlags.Variadic) {\n rest = fromType(el, ctx);\n return;\n }\n if (f & ts.ElementFlags.Optional && optionalFrom === undefined) optionalFrom = items.length;\n items.push(fromType(el, ctx));\n });\n const spec: ArbSpec = { kind: 'tuple', items };\n if (optionalFrom !== undefined) spec.optionalFrom = optionalFrom;\n if (rest) spec.rest = rest;\n return spec;\n}\n\nfunction objectSpec(type: Type, ctx: Ctx): ArbSpec {\n const id = typeId(type);\n const active = ctx.stack.get(id);\n if (active) {\n active.referenced = true;\n return { kind: 'ref', id: active.id };\n }\n const entry = { id: `T${ctx.nextId.n++}`, referenced: false };\n ctx.stack.set(id, entry);\n try {\n const checker = ctx.location.getProject().getTypeChecker();\n const props: PropSpec[] = [];\n for (const sym of type.getProperties().slice(0, MAX_PROPS)) {\n const propType = checker.getTypeOfSymbolAtLocation(sym, ctx.location);\n const optional = (sym.getFlags() & ts.SymbolFlags.Optional) !== 0;\n let spec = fromType(propType, ctx);\n // With strictNullChecks the optional prop type already includes undefined; drop it, `optional` covers it.\n if (optional && spec.kind === 'union') {\n const rest = spec.options.filter((o) => o.kind !== 'undefined');\n spec = rest.length === 1 ? rest[0]! : { kind: 'union', options: rest };\n }\n props.push({ name: sym.getName(), spec, optional });\n }\n const stringIndex = type.getStringIndexType();\n const numberIndex = type.getNumberIndexType();\n let result: ArbSpec;\n if (props.length === 0 && stringIndex) {\n result = { kind: 'record', key: 'string', values: fromType(stringIndex, ctx) };\n } else if (props.length === 0 && numberIndex) {\n result = { kind: 'record', key: 'number', values: fromType(numberIndex, ctx) };\n } else {\n result = { kind: 'object', props };\n }\n return entry.referenced ? { kind: 'recursive', id: entry.id, spec: result } : result;\n } finally {\n ctx.stack.delete(id);\n }\n}\n\nfunction paramSpec(p: ParameterDeclaration, location: Node, index: number): ParamSpec {\n const rest = p.isRestParameter();\n const optional = !rest && (p.isOptional() || p.hasInitializer() || p.hasQuestionToken());\n let type = p.getType();\n if (rest) {\n const el = type.getArrayElementType();\n type = el ?? type;\n }\n let spec = specFromType(type, location);\n if (optional && !rest) {\n // Make `undefined` an explicit option so omitted arguments are exercised.\n spec =\n spec.kind === 'union'\n ? spec.options.some((o) => o.kind === 'undefined')\n ? spec\n : { kind: 'union', options: [...spec.options, { kind: 'undefined' }] }\n : spec.kind === 'undefined'\n ? spec\n : { kind: 'union', options: [spec, { kind: 'undefined' }] };\n }\n const name = Node.isIdentifier(p.getNameNode()) ? p.getName() : `arg${index}`;\n return { name, spec, optional, rest };\n}\n\n/** Signature spec for a function-like node. Destructured parameters are named `argN`. */\nexport function signatureFromNode(fn: FunctionLikeNode): SignatureSpec {\n const params = fn\n .getParameters()\n .filter((p) => p.getName() !== 'this')\n .map((p, i) => paramSpec(p, fn, i));\n const ret = fn.getReturnType();\n const async = fn.isAsync() || unwrapPromise(ret) !== undefined;\n return { params, async };\n}\n\n/** Signature spec for a callable value (no function node), from its type's single call signature. */\nexport function signatureFromCallable(decl: VariableDeclaration): SignatureSpec {\n const sig = decl.getType().getCallSignatures()[0]!;\n const checker = decl.getProject().getTypeChecker();\n const params: ParamSpec[] = sig.getParameters().map((sym, i) => {\n const pdecl = sym.getValueDeclaration();\n const isParam = pdecl !== undefined && Node.isParameterDeclaration(pdecl);\n const rest = isParam && pdecl.isRestParameter();\n const optional =\n !rest &&\n ((sym.getFlags() & ts.SymbolFlags.Optional) !== 0 ||\n (isParam && (pdecl.isOptional() || pdecl.hasInitializer())));\n let type = checker.getTypeOfSymbolAtLocation(sym, decl);\n if (rest) type = type.getArrayElementType() ?? type;\n let spec = specFromType(type, decl);\n if (optional && spec.kind !== 'union') spec = { kind: 'union', options: [spec, { kind: 'undefined' }] };\n else if (optional && spec.kind === 'union' && !spec.options.some((o) => o.kind === 'undefined')) {\n spec = { kind: 'union', options: [...spec.options, { kind: 'undefined' }] };\n }\n return { name: sym.getName() || `arg${i}`, spec, optional, rest };\n });\n return { params, async: unwrapPromise(sig.getReturnType()) !== undefined };\n}\n\n/** Signature for whatever `locate` found: a function node or a callable value. */\nexport function signatureOf(node: FunctionLikeNode | VariableDeclaration): SignatureSpec {\n return Node.isVariableDeclaration(node) ? signatureFromCallable(node) : signatureFromNode(node);\n}\n", "/**\n * ArbSpec: a plain, JSON-serializable description of the values a parameter can take.\n *\n * It is derived from TypeScript types (see `fromType.ts`) and compiled to fast-check arbitraries\n * (see `../arbitraries/compile.ts`). Keeping this intermediate representation separate makes type\n * analysis testable without fast-check and lets us hash, compare and print specs.\n */\nexport type ArbSpec =\n | { kind: 'number' }\n | { kind: 'bigint' }\n | { kind: 'string' }\n | { kind: 'boolean' }\n | { kind: 'undefined' }\n | { kind: 'null' }\n | { kind: 'literal'; value: string | number | boolean }\n | { kind: 'bigintLiteral'; value: string }\n | { kind: 'union'; options: ArbSpec[] }\n | { kind: 'array'; items: ArbSpec }\n | { kind: 'tuple'; items: ArbSpec[]; optionalFrom?: number; rest?: ArbSpec }\n | { kind: 'object'; props: PropSpec[] }\n | { kind: 'record'; key: 'string' | 'number'; values: ArbSpec }\n | { kind: 'date' }\n | { kind: 'binary'; ctor: BinaryCtor }\n | { kind: 'map'; key: ArbSpec; value: ArbSpec }\n | { kind: 'set'; items: ArbSpec }\n | { kind: 'function'; returns: ArbSpec; async: boolean }\n | { kind: 'recursive'; id: string; spec: ArbSpec }\n | { kind: 'ref'; id: string }\n | { kind: 'anything' }\n | { kind: 'unsupported'; reason: string };\n\n/** Binary built-ins: typed arrays, ArrayBuffer and DataView. */\nexport const BINARY_CTORS = [\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Int8Array',\n 'Uint16Array',\n 'Int16Array',\n 'Uint32Array',\n 'Int32Array',\n 'Float32Array',\n 'Float64Array',\n 'BigInt64Array',\n 'BigUint64Array',\n 'ArrayBuffer',\n 'DataView',\n] as const;\nexport type BinaryCtor = (typeof BINARY_CTORS)[number];\n\nexport interface PropSpec {\n name: string;\n spec: ArbSpec;\n optional: boolean;\n}\n\nexport interface ParamSpec {\n name: string;\n spec: ArbSpec;\n /** Optional or defaulted parameter: `undefined` is a valid argument. */\n optional: boolean;\n /** Rest parameter: `spec` describes one element; zero or more are spread at the end. */\n rest: boolean;\n}\n\nexport interface SignatureSpec {\n params: ParamSpec[];\n /** The function's declared return type is a Promise / it is declared `async`. */\n async: boolean;\n}\n\n/** Returns the first `unsupported` reason found in a spec, or undefined if the spec is fully supported. */\nexport function findUnsupported(spec: ArbSpec): string | undefined {\n switch (spec.kind) {\n case 'unsupported':\n return spec.reason;\n case 'union':\n // A union is usable if at least one option is supported; unsupported options are dropped at compile time.\n return spec.options.every((o) => findUnsupported(o) !== undefined)\n ? findUnsupported(spec.options[0] ?? { kind: 'unsupported', reason: 'empty union' })\n : undefined;\n case 'array':\n case 'set':\n return findUnsupported(spec.items);\n case 'tuple':\n for (const item of spec.items) {\n const r = findUnsupported(item);\n if (r) return r;\n }\n return spec.rest ? findUnsupported(spec.rest) : undefined;\n case 'object':\n for (const p of spec.props) {\n const r = p.optional ? undefined : findUnsupported(p.spec);\n if (r) return `${p.name}: ${r}`;\n }\n return undefined;\n case 'record':\n return findUnsupported(spec.values);\n case 'map':\n return findUnsupported(spec.key) ?? findUnsupported(spec.value);\n case 'function':\n return findUnsupported(spec.returns);\n case 'recursive':\n return findUnsupported(spec.spec);\n default:\n return undefined;\n }\n}\n\nexport function signatureUnsupported(sig: SignatureSpec): string | undefined {\n for (const p of sig.params) {\n const r = p.optional ? undefined : findUnsupported(p.spec);\n if (r) return `parameter \\`${p.name}\\`: ${r}`;\n }\n return undefined;\n}\n\n/** Compact human-readable rendering of a spec, TypeScript-like. Used in reports and tests. */\nexport function printSpec(spec: ArbSpec): string {\n switch (spec.kind) {\n case 'literal':\n return typeof spec.value === 'string' ? JSON.stringify(spec.value) : String(spec.value);\n case 'bigintLiteral':\n return `${spec.value}n`;\n case 'union':\n return spec.options.map(printSpec).join(' | ');\n case 'array': {\n const inner = printSpec(spec.items);\n return spec.items.kind === 'union' || spec.items.kind === 'function' ? `(${inner})[]` : `${inner}[]`;\n }\n case 'tuple': {\n const items = spec.items.map((s, i) =>\n spec.optionalFrom !== undefined && i >= spec.optionalFrom ? `${printSpec(s)}?` : printSpec(s),\n );\n if (spec.rest) items.push(`...${printSpec(spec.rest)}[]`);\n return `[${items.join(', ')}]`;\n }\n case 'object':\n return `{ ${spec.props.map((p) => `${p.name}${p.optional ? '?' : ''}: ${printSpec(p.spec)}`).join('; ')} }`;\n case 'record':\n return `Record<${spec.key}, ${printSpec(spec.values)}>`;\n case 'date':\n return 'Date';\n case 'binary':\n return spec.ctor;\n case 'map':\n return `Map<${printSpec(spec.key)}, ${printSpec(spec.value)}>`;\n case 'set':\n return `Set<${printSpec(spec.items)}>`;\n case 'function':\n return `() => ${spec.async ? `Promise<${printSpec(spec.returns)}>` : printSpec(spec.returns)}`;\n case 'recursive':\n return `${spec.id}=${printSpec(spec.spec)}`;\n case 'ref':\n return spec.id;\n case 'anything':\n return 'unknown';\n case 'unsupported':\n return `<unsupported: ${spec.reason}>`;\n default:\n return spec.kind;\n }\n}\n", "import { Node, SyntaxKind, type ParameterDeclaration } from 'ts-morph';\n\n/**\n * Input domain inferred from the OLD version's guard clauses: the leading `if (cond) throw ...` /\n * `if (cond) return ...` statements of the function body. The conditions are evaluated by a tiny interpreter that\n * understands comparisons with literals, typeof, Number.isInteger/isNaN/isFinite/isSafeInteger, isNaN,\n * Array.isArray, `.length`, `!`, `&&`, `||`. Anything else evaluates to \"unknown\" and is ignored (never guessed).\n */\nexport interface Guards {\n /** Human-readable guard conditions that could be evaluated. */\n conditions: string[];\n /** True if the input passes every guard (or the guard cannot be evaluated for it). */\n accepts(input: unknown[]): boolean;\n}\n\ntype Env = Map<string, unknown>;\nconst UNKNOWN = Symbol('unknown');\ntype Value = unknown;\ntype Expr = (env: Env) => Value;\n\nfunction compile(node: Node, params: Set<string>): Expr | undefined {\n if (Node.isParenthesizedExpression(node)) return compile(node.getExpression(), params);\n if (Node.isNumericLiteral(node)) {\n const v = node.getLiteralValue();\n return () => v;\n }\n if (Node.isStringLiteral(node) || Node.isNoSubstitutionTemplateLiteral(node)) {\n const v = node.getLiteralValue();\n return () => v;\n }\n if (node.getKind() === SyntaxKind.TrueKeyword) return () => true;\n if (node.getKind() === SyntaxKind.FalseKeyword) return () => false;\n if (node.getKind() === SyntaxKind.NullKeyword) return () => null;\n if (Node.isIdentifier(node)) {\n const name = node.getText();\n if (name === 'undefined') return () => undefined;\n if (name === 'NaN') return () => NaN;\n if (name === 'Infinity') return () => Infinity;\n if (params.has(name)) return (env) => env.get(name);\n return undefined;\n }\n if (Node.isPropertyAccessExpression(node) && node.getName() === 'length') {\n const obj = compile(node.getExpression(), params);\n if (!obj) return undefined;\n return (env) => {\n const v = obj(env);\n return typeof v === 'string' || Array.isArray(v) ? v.length : UNKNOWN;\n };\n }\n if (Node.isTypeOfExpression(node)) {\n const e = compile(node.getExpression(), params);\n if (!e) return undefined;\n return (env) => {\n const v = e(env);\n return v === UNKNOWN ? UNKNOWN : v === null ? 'object' : typeof v;\n };\n }\n if (Node.isPrefixUnaryExpression(node)) {\n const e = compile(node.getOperand(), params);\n if (!e) return undefined;\n const op = node.getOperatorToken();\n if (op === SyntaxKind.ExclamationToken) return (env) => (e(env) === UNKNOWN ? UNKNOWN : !e(env));\n if (op === SyntaxKind.MinusToken)\n return (env) => (typeof e(env) === 'number' ? -(e(env) as number) : UNKNOWN);\n return undefined;\n }\n if (Node.isCallExpression(node)) {\n const callee = node.getExpression().getText().replace(/\\s+/g, '');\n const fns: Record<string, (v: unknown) => boolean> = {\n 'Number.isInteger': Number.isInteger,\n 'Number.isSafeInteger': Number.isSafeInteger,\n 'Number.isFinite': Number.isFinite,\n 'Number.isNaN': Number.isNaN,\n isNaN: (v) => isNaN(v as number),\n isFinite: (v) => isFinite(v as number),\n 'Array.isArray': Array.isArray,\n };\n const fn = fns[callee];\n const [arg] = node.getArguments();\n if (!fn || !arg || node.getArguments().length !== 1) return undefined;\n const e = compile(arg, params);\n if (!e) return undefined;\n return (env) => {\n const v = e(env);\n return v === UNKNOWN ? UNKNOWN : fn(v);\n };\n }\n if (Node.isBinaryExpression(node)) {\n const l = compile(node.getLeft(), params);\n const r = compile(node.getRight(), params);\n if (!l || !r) return undefined;\n const op = node.getOperatorToken().getKind();\n const cmp =\n (f: (a: never, b: never) => boolean): Expr =>\n (env) => {\n const a = l(env);\n const b = r(env);\n return a === UNKNOWN || b === UNKNOWN ? UNKNOWN : f(a as never, b as never);\n };\n switch (op) {\n case SyntaxKind.LessThanToken:\n return cmp((a, b) => a < b);\n case SyntaxKind.LessThanEqualsToken:\n return cmp((a, b) => a <= b);\n case SyntaxKind.GreaterThanToken:\n return cmp((a, b) => a > b);\n case SyntaxKind.GreaterThanEqualsToken:\n return cmp((a, b) => a >= b);\n case SyntaxKind.EqualsEqualsEqualsToken:\n return cmp((a, b) => a === b);\n case SyntaxKind.ExclamationEqualsEqualsToken:\n return cmp((a, b) => a !== b);\n case SyntaxKind.EqualsEqualsToken:\n return cmp((a, b) => a == b);\n case SyntaxKind.ExclamationEqualsToken:\n return cmp((a, b) => a != b);\n case SyntaxKind.AmpersandAmpersandToken:\n return (env) => {\n const a = l(env);\n if (a === UNKNOWN) return UNKNOWN;\n return a ? r(env) : a;\n };\n case SyntaxKind.BarBarToken:\n return (env) => {\n const a = l(env);\n if (a === UNKNOWN) return UNKNOWN;\n return a ? a : r(env);\n };\n default:\n return undefined;\n }\n }\n return undefined;\n}\n\nfunction isExit(stmt: Node): boolean {\n if (Node.isThrowStatement(stmt) || Node.isReturnStatement(stmt)) return true;\n if (Node.isBlock(stmt)) {\n const s = stmt.getStatements();\n return s.length >= 1 && isExit(s[s.length - 1]!);\n }\n return false;\n}\n\n/** Infer guards from a function-like node (the old version). Returns undefined when there are none. */\nexport function inferGuards(fn: Node): Guards | undefined {\n if (!(Node.isFunctionDeclaration(fn) || Node.isFunctionExpression(fn) || Node.isArrowFunction(fn)))\n return undefined;\n const body = fn.getBody();\n if (!body || !Node.isBlock(body)) return undefined;\n const paramDecls: ParameterDeclaration[] = fn.getParameters();\n const names = paramDecls.map((p) => (Node.isIdentifier(p.getNameNode()) ? p.getName() : undefined));\n const params = new Set(names.filter((n): n is string => !!n));\n const checks: { text: string; expr: Expr }[] = [];\n for (const stmt of body.getStatements()) {\n if (Node.isIfStatement(stmt) && !stmt.getElseStatement() && isExit(stmt.getThenStatement())) {\n const expr = compile(stmt.getExpression(), params);\n if (expr) checks.push({ text: stmt.getExpression().getText(), expr });\n continue;\n }\n // Assertion calls (`assertString(str)`) and variable declarations may precede guards; anything else ends them.\n if (Node.isExpressionStatement(stmt) && Node.isCallExpression(stmt.getExpression())) continue;\n if (Node.isVariableStatement(stmt) && checks.length === 0) continue;\n break;\n }\n if (checks.length === 0) return undefined;\n return {\n conditions: checks.map((c) => c.text),\n accepts(input) {\n const env: Env = new Map();\n names.forEach((n, i) => n && env.set(n, input[i]));\n return checks.every((c) => {\n try {\n const v = c.expr(env);\n return v === UNKNOWN || !v;\n } catch {\n return true;\n }\n });\n },\n };\n}\n", "import { isFnDescriptor, isProtoDescriptor, PROTO_TAG } from '../runner/tags.js';\n\n/**\n * How realistic is an input? Findings on inputs that real callers pass matter more than findings on NaN, -0 or\n * lone surrogates. Tiers (higher is more realistic):\n * 3 seen every number/string in the input appears in the project's tests or call sites\n * 2 ordinary no exotic values, and within the domain observed in tests/call sites\n * 1 unusual outside the observed domain (e.g. negative while every observed number is >= 0), or objects with\n * inherited enumerable properties\n * 0 edge exotic values: NaN, \u00B1Infinity, -0, huge/tiny magnitudes, lone surrogates, control or zero-width\n * characters, invalid dates\n */\nexport type RealismTier = 0 | 1 | 2 | 3;\nexport const REALISM_NAMES = ['edge', 'unusual', 'ordinary', 'seen'] as const;\nexport type RealismName = (typeof REALISM_NAMES)[number];\n\nexport interface RealismContext {\n numbers: ReadonlySet<number>;\n strings: ReadonlySet<string>;\n /** Every observed number is >= 0 (with enough observations). */\n nonNegative: boolean;\n /** Every observed number is an integer (with enough observations). */\n integerOnly: boolean;\n}\n\nexport interface Realism {\n tier: RealismTier;\n /** Why the input is not more realistic, e.g. \"NaN\", \"negative number (tests only use >= 0)\". */\n reason?: string;\n}\n\nconst MIN_OBSERVATIONS = 3;\n\nexport function realismContext(\n usage: { numbers: number[]; strings: string[]; numberObservations?: number } | undefined,\n): RealismContext {\n const numbers = usage?.numbers ?? [];\n const enough = (usage?.numberObservations ?? numbers.length) >= MIN_OBSERVATIONS && numbers.length > 0;\n return {\n numbers: new Set(numbers),\n strings: new Set(usage?.strings ?? []),\n nonNegative: enough && numbers.every((n) => n >= 0),\n integerOnly: enough && numbers.every((n) => Number.isInteger(n)),\n };\n}\n\n// Lone surrogates, C0/C1 control characters (except tab/newline/CR), zero-width characters and BOM.\nconst EXOTIC_CHARS = new RegExp(\n '[\\\\uD800-\\\\uDBFF](?![\\\\uDC00-\\\\uDFFF])|(?<![\\\\uD800-\\\\uDBFF])[\\\\uDC00-\\\\uDFFF]|' +\n '[\\\\u0000-\\\\u0008\\\\u000B\\\\u000C\\\\u000E-\\\\u001F\\\\u007F-\\\\u009F\\\\u200B-\\\\u200F\\\\u2028\\\\u2029\\\\uFEFF]',\n);\n// A string that starts with a combining mark has nothing to combine with.\nconst LEADING_COMBINING = /^\\p{M}/u;\n\nfunction numberRealism(n: number, ctx: RealismContext): Realism {\n if (Number.isNaN(n)) return { tier: 0, reason: 'NaN' };\n if (!Number.isFinite(n)) return { tier: 0, reason: n > 0 ? 'Infinity' : '-Infinity' };\n if (Object.is(n, -0)) return { tier: 0, reason: '-0' };\n if (Math.abs(n) >= 1e9) return { tier: 0, reason: 'huge number' };\n if (n !== 0 && Math.abs(n) < 1e-6) return { tier: 0, reason: 'tiny number' };\n if (ctx.numbers.has(n)) return { tier: 3 };\n if (ctx.nonNegative && n < 0)\n return { tier: 1, reason: 'negative number (tests and call sites only use values >= 0)' };\n if (ctx.integerOnly && !Number.isInteger(n))\n return { tier: 1, reason: 'non-integer (tests and call sites only use integers)' };\n return { tier: 2 };\n}\n\nfunction stringRealism(s: string, ctx: RealismContext): Realism {\n if (EXOTIC_CHARS.test(s))\n return { tier: 0, reason: 'control, zero-width or unpaired surrogate characters' };\n if (LEADING_COMBINING.test(s)) return { tier: 0, reason: 'leading combining mark' };\n if (ctx.strings.has(s)) return { tier: 3 };\n return { tier: 2 };\n}\n\n/** Realism of one input: its least realistic value decides. */\nexport function inputRealism(input: unknown[], ctx: RealismContext): Realism {\n let worst: Realism = { tier: 3 };\n let leaves = 0;\n const consider = (r: Realism) => {\n leaves++;\n if (r.tier < worst.tier) worst = r;\n };\n const seen = new Set<unknown>();\n const walk = (v: unknown, depth: number) => {\n if (depth > 8) return;\n if (typeof v === 'number') return consider(numberRealism(v, ctx));\n if (typeof v === 'string') return consider(stringRealism(v, ctx));\n if (typeof v !== 'object' || v === null || seen.has(v)) return;\n seen.add(v);\n if (isFnDescriptor(v)) return;\n if (isProtoDescriptor(v)) {\n consider({ tier: 1, reason: 'object with inherited enumerable properties' });\n walk(v[PROTO_TAG].proto, depth + 1);\n walk(v[PROTO_TAG].own, depth + 1);\n return;\n }\n if (v instanceof ArrayBuffer || ArrayBuffer.isView(v)) {\n consider({ tier: 2 });\n return;\n }\n if (v instanceof Date) {\n const t = v.getTime();\n if (Number.isNaN(t)) consider({ tier: 0, reason: 'Invalid Date' });\n else if (v.getUTCFullYear() < 1900 || v.getUTCFullYear() > 2200)\n consider({ tier: 0, reason: 'date far from the present' });\n else consider({ tier: 2 });\n return;\n }\n if (v instanceof Map) {\n for (const [k, x] of v) {\n walk(k, depth + 1);\n walk(x, depth + 1);\n }\n return;\n }\n if (v instanceof Set) {\n for (const x of v) walk(x, depth + 1);\n return;\n }\n for (const x of Object.values(v as Record<string, unknown>)) walk(x, depth + 1);\n };\n input.forEach((v) => walk(v, 0));\n // Inputs without any number or string (booleans, empty arrays, undefined) are ordinary, not \"seen\".\n if (leaves === 0) return { tier: 2 };\n return worst;\n}\n", "import { mineValues, type MinedValues } from '../arbitraries/mine.js';\nimport { compileSignature } from '../arbitraries/compile.js';\nimport {\n asFunctionLike,\n reachableLocalFunctions,\n referencedModuleValues,\n usesThis,\n type LocateResult,\n} from '../analyze/locate.js';\nimport { regexDiffStrings } from '../arbitraries/regex.js';\nimport { indexModule } from '../detect/toplevel.js';\nimport type { SourceFile } from 'ts-morph';\nimport type { Arbitrary } from 'fast-check';\nimport type { CompareOptions } from '../compare/compare.js';\nimport {\n explore,\n type Cluster,\n type ExploreResult,\n type NondeterminismReport,\n type PairOutcome,\n} from '../explore/explore.js';\nimport { signatureOf } from '../types/fromType.js';\nimport { inferGuards } from '../analyze/guards.js';\nimport type { Usage } from '../analyze/usage.js';\nimport { inputRealism, realismContext } from '../explore/realism.js';\nimport { Node } from 'ts-morph';\nimport { signatureAccepts } from '../types/accepts.js';\nimport { printSpec, signatureUnsupported, type SignatureSpec } from '../types/spec.js';\nimport { fnv1a } from '../util/stableKey.js';\nimport type { VerifySession } from './session.js';\n\nexport interface FunctionTarget {\n /** Stable identifier, e.g. `src/pricing.ts#applyDiscount`. */\n id: string;\n /** Export name in the base and head version (usually identical). */\n exportName: string;\n baseFile: string;\n headFile: string;\n /** Why this function is a target (e.g. \"body changed\", \"calls changed helper toCents()\"). */\n reason?: string;\n}\n\nexport interface VerifyFunctionOptions {\n /** Root seed of the run. Each function derives its own seed from it. */\n seed: number;\n runs: number;\n /** Absolute wall-clock deadline for this function's exploration (epoch ms). */\n deadline?: number;\n compare?: CompareOptions;\n examples?: unknown[][];\n /** Usage of the function in the repository (call sites, test values). */\n usage?: Usage;\n /** Declared input domain (config `where`): inputs outside it are never generated or reported. */\n where?: (args: unknown[]) => boolean;\n /** Custom argument generator (from the config file); replaces the type-derived one. */\n arbitrary?: Arbitrary<unknown[]>;\n /** Optional source of extra inputs (e.g. LLM edge-case suggestions); results are validated against the types. */\n suggest?: (ctx: {\n name: string;\n signature: string;\n spec: SignatureSpec;\n baseSource: string;\n headSource: string;\n }) => Promise<unknown[][]>;\n onWarning?: (message: string) => void;\n onProgress?: (p: { inputsRun: number; clusters: number }) => void;\n}\n\nexport type FunctionStatus = 'changed' | 'unchanged' | 'skipped' | 'nondeterministic';\n\nexport interface FunctionResult {\n id: string;\n exportName: string;\n file: string;\n status: FunctionStatus;\n reason?: string;\n targetReason?: string;\n signature?: string;\n seed: number;\n inputsRun: number;\n differingInputs: number;\n clusters: Cluster[];\n flakyClusters: number;\n nondeterministic?: NondeterminismReport;\n stoppedBy?: ExploreResult['stoppedBy'];\n failures: number;\n shrinkEvaluations: number;\n durationMs: number;\n mined?: { numbers: number; strings: number; thresholds: number[] };\n /** How the function is used in the repository (call sites and tests). */\n usage?: { files: number; callSites: number; values: number };\n /** Guard conditions inferred from the old version (used to focus generation). */\n guards?: string[];\n /** Number of suggested (LLM) inputs that passed type validation and were run first. */\n llmInputs?: number;\n}\n\n/** Locate an exported function through the module index (ESM exports, re-exports and CommonJS). */\nexport function locateExport(sf: SourceFile, exportName: string): LocateResult {\n const index = indexModule(sf);\n const top = index.exports.get(exportName);\n if (top === undefined) return { ok: false, reason: `no export named \\`${exportName}\\``, missing: true };\n return asFunctionLike(index.decls.get(top)!.node);\n}\n\nexport function printSignature(name: string, sig: SignatureSpec): string {\n const params = sig.params.map(\n (p) =>\n `${p.rest ? '...' : ''}${p.name}${p.optional && !p.rest ? '?' : ''}: ${printSpec(p.spec)}${p.rest ? '[]' : ''}`,\n );\n return `${name}(${params.join(', ')})`;\n}\n\nexport function functionSeed(rootSeed: number, id: string): number {\n return fnv1a(`${rootSeed}:${id}`);\n}\n\nconst FEATURE_THRESHOLDS = 8;\n\nfunction featureThresholds(mined: MinedValues): number[] {\n const all = [...new Set([0, ...mined.thresholds])].sort((a, b) => a - b);\n if (all.length <= FEATURE_THRESHOLDS) return all;\n // Keep 0 and the thresholds closest to it in magnitude (most likely to be \"real\" boundaries).\n return [\n 0,\n ...all\n .filter((t) => t !== 0)\n .sort((a, b) => Math.abs(a) - Math.abs(b))\n .slice(0, FEATURE_THRESHOLDS - 1),\n ].sort((a, b) => a - b);\n}\n\nexport async function verifyFunction(\n session: VerifySession,\n target: FunctionTarget,\n options: VerifyFunctionOptions,\n): Promise<FunctionResult> {\n const started = Date.now();\n const seed = functionSeed(options.seed, target.id);\n const base: FunctionResult = {\n id: target.id,\n exportName: target.exportName,\n file: target.id.split('#')[0] ?? target.headFile,\n status: 'skipped',\n seed,\n inputsRun: 0,\n differingInputs: 0,\n clusters: [],\n flakyClusters: 0,\n failures: 0,\n shrinkEvaluations: 0,\n durationMs: 0,\n ...(target.reason ? { targetReason: target.reason } : {}),\n };\n const skip = (reason: string): FunctionResult => ({\n ...base,\n status: 'skipped',\n reason,\n durationMs: Date.now() - started,\n });\n\n // 1. Locate both versions.\n let baseLoc, headLoc;\n try {\n baseLoc = locateExport(session.sourceFile('base', target.baseFile), target.exportName);\n headLoc = locateExport(session.sourceFile('head', target.headFile), target.exportName);\n } catch (e) {\n return skip(`could not parse source: ${(e as Error).message}`);\n }\n if (!headLoc.ok) return skip(headLoc.reason);\n if (!baseLoc.ok) return skip(`base version: ${baseLoc.reason}`);\n if (usesThis(headLoc.node) || usesThis(baseLoc.node))\n return skip('uses `this` (methods are out of scope in v1)');\n\n // 2. Signatures.\n const headSig = signatureOf(headLoc.node);\n const baseSig = signatureOf(baseLoc.node);\n const signature = printSignature(target.exportName, headSig);\n base.signature = signature;\n const unsupported = options.arbitrary ? undefined : signatureUnsupported(headSig);\n if (unsupported)\n return skip(`unsupported parameter type: ${unsupported} (provide \\`args\\` in doppeldiff.config.ts)`);\n if (!options.arbitrary && !signatureAccepts(baseSig, headSig)) {\n return skip(\n `signature changed incompatibly: ${printSignature(target.exportName, baseSig)} \u2192 ${signature}`,\n );\n }\n\n // 3. Inputs: type-driven arbitrary biased with values mined from both versions and reachable helpers.\n const baseNodes = [baseLoc.node, ...reachableLocalFunctions(baseLoc.node, 3)];\n const headNodes = [headLoc.node, ...reachableLocalFunctions(headLoc.node, 3)];\n // Module-level constants the code reads (`const iso8601 = /.../`) count too.\n baseNodes.push(...referencedModuleValues(baseNodes));\n headNodes.push(...referencedModuleValues(headNodes));\n const mined = mineValues([...baseNodes, ...headNodes]);\n // Strings on which a changed regex disagrees between the versions.\n mined.distinguishing = regexDiffStrings(mineValues(baseNodes).regexes, mineValues(headNodes).regexes);\n // Values real callers and tests use come first: they bias generation and make findings more realistic.\n const usage = options.usage;\n if (usage) {\n const finite = usage.numbers.filter((n) => Number.isFinite(n));\n mined.numbers = [...new Set([...finite.slice(0, 60), ...mined.numbers])].slice(0, 260);\n mined.strings = [...new Set([...usage.strings.slice(0, 60), ...mined.strings])].slice(0, 260);\n mined.fragments = [\n ...new Set([\n ...mined.fragments,\n ...usage.strings.filter((s) => s.length > 0 && s.length <= 12).slice(0, 30),\n ]),\n ];\n base.usage = {\n files: usage.files,\n callSites: usage.tuples.length,\n values: usage.numbers.length + usage.strings.length,\n };\n }\n const guards = Node.isVariableDeclaration(baseLoc.node) ? undefined : inferGuards(baseLoc.node);\n if (guards) base.guards = guards.conditions;\n const realismCtx = realismContext(usage);\n base.mined = { numbers: mined.numbers.length, strings: mined.strings.length, thresholds: mined.thresholds };\n const arbitrary = options.arbitrary ?? compileSignature(headSig, { mined });\n if (!arbitrary) return skip('could not build an input generator for the signature');\n\n // Optional suggested inputs (validated against the signature by the suggester).\n // Literal call sites from the repository run first (filtered by a declared domain, if any).\n let examples = [...(usage?.tuples ?? []), ...(options.examples ?? [])];\n if (options.where) examples = examples.filter((e) => safeWhere(options.where!, e));\n if (options.suggest) {\n try {\n const suggested = await options.suggest({\n name: target.exportName,\n signature,\n spec: headSig,\n baseSource: baseLoc.node.getText(),\n headSource: headLoc.node.getText(),\n });\n base.llmInputs = suggested.length;\n examples = [...suggested, ...examples];\n } catch (e) {\n options.onWarning?.(`input suggestions for ${target.exportName} failed: ${(e as Error).message}`);\n }\n }\n\n // 4. Load both versions in their sandboxes.\n let baseMod, headMod;\n try {\n [baseMod, headMod] = await Promise.all([\n session.loadModule('base', target.baseFile),\n session.loadModule('head', target.headFile),\n ]);\n } catch (e) {\n return skip(`could not bundle or start runner: ${(e as Error).message.split('\\n')[0]}`);\n }\n for (const [label, m] of [\n ['base', baseMod],\n ['head', headMod],\n ] as const) {\n if (!m.load.ok) {\n const err = m.load.error;\n return skip(\n `module failed to load (${label}): ${err?.code ? `${err.code} ` : ''}${err?.message ?? 'unknown error'}`,\n );\n }\n if (!m.load.exports.includes(target.exportName))\n return skip(`export \\`${target.exportName}\\` not found at runtime (${label})`);\n }\n\n // 5. Explore.\n const evaluate = async (inputs: unknown[][]): Promise<PairOutcome[]> => {\n const [b, h] = await Promise.all([\n session.pools.base.run(baseMod.moduleId, target.exportName, inputs),\n session.pools.head.run(headMod.moduleId, target.exportName, inputs),\n ]);\n return b.map((o, i) => ({ base: o, head: h[i]! }));\n };\n const result = await explore({\n arbitrary,\n evaluate,\n seed,\n runs: options.runs,\n thresholds: featureThresholds(mined),\n ...(options.deadline !== undefined ? { deadline: options.deadline } : {}),\n ...(options.compare ? { compare: options.compare } : {}),\n ...(examples.length ? { examples } : {}),\n ...(options.onProgress ? { onProgress: options.onProgress } : {}),\n ...(options.where\n ? { inDomain: (input: unknown[]) => safeWhere(options.where!, input), strictDomain: true }\n : guards\n ? { inDomain: (input: unknown[]) => guards.accepts(input) }\n : {}),\n realism: (input: unknown[]) => inputRealism(input, realismCtx),\n });\n\n const common = {\n ...base,\n inputsRun: result.inputsRun,\n differingInputs: result.differingInputs,\n clusters: result.clusters,\n flakyClusters: result.flakyClusters,\n stoppedBy: result.stoppedBy,\n failures: result.failures,\n shrinkEvaluations: result.shrinkEvaluations,\n durationMs: Date.now() - started,\n };\n if (result.nondeterministic) {\n return {\n ...common,\n status: 'nondeterministic',\n nondeterministic: result.nondeterministic,\n reason: `the ${result.nondeterministic.side} version returned different results for the same input`,\n };\n }\n return { ...common, status: result.clusters.length > 0 ? 'changed' : 'unchanged' };\n}\n\nfunction safeWhere(where: (args: unknown[]) => boolean, input: unknown[]): boolean {\n try {\n return where(structuredClone(input)) !== false;\n } catch {\n return false;\n }\n}\n", "import type { ArbSpec, SignatureSpec } from './spec.js';\n\n/**\n * Conservative check that every value described by `head` is also a valid value for `base`,\n * so inputs generated from the head signature are legal for the base version.\n */\nexport function accepts(base: ArbSpec, head: ArbSpec): boolean {\n if (base.kind === 'anything') return true;\n if (head.kind === 'union') return head.options.every((o) => accepts(base, o));\n if (base.kind === 'union') return base.options.some((o) => accepts(o, head));\n if (JSON.stringify(base) === JSON.stringify(head)) return true;\n if (head.kind === 'literal') {\n return (\n (base.kind === 'number' && typeof head.value === 'number') ||\n (base.kind === 'string' && typeof head.value === 'string') ||\n (base.kind === 'boolean' && typeof head.value === 'boolean')\n );\n }\n if (head.kind === 'bigintLiteral') return base.kind === 'bigint';\n if (base.kind !== head.kind) return false;\n switch (base.kind) {\n case 'array':\n return accepts(base.items, (head as typeof base).items);\n case 'set':\n return accepts(base.items, (head as typeof base).items);\n case 'map': {\n const h = head as typeof base;\n return accepts(base.key, h.key) && accepts(base.value, h.value);\n }\n case 'record':\n return accepts(base.values, (head as typeof base).values);\n case 'tuple': {\n const h = head as typeof base;\n if (h.items.length < (base.optionalFrom ?? base.items.length)) return false;\n return h.items.every((it, i) => {\n const b = base.items[i] ?? base.rest;\n return b !== undefined && accepts(b, it);\n });\n }\n case 'object': {\n const h = head as typeof base;\n return base.props.every((bp) => {\n const hp = h.props.find((p) => p.name === bp.name);\n if (!hp) return bp.optional;\n if (hp.optional && !bp.optional) return false;\n return accepts(bp.spec, hp.spec);\n });\n }\n case 'function':\n return accepts(base.returns, (head as typeof base).returns);\n default:\n return true;\n }\n}\n\nexport function signatureAccepts(base: SignatureSpec, head: SignatureSpec): boolean {\n const baseRest = base.params.find((p) => p.rest);\n const headFixed = head.params.filter((p) => !p.rest);\n for (let i = 0; i < headFixed.length; i++) {\n const hp = headFixed[i]!;\n const bp = base.params[i] && !base.params[i]!.rest ? base.params[i] : baseRest;\n if (!bp) {\n // Extra head parameter: only fine if the base ignores it, i.e. it is optional in head.\n if (!hp.optional) return false;\n continue;\n }\n if (!accepts(bp.spec, hp.spec)) return false;\n }\n // Base parameters that head does not pass must be optional.\n for (let i = headFixed.length; i < base.params.length; i++) {\n const bp = base.params[i]!;\n if (!bp.optional && !bp.rest) return false;\n }\n const headRest = head.params.find((p) => p.rest);\n if (headRest) {\n const target = baseRest ?? undefined;\n if (!target || !accepts(target.spec, headRest.spec)) return false;\n }\n return true;\n}\n", "import { existsSync, realpathSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { join } from 'node:path';\nimport type { CompareOptions } from './compare/compare.js';\nimport fc from 'fast-check';\nimport type { FunctionConfig } from '../config.js';\nimport type { LlmProvider } from './claims/providers.js';\nimport { suggestInputs } from './claims/suggest.js';\nimport { detectChanges, listSourceFiles, type Detection, type ListedFunction } from './detect/detect.js';\nimport { collectUsage } from './analyze/usage.js';\nimport { prepareDependencies, type DepsResult } from './git/deps.js';\nimport { isWorkingTreeClean, mergeBase, repoRoot, resolveCommit, git } from './git/git.js';\nimport { addWorktree, type Worktree } from './git/worktree.js';\nimport { packageRootOf, relPath, VerifySession } from './verify/session.js';\nimport { verifyFunction, type FunctionResult, type FunctionTarget } from './verify/verifyFunction.js';\n\nexport interface RunOptions {\n /** Any directory inside the repository. */\n cwd: string;\n /** Base revision (default: HEAD). */\n base?: string;\n /** Head revision (default: the working tree, including uncommitted changes). */\n head?: string;\n /** Compare against merge-base(base, head) like a pull request does (default true). */\n mergeBase?: boolean;\n seed?: number;\n /** Max inputs per function (default 1000). */\n runs?: number;\n /** Per-call timeout in ms (default 250). */\n timeoutMs?: number;\n /** Total time budget for exploring all functions, in ms. Undefined: no budget. */\n timeBudgetMs?: number;\n /** Freeze the clock and seed randomness in the code under test (default true). */\n freeze?: boolean;\n include?: string[];\n exclude?: string[];\n /** Only verify these functions (ids or export names). */\n only?: string[];\n compare?: CompareOptions;\n keepWorktrees?: boolean;\n /** Allow installing dependencies in the base worktree when the lockfile changed (default true). */\n install?: boolean;\n /** Cache directory for dependency installs (default ~/.cache/doppeldiff/deps). */\n depsCacheDir?: string;\n poolSize?: number;\n noSandbox?: boolean;\n showConsole?: boolean;\n /** Optional LLM provider for edge-case input suggestions. */\n suggestProvider?: LlmProvider | null;\n onWarning?: (message: string) => void;\n /** Per-function overrides (from the config file), keyed by id (`file#export`) or export name. */\n functions?: Record<string, FunctionConfig>;\n onEvent?: (event: RunEvent) => void;\n}\n\nexport type RunEvent =\n | { type: 'phase'; phase: 'materialize' | 'dependencies' | 'detect' | 'verify'; detail?: string }\n | { type: 'detected'; detection: Detection }\n | { type: 'function-start'; target: FunctionTarget; index: number; total: number }\n | { type: 'function-progress'; target: FunctionTarget; inputsRun: number; clusters: number }\n | { type: 'function-done'; result: FunctionResult; index: number; total: number };\n\nexport interface RunResult {\n tool: { name: 'doppeldiff'; version: string };\n base: { ref: string; sha: string };\n head: { ref: string; sha: string | null };\n seed: number;\n settings: { runs: number; timeoutMs: number; timeBudgetMs: number | null; freeze: boolean };\n /** Results for every function whose behavior may have changed. */\n functions: FunctionResult[];\n skipped: ListedFunction[];\n added: ListedFunction[];\n removed: ListedFunction[];\n identical: ListedFunction[];\n errors: { file: string; message: string }[];\n changedFiles: number;\n dependencies: DepsResult['actions'];\n timing: {\n totalMs: number;\n materializeMs: number;\n dependenciesMs: number;\n detectMs: number;\n verifyMs: number;\n };\n}\n\nexport const DEFAULT_SEED = 1;\nexport const DEFAULT_RUNS = 1000;\nexport const DEFAULT_TIMEOUT_MS = 250;\n\nexport function toolVersion(): string {\n try {\n const require = createRequire(import.meta.url);\n for (const p of ['../package.json', '../../package.json']) {\n try {\n return (require(p) as { version: string }).version;\n } catch {\n /* try next */\n }\n }\n } catch {\n /* ignore */\n }\n return '0.0.0';\n}\n\nexport async function run(options: RunOptions): Promise<RunResult> {\n const t0 = Date.now();\n const emit = options.onEvent ?? (() => {});\n const seed = options.seed ?? DEFAULT_SEED;\n const runs = options.runs ?? DEFAULT_RUNS;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const freeze = options.freeze ?? true;\n\n // 1. Resolve revisions and materialize both versions.\n emit({ type: 'phase', phase: 'materialize' });\n const repo = repoRoot(options.cwd);\n const baseRef = options.base ?? 'HEAD';\n const headRef = options.head;\n const headSha = headRef ? resolveCommit(repo, headRef) : undefined;\n let baseSha = resolveCommit(repo, baseRef);\n if (options.mergeBase !== false) baseSha = mergeBase(repo, baseSha, headSha ?? 'HEAD');\n\n const worktrees: Worktree[] = [];\n let session: VerifySession | undefined;\n try {\n const baseWt = addWorktree(repo, baseSha, { keep: options.keepWorktrees ?? false });\n worktrees.push(baseWt);\n let headRoot = repo;\n const currentHead = git(['rev-parse', 'HEAD'], repo).trim();\n if (headSha && !(headSha === currentHead && isWorkingTreeClean(repo))) {\n const headWt = addWorktree(repo, headSha, { keep: options.keepWorktrees ?? false });\n worktrees.push(headWt);\n headRoot = headWt.path;\n }\n const materializeMs = Date.now() - t0;\n\n // 2. Detect changed functions (parsing only needs sources, not dependencies).\n emit({ type: 'phase', phase: 'detect' });\n const tDetect = Date.now();\n const parser = new VerifySession({ baseRoot: baseWt.path, headRoot, timeoutMs, freeze, seed });\n const detection = detectChanges({\n repo,\n baseSha,\n ...(headSha ? { headSha } : {}),\n baseRoot: baseWt.path,\n headRoot,\n ...(options.include ? { include: options.include } : {}),\n ...(options.exclude ? { exclude: options.exclude } : {}),\n sourceFile: (side, file) => parser.sourceFile(side, file),\n });\n // Config: functions explicitly skipped.\n for (const t of [...detection.targets]) {\n const fcfg = options.functions?.[t.id] ?? options.functions?.[t.exportName];\n if (fcfg?.skip) {\n detection.targets.splice(detection.targets.indexOf(t), 1);\n detection.skipped.push({\n id: t.id,\n file: t.id.split('#')[0]!,\n exportName: t.exportName,\n kind: 'function',\n reason: typeof fcfg.skip === 'string' ? fcfg.skip : 'skipped in doppeldiff.config',\n });\n }\n }\n const only = options.only;\n if (only?.length) {\n detection.targets = detection.targets.filter((t) => only.some((o) => o === t.id || o === t.exportName));\n }\n emit({ type: 'detected', detection });\n const detectMs = Date.now() - tDetect;\n\n // 3. Dependencies for the worktrees (only the package dirs that contain targets).\n emit({ type: 'phase', phase: 'dependencies' });\n const tDeps = Date.now();\n const packageDirs = [\n ...new Set(detection.targets.map((t) => relPath(headRoot, packageRootOf(headRoot, t.headFile)))),\n ];\n const deps: DepsResult = { readPaths: [], actions: [] };\n if (detection.targets.length > 0) {\n for (const wt of worktrees) {\n const r = prepareDependencies({\n targetRoot: wt.path,\n sourceRoot: repo,\n packageDirs,\n ...(options.install !== undefined ? { install: options.install } : {}),\n ...(options.depsCacheDir !== undefined ? { cacheDir: options.depsCacheDir } : {}),\n });\n deps.readPaths.push(...r.readPaths);\n deps.actions.push(...r.actions);\n }\n // Package-level node_modules of the working copy may be symlinks (pnpm, workspaces): allow their targets.\n for (const dir of packageDirs) {\n const nm = join(repo, dir, 'node_modules');\n if (existsSync(nm)) deps.readPaths.push(realpathSync(nm));\n }\n }\n const dependenciesMs = Date.now() - tDeps;\n\n // 4. Verify each target in the sandboxed runners.\n emit({ type: 'phase', phase: 'verify' });\n const tVerify = Date.now();\n session = new VerifySession({\n baseRoot: baseWt.path,\n headRoot,\n timeoutMs,\n freeze,\n seed,\n // Both runners may read the working copy (for symlinked workspace packages); writes stay denied.\n extraReadPaths: [repo, ...deps.readPaths],\n sourceRepo: repo,\n ...(options.poolSize !== undefined ? { poolSize: options.poolSize } : {}),\n ...(options.noSandbox !== undefined ? { noSandbox: options.noSandbox } : {}),\n ...(options.showConsole !== undefined ? { showConsole: options.showConsole } : {}),\n });\n const functions: FunctionResult[] = [];\n let fileList: string[] | undefined;\n const repoFiles = () => (fileList ??= listSourceFiles(repo, headSha));\n const total = detection.targets.length;\n for (const [index, target] of detection.targets.entries()) {\n emit({ type: 'function-start', target, index, total });\n let deadline: number | undefined;\n if (options.timeBudgetMs !== undefined) {\n const remaining = options.timeBudgetMs - (Date.now() - tVerify);\n deadline = Date.now() + Math.max(500, remaining / (total - index));\n }\n const fcfg = options.functions?.[target.id] ?? options.functions?.[target.exportName];\n const stem = target.id\n .split('#')[0]!\n .split('/')\n .pop()!\n .replace(/\\.[^.]+$/, '');\n const usage = collectUsage(headRoot, repoFiles(), [\n target.exportName === 'default' ? stem : target.exportName,\n ]);\n const result = await verifyFunction(session, target, {\n seed,\n runs: fcfg?.runs ?? runs,\n usage,\n ...(fcfg?.where ? { where: fcfg.where } : {}),\n ...(fcfg?.args ? { arbitrary: fcfg.args(fc) } : {}),\n ...(fcfg?.examples ? { examples: fcfg.examples } : {}),\n ...(options.suggestProvider\n ? {\n suggest: async (ctx) => {\n const r = await suggestInputs(options.suggestProvider!, ctx);\n return r.accepted;\n },\n }\n : {}),\n ...(options.onWarning ? { onWarning: options.onWarning } : {}),\n ...(deadline !== undefined ? { deadline } : {}),\n ...(options.compare ? { compare: options.compare } : {}),\n onProgress: (p) => emit({ type: 'function-progress', target, ...p }),\n });\n functions.push(result);\n emit({ type: 'function-done', result, index, total });\n }\n const verifyMs = Date.now() - tVerify;\n\n return {\n tool: { name: 'doppeldiff', version: toolVersion() },\n base: { ref: baseRef, sha: baseSha },\n head: { ref: headRef ?? 'working tree', sha: headSha ?? null },\n seed,\n settings: { runs, timeoutMs, timeBudgetMs: options.timeBudgetMs ?? null, freeze },\n functions,\n skipped: detection.skipped,\n added: detection.added,\n removed: detection.removed,\n identical: detection.identical,\n errors: detection.errors,\n changedFiles: detection.files.length,\n dependencies: deps.actions,\n timing: { totalMs: Date.now() - t0, materializeMs, dependenciesMs, detectMs, verifyMs },\n };\n } finally {\n session?.close();\n for (const wt of worktrees) wt.dispose();\n }\n}\n", "import type { ArbSpec, SignatureSpec } from '../types/spec.js';\nimport type { LlmProvider } from './providers.js';\n\n/**\n * Optional LLM step: suggest targeted edge-case inputs for a changed function. Suggestions are plain\n * literals parsed with a small safe parser (never eval'd) and must conform to the parameter types.\n */\nexport const SUGGEST_SCHEMA = {\n type: 'object',\n additionalProperties: false,\n required: ['inputs'],\n properties: {\n inputs: {\n type: 'array',\n items: {\n type: 'object',\n additionalProperties: false,\n required: ['args'],\n properties: {\n args: {\n type: 'string',\n description:\n 'The argument list as a JavaScript array literal, e.g. [1000.01, 0.15]. Use only literals.',\n },\n },\n },\n },\n },\n} as const;\n\nconst SYSTEM = `You help a differential-testing tool find inputs where the old and new version of a function behave differently.\nGiven both versions and the parameter types, propose up to 20 argument lists that are most likely to expose a difference: boundary values around constants in the code, empty/negative/zero/NaN values, special characters, edge cases the change touches.\nWrite each argument list as a JavaScript array literal using only: numbers (including NaN, Infinity, -Infinity, -0), strings in double quotes, true, false, null, undefined, arrays and plain objects with quoted or identifier keys. No expressions, no function calls.`;\n\nexport function buildSuggestPrompt(\n name: string,\n signature: string,\n baseSource: string,\n headSource: string,\n): string {\n const clip = (s: string) => (s.length > 8000 ? `${s.slice(0, 8000)}\\n// \u2026 truncated` : s);\n return `Function: ${signature}\\n\\n<old_version>\\n${clip(baseSource)}\\n</old_version>\\n\\n<new_version>\\n${clip(headSource)}\\n</new_version>\\n\\nPropose argument lists for ${name}.`;\n}\n\n/** Safe parser for JavaScript literal values (no evaluation). Throws on anything else. */\nexport function parseLiteral(src: string): unknown {\n let i = 0;\n const ws = () => {\n while (i < src.length && /\\s/.test(src[i]!)) i++;\n };\n const fail = (msg: string): never => {\n throw new Error(`${msg} at ${i}`);\n };\n const value = (depth: number): unknown => {\n if (depth > 20) fail('too deep');\n ws();\n const c = src[i];\n if (c === '[') {\n i++;\n const arr: unknown[] = [];\n ws();\n if (src[i] === ']') {\n i++;\n return arr;\n }\n for (;;) {\n arr.push(value(depth + 1));\n ws();\n if (src[i] === ',') {\n i++;\n ws();\n if (src[i] === ']') {\n i++;\n return arr;\n }\n continue;\n }\n if (src[i] === ']') {\n i++;\n return arr;\n }\n fail('expected , or ]');\n }\n }\n if (c === '{') {\n i++;\n const obj: Record<string, unknown> = {};\n ws();\n if (src[i] === '}') {\n i++;\n return obj;\n }\n for (;;) {\n ws();\n let key: string;\n if (src[i] === '\"' || src[i] === \"'\") key = str();\n else {\n const m = /^[A-Za-z_$][\\w$]*/.exec(src.slice(i));\n if (!m) fail('expected key');\n key = m![0];\n i += key.length;\n }\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') fail('forbidden key');\n ws();\n if (src[i] !== ':') fail('expected :');\n i++;\n obj[key] = value(depth + 1);\n ws();\n if (src[i] === ',') {\n i++;\n ws();\n if (src[i] === '}') {\n i++;\n return obj;\n }\n continue;\n }\n if (src[i] === '}') {\n i++;\n return obj;\n }\n fail('expected , or }');\n }\n }\n if (c === '\"' || c === \"'\") return str();\n const rest = src.slice(i);\n for (const [word, v] of [\n ['true', true],\n ['false', false],\n ['null', null],\n ['undefined', undefined],\n ['NaN', NaN],\n ['Infinity', Infinity],\n ['-Infinity', -Infinity],\n ] as const) {\n if (rest.startsWith(word) && !/[\\w$]/.test(rest[word.length] ?? '')) {\n i += word.length;\n return v;\n }\n }\n const m = /^-?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?/i.exec(rest);\n if (m) {\n i += m[0].length;\n return Number(m[0]);\n }\n return fail('unexpected token');\n };\n const str = (): string => {\n const q = src[i];\n i++;\n let out = '';\n while (i < src.length && src[i] !== q) {\n if (src[i] === '\\\\') {\n const n = src[i + 1];\n const map: Record<string, string> = {\n n: '\\n',\n t: '\\t',\n r: '\\r',\n '\\\\': '\\\\',\n '\"': '\"',\n \"'\": \"'\",\n '0': '\\0',\n };\n if (n === 'u') {\n out += String.fromCharCode(parseInt(src.slice(i + 2, i + 6), 16));\n i += 6;\n continue;\n }\n out += map[n ?? ''] ?? n ?? '';\n i += 2;\n continue;\n }\n out += src[i++];\n }\n if (src[i] !== q) fail('unterminated string');\n i++;\n return out;\n };\n const v = value(0);\n ws();\n if (i !== src.length) fail('trailing characters');\n return v;\n}\n\n/** Does a value conform to a spec? Used to validate LLM suggestions before running them. */\nexport function conforms(spec: ArbSpec, v: unknown, defs = new Map<string, ArbSpec>()): boolean {\n switch (spec.kind) {\n case 'number':\n return typeof v === 'number';\n case 'bigint':\n return typeof v === 'bigint';\n case 'string':\n return typeof v === 'string';\n case 'boolean':\n return typeof v === 'boolean';\n case 'undefined':\n return v === undefined;\n case 'null':\n return v === null;\n case 'literal':\n return Object.is(v, spec.value) || v === spec.value;\n case 'bigintLiteral':\n return typeof v === 'bigint' && v.toString() === spec.value;\n case 'union':\n return spec.options.some((o) => conforms(o, v, defs));\n case 'array':\n return Array.isArray(v) && v.every((x) => conforms(spec.items, x, defs));\n case 'tuple': {\n if (!Array.isArray(v)) return false;\n const min = spec.optionalFrom ?? spec.items.length;\n if (v.length < min || (!spec.rest && v.length > spec.items.length)) return false;\n return v.every((x, idx) => {\n const s = spec.items[idx] ?? spec.rest;\n return s !== undefined && conforms(s, x, defs);\n });\n }\n case 'object': {\n if (typeof v !== 'object' || v === null || Array.isArray(v)) return false;\n const o = v as Record<string, unknown>;\n return spec.props.every((p) =>\n p.name in o\n ? (p.optional && o[p.name] === undefined) || conforms(p.spec, o[p.name], defs)\n : p.optional,\n );\n }\n case 'record':\n return (\n typeof v === 'object' &&\n v !== null &&\n !Array.isArray(v) &&\n Object.values(v).every((x) => conforms(spec.values, x, defs))\n );\n case 'recursive':\n defs.set(spec.id, spec.spec);\n return conforms(spec.spec, v, defs);\n case 'ref': {\n const d = defs.get(spec.id);\n return d !== undefined && conforms(d, v, defs);\n }\n case 'anything':\n return true;\n default:\n // Dates, Maps, Sets and callbacks cannot be written as plain literals; unsupported never conforms.\n return false;\n }\n}\n\nexport function conformsSignature(sig: SignatureSpec, args: unknown[]): boolean {\n const fixed = sig.params.filter((p) => !p.rest);\n const rest = sig.params.find((p) => p.rest);\n if (args.length < fixed.filter((p) => !p.optional).length) return false;\n if (!rest && args.length > fixed.length) return false;\n return args.every((a, idx) => {\n const p = fixed[idx] ?? rest;\n return p !== undefined && conforms(p.spec, a);\n });\n}\n\nexport interface SuggestResult {\n accepted: unknown[][];\n rejected: number;\n}\n\nexport async function suggestInputs(\n provider: LlmProvider,\n ctx: { name: string; signature: string; spec: SignatureSpec; baseSource: string; headSource: string },\n): Promise<SuggestResult> {\n const text = await provider.complete({\n system: SYSTEM,\n user: buildSuggestPrompt(ctx.name, ctx.signature, ctx.baseSource, ctx.headSource),\n schema: SUGGEST_SCHEMA,\n schemaName: 'edge_case_inputs',\n maxTokens: 8000,\n });\n let parsed: { inputs?: { args?: unknown }[] };\n try {\n parsed = JSON.parse(text) as typeof parsed;\n } catch {\n return { accepted: [], rejected: 0 };\n }\n const accepted: unknown[][] = [];\n let rejected = 0;\n for (const item of (parsed.inputs ?? []).slice(0, 30)) {\n try {\n const args = parseLiteral(String(item.args ?? ''));\n if (Array.isArray(args) && conformsSignature(ctx.spec, args)) accepted.push(args);\n else rejected++;\n } catch {\n rejected++;\n }\n }\n return { accepted, rejected };\n}\n", "import { existsSync, readFileSync, realpathSync } from 'node:fs';\nimport { basename, dirname, extname, join } from 'node:path';\nimport picomatch from 'picomatch';\nimport { asFunctionLike } from '../analyze/locate.js';\nimport { changedFiles, git, type ChangedFile } from '../git/git.js';\nimport type { Side } from '../verify/session.js';\nimport type { FunctionTarget } from '../verify/verifyFunction.js';\nimport { changedTopLevel, indexModule, reach, type ModuleIndex } from './toplevel.js';\nimport type { SourceFile } from 'ts-morph';\n\nexport const SOURCE_EXTENSIONS = ['.ts', '.tsx', '.mts', '.cts', '.js', '.jsx', '.mjs', '.cjs'];\n\nexport const DEFAULT_EXCLUDE = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/coverage/**',\n '**/*.d.ts',\n '**/*.d.mts',\n '**/*.d.cts',\n '**/*.test.*',\n '**/*.spec.*',\n '**/__tests__/**',\n '**/__mocks__/**',\n '**/test/**',\n '**/tests/**',\n '**/test.{js,ts,mjs,cjs}',\n '**/tests.{js,ts,mjs,cjs}',\n '**/*.config.*',\n '**/.*/**',\n];\n\nexport interface DetectOptions {\n /** Repository root of the head version (where git commands run). */\n repo: string;\n baseSha: string;\n /** Head revision, or undefined for the working tree. */\n headSha?: string;\n baseRoot: string;\n headRoot: string;\n include?: string[];\n exclude?: string[];\n /** Depth for following references inside a module (default 3). */\n transitiveDepth?: number;\n /** Follow imports one module deep (default true). */\n crossModule?: boolean;\n sourceFile: (side: Side, absFile: string) => SourceFile;\n}\n\nexport interface ListedFunction {\n id: string;\n file: string;\n exportName: string;\n kind: string;\n reason?: string;\n}\n\nexport interface Detection {\n /** Changed source files considered (after include/exclude). */\n files: ChangedFile[];\n targets: FunctionTarget[];\n /** Changed exports that cannot be tested in v1 (classes, values, generators, \u2026). */\n skipped: ListedFunction[];\n added: ListedFunction[];\n removed: ListedFunction[];\n /** Exports whose code changed only in comments/formatting. */\n identical: ListedFunction[];\n /** Changed files that could not be analyzed. */\n errors: { file: string; message: string }[];\n}\n\n/** Canonical path key: real path with forward slashes (TypeScript reports resolved, posix-style paths). */\nfunction pathKey(p: string): string {\n let r = p;\n try {\n r = realpathSync.native(p);\n } catch {\n /* keep as is */\n }\n return r.replace(/\\\\/g, '/');\n}\n\nfunction isSource(path: string): boolean {\n return SOURCE_EXTENSIONS.includes(extname(path));\n}\n\nfunction exportKind(\n index: ModuleIndex,\n topName: string,\n): { testable: boolean; kind: string; reason?: string } {\n const top = index.decls.get(topName)!;\n if (top.kind === 'class')\n return { testable: false, kind: 'class', reason: 'class (class methods are out of scope in v1)' };\n if (top.kind === 'enum') return { testable: false, kind: 'enum', reason: 'enum (not a function)' };\n if (top.kind === 'import') return { testable: false, kind: 'import', reason: 're-exported import' };\n const loc = asFunctionLike(top.node);\n if (loc.ok) return { testable: true, kind: 'function' };\n return { testable: false, kind: top.kind === 'variable' ? 'value' : top.kind, reason: loc.reason };\n}\n\n/**\n * Determine which exported functions may have changed behavior between two versions:\n * - directly: their normalized declaration differs;\n * - transitively: they reference (within `transitiveDepth` hops) a changed module-level binding,\n * or an imported binding whose declaration changed in another module (one module deep).\n */\nexport function detectChanges(options: DetectOptions): Detection {\n const include = options.include?.length ? picomatch(options.include, { dot: true }) : () => true;\n const exclude = picomatch([...DEFAULT_EXCLUDE, ...(options.exclude ?? [])], { dot: true });\n const wanted = (p: string | undefined) => !!p && isSource(p) && include(p) && !exclude(p);\n const depth = options.transitiveDepth ?? 3;\n\n const all = changedFiles(options.repo, options.baseSha, options.headSha);\n const files = all.filter((f) => wanted(f.headPath) || wanted(f.basePath));\n const detection: Detection = {\n files,\n targets: [],\n skipped: [],\n added: [],\n removed: [],\n identical: [],\n errors: [],\n };\n\n /** Changed top-level names per head file (absolute path). */\n const changedByFile = new Map<string, Set<string>>();\n /** `file#name` of unchanged bindings that use a changed binding of the same file \u2192 that changed binding. */\n const indirect = new Map<string, string>();\n const targetIds = new Set<string>();\n\n const pushTarget = (t: FunctionTarget) => {\n if (targetIds.has(t.id)) return;\n targetIds.add(t.id);\n detection.targets.push(t);\n };\n\n // Add every file analysis will need to the projects *before* querying the type checker: each addition\n // invalidates the TypeScript program, and rebuilding it per file is quadratic on large repositories.\n const preload = (side: Side, abs: string) => {\n try {\n if (existsSync(abs)) options.sourceFile(side, abs);\n } catch {\n /* reported when analyzed */\n }\n };\n const changedStems = new Set<string>();\n for (const f of files) {\n if (f.headPath) {\n preload('head', join(options.headRoot, f.headPath));\n changedStems.add(basename(f.headPath).replace(/\\.[^.]+$/, ''));\n const name = nearestPackageName(join(options.headRoot, f.headPath), options.headRoot);\n if (name) changedStems.add(name);\n }\n if (f.basePath) preload('base', join(options.baseRoot, f.basePath));\n }\n const changedHeadKeys = new Set(\n files.filter((f) => f.headPath).map((f) => pathKey(join(options.headRoot, f.headPath!))),\n );\n const crossCandidates =\n options.crossModule === false || files.length === 0\n ? []\n : listSourceFiles(options.repo, options.headSha)\n .filter((p) => wanted(p))\n .map((p) => ({ rel: p, abs: join(options.headRoot, p) }))\n .filter(({ abs }) => existsSync(abs) && !changedHeadKeys.has(pathKey(abs)))\n .filter(({ abs }) => {\n const text = readFileSync(abs, 'utf8');\n return [...changedStems].some((st) => text.includes(st));\n });\n for (const c of crossCandidates) preload('head', c.abs);\n\n for (const f of files) {\n const headFile = f.headPath ? join(options.headRoot, f.headPath) : undefined;\n const baseFile = f.basePath ? join(options.baseRoot, f.basePath) : undefined;\n let head: ModuleIndex | undefined;\n let base: ModuleIndex | undefined;\n try {\n if (headFile && existsSync(headFile)) head = indexModule(options.sourceFile('head', headFile));\n if (baseFile && existsSync(baseFile)) base = indexModule(options.sourceFile('base', baseFile));\n } catch (e) {\n detection.errors.push({ file: (f.headPath ?? f.basePath)!, message: (e as Error).message });\n continue;\n }\n const displayPath = (f.headPath ?? f.basePath)!;\n const changed = changedTopLevel(base, head);\n const sideEffectsChanged =\n JSON.stringify(base?.sideEffects ?? []) !== JSON.stringify(head?.sideEffects ?? []);\n if (headFile && head) {\n // Importers are affected by changed bindings and by bindings that reach them (`decorateResult` calling a\n // changed `applyNumberFormatting` in the same file), so both count for cross-module impact.\n const affected = new Set(changed);\n if (changed.size > 0) {\n for (const [name, top] of head.decls) {\n if (affected.has(name) || top.kind === 'import') continue;\n const r = reach(head, top.node, depth);\n const via = [...r.local.keys()].find((n) => changed.has(n));\n if (via) {\n affected.add(name);\n indirect.set(`${pathKey(headFile)}#${name}`, via);\n }\n }\n }\n changedByFile.set(pathKey(headFile), affected);\n } else if (headFile) changedByFile.set(pathKey(headFile), changed);\n\n // Removed exports.\n if (base) {\n for (const [exportName, topName] of base.exports) {\n if (head?.exports.has(exportName)) continue;\n detection.removed.push({\n id: `${f.basePath}#${exportName}`,\n file: f.basePath!,\n exportName,\n kind: exportKind(base, topName).kind,\n });\n }\n }\n if (!head) continue;\n\n // A changed module with runtime code but no recognizable exports (UMD/IIFE wrappers, globals) must not be\n // reported as \"nothing changed\": list it as not verified.\n if (head.exports.size === 0 && (changed.size > 0 || sideEffectsChanged)) {\n detection.skipped.push({\n id: `${displayPath}#*`,\n file: displayPath,\n exportName: '*',\n kind: 'module',\n reason:\n 'changed, but no ESM/CommonJS exports were recognized (UMD/IIFE wrappers are not supported in v1)',\n });\n continue;\n }\n\n for (const [exportName, topName] of head.exports) {\n const id = `${displayPath}#${exportName}`;\n const kind = exportKind(head, topName);\n const baseTop = base?.exports.get(exportName);\n if (!base || baseTop === undefined) {\n detection.added.push({ id, file: displayPath, exportName, kind: kind.kind });\n continue;\n }\n const top = head.decls.get(topName)!;\n const baseDecl = base.decls.get(baseTop);\n const directlyChanged = !baseDecl || baseDecl.normalized !== top.normalized;\n let reason: string | undefined;\n if (directlyChanged) {\n reason = 'code changed';\n } else {\n const r = reach(head, top.node, depth);\n const hit = [...r.local].find(([name]) => changed.has(name));\n if (hit)\n reason = `uses changed \\`${hit[0]}\\`${hit[1].length > 1 ? ` (via ${hit[1].slice(0, -1).join(' \u2192 ')})` : ''}`;\n else if (sideEffectsChanged) reason = 'module-level code changed';\n }\n if (!reason) {\n if (baseDecl && baseDecl.raw !== top.raw) {\n detection.identical.push({\n id,\n file: displayPath,\n exportName,\n kind: kind.kind,\n reason: 'only comments or formatting changed',\n });\n }\n continue;\n }\n if (!kind.testable) {\n detection.skipped.push({\n id,\n file: displayPath,\n exportName,\n kind: kind.kind,\n reason: kind.reason ?? 'not testable',\n });\n continue;\n }\n pushTarget({\n id,\n exportName,\n baseFile: join(options.baseRoot, f.basePath!),\n headFile: headFile!,\n reason,\n });\n }\n }\n\n // Cross-module impact: exported functions anywhere in the head tree that import a changed binding.\n if (options.crossModule !== false && changedByFile.size > 0) {\n const changedFilesAbs = [...changedByFile.entries()].filter(([, set]) => set.size > 0);\n // Cheap pre-filter: a file can only import a changed module if it mentions its file stem or package name.\n const stems = new Set(changedFilesAbs.map(([p]) => basename(p).replace(/\\.[^.]+$/, '')));\n for (const [p] of changedFilesAbs) {\n const name = nearestPackageName(p, options.headRoot);\n if (name) stems.add(name);\n }\n const candidates = crossCandidates.filter(({ abs }) => !changedByFile.has(pathKey(abs)));\n for (const { rel, abs } of candidates) {\n const text = readFileSync(abs, 'utf8');\n if (![...stems].some((s) => text.includes(s))) continue;\n const baseAbs = join(options.baseRoot, rel);\n if (!existsSync(baseAbs)) continue;\n let index: ModuleIndex;\n try {\n index = indexModule(options.sourceFile('head', abs));\n } catch {\n continue;\n }\n for (const [exportName, topName] of index.exports) {\n const id = `${rel}#${exportName}`;\n if (targetIds.has(id)) continue;\n const top = index.decls.get(topName)!;\n const r = reach(index, top.node, depth);\n let reason: string | undefined;\n for (const [, imp] of r.imported) {\n const key = pathKey(imp.file);\n if (changedByFile.get(key)?.has(imp.name)) {\n const from = relativeTo(pathKey(options.headRoot), key);\n const via = indirect.get(`${key}#${imp.name}`);\n reason = via\n ? `uses \\`${imp.name}\\` from ${from}, which uses changed \\`${via}\\``\n : `uses changed \\`${imp.name}\\` from ${from}`;\n break;\n }\n }\n if (!reason) continue;\n const kind = exportKind(index, topName);\n if (!kind.testable) continue;\n pushTarget({ id, exportName, baseFile: baseAbs, headFile: abs, reason });\n }\n }\n }\n return detection;\n}\n\nfunction nearestPackageName(file: string, root: string): string | undefined {\n let dir = dirname(file);\n const stop = pathKey(root);\n for (let i = 0; i < 20; i++) {\n const pkg = join(dir, 'package.json');\n if (existsSync(pkg)) {\n try {\n const name = (JSON.parse(readFileSync(pkg, 'utf8')) as { name?: unknown }).name;\n if (typeof name === 'string') return name;\n } catch {\n /* ignore */\n }\n }\n if (pathKey(dir) === stop) break;\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return undefined;\n}\n\nfunction relativeTo(root: string, abs: string): string {\n return abs.startsWith(root + '/') ? abs.slice(root.length + 1) : abs;\n}\n\n/** Tracked (and, for the working tree, untracked non-ignored) files of the head version. */\nexport function listSourceFiles(repo: string, headSha?: string): string[] {\n const out = headSha\n ? git(['ls-tree', '-r', '--name-only', '-z', headSha], repo)\n : git(['ls-files', '--cached', '--others', '--exclude-standard', '-z'], repo);\n return out.split('\\0').filter((p) => p.length > 0 && isSource(p));\n}\n", "import { execFileSync } from 'node:child_process';\n\nexport class GitError extends Error {\n constructor(\n message: string,\n readonly stderr: string,\n ) {\n super(message);\n this.name = 'GitError';\n }\n}\n\nexport function git(args: string[], cwd: string): string {\n try {\n return execFileSync('git', args, {\n cwd,\n encoding: 'utf8',\n maxBuffer: 256 * 1024 * 1024,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env, GIT_TERMINAL_PROMPT: '0', LC_ALL: 'C' },\n });\n } catch (e) {\n const err = e as { stderr?: string | Buffer; message: string };\n const stderr = String(err.stderr ?? '');\n throw new GitError(`git ${args.join(' ')} failed: ${stderr.trim() || err.message}`, stderr);\n }\n}\n\nexport function repoRoot(cwd: string): string {\n return git(['rev-parse', '--show-toplevel'], cwd).trim();\n}\n\n/** Resolve a revision to a full commit SHA. */\nexport function resolveCommit(cwd: string, rev: string): string {\n return git(['rev-parse', '--verify', '--quiet', `${rev}^{commit}`], cwd).trim();\n}\n\nexport function mergeBase(cwd: string, a: string, b: string): string {\n return git(['merge-base', a, b], cwd).trim();\n}\n\nexport type FileStatus = 'added' | 'modified' | 'deleted' | 'renamed';\n\nexport interface ChangedFile {\n status: FileStatus;\n /** Path in the base revision (repo-relative, forward slashes); undefined for added files. */\n basePath?: string;\n /** Path in the head revision; undefined for deleted files. */\n headPath?: string;\n}\n\n/**\n * Files changed between `base` and `head`. `head === undefined` means the working tree\n * (staged + unstaged changes and untracked, non-ignored files).\n */\nexport function changedFiles(cwd: string, base: string, head?: string): ChangedFile[] {\n const args = ['diff', '--name-status', '-z', '-M', base];\n if (head) args.push(head);\n const out = git(args, cwd);\n const parts = out.split('\\0').filter((p) => p.length > 0);\n const files: ChangedFile[] = [];\n for (let i = 0; i < parts.length;) {\n const code = parts[i++]!;\n if (code.startsWith('R')) {\n files.push({ status: 'renamed', basePath: parts[i++]!, headPath: parts[i++]! });\n } else if (code.startsWith('C')) {\n i++; // copy source\n files.push({ status: 'added', headPath: parts[i++]! });\n } else if (code === 'A') {\n files.push({ status: 'added', headPath: parts[i++]! });\n } else if (code === 'D') {\n files.push({ status: 'deleted', basePath: parts[i++]! });\n } else {\n const p = parts[i++]!;\n files.push({ status: 'modified', basePath: p, headPath: p });\n }\n }\n if (!head) {\n const untracked = git(['ls-files', '--others', '--exclude-standard', '-z'], cwd)\n .split('\\0')\n .filter((p) => p.length > 0);\n for (const p of untracked) files.push({ status: 'added', headPath: p });\n }\n return files;\n}\n\n/** Line ranges touched by a diff, per side. Lines are 1-based, ranges inclusive. */\nexport interface Hunk {\n baseStart: number;\n baseLines: number;\n headStart: number;\n headLines: number;\n}\n\nexport function parseHunks(diff: string): Hunk[] {\n const hunks: Hunk[] = [];\n const re = /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/gm;\n for (const m of diff.matchAll(re)) {\n hunks.push({\n baseStart: Number(m[1]),\n baseLines: m[2] === undefined ? 1 : Number(m[2]),\n headStart: Number(m[3]),\n headLines: m[4] === undefined ? 1 : Number(m[4]),\n });\n }\n return hunks;\n}\n\nexport function fileHunks(cwd: string, base: string, head: string | undefined, file: ChangedFile): Hunk[] {\n const args = ['diff', '-U0', '-M', '--no-color', '--no-ext-diff', base];\n if (head) args.push(head);\n args.push('--', ...new Set([file.basePath, file.headPath].filter((p): p is string => !!p)));\n return parseHunks(git(args, cwd));\n}\n\n/** Contents of a file at a revision. */\nexport function showFile(cwd: string, rev: string, path: string): string {\n return git(['show', `${rev}:${path}`], cwd);\n}\n\nexport function isWorkingTreeClean(cwd: string): boolean {\n return git(['status', '--porcelain'], cwd).trim().length === 0;\n}\n\n/** Unified diff text between base and head (or the working tree) restricted to `paths`. */\nexport function diffText(cwd: string, base: string, head: string | undefined, paths: string[]): string {\n if (paths.length === 0) return '';\n const args = ['diff', '-U3', '-M', '--no-color', '--no-ext-diff', base];\n if (head) args.push(head);\n args.push('--', ...paths);\n return git(args, cwd);\n}\n", "import { readFileSync } from 'node:fs';\nimport { basename, join } from 'node:path';\nimport { ts } from 'ts-morph';\n\n/**\n * How a function is actually used in the repository: literal arguments at call sites (in sources and tests) and the\n * literal values of test files that exercise it. Used to run real inputs first, to bias generation towards them, and\n * to judge how realistic a counterexample is.\n */\nexport interface Usage {\n /** Argument lists of call sites whose arguments are all literals. */\n tuples: unknown[][];\n /** Literal numbers seen at call sites and in tests of the function. */\n numbers: number[];\n /** Literal strings seen at call sites and in tests of the function. */\n strings: string[];\n /** Number of files that referenced the function. */\n files: number;\n /** Number of numeric literal occurrences behind `numbers` (repeated values count). */\n numberObservations: number;\n}\n\nexport function emptyUsage(): Usage {\n return { tuples: [], numbers: [], strings: [], files: 0, numberObservations: 0 };\n}\n\nconst TEST_FILE = /(^|\\/)(test|tests|__tests__|spec)\\/|\\.(test|spec)\\.[cm]?[jt]sx?$/;\nconst MAX_TUPLES = 60;\nconst MAX_POOL = 400;\nconst MAX_FILE_BYTES = 512 * 1024;\n\nconst NOT_LITERAL = Symbol('not-literal');\n\n/** Evaluate a literal expression (numbers, strings, booleans, null/undefined, arrays/objects of literals). */\nfunction literalValue(node: ts.Node, depth = 0): unknown {\n if (depth > 6) return NOT_LITERAL;\n if (ts.isNumericLiteral(node)) return Number(node.text);\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) return node.text;\n if (ts.isPrefixUnaryExpression(node) && ts.isNumericLiteral(node.operand)) {\n if (node.operator === ts.SyntaxKind.MinusToken) return -Number(node.operand.text);\n if (node.operator === ts.SyntaxKind.PlusToken) return Number(node.operand.text);\n }\n if (node.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (node.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (node.kind === ts.SyntaxKind.NullKeyword) return null;\n if (ts.isIdentifier(node)) {\n if (node.text === 'undefined') return undefined;\n if (node.text === 'NaN') return NaN;\n if (node.text === 'Infinity') return Infinity;\n return NOT_LITERAL;\n }\n if (ts.isParenthesizedExpression(node) || ts.isAsExpression(node))\n return literalValue(node.expression, depth + 1);\n if (ts.isArrayLiteralExpression(node)) {\n const out: unknown[] = [];\n for (const el of node.elements) {\n const v = literalValue(el, depth + 1);\n if (v === NOT_LITERAL) return NOT_LITERAL;\n out.push(v);\n }\n return out;\n }\n if (ts.isObjectLiteralExpression(node)) {\n const out: Record<string, unknown> = {};\n for (const p of node.properties) {\n if (!ts.isPropertyAssignment(p)) return NOT_LITERAL;\n const key =\n ts.isIdentifier(p.name) || ts.isStringLiteral(p.name) || ts.isNumericLiteral(p.name)\n ? p.name.text\n : undefined;\n if (key === undefined || key === '__proto__') return NOT_LITERAL;\n const v = literalValue(p.initializer, depth + 1);\n if (v === NOT_LITERAL) return NOT_LITERAL;\n out[key] = v;\n }\n return out;\n }\n return NOT_LITERAL;\n}\n\nfunction calleeName(expr: ts.Expression): string | undefined {\n if (ts.isIdentifier(expr)) return expr.text;\n if (ts.isPropertyAccessExpression(expr)) return expr.name.text;\n return undefined;\n}\n\n/**\n * Collect usage of `names` (export name, plus the file stem for default exports) across `files`\n * (repo-relative paths under `root`).\n */\nexport function collectUsage(root: string, files: string[], names: string[]): Usage {\n const usage = emptyUsage();\n const nameSet = new Set(names.filter((n) => n && n !== 'default'));\n if (nameSet.size === 0) return usage;\n const pattern = new RegExp(`\\\\b(${[...nameSet].map((n) => n.replace(/[$]/g, '\\\\$')).join('|')})\\\\b`);\n const numbers = new Set<number>();\n const strings = new Set<string>();\n const tupleKeys = new Set<string>();\n\n for (const rel of files) {\n let text: string;\n try {\n text = readFileSync(join(root, rel), 'utf8');\n } catch {\n continue;\n }\n if (text.length > MAX_FILE_BYTES || !pattern.test(text)) continue;\n usage.files++;\n const isTest = TEST_FILE.test(rel);\n const sf = ts.createSourceFile(basename(rel), text, ts.ScriptTarget.Latest, true);\n const visit = (node: ts.Node) => {\n if (ts.isCallExpression(node)) {\n const name = calleeName(node.expression);\n if (name && nameSet.has(name)) {\n const args = node.arguments.map((a) => literalValue(a));\n for (const a of args) if (typeof a === 'number') usage.numberObservations++;\n for (const a of args) collectLeaves(a, numbers, strings);\n if (args.length > 0 && args.every((a) => a !== NOT_LITERAL) && usage.tuples.length < MAX_TUPLES) {\n const key = JSON.stringify(args, (_k, v) =>\n typeof v === 'number' && !Number.isFinite(v) ? String(v) : v,\n );\n if (!tupleKeys.has(key)) {\n tupleKeys.add(key);\n usage.tuples.push(args);\n }\n }\n }\n }\n // Tests often keep inputs in tables (`[['1', '2'], [1, 2]].forEach(...)`): their literals are usage too.\n if (isTest && numbers.size + strings.size < MAX_POOL) {\n const v =\n ts.isNumericLiteral(node) || ts.isStringLiteral(node) || ts.isPrefixUnaryExpression(node)\n ? literalValue(node)\n : NOT_LITERAL;\n if (v !== NOT_LITERAL && !isImportSpecifier(node) && !isTestTitle(node) && !isExpectedValue(node)) {\n if (typeof v === 'number') usage.numberObservations++;\n collectLeaves(v, numbers, strings);\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(sf);\n }\n usage.numbers = [...numbers].slice(0, MAX_POOL);\n usage.strings = [...strings].slice(0, MAX_POOL);\n return usage;\n}\n\n/** Assertion calls whose arguments after the first (or all, for matchers) are expected outputs, not inputs. */\nconst ASSERT_SECOND = new Set([\n 'equal',\n 'equals',\n 'strictEqual',\n 'deepEqual',\n 'deepStrictEqual',\n 'notEqual',\n 'same',\n 'is',\n 'eq',\n 'assertEquals',\n 'match',\n]);\nconst MATCHERS = new Set([\n 'toBe',\n 'toEqual',\n 'toStrictEqual',\n 'toMatchObject',\n 'toContain',\n 'toBeCloseTo',\n 'toThrow',\n 'toHaveLength',\n 'toBeGreaterThan',\n 'toBeLessThan',\n 'toBeGreaterThanOrEqual',\n 'toBeLessThanOrEqual',\n 'eql',\n 'equal',\n]);\n\n/** Is this literal (part of) an expected value in an assertion? */\nfunction isExpectedValue(node: ts.Node): boolean {\n let child: ts.Node = node;\n for (let p = node.parent; p; child = p, p = p.parent) {\n if (ts.isCallExpression(p)) {\n const name = calleeName(p.expression);\n const index = p.arguments.indexOf(child as ts.Expression);\n if (name && index >= 0) {\n if (MATCHERS.has(name) && ts.isPropertyAccessExpression(p.expression)) return true;\n if (ASSERT_SECOND.has(name) && index >= 1) return true;\n }\n return false;\n }\n if (ts.isSourceFile(p) || ts.isBlock(p)) return false;\n }\n return false;\n}\n\nconst TEST_FUNCTIONS = new Set(['describe', 'it', 'test', 'suite', 'context', 'bench']);\n\nfunction isTestTitle(node: ts.Node): boolean {\n const p = node.parent;\n if (!p || !ts.isCallExpression(p) || p.arguments[0] !== node) return false;\n const callee = ts.isPropertyAccessExpression(p.expression) ? p.expression.expression : p.expression;\n return ts.isIdentifier(callee) && TEST_FUNCTIONS.has(callee.text);\n}\n\nfunction isImportSpecifier(node: ts.Node): boolean {\n const p = node.parent;\n return (\n !!p &&\n (ts.isImportDeclaration(p) ||\n ts.isExportDeclaration(p) ||\n (ts.isCallExpression(p) && ts.isIdentifier(p.expression) && p.expression.text === 'require'))\n );\n}\n\nfunction collectLeaves(v: unknown, numbers: Set<number>, strings: Set<string>): void {\n if (v === NOT_LITERAL) return;\n if (typeof v === 'number') numbers.add(v);\n else if (typeof v === 'string') {\n if (v.length <= 200) strings.add(v);\n } else if (Array.isArray(v)) v.forEach((x) => collectLeaves(x, numbers, strings));\n else if (v && typeof v === 'object') Object.values(v).forEach((x) => collectLeaves(x, numbers, strings));\n}\n", "import { execFileSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport {\n existsSync,\n type Dirent,\n lstatSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n realpathSync,\n renameSync,\n rmSync,\n symlinkSync,\n} from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\nconst LOCKFILES: [string, PackageManager][] = [\n ['pnpm-lock.yaml', 'pnpm'],\n ['yarn.lock', 'yarn'],\n ['bun.lock', 'bun'],\n ['bun.lockb', 'bun'],\n ['package-lock.json', 'npm'],\n ['npm-shrinkwrap.json', 'npm'],\n];\n\nexport interface DepsResult {\n /** node_modules directories (real paths) the runners must be allowed to read. */\n readPaths: string[];\n /** What happened, for the report's timing/diagnostics section. */\n actions: { dir: string; action: 'linked' | 'installed' | 'cached' | 'none'; reason: string; ms: number }[];\n}\n\nexport interface DepsOptions {\n /** Repo root of the worktree that needs dependencies. */\n targetRoot: string;\n /** Repo root of the checkout whose node_modules are installed (the user's working copy). */\n sourceRoot: string;\n /** Package directories (repo-relative) that contain code under test. */\n packageDirs: string[];\n /** Allow running the package manager when the lockfile changed (default true). */\n install?: boolean;\n cacheDir?: string;\n}\n\n/** Content hash of a text file, insensitive to CRLF vs LF (Windows checkouts convert line endings). */\nfunction hashFile(path: string): string {\n if (!existsSync(path)) return 'missing';\n return createHash('sha256').update(readFileSync(path, 'utf8').replace(/\\r\\n/g, '\\n')).digest('hex');\n}\n\n/** Dependency-relevant fields of a package.json. */\nfunction manifestDeps(path: string): string {\n if (!existsSync(path)) return 'missing';\n try {\n const pkg = JSON.parse(readFileSync(path, 'utf8')) as Record<string, unknown>;\n return JSON.stringify([\n pkg.dependencies,\n pkg.devDependencies,\n pkg.optionalDependencies,\n pkg.peerDependencies,\n pkg.workspaces,\n pkg.overrides,\n pkg.resolutions,\n pkg.pnpm,\n ]);\n } catch {\n return 'invalid';\n }\n}\n\nfunction detectPackageManager(root: string): { pm: PackageManager; lockfile?: string } {\n for (const [file, pm] of LOCKFILES) if (existsSync(join(root, file))) return { pm, lockfile: file };\n return { pm: 'npm' };\n}\n\n/** Directory whose lockfile governs `packageDir`: the package itself if it has one, else the repo root. */\nfunction lockRoot(root: string, packageDir: string): string {\n const own = join(root, packageDir);\n return LOCKFILES.some(([f]) => existsSync(join(own, f))) ? own : root;\n}\n\n/** Identity of the dependency tree for a package: lockfile content plus dependency fields of manifests. */\nfunction lockKey(root: string, packageDir: string): string {\n const lr = lockRoot(root, packageDir);\n const { lockfile } = detectPackageManager(lr);\n const h = createHash('sha256');\n h.update(lockfile ? `${lockfile}:${hashFile(join(lr, lockfile))}` : 'no-lockfile');\n h.update(manifestDeps(join(root, 'package.json')));\n h.update(manifestDeps(join(root, packageDir, 'package.json')));\n return h.digest('hex');\n}\n\nfunction link(target: string, path: string): void {\n if (existsSync(path) || isSymlink(path)) rmSync(path, { recursive: true, force: true });\n mkdirSync(dirname(path), { recursive: true });\n symlinkSync(target, path, process.platform === 'win32' ? 'junction' : 'dir');\n}\n\nfunction isSymlink(p: string): boolean {\n try {\n return lstatSync(p).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nfunction installCommand(pm: PackageManager, hasLock: boolean): [string, string[]] {\n switch (pm) {\n case 'pnpm':\n return [\n 'pnpm',\n ['install', hasLock ? '--frozen-lockfile' : '--no-frozen-lockfile', '--ignore-scripts'],\n ];\n case 'yarn':\n return ['yarn', ['install', '--immutable', '--mode=skip-build']];\n case 'bun':\n return ['bun', ['install', '--frozen-lockfile', '--ignore-scripts']];\n default:\n return ['npm', [hasLock ? 'ci' : 'install', '--ignore-scripts', '--no-audit', '--no-fund']];\n }\n}\n\n/**\n * Make dependencies available to the base worktree:\n * - unchanged lockfile and manifests \u2192 symlink the head's node_modules (fast path, the common case);\n * - changed \u2192 install in the worktree with lifecycle scripts disabled, and cache the result by lock hash.\n */\nexport function prepareDependencies(options: DepsOptions): DepsResult {\n const result: DepsResult = { readPaths: [], actions: [] };\n const cacheDir = options.cacheDir ?? join(homedir(), '.cache', 'doppeldiff', 'deps');\n const dirs = [...new Set(['', ...options.packageDirs])];\n\n for (const dir of dirs) {\n const headNm = join(options.sourceRoot, dir, 'node_modules');\n const baseNm = join(options.targetRoot, dir, 'node_modules');\n const started = Date.now();\n if (!existsSync(headNm)) {\n if (dir === '' || existsSync(join(options.sourceRoot, dir, 'package.json'))) {\n result.actions.push({ dir, action: 'none', reason: 'no node_modules in the working copy', ms: 0 });\n }\n continue;\n }\n result.readPaths.push(realpathSync(headNm), ...symlinkedPackageTargets(headNm));\n if (samePath(options.targetRoot, options.sourceRoot)) continue;\n\n const baseKey = lockKey(options.targetRoot, dir);\n const headKey = lockKey(options.sourceRoot, dir);\n if (baseKey === headKey) {\n link(realpathSync(headNm), baseNm);\n result.actions.push({ dir, action: 'linked', reason: 'lockfile unchanged', ms: Date.now() - started });\n continue;\n }\n\n const cached = join(\n cacheDir,\n baseKey.slice(0, 24),\n dir.replace(/[\\\\/]/g, '__') || '_root',\n 'node_modules',\n );\n if (existsSync(cached)) {\n link(cached, baseNm);\n result.readPaths.push(realpathSync(cached));\n result.actions.push({\n dir,\n action: 'cached',\n reason: 'lockfile changed; reused cached install',\n ms: Date.now() - started,\n });\n continue;\n }\n if (options.install === false) {\n link(realpathSync(headNm), baseNm);\n result.actions.push({\n dir,\n action: 'linked',\n reason: 'lockfile changed but installs are disabled; reusing the working copy dependencies',\n ms: Date.now() - started,\n });\n continue;\n }\n // Install where the governing lockfile lives (package dir or repo root for workspaces).\n const installRoot = lockRoot(options.targetRoot, dir);\n const { pm, lockfile } = detectPackageManager(installRoot);\n const [cmd, args] = installCommand(pm, lockfile !== undefined);\n try {\n execFileSync(cmd, args, {\n cwd: installRoot,\n stdio: 'pipe',\n env: { ...process.env, npm_config_ignore_scripts: 'true' },\n shell: process.platform === 'win32',\n });\n } catch (e) {\n const stderr = String((e as { stderr?: Buffer }).stderr ?? '').slice(-500);\n link(realpathSync(headNm), baseNm);\n result.actions.push({\n dir,\n action: 'linked',\n reason: `install failed (${cmd} ${args.join(' ')}): ${stderr.trim() || (e as Error).message}; reusing the working copy dependencies`,\n ms: Date.now() - started,\n });\n continue;\n }\n // Cache the install unless it contains relative links that would break when moved (file: deps, workspaces).\n if (existsSync(baseNm) && !isSymlink(baseNm) && symlinkedPackageTargets(baseNm).length > 0) {\n result.readPaths.push(realpathSync(baseNm), ...symlinkedPackageTargets(baseNm));\n } else if (existsSync(baseNm) && !isSymlink(baseNm)) {\n try {\n mkdirSync(dirname(cached), { recursive: true });\n renameSync(baseNm, cached);\n link(cached, baseNm);\n result.readPaths.push(realpathSync(cached));\n } catch {\n result.readPaths.push(realpathSync(baseNm));\n }\n }\n result.actions.push({\n dir,\n action: 'installed',\n reason: `lockfile changed; ran ${cmd} ${args[0]}`,\n ms: Date.now() - started,\n });\n }\n return result;\n}\n\n/**\n * Real paths of symlinked packages in a node_modules dir (npm `file:` deps, workspaces, `npm link`) that\n * live outside it: the runners need read access to them because Node resolves modules to real paths.\n */\nexport function symlinkedPackageTargets(nodeModules: string): string[] {\n const out = new Set<string>();\n const root = realpathSync(nodeModules);\n const visit = (dir: string, depth: number) => {\n let entries: Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n const p = join(dir, e.name);\n if (e.name.startsWith('@') && e.isDirectory() && depth === 0) {\n visit(p, 1);\n } else if (e.isSymbolicLink()) {\n try {\n const target = realpathSync(p);\n if (!target.startsWith(root)) out.add(target);\n } catch {\n /* dangling link */\n }\n }\n }\n };\n visit(nodeModules, 0);\n return [...out];\n}\n\nfunction samePath(a: string, b: string): boolean {\n return a.replace(/\\\\/g, '/').toLowerCase() === b.replace(/\\\\/g, '/').toLowerCase();\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, rmSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { git } from './git.js';\n\nexport interface Worktree {\n path: string;\n sha: string;\n /** Remove the worktree (no-op for reused checkouts). */\n dispose(): void;\n}\n\nfunction worktreeBase(repo: string): string {\n const id = createHash('sha256').update(repo).digest('hex').slice(0, 10);\n return join(tmpdir(), 'doppeldiff-worktrees', id);\n}\n\n/**\n * Materialize `sha` of `repo` in a detached git worktree under the OS temp dir.\n * Reuses an existing worktree for the same commit (e.g. from a `--keep-worktrees` run).\n */\nexport function addWorktree(repo: string, sha: string, options: { keep?: boolean } = {}): Worktree {\n const dir = join(worktreeBase(repo), sha.slice(0, 12));\n const registered = git(['worktree', 'list', '--porcelain'], repo)\n .split('\\n')\n .filter((l) => l.startsWith('worktree '))\n .map((l) => l.slice('worktree '.length));\n const isRegistered = registered.some((p) => samePath(p, dir));\n if (isRegistered && existsSync(join(dir, '.git'))) {\n const head = git(['rev-parse', 'HEAD'], dir).trim();\n if (head === sha) return { path: dir, sha, dispose: () => options.keep || removeWorktree(repo, dir) };\n }\n if (isRegistered || existsSync(dir)) removeWorktree(repo, dir);\n mkdirSync(worktreeBase(repo), { recursive: true });\n git(['worktree', 'add', '--detach', '--force', dir, sha], repo);\n return { path: dir, sha, dispose: () => options.keep || removeWorktree(repo, dir) };\n}\n\nexport function removeWorktree(repo: string, dir: string): void {\n try {\n git(['worktree', 'remove', '--force', dir], repo);\n } catch {\n rmSync(dir, { recursive: true, force: true });\n try {\n git(['worktree', 'prune'], repo);\n } catch {\n /* ignore */\n }\n }\n}\n\nfunction samePath(a: string, b: string): boolean {\n const norm = (p: string) => p.replace(/\\\\/g, '/').replace(/\\/+$/, '').toLowerCase();\n return norm(a) === norm(b);\n}\n", "import type { Outcome } from '../compare/observed.js';\nimport type { Cluster, Witness } from '../explore/explore.js';\nimport { encCategory, formatOutcome } from '../format/format.js';\nimport { inputComplexity } from '../explore/humanize.js';\nimport type { RealismTier } from '../explore/realism.js';\n\n/**\n * A behavior is what a reviewer reasons about: \"now returns NaN where it used to return a number\".\n * It groups fine-grained clusters whose coarse transition is the same.\n */\nexport interface Behavior {\n /** Coarse transition key, e.g. \"returns number \u2192 returns NaN\". */\n key: string;\n /** Human-readable title, e.g. \"now returns NaN (previously a number)\". */\n title: string;\n /** Number of explored inputs that showed this behavior. */\n count: number;\n /** Fine-grained variants (transition + input region). */\n variants: { transition: string; features: string[]; count: number }[];\n /** Up to `maxExamples` examples, most realistic and simplest first, from distinct variants when possible. */\n examples: Witness[];\n /** Realism of the most realistic witness (0 edge \u2026 3 seen) and why it is not higher. */\n realism: { tier: RealismTier; reason?: string };\n}\n\n/** Coarse value category: numbers of any sign (including \u00B1Infinity) are \"number\"; NaN stays distinct. */\nfunction coarseCategory(o: Outcome): string {\n switch (o.kind) {\n case 'return': {\n let c = encCategory(o.value);\n if (['0', '-0', 'positive number', 'negative number', 'Infinity', '-Infinity'].includes(c))\n c = 'number';\n else if (c === 'empty string') c = 'string';\n else if (c === 'empty array') c = 'array';\n return `${o.async ? 'resolves' : 'returns'} ${c}`;\n }\n case 'throw':\n return `${o.async ? 'rejects' : 'throws'} ${encCategory(o.error)}`;\n case 'timeout':\n return 'timeout';\n case 'crash':\n return 'crash';\n }\n}\n\nexport function coarseKey(w: Witness): string {\n const a = coarseCategory(w.base);\n const b = coarseCategory(w.head);\n if (a !== b) return `${a} \u2192 ${b}`;\n if (w.diff.aspect === 'mutation') return `${a}: mutates argument ${String(w.diff.path[0])} differently`;\n if (w.diff.aspect === 'async') return `${a}: sync/async changed`;\n if (w.diff.aspect === 'error') return `${a}: error changed`;\n return `${a}: value changed`;\n}\n\nconst NO_ARTICLE = new Set(['undefined', 'null', 'NaN', 'Infinity', '-Infinity', 'Invalid Date']);\nconst valueWord = (cat: string) => (NO_ARTICLE.has(cat) ? cat : `a ${cat}`.replace(/^a ([aeiou])/i, 'an $1'));\n\n/** Plain-English title for a coarse transition. */\nexport function behaviorTitle(w: Witness): string {\n const a = coarseCategory(w.base);\n const b = coarseCategory(w.head);\n const [aVerb, ...aRest] = a.split(' ');\n const [bVerb, ...bRest] = b.split(' ');\n const aWhat = aRest.join(' ');\n const bWhat = bRest.join(' ');\n if (a === b) {\n switch (w.diff.aspect) {\n case 'mutation':\n return `mutates argument ${Number(w.diff.path[0]) + 1} differently`;\n case 'async':\n return 'changed between sync and async';\n case 'error':\n return `still ${aVerb} ${aWhat}, but with a different ${w.diff.path.includes('message') ? 'message' : 'error'}`;\n default:\n return aVerb === 'resolves' ? 'resolved value changed' : 'return value changed';\n }\n }\n if (b === 'timeout') return 'now hangs (times out)';\n if (a === 'timeout') return `no longer hangs; now ${b}`;\n if (b === 'crash') return 'now crashes the process';\n if (a === 'crash') return `no longer crashes; now ${b}`;\n const isThrow = (v: string | undefined) => v === 'throws' || v === 'rejects';\n if (isThrow(bVerb) && !isThrow(aVerb))\n return `now ${bVerb} ${bWhat} (previously ${aVerb === 'resolves' ? 'resolved' : 'returned'} ${valueWord(aWhat)})`;\n if (isThrow(aVerb) && !isThrow(bVerb))\n return `no longer ${aVerb === 'throws' ? 'throws' : 'rejects with'} ${aWhat}; now ${bVerb} ${valueWord(bWhat)}`;\n if (isThrow(aVerb) && isThrow(bVerb)) return `now ${bVerb} ${bWhat} instead of ${aWhat}`;\n if (aVerb !== bVerb)\n return `now ${bVerb === 'resolves' ? 'returns a promise' : 'returns synchronously'} (${b}, previously ${a})`;\n return `now ${bVerb} ${valueWord(bWhat)} (previously ${valueWord(aWhat)})`;\n}\n\n/** Group clusters into behaviors, ordered by number of affected inputs. */\nexport function groupBehaviors(clusters: Cluster[], maxExamples = 3): Behavior[] {\n const groups = new Map<string, { title: string; clusters: Cluster[] }>();\n for (const c of clusters) {\n const w = c.witnesses[0];\n if (!w) continue;\n const key = coarseKey(w);\n const g = groups.get(key) ?? { title: behaviorTitle(w), clusters: [] };\n g.clusters.push(c);\n groups.set(key, g);\n }\n const behaviors: Behavior[] = [];\n for (const [key, g] of groups) {\n const sorted = [...g.clusters].sort((x, y) => y.count - x.count);\n // Prefer simple examples that show *different* old \u2192 new outcomes; then fill with the next simplest.\n const tier = (w: Witness) => w.realism?.tier ?? 2;\n const order = (x: Witness, y: Witness) =>\n tier(y) - tier(x) || inputComplexity(x.input) - inputComplexity(y.input);\n const firsts = sorted.map((c) => c.witnesses[0]!).sort(order);\n const rest = sorted.flatMap((c) => c.witnesses.slice(1)).sort(order);\n const candidates = [...firsts, ...rest];\n const pairKey = (w: Witness) => `${formatOutcome(w.base)}\\u0000${formatOutcome(w.head)}`;\n const usedPairs = new Set<string>();\n const examples: Witness[] = [];\n for (const w of candidates) {\n if (examples.length >= maxExamples) break;\n if (usedPairs.has(pairKey(w))) continue;\n usedPairs.add(pairKey(w));\n examples.push(w);\n }\n for (const w of candidates) {\n if (examples.length >= maxExamples) break;\n if (!examples.includes(w)) examples.push(w);\n }\n const best = [...firsts, ...rest].sort(order)[0];\n behaviors.push({\n realism: {\n tier: best ? (tier(best) as RealismTier) : 2,\n ...(best?.realism?.reason ? { reason: best.realism.reason } : {}),\n },\n key,\n title: g.title,\n count: sorted.reduce((s, c) => s + c.count, 0),\n variants: sorted.map((c) => ({ transition: c.transition, features: c.features, count: c.count })),\n examples: examples.map((e, i) => ({ ...e, minimal: i === 0 })),\n });\n }\n return behaviors.sort((x, y) => y.realism.tier - x.realism.tier || y.count - x.count);\n}\n", "/**\n * Keyless, deterministic claim matching: compares observed behavior changes with the PR title/description\n * using documented rules. This is the default; no LLM or API key is involved.\n *\n * Rules (first match wins), see docs/CLAIMS.md:\n * 1. Intent \"no behavior change\": an explicit phrase (\"no behavior change\", \"pure refactor\", \"behavior-preserving\",\n * ...), a conventional-commit type refactor/perf/chore/style/build/ci/test/docs, a fix/feat title whose text is\n * only about performance (\"fix: faster paths for compare\"), or refactor-style words (\"refactor\", \"cleanup\",\n * \"rename\", \"simplify\", \"faster\", ...) without change words. Every behavior change is **unclaimed**.\n * 2. The PR text names the function (its export name, a distinctive word of a camelCase name, or a changed\n * helper it calls): **claimed**.\n * 3. The PR text names other changed functions but not this one: **unclaimed**.\n * 4. Otherwise: neutral **behavior change**.\n */\nexport type Intent = 'no-change' | 'change' | 'unknown';\n\nexport interface ClaimAnalysis {\n intent: Intent;\n /** The words that decided the intent, for explanations. */\n intentEvidence?: string;\n /** Lower-cased identifier-like words of the claim. */\n words: Set<string>;\n /** Identifiers written as code (`foo`) or in camelCase/snake_case, as written. */\n identifiers: Set<string>;\n}\n\nconst NO_CHANGE_TYPES = new Set([\n 'refactor',\n 'perf',\n 'chore',\n 'style',\n 'build',\n 'ci',\n 'test',\n 'tests',\n 'docs',\n]);\nconst CHANGE_TYPES = new Set(['fix', 'feat', 'feature', 'bugfix', 'hotfix', 'revert', 'security']);\n\nconst EXPLICIT_NO_CHANGE = [\n /\\bno (?:functional|behaviou?ral|behaviou?r|logic|user[- ]facing|runtime) changes?\\b/i,\n /\\bno changes? (?:in|to) (?:behaviou?r|functionality|logic|output)\\b/i,\n /\\bpure(?:ly)?[- ]refactor/i,\n /\\bbehaviou?r[- ]preserving\\b/i,\n /\\bnon[- ]functional (?:change|refactor)/i,\n /\\bwithout (?:changing|any change (?:in|to)) (?:behaviou?r|functionality|output)\\b/i,\n /\\bsemantics?[- ]preserving\\b/i,\n];\n\nconst NO_CHANGE_WORDS =\n /\\b(refactor(?:s|ed|ing)?|clean(?:s|ed|ing)?[- ]?up|cleanups?|tidy|tidies|renam(?:e|es|ed|ing)|simplif(?:y|ies|ied|ication)|moderni[sz](?:e|es|ed|ation)|restructur(?:e|es|ed|ing)|reorgani[sz](?:e|es|ed)|extract(?:s|ed)?|perf(?:ormance)?|optimi[sz](?:e|es|ed|ation)|faster|speed[- ]?up|lint|formatting|typos?|dead code)\\b/i;\n\nconst CHANGE_WORDS =\n /\\b(fix(?:es|ed|ing)?|bugs?|regression|crash(?:es|ed)?|errors?|wrong|incorrect(?:ly)?|broken|issues?|feat(?:ure)?s?|add(?:s|ed|ing)?|support(?:s|ed)?|handle(?:s|d)?|allow(?:s|ed)?|reject(?:s|ed)?|correct(?:s|ed|ly)?|prevent(?:s|ed)?|now (?:returns?|throws?|accepts?)|change(?:s|d)? (?:the )?behaviou?r|breaking)\\b/i;\n\nconst PERF_WORDS =\n /\\b(perf(?:ormance)?|faster|speed[- ]?up|optimi[sz](?:e|es|ed|ation)|fast[- ]path|cach(?:e|ing))\\b/i;\n\n/** Generic name parts that say nothing about which function a PR is about. */\nconst STOP_PARTS = new Set([\n 'get',\n 'set',\n 'is',\n 'has',\n 'to',\n 'from',\n 'with',\n 'without',\n 'for',\n 'of',\n 'on',\n 'in',\n 'and',\n 'or',\n 'by',\n 'as',\n 'make',\n 'create',\n 'build',\n 'new',\n 'apply',\n 'use',\n 'run',\n 'do',\n 'can',\n 'should',\n 'parse',\n 'format',\n 'value',\n 'values',\n 'data',\n 'item',\n 'items',\n 'list',\n 'util',\n 'utils',\n 'helper',\n 'helpers',\n 'default',\n 'index',\n 'main',\n 'all',\n 'any',\n 'each',\n 'some',\n 'find',\n 'first',\n 'last',\n 'string',\n 'number',\n 'array',\n 'object',\n]);\n\n/** Split `applyDiscount`, `apply_discount`, `HTTPServer` into lower-case words. */\nexport function nameParts(name: string): string[] {\n return name\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((w) => w.toLowerCase());\n}\n\nexport function analyzeClaim(text: string | null | undefined): ClaimAnalysis {\n const t = (text ?? '').trim();\n const words = new Set((t.toLowerCase().match(/[a-z0-9_$]+/g) ?? []).flatMap((w) => [w, ...nameParts(w)]));\n const identifiers = new Set<string>();\n for (const m of t.matchAll(/`([^`]+)`/g))\n for (const id of m[1]!.match(/[A-Za-z_$][\\w$]*/g) ?? []) identifiers.add(id);\n for (const m of t.matchAll(/\\b[a-z]+[A-Z][A-Za-z0-9]*\\b|\\b[a-z0-9]+_[a-z0-9_]+\\b/g)) identifiers.add(m[0]);\n\n const base = { words, identifiers };\n if (!t) return { intent: 'unknown', ...base };\n const explicit = EXPLICIT_NO_CHANGE.map((re) => re.exec(t)).find(Boolean);\n if (explicit) return { intent: 'no-change', intentEvidence: explicit[0], ...base };\n\n const title = t.split(/\\r?\\n/)[0]!.replace(/^#+\\s*/, '');\n const conventional =\n /^\\s*([a-z]+)(?:\\([^)]*\\))?!?:/i.exec(title) ?? /^\\s*([a-z]+)\\[[^\\]]*\\]:?/i.exec(title);\n const type = conventional?.[1]?.toLowerCase();\n if (type && NO_CHANGE_TYPES.has(type)) return { intent: 'no-change', intentEvidence: `${type}:`, ...base };\n if (type && CHANGE_TYPES.has(type)) {\n // \"fix: faster paths for compare\" is a performance change: perf wording and no change words after the prefix.\n const rest = title.slice(conventional![0].length);\n const perf = PERF_WORDS.exec(rest);\n if (perf && !CHANGE_WORDS.exec(rest)) return { intent: 'no-change', intentEvidence: perf[0], ...base };\n return { intent: 'change', intentEvidence: `${type}:`, ...base };\n }\n\n const change = CHANGE_WORDS.exec(t);\n const noChange = NO_CHANGE_WORDS.exec(t);\n if (noChange && !change) return { intent: 'no-change', intentEvidence: noChange[0], ...base };\n if (change) return { intent: 'change', intentEvidence: change[0], ...base };\n return { intent: 'unknown', ...base };\n}\n\nexport interface RuleTarget {\n exportName: string;\n file: string;\n /** Changed helpers this function uses (from detection, e.g. \"uses changed `toCents`\"). */\n helpers: string[];\n}\n\nexport interface RuleLabel {\n label: 'claimed' | 'unclaimed' | 'behavior-change';\n explanation?: string;\n}\n\nfunction stem(file: string): string {\n return (file.split('/').pop() ?? file).replace(/\\.[^.]+$/, '');\n}\n\n/** Which names of this function (export name, file stem for default exports, helpers) does the claim mention? */\nexport function mentionedNames(target: RuleTarget, a: ClaimAnalysis): string[] {\n const names = [target.exportName === 'default' ? stem(target.file) : target.exportName, ...target.helpers];\n const hits: string[] = [];\n for (const name of names) {\n if (a.identifiers.has(name) || a.words.has(name.toLowerCase())) {\n hits.push(name);\n continue;\n }\n const parts = nameParts(name).filter((p) => p.length >= 5 && !STOP_PARTS.has(p));\n const part = parts.find((p) => a.words.has(p));\n if (part) hits.push(`${name} (\"${part}\")`);\n }\n return hits;\n}\n\n/** Label one function's behavior changes. `others` are all changed functions in the report. */\nexport function ruleLabel(target: RuleTarget, a: ClaimAnalysis, others: RuleTarget[]): RuleLabel {\n if (a.intent === 'no-change') return { label: 'unclaimed' };\n const hits = mentionedNames(target, a);\n if (hits.length > 0) {\n const described = hits.map((h) => {\n const part = / \\(\"(.+)\"\\)$/.exec(h);\n const name = h.replace(/ \\(.*$/, '');\n return part ? `\"${part[1]}\" (\\`${name}\\`)` : `\\`${name}\\``;\n });\n return { label: 'claimed', explanation: `The PR mentions ${described.join(', ')}.` };\n }\n const othersMentioned = others.filter((o) => o !== target && mentionedNames(o, a).length > 0);\n if (othersMentioned.length > 0) {\n return {\n label: 'unclaimed',\n explanation: `The PR mentions ${othersMentioned\n .map((o) => `\\`${o.exportName}\\``)\n .slice(0, 3)\n .join(', ')} but not \\`${target.exportName}\\`.`,\n };\n }\n return { label: 'behavior-change' };\n}\n\n/** Helper names from a detection reason like \"uses changed `toCents` (via wrap)\". */\nexport function helpersFromReason(reason: string | undefined): string[] {\n return [...(reason ?? '').matchAll(/`([^`]+)`/g)].map((m) => m[1]!);\n}\n", "import type { Enc } from '../compare/observed.js';\nimport { FN_TAG, isFnDescriptor, isProtoDescriptor, PROTO_TAG, viewBytes } from '../runner/tags.js';\n\n/**\n * JavaScript source for values, used in reports (copy-pasteable calls) and generated regression tests.\n * Returns undefined when a value cannot be expressed faithfully as a literal.\n */\nconst IDENT = /^[A-Za-z_$][\\w$]*$/;\nconst key = (k: string) => (IDENT.test(k) ? k : JSON.stringify(k));\n\nfunction num(n: number): string {\n if (Number.isNaN(n)) return 'NaN';\n if (n === Infinity) return 'Infinity';\n if (n === -Infinity) return '-Infinity';\n if (Object.is(n, -0)) return '-0';\n return String(n);\n}\n\n/** Code for a generated input value (plain data, Dates, Maps, Sets, callback descriptors). */\nexport function valueToCode(v: unknown): string | undefined {\n const seen = new Set<unknown>();\n const f = (x: unknown): string | undefined => {\n if (isFnDescriptor(x)) {\n const { returns, async } = x[FN_TAG];\n const r = f(returns);\n if (r === undefined) return undefined;\n const body = r.startsWith('{') ? `(${r})` : r;\n return `${async ? 'async ' : ''}() => ${body}`;\n }\n switch (typeof x) {\n case 'undefined':\n return 'undefined';\n case 'number':\n return num(x);\n case 'bigint':\n return `${x}n`;\n case 'string':\n return JSON.stringify(x);\n case 'boolean':\n return String(x);\n case 'symbol':\n case 'function':\n return undefined;\n }\n if (x === null) return 'null';\n if (seen.has(x)) return undefined;\n seen.add(x);\n try {\n if (Array.isArray(x)) {\n const items = x.map(f);\n return items.some((i) => i === undefined) ? undefined : `[${items.join(', ')}]`;\n }\n if (x instanceof Date)\n return Number.isNaN(x.getTime()) ? 'new Date(NaN)' : `new Date(${JSON.stringify(x.toISOString())})`;\n if (x instanceof Map) {\n const entries = [...x].map(([k, val]) => {\n const a = f(k);\n const b = f(val);\n return a === undefined || b === undefined ? undefined : `[${a}, ${b}]`;\n });\n return entries.some((e) => e === undefined) ? undefined : `new Map([${entries.join(', ')}])`;\n }\n if (x instanceof Set) {\n const items = [...x].map(f);\n return items.some((i) => i === undefined) ? undefined : `new Set([${items.join(', ')}])`;\n }\n if (x instanceof RegExp) return String(x);\n if (isProtoDescriptor(x)) {\n const { proto, own } = x[PROTO_TAG];\n const p = f(proto);\n const o = f(own);\n return p === undefined || o === undefined ? undefined : `Object.assign(Object.create(${p}), ${o})`;\n }\n if (x instanceof ArrayBuffer) return `new Uint8Array([${viewBytes(x).join(', ')}]).buffer`;\n if (x instanceof DataView) {\n return `new DataView(new Uint8Array([${viewBytes(new Uint8Array(x.buffer)).join(', ')}]).buffer, ${x.byteOffset}, ${x.byteLength})`;\n }\n if (ArrayBuffer.isView(x) && /^(?:Int|Uint|Float)\\d+(?:Clamped)?Array$/.test(x.constructor.name)) {\n return `new ${x.constructor.name}([${Array.from(x as unknown as ArrayLike<number>).join(', ')}])`;\n }\n const proto = Object.getPrototypeOf(x) as unknown;\n if (proto !== Object.prototype && proto !== null) return undefined;\n const entries = Object.entries(x as Record<string, unknown>).map(([k, val]) => {\n const c = f(val);\n return c === undefined ? undefined : `${key(k)}: ${c}`;\n });\n if (entries.some((e) => e === undefined)) return undefined;\n return entries.length === 0 ? '{}' : `{ ${entries.join(', ')} }`;\n } finally {\n seen.delete(x);\n }\n };\n return f(v);\n}\n\nexport function argsToCode(args: unknown[]): string | undefined {\n const parts = args.map(valueToCode);\n return parts.some((p) => p === undefined) ? undefined : parts.join(', ');\n}\n\n/** Code for an observed (encoded) value; undefined for class instances, functions, cycles, symbols. */\nexport function encToCode(e: Enc): string | undefined {\n const f = (x: Enc): string | undefined => {\n switch (x.t) {\n case 'undefined':\n return 'undefined';\n case 'null':\n return 'null';\n case 'boolean':\n return String(x.v);\n case 'number':\n return num(x.v);\n case 'bigint':\n return `${x.v}n`;\n case 'string':\n return JSON.stringify(x.v);\n case 'array': {\n const items = x.items.map(f);\n return items.some((i) => i === undefined) ? undefined : `[${items.join(', ')}]`;\n }\n case 'object': {\n if (x.ctor !== null) return undefined;\n const entries = x.entries.map(([k, v]) => {\n const c = f(v);\n return c === undefined ? undefined : `${key(k)}: ${c}`;\n });\n if (entries.some((en) => en === undefined)) return undefined;\n return entries.length === 0 ? '{}' : `{ ${entries.join(', ')} }`;\n }\n case 'date':\n return Number.isNaN(x.v)\n ? 'new Date(NaN)'\n : `new Date(${JSON.stringify(new Date(x.v).toISOString())})`;\n case 'map': {\n const entries = x.entries.map(([k, v]) => {\n const a = f(k);\n const b = f(v);\n return a === undefined || b === undefined ? undefined : `[${a}, ${b}]`;\n });\n return entries.some((en) => en === undefined) ? undefined : `new Map([${entries.join(', ')}])`;\n }\n case 'set': {\n const items = x.items.map(f);\n return items.some((i) => i === undefined) ? undefined : `new Set([${items.join(', ')}])`;\n }\n case 'regexp':\n return `/${x.source}/${x.flags}`;\n case 'typed':\n return /^(?:Big)?(?:Int|Uint|Float)\\d+(?:Clamped)?Array$/.test(x.ctor) && !x.ctor.startsWith('Big')\n ? `new ${x.ctor}([${x.items.map(num).join(', ')}])`\n : undefined;\n default:\n return undefined;\n }\n };\n return f(e);\n}\n", "import { z } from 'zod';\n\n/**\n * The stable, machine-readable report (schemaVersion 1). Every renderer (terminal, Markdown, JSON,\n * regression tests) consumes only this model. It is also the artifact that crosses the trust boundary in\n * the GitHub Action, so it is validated with this schema before use.\n */\nexport const SCHEMA_VERSION = 1 as const;\n\nconst MAX_TEXT = 4000;\nconst text = (max = MAX_TEXT) => z.string().max(max);\n\nexport const OutcomeView = z.object({\n kind: z.enum(['return', 'throw', 'timeout', 'crash']),\n async: z.boolean(),\n /** Human-readable rendering, e.g. `1104.99`, `throws RangeError: bad price`, `timeout (>250ms)`. */\n display: text(),\n /** JavaScript expression reproducing a returned value (absent if not expressible). */\n code: text().optional(),\n errorClass: text(200).optional(),\n message: text().optional(),\n});\nexport type OutcomeView = z.infer<typeof OutcomeView>;\n\nexport const Example = z.object({\n /** e.g. `applyDiscount(2000, 0.07)` */\n call: text(),\n /** Arguments as JavaScript source (absent if not expressible). */\n argsCode: text().optional(),\n old: OutcomeView,\n new: OutcomeView,\n /** Present when the difference is in how arguments were mutated. */\n mutation: z\n .object({ argIndex: z.number().int(), old: text(), new: text(), newCode: text().optional() })\n .optional(),\n minimal: z.boolean(),\n});\nexport type Example = z.infer<typeof Example>;\n\nexport const BehaviorLabel = z.enum(['behavior-change', 'claimed', 'unclaimed', 'suspicious']);\nexport type BehaviorLabel = z.infer<typeof BehaviorLabel>;\n\nexport const Behavior = z.object({\n /** Stable id within the report, e.g. `src/pricing.ts#applyDiscount/1`. */\n id: text(600),\n key: text(),\n title: text(),\n label: BehaviorLabel,\n /** Where the label came from: no claim analysis, the deterministic refactor rule, or an LLM. */\n labelSource: z.enum(['none', 'rules', 'llm']),\n explanation: text(1000).optional(),\n /**\n * How realistic the inputs are: seen (values from tests/call sites), ordinary, unusual (outside what tests and\n * call sites use), edge (NaN, Infinity, -0, lone surrogates, \u2026). Edge-only behaviors are listed separately.\n */\n realism: z.enum(['seen', 'ordinary', 'unusual', 'edge']),\n realismNote: text(300).optional(),\n count: z.number().int().nonnegative(),\n variants: z.array(z.object({ transition: text(), features: z.array(text(200)), count: z.number().int() })),\n examples: z.array(Example),\n});\nexport type Behavior = z.infer<typeof Behavior>;\n\nexport const FunctionStatus = z.enum(['changed', 'unchanged', 'skipped', 'nondeterministic']);\n\nexport const FunctionReport = z.object({\n id: text(600),\n file: text(500),\n exportName: text(200),\n signature: text().optional(),\n status: FunctionStatus,\n reason: text().optional(),\n /** Why the function was analyzed: \"code changed\", \"uses changed `toCents`\", \u2026 */\n targetReason: text().optional(),\n inputsRun: z.number().int().nonnegative(),\n stoppedBy: z.enum(['runs', 'deadline', 'failures', 'exhausted']).optional(),\n failures: z.number().int().nonnegative(),\n durationMs: z.number().nonnegative(),\n seed: z.number().int(),\n usage: z\n .object({ files: z.number().int(), callSites: z.number().int(), values: z.number().int() })\n .optional(),\n guards: z.array(text(300)).optional(),\n /** Inputs suggested by the optional LLM step that passed type validation. */\n llmInputs: z.number().int().nonnegative().optional(),\n behaviors: z.array(Behavior),\n nondeterministic: z\n .object({ side: z.enum(['base', 'head']), call: text(), first: text(), second: text() })\n .optional(),\n});\nexport type FunctionReport = z.infer<typeof FunctionReport>;\n\nexport const Listed = z.object({\n id: text(600),\n file: text(500),\n exportName: text(200),\n kind: text(100),\n reason: text().optional(),\n});\nexport type Listed = z.infer<typeof Listed>;\n\nexport const Report = z.object({\n schemaVersion: z.literal(SCHEMA_VERSION),\n tool: z.object({ name: z.literal('doppeldiff'), version: text(50) }),\n base: z.object({ ref: text(300), sha: text(64) }),\n head: z.object({ ref: text(300), sha: text(64).nullable() }),\n claim: z.object({\n source: z.enum(['pr', 'flag', 'none']),\n text: text(20_000).nullable(),\n /** The claim asserts no behavior change (refactor mode): every behavior change is unclaimed. */\n refactor: z.boolean(),\n /** Claim matching by an LLM was performed (labels are \"claimed\"/\"unclaimed\"/\"suspicious\"). */\n llm: z.object({ provider: text(50), model: text(100) }).nullable(),\n }),\n settings: z.object({\n seed: z.number().int(),\n runs: z.number().int(),\n timeoutMs: z.number().int(),\n timeBudgetMs: z.number().int().nullable(),\n freeze: z.boolean(),\n }),\n summary: z.object({\n /** `no-change` can still come with edge-case-only behaviors (see edgeCaseBehaviors). */\n verdict: z.enum(['no-change', 'changes', 'unclaimed']),\n functions: z.number().int(),\n changed: z.number().int(),\n unchanged: z.number().int(),\n skipped: z.number().int(),\n nondeterministic: z.number().int(),\n /** Behavior changes on realistic or unusual inputs (edge-case-only ones excluded). */\n behaviors: z.number().int(),\n /** Behavior changes that only occur on edge-case inputs. */\n edgeCaseBehaviors: z.number().int(),\n /** Unclaimed/suspicious behaviors (edge-case-only ones excluded). */\n unclaimed: z.number().int(),\n /** Unclaimed/suspicious behaviors on seen or ordinary inputs: what `--fail-on unclaimed` counts. */\n unclaimedRealistic: z.number().int(),\n inputsRun: z.number().int(),\n durationMs: z.number(),\n }),\n functions: z.array(FunctionReport),\n skipped: z.array(Listed),\n added: z.array(Listed),\n removed: z.array(Listed),\n identical: z.array(Listed),\n errors: z.array(z.object({ file: text(500), message: text() })),\n regressionTests: z\n .object({ framework: z.enum(['vitest', 'jest']), files: z.array(text(500)), cases: z.number().int() })\n .nullable(),\n timing: z.object({\n totalMs: z.number(),\n materializeMs: z.number(),\n dependenciesMs: z.number(),\n detectMs: z.number(),\n verifyMs: z.number(),\n }),\n});\nexport type Report = z.infer<typeof Report>;\n\n/** JSON Schema of the report, published as schema/report.schema.json. */\nexport function reportJsonSchema(): unknown {\n return z.toJSONSchema(Report);\n}\n", "import type { Outcome } from '../compare/observed.js';\nimport type { Witness } from '../explore/explore.js';\nimport { formatArgs, formatEnc, formatOutcome } from '../format/format.js';\nimport type { RunResult } from '../run.js';\nimport type { FunctionResult } from '../verify/verifyFunction.js';\nimport { groupBehaviors } from './behaviors.js';\nimport { REALISM_NAMES } from '../explore/realism.js';\nimport { analyzeClaim, helpersFromReason, ruleLabel, type RuleLabel } from '../claims/rules.js';\nimport { argsToCode, encToCode } from './codegen.js';\nimport {\n SCHEMA_VERSION,\n type Behavior,\n type Example,\n type FunctionReport,\n type OutcomeView,\n type Report,\n} from './model.js';\n\nexport interface ClaimInput {\n text: string | null;\n source: 'pr' | 'flag' | 'none';\n /** Force refactor mode (assert no behavior change), e.g. `--refactor` or the MCP verify_refactor tool. */\n refactor?: boolean;\n}\n\n/**\n * True when the claim says the change should not alter behavior (see the rules in ../claims/rules.ts):\n * explicit phrases, refactor-type conventional commits, or refactor-style wording without change words.\n */\nexport function isRefactorClaim(text: string | null | undefined): boolean {\n return analyzeClaim(text).intent === 'no-change';\n}\n\n/**\n * Label every behavior from the claim with the deterministic rules (no LLM). Mutates and returns the report.\n * `forceRefactor` comes from --refactor / verify_refactor.\n */\nexport function applyRuleLabels(report: Report, forceRefactor = false): Report {\n const a = analyzeClaim(report.claim.text);\n const refactor = forceRefactor || a.intent === 'no-change';\n report.claim.refactor = refactor;\n const targets = new Map(\n report.functions\n .filter((f) => f.behaviors.length > 0)\n .map(\n (f) =>\n [\n f,\n { exportName: f.exportName, file: f.file, helpers: helpersFromReason(f.targetReason) },\n ] as const,\n ),\n );\n const all = [...targets.values()];\n for (const [f, target] of targets) {\n const r: RuleLabel = refactor\n ? { label: 'unclaimed' }\n : report.claim.text\n ? ruleLabel(target, a, all)\n : { label: 'behavior-change' };\n for (const b of f.behaviors) {\n b.label = r.label;\n b.labelSource = r.label === 'behavior-change' ? 'none' : 'rules';\n if (r.explanation) b.explanation = r.explanation;\n else delete b.explanation;\n }\n }\n report.summary = summarize(report.functions, report.skipped.length, report.summary.durationMs);\n return report;\n}\n\nconst MAX_DISPLAY = 300;\n\nexport function outcomeView(o: Outcome): OutcomeView {\n switch (o.kind) {\n case 'return': {\n const code = encToCode(o.value);\n return {\n kind: 'return',\n async: o.async,\n display: formatOutcome(o, MAX_DISPLAY),\n ...(code !== undefined && code.length < 4000 ? { code } : {}),\n };\n }\n case 'throw': {\n const e = o.error;\n return {\n kind: 'throw',\n async: o.async,\n display: formatOutcome(o, MAX_DISPLAY),\n ...(e.t === 'error' ? { errorClass: e.ctor.slice(0, 200), message: e.message.slice(0, 4000) } : {}),\n };\n }\n default:\n return { kind: o.kind, async: false, display: formatOutcome(o, MAX_DISPLAY) };\n }\n}\n\nexport function exampleFrom(exportName: string, w: Witness): Example {\n const argsCode = argsToCode(w.input);\n const ex: Example = {\n call: `${exportName}(${formatArgs(w.input, MAX_DISPLAY)})`.slice(0, 4000),\n ...(argsCode !== undefined && argsCode.length < 4000 ? { argsCode } : {}),\n old: outcomeView(w.base),\n new: outcomeView(w.head),\n minimal: w.minimal,\n };\n if (\n w.diff.aspect === 'mutation' &&\n (w.base.kind === 'return' || w.base.kind === 'throw') &&\n (w.head.kind === 'return' || w.head.kind === 'throw')\n ) {\n const i = Number(w.diff.path[0]);\n const a = w.base.args[i];\n const b = w.head.args[i];\n if (a && b) {\n const newCode = encToCode(b);\n ex.mutation = {\n argIndex: i,\n old: formatEnc(a, MAX_DISPLAY),\n new: formatEnc(b, MAX_DISPLAY),\n ...(newCode !== undefined && newCode.length < 4000 ? { newCode } : {}),\n };\n }\n }\n return ex;\n}\n\nfunction functionReport(f: FunctionResult): FunctionReport {\n const behaviors: Behavior[] = groupBehaviors(f.clusters).map((b, i) => ({\n id: `${f.id}/${i + 1}`,\n key: b.key,\n title: b.title,\n realism: REALISM_NAMES[b.realism.tier],\n ...(b.realism.tier < 2 && b.realism.reason ? { realismNote: b.realism.reason } : {}),\n label: 'behavior-change',\n labelSource: 'none',\n count: b.count,\n variants: b.variants,\n examples: b.examples.map((w) => exampleFrom(f.exportName, w)),\n }));\n const nd = f.nondeterministic;\n return {\n id: f.id,\n file: f.file,\n exportName: f.exportName,\n ...(f.signature ? { signature: f.signature } : {}),\n status: f.status,\n ...(f.reason ? { reason: f.reason } : {}),\n ...(f.targetReason ? { targetReason: f.targetReason } : {}),\n inputsRun: f.inputsRun,\n ...(f.stoppedBy ? { stoppedBy: f.stoppedBy } : {}),\n failures: f.failures,\n durationMs: f.durationMs,\n seed: f.seed,\n ...(f.usage ? { usage: f.usage } : {}),\n ...(f.guards ? { guards: f.guards.map((g) => g.slice(0, 300)) } : {}),\n ...(f.llmInputs !== undefined ? { llmInputs: f.llmInputs } : {}),\n behaviors,\n ...(nd\n ? {\n nondeterministic: {\n side: nd.side,\n call: `${f.exportName}(${formatArgs(nd.input, MAX_DISPLAY)})`,\n first: formatOutcome(nd.first, MAX_DISPLAY),\n second: formatOutcome(nd.second, MAX_DISPLAY),\n },\n }\n : {}),\n };\n}\n\nexport function summarize(\n functions: FunctionReport[],\n skippedListed: number,\n durationMs: number,\n): Report['summary'] {\n const all = functions.flatMap((f) => f.behaviors);\n const behaviors = all.filter((b) => b.realism !== 'edge');\n const isUnclaimed = (b: Behavior) => b.label === 'unclaimed' || b.label === 'suspicious';\n const unclaimed = behaviors.filter(isUnclaimed).length;\n const unclaimedRealistic = behaviors.filter(\n (b) => isUnclaimed(b) && (b.realism === 'seen' || b.realism === 'ordinary'),\n ).length;\n return {\n verdict: behaviors.length === 0 ? 'no-change' : unclaimed > 0 ? 'unclaimed' : 'changes',\n functions: functions.length,\n changed: functions.filter((f) => f.status === 'changed').length,\n unchanged: functions.filter((f) => f.status === 'unchanged').length,\n skipped: functions.filter((f) => f.status === 'skipped').length + skippedListed,\n nondeterministic: functions.filter((f) => f.status === 'nondeterministic').length,\n behaviors: behaviors.length,\n edgeCaseBehaviors: all.length - behaviors.length,\n unclaimed,\n unclaimedRealistic,\n inputsRun: functions.reduce((s, f) => s + f.inputsRun, 0),\n durationMs,\n };\n}\n\nexport function buildReport(run: RunResult, claim: ClaimInput = { text: null, source: 'none' }): Report {\n const functions = run.functions.map((f) => functionReport(f));\n const report: Report = {\n schemaVersion: SCHEMA_VERSION,\n tool: run.tool,\n base: run.base,\n head: run.head,\n claim: { source: claim.source, text: claim.text, refactor: false, llm: null },\n settings: { seed: run.seed, ...run.settings },\n summary: summarize(functions, run.skipped.length, run.timing.totalMs),\n functions,\n skipped: run.skipped,\n added: run.added,\n removed: run.removed,\n identical: run.identical,\n errors: run.errors,\n regressionTests: null,\n timing: run.timing,\n };\n return applyRuleLabels(report, claim.refactor ?? false);\n}\n\n/**\n * Re-derive claim fields and deterministic labels for a report from a (trusted) claim text, discarding any\n * labels it carried. Used by the GitHub Action's trusted job on the report produced by the untrusted job.\n */\nexport function relabel(report: Report, claim: ClaimInput): Report {\n const out: Report = structuredClone(report);\n out.claim = { source: claim.source, text: claim.text, refactor: false, llm: null };\n for (const f of out.functions) for (const b of f.behaviors) delete b.explanation;\n return applyRuleLabels(out, claim.refactor ?? false);\n}\n", "import type { Behavior, BehaviorLabel, FunctionReport, Report } from './model.js';\n\nexport const STICKY_MARKER = '<!-- doppeldiff:sticky -->';\nconst GITHUB_LIMIT = 60_000;\nconst PROJECT_URL = 'https://github.com/7suheel/doppeldiff';\n\n/** Escape untrusted text for Markdown prose: HTML, mentions, and Markdown control characters. */\nexport function escapeText(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/@/g, '@\u200B')\n .replace(/([\\\\`*_[\\]#|~])/g, '\\\\$1')\n .replace(/\\r?\\n/g, ' ');\n}\n\n/** Inline code span that survives backticks and table pipes. */\nexport function code(s: string, max = 160): string {\n let v = s.replace(/\\r?\\n/g, '\u21B5');\n if (v.length > max) v = `${v.slice(0, max - 1)}\u2026`;\n v = v.replace(/\\|/g, '\\\\|');\n const ticks = (v.match(/`+/g) ?? []).reduce((m, t) => Math.max(m, t.length), 0);\n const fence = '`'.repeat(ticks + 1);\n const pad = v.startsWith('`') || v.endsWith('`') || v.startsWith(' ') ? ' ' : '';\n return `${fence}${pad}${v}${pad}${fence}`;\n}\n\nconst n = (x: number) => x.toLocaleString('en-US');\n\nfunction duration(ms: number): string {\n return ms < 1000\n ? `${ms}ms`\n : ms < 60_000\n ? `${(ms / 1000).toFixed(1)}s`\n : `${Math.floor(ms / 60_000)}m ${Math.round((ms % 60_000) / 1000)}s`;\n}\n\nconst SECTIONS: { label: BehaviorLabel; heading: string }[] = [\n { label: 'unclaimed', heading: '\u26A0\uFE0F Unclaimed behavior change' },\n { label: 'suspicious', heading: '\u2753 Suspicious behavior change' },\n { label: 'claimed', heading: '\u2705 Claimed change verified' },\n { label: 'behavior-change', heading: '\uD83D\uDD0D Behavior change' },\n];\n\nfunction behaviorBlock(f: FunctionReport, b: Behavior, maxExamples: number): string {\n const lines: string[] = [];\n const region = f.inputsRun > 0 ? ` \u00B7 ${n(b.count)} of ${n(f.inputsRun)} inputs` : '';\n lines.push(`**${code(f.exportName, 80)}** in ${code(f.file, 120)}: ${escapeText(b.title)}${region}`);\n if (b.explanation) lines.push(`<br>${b.labelSource === 'llm' ? '\uD83E\uDD16 ' : ''}${escapeText(b.explanation)}`);\n if (b.realism === 'unusual') {\n lines.push(\n `<br>\u2139\uFE0F Only on inputs unlike those in the project's tests and call sites: ${escapeText(b.realismNote ?? 'unusual values')}.`,\n );\n }\n lines.push('');\n const examples = b.examples.slice(0, maxExamples);\n const hasMutation = examples.some((e) => e.mutation);\n lines.push(hasMutation ? '| Call | Old | New | Argument after call (old \u2192 new) |' : '| Call | Old | New |');\n lines.push(hasMutation ? '| --- | --- | --- | --- |' : '| --- | --- | --- |');\n for (const e of examples) {\n const cells = [code(e.call), code(e.old.display, 100), code(e.new.display, 100)];\n if (hasMutation)\n cells.push(e.mutation ? `${code(e.mutation.old, 60)} \u2192 ${code(e.mutation.new, 60)}` : '');\n lines.push(`| ${cells.join(' | ')} |`);\n }\n return lines.join('\\n');\n}\n\nfunction claimLine(r: Report): string | undefined {\n if (!r.claim.text) return undefined;\n const firstLine = r.claim.text\n .trim()\n .split(/\\r?\\n/)[0]!\n .replace(/^#+\\s*/, '');\n return `**PR claims:** \u201C${escapeText(firstLine.slice(0, 200))}\u201D${r.claim.refactor ? ' (no behavior change)' : ''}`;\n}\n\nexport interface MarkdownOptions {\n maxExamples?: number;\n /** Include the hidden sticky-comment marker (GitHub Action). */\n sticky?: boolean;\n}\n\nexport function renderMarkdown(r: Report, options: MarkdownOptions = {}): string {\n const out = render(r, options.maxExamples ?? 3, options.sticky ?? false);\n if (out.length <= GITHUB_LIMIT) return out;\n const shorter = render(r, 1, options.sticky ?? false);\n if (shorter.length <= GITHUB_LIMIT) return shorter;\n const cut = shorter.slice(0, GITHUB_LIMIT - 400);\n return `${cut.slice(0, cut.lastIndexOf('\\n'))}\\n\\n_Report truncated. The full report is in the JSON artifact._\\n${options.sticky ? STICKY_MARKER : ''}`;\n}\n\nfunction render(r: Report, maxExamples: number, sticky: boolean): string {\n const lines: string[] = [];\n lines.push('## \uD83D\uDD2C doppeldiff: behavioral diff');\n const claim = claimLine(r);\n if (claim) lines.push('', claim);\n\n const s = r.summary;\n lines.push('');\n if (s.functions === 0) {\n lines.push(\n r.skipped.length + r.added.length + r.removed.length > 0\n ? '> No existing exported function with changed behavior to compare.'\n : '> No changed exported functions found.',\n );\n } else if (s.behaviors === 0 && s.edgeCaseBehaviors === 0) {\n lines.push(\n `> \u2705 **No behavior change** detected in ${n(s.unchanged)} function${s.unchanged === 1 ? '' : 's'} across ${n(s.inputsRun)} generated inputs.`,\n );\n } else if (s.behaviors === 0) {\n lines.push(\n `> \u2705 **No behavior change on realistic inputs** across ${n(s.inputsRun)} generated inputs; ${s.edgeCaseBehaviors} difference${s.edgeCaseBehaviors === 1 ? '' : 's'} only on edge-case inputs (below).`,\n );\n } else {\n const all = r.functions.flatMap((f) => f.behaviors).filter((b) => b.realism !== 'edge');\n const realistic = all.filter((b) => b.realism === 'seen' || b.realism === 'ordinary').length;\n const unusual = all.length - realistic;\n const plural = (k: number, w: string) => `${k} ${w}${k === 1 ? '' : 's'}`;\n const parts: string[] = [];\n if (realistic > 0) {\n parts.push(`**${plural(realistic, 'behavior change')}** on realistic inputs`);\n if (s.unclaimedRealistic > 0)\n parts.push(`**${s.unclaimedRealistic} not covered by the PR description**`);\n if (unusual > 0) parts.push(`${unusual} more only on unusual inputs`);\n } else {\n parts.push(\n `${plural(unusual, 'behavior change')} only on unusual inputs${s.unclaimed > 0 ? ` (${s.unclaimed} not covered by the PR description)` : ''}`,\n );\n }\n if (s.edgeCaseBehaviors > 0) parts.push(`${s.edgeCaseBehaviors} only on edge-case inputs`);\n const icon = s.unclaimedRealistic > 0 ? '\u26A0\uFE0F' : realistic > 0 ? '\uD83D\uDD0D' : '\u2139\uFE0F';\n lines.push(`> ${icon} ${parts.join(', ')}.`);\n }\n\n const rank = { seen: 0, ordinary: 1, unusual: 2, edge: 3 } as const;\n for (const sec of SECTIONS) {\n const items = r.functions\n .flatMap((f) =>\n f.behaviors.filter((b) => b.label === sec.label && b.realism !== 'edge').map((b) => ({ f, b })),\n )\n .sort((x, y) => rank[x.b.realism] - rank[y.b.realism]);\n if (items.length === 0) continue;\n lines.push(\n '',\n `### ${sec.heading}`,\n '',\n items.map(({ f, b }) => behaviorBlock(f, b, maxExamples)).join('\\n\\n'),\n );\n }\n\n const edge = r.functions.flatMap((f) =>\n f.behaviors.filter((b) => b.realism === 'edge').map((b) => ({ f, b })),\n );\n if (edge.length > 0) {\n const reasons = [...new Set(edge.map(({ b }) => b.realismNote).filter(Boolean))].slice(0, 4).join(', ');\n const tag: Record<string, string> = {\n unclaimed: '\u26A0\uFE0F unclaimed: ',\n suspicious: '\u2753 suspicious: ',\n claimed: '\u2705 claimed: ',\n 'behavior-change': '',\n };\n lines.push(\n '',\n `<details><summary>\uD83E\uDDEA ${edge.length} behavior change${edge.length === 1 ? '' : 's'} only on edge-case inputs${reasons ? ` (${escapeText(reasons)})` : ''}</summary>`,\n '',\n edge.map(({ f, b }) => `${tag[b.label] ?? ''}${behaviorBlock(f, b, maxExamples)}`).join('\\n\\n'),\n '',\n '</details>',\n );\n }\n\n const unchanged = r.functions.filter((f) => f.status === 'unchanged');\n if (unchanged.length > 0) {\n lines.push('', '### \u2705 No behavior change', '');\n lines.push(\n unchanged\n .map(\n (f) =>\n `${code(f.exportName, 80)} (${n(f.inputsRun)} inputs${f.stoppedBy === 'failures' ? ', stopped early after repeated timeouts' : ''})`,\n )\n .join(' \u00B7 '),\n );\n }\n\n const notVerified = [\n ...r.functions\n .filter((f) => f.status === 'skipped' || f.status === 'nondeterministic')\n .map((f) => ({ name: f.exportName, file: f.file, reason: f.reason ?? f.status })),\n ...r.skipped.map((x) => ({ name: x.exportName, file: x.file, reason: x.reason ?? x.kind })),\n ];\n if (notVerified.length > 0) {\n lines.push('', '### \u23ED\uFE0F Not verified', '');\n for (const x of notVerified)\n lines.push(`- ${code(x.name, 80)} in ${code(x.file, 120)}: ${escapeText(x.reason)}`);\n }\n\n const extras: string[] = [];\n if (r.added.length) extras.push(`**Added:** ${r.added.map((a) => code(a.exportName, 60)).join(', ')}`);\n if (r.removed.length)\n extras.push(`**Removed:** ${r.removed.map((a) => code(a.exportName, 60)).join(', ')}`);\n if (r.identical.length)\n extras.push(\n `**Only comments/formatting changed:** ${r.identical.map((a) => code(a.exportName, 60)).join(', ')}`,\n );\n if (r.errors.length)\n extras.push(\n `**Could not analyze:** ${r.errors.map((e) => `${code(e.file, 120)} (${escapeText(e.message.slice(0, 200))})`).join(', ')}`,\n );\n if (extras.length) {\n const counts = [\n r.added.length ? `${r.added.length} added` : '',\n r.removed.length ? `${r.removed.length} removed` : '',\n r.identical.length ? `${r.identical.length} formatting-only` : '',\n r.errors.length ? `${r.errors.length} not analyzable` : '',\n ].filter(Boolean);\n lines.push(\n '',\n `<details><summary>${counts.join(' \u00B7 ')}</summary>`,\n '',\n extras.join('<br>\\n'),\n '',\n '</details>',\n );\n }\n\n if (r.regressionTests && r.regressionTests.files.length > 0) {\n lines.push(\n '',\n `\uD83D\uDCCE Regression tests (${r.regressionTests.cases} cases): ${r.regressionTests.files.map((f) => code(f, 200)).join(', ')}`,\n );\n }\n\n const footer = [\n `${n(s.inputsRun)} inputs`,\n `${s.functions} function${s.functions === 1 ? '' : 's'}`,\n duration(Math.round(s.durationMs)),\n `seed ${r.settings.seed}`,\n `${r.base.sha.slice(0, 7)} \u2192 ${r.head.sha ? r.head.sha.slice(0, 7) : 'working tree'}`,\n `[doppeldiff](${PROJECT_URL}) v${r.tool.version}`,\n ];\n lines.push('', `<sub>${footer.join(' \u00B7 ')}</sub>`);\n if (r.claim.llm && s.behaviors > 0) {\n lines.push(\n `<sub>\uD83E\uDD16 Claimed/unclaimed labels and explanations by ${escapeText(r.claim.llm.model)}, checked against the observed examples. The examples themselves come from running the code.</sub>`,\n );\n } else if (s.behaviors > 0) {\n const labeled = r.functions.some((f) => f.behaviors.some((b) => b.labelSource === 'rules'));\n lines.push(\n labeled\n ? `<sub>Claimed/unclaimed labels come from the PR text via [deterministic rules](${PROJECT_URL}/blob/main/docs/CLAIMS.md) (no LLM, no API key).</sub>`\n : `<sub>Not matched against the PR description: name the functions you meant to change, or say \"no behavior change\" for a refactor ([rules](${PROJECT_URL}/blob/main/docs/CLAIMS.md)).</sub>`,\n );\n }\n if (sticky) lines.push(STICKY_MARKER);\n return lines.join('\\n') + '\\n';\n}\n", "import pc from 'picocolors';\nimport { groupBehaviors } from './behaviors.js';\nimport type { RunEvent } from '../run.js';\nimport type { Behavior, FunctionReport, Report } from './model.js';\n\nconst n = (x: number) => x.toLocaleString('en-US');\nconst secs = (ms: number) => (ms < 1000 ? `${Math.round(ms)}ms` : `${(ms / 1000).toFixed(1)}s`);\n\nconst LABEL: Record<Behavior['label'], (s: string) => string> = {\n unclaimed: (s) => pc.yellow(`\u26A0 unclaimed ${s}`),\n suspicious: (s) => pc.magenta(`? suspicious ${s}`),\n claimed: (s) => pc.green(`\u2713 claimed ${s}`),\n 'behavior-change': (s) => pc.cyan(`\u25CF changed ${s}`),\n};\n\nfunction clip(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}\u2026`;\n}\n\n/** Live progress lines for a run (written to stderr by the CLI). */\nexport function progressPrinter(write: (line: string) => void): (e: RunEvent) => void {\n return (e) => {\n switch (e.type) {\n case 'phase':\n if (e.phase === 'detect') write(pc.dim(' detecting changed functions\u2026'));\n break;\n case 'detected': {\n const d = e.detection;\n write(\n pc.dim(\n ` ${d.targets.length} function${d.targets.length === 1 ? '' : 's'} to verify in ${d.files.length} changed file${d.files.length === 1 ? '' : 's'}` +\n (d.skipped.length ? `, ${d.skipped.length} not verifiable` : ''),\n ),\n );\n break;\n }\n case 'function-done': {\n const r = e.result;\n const name = `${pc.bold(r.exportName)} ${pc.dim(r.file)}`;\n const meta = pc.dim(`${n(r.inputsRun)} inputs \u00B7 ${secs(r.durationMs)}`);\n const nb = groupBehaviors(r.clusters).length;\n if (r.status === 'changed')\n write(` ${pc.yellow('\u2260')} ${name} ${nb} behavior change${nb === 1 ? '' : 's'} ${meta}`);\n else if (r.status === 'unchanged') write(` ${pc.green('=')} ${name} no behavior change ${meta}`);\n else if (r.status === 'nondeterministic')\n write(` ${pc.magenta('~')} ${name} nondeterministic ${pc.dim(r.reason ?? '')}`);\n else write(` ${pc.dim('-')} ${name} ${pc.dim(`skipped: ${r.reason ?? ''}`)}`);\n break;\n }\n default:\n break;\n }\n };\n}\n\nfunction behaviorLines(f: FunctionReport, b: Behavior, width: number): string[] {\n const lines = [\n ` ${LABEL[b.label](pc.bold(b.title))} ${pc.dim(`(${n(b.count)} of ${n(f.inputsRun)} inputs)`)}`,\n ];\n if (b.explanation) lines.push(` ${pc.dim(clip(b.explanation, width - 6))}`);\n if (b.realism === 'unusual')\n lines.push(` ${pc.dim(clip(`only on unusual inputs: ${b.realismNote ?? ''}`, width - 6))}`);\n for (const ex of b.examples) {\n lines.push(` ${clip(ex.call, width - 6)}`);\n lines.push(` ${pc.dim('old:')} ${clip(ex.old.display, width - 14)}`);\n lines.push(` ${pc.dim('new:')} ${clip(ex.new.display, width - 14)}`);\n if (ex.mutation)\n lines.push(\n ` ${pc.dim(`arg ${ex.mutation.argIndex + 1} after call:`)} ${clip(`${ex.mutation.old} \u2192 ${ex.mutation.new}`, width - 30)}`,\n );\n }\n return lines;\n}\n\n/** Final human-readable report. */\nexport function renderTerminal(r: Report, width = Math.min(process.stdout.columns ?? 100, 120)): string {\n const out: string[] = [''];\n if (r.claim.text)\n out.push(\n `${pc.dim('Claim:')} ${clip(\n r.claim.text\n .trim()\n .split('\\n')[0]!\n .replace(/^#+\\s*/, ''),\n width - 8,\n )}${r.claim.refactor ? pc.dim(' (no behavior change)') : ''}`,\n '',\n );\n\n for (const f of r.functions.filter((x) => x.behaviors.length > 0)) {\n out.push(\n ` ${pc.bold(f.exportName)} ${pc.dim(f.file)}${f.targetReason && f.targetReason !== 'code changed' ? pc.dim(` (${f.targetReason})`) : ''}`,\n );\n for (const b of f.behaviors.filter((x) => x.realism !== 'edge')) out.push(...behaviorLines(f, b, width));\n const edge = f.behaviors.filter((x) => x.realism === 'edge');\n if (edge.length > 0) {\n out.push(\n ` ${pc.dim(\n `edge-case inputs only (${edge\n .map((b) => b.realismNote)\n .filter(Boolean)\n .join(', ')}):`,\n )}`,\n );\n for (const b of edge) out.push(...behaviorLines(f, b, width).map((l) => pc.dim(l)));\n }\n out.push('');\n }\n\n const unchanged = r.functions.filter((f) => f.status === 'unchanged');\n if (unchanged.length) {\n out.push(\n ` ${pc.green('\u2713 no behavior change:')} ${unchanged.map((f) => `${f.exportName} ${pc.dim(`(${n(f.inputsRun)})`)}`).join(', ')}`,\n );\n }\n const skipped = [\n ...r.functions\n .filter((f) => f.status === 'skipped' || f.status === 'nondeterministic')\n .map((f) => `${f.exportName}: ${f.reason ?? f.status}`),\n ...r.skipped.map((s) => `${s.exportName}: ${s.reason ?? s.kind}`),\n ];\n if (skipped.length) {\n out.push(` ${pc.dim('\u2013 not verified:')}`);\n for (const s of skipped) out.push(` ${pc.dim(clip(s, width - 6))}`);\n }\n if (r.added.length) out.push(` ${pc.dim('+ added:')} ${r.added.map((a) => a.exportName).join(', ')}`);\n if (r.removed.length)\n out.push(` ${pc.dim('- removed:')} ${r.removed.map((a) => a.exportName).join(', ')}`);\n if (r.identical.length)\n out.push(` ${pc.dim('\u00B7 formatting only:')} ${r.identical.map((a) => a.exportName).join(', ')}`);\n if (r.regressionTests?.files.length)\n out.push(` ${pc.dim('\uD83D\uDCCE regression tests:')} ${r.regressionTests.files.join(', ')}`);\n\n const s = r.summary;\n const verdict =\n s.functions === 0\n ? pc.dim('no changed exported functions to compare')\n : s.verdict === 'no-change'\n ? pc.green(pc.bold('no behavior change'))\n : s.verdict === 'unclaimed'\n ? pc.yellow(\n pc.bold(\n `${s.behaviors} behavior change${s.behaviors === 1 ? '' : 's'}, ${s.unclaimed} unclaimed`,\n ),\n )\n : pc.cyan(pc.bold(`${s.behaviors} behavior change${s.behaviors === 1 ? '' : 's'}`));\n const edgeNote =\n s.edgeCaseBehaviors > 0 ? pc.dim(` (+${s.edgeCaseBehaviors} on edge-case inputs only)`) : '';\n out.push('');\n out.push(\n ` ${verdict}${edgeNote} ${pc.dim(`${n(s.inputsRun)} inputs \u00B7 ${s.functions} function${s.functions === 1 ? '' : 's'} \u00B7 ${secs(s.durationMs)} \u00B7 seed ${r.settings.seed}`)}`,\n );\n out.push('');\n return out.join('\\n');\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, extname, join, posix } from 'node:path';\nimport { DEFAULT_NOW, packageRootOf } from '../verify/session.js';\nimport type { Behavior, Example, FunctionReport, Report } from './model.js';\n\nexport type Framework = 'vitest' | 'jest';\n\nexport interface TestgenOptions {\n /** Root of the head version (the working copy): files are written here. */\n root: string;\n /** Output directory relative to `root` (default `tests/doppeldiff`). */\n outDir?: string;\n framework?: Framework | 'auto';\n /** Write files (default true). When false, only returns them. */\n write?: boolean;\n}\n\nexport interface GeneratedFile {\n path: string;\n content: string;\n cases: number;\n}\n\nconst BUILTIN_ERRORS = new Set([\n 'Error',\n 'TypeError',\n 'RangeError',\n 'SyntaxError',\n 'ReferenceError',\n 'EvalError',\n 'URIError',\n 'AggregateError',\n]);\nconst PRIMITIVE_CODE = /^(?:-?\\d|-?Infinity|undefined|null|true|false|\"|-?\\d+n$)/;\n\n/** Pick the test framework from the nearest package.json (vitest wins if both are present). */\nexport function detectFramework(root: string, file: string): Framework {\n for (const dir of [packageRootOf(root, join(root, file)), root]) {\n const pkgPath = join(dir, 'package.json');\n if (!existsSync(pkgPath)) continue;\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<\n string,\n Record<string, string> | undefined\n >;\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps.vitest) return 'vitest';\n if (deps.jest) return 'jest';\n } catch {\n /* ignore */\n }\n }\n return 'vitest';\n}\n\nfunction importPath(fromFile: string, sourceFile: string): string {\n let rel = posix.relative(posix.dirname(fromFile), sourceFile);\n if (!rel.startsWith('.')) rel = `./${rel}`;\n const ext = extname(rel);\n // TypeScript sources are imported without extension (resolved by the test runner); JS keeps its extension.\n if (['.ts', '.tsx', '.mts', '.cts'].includes(ext)) rel = rel.slice(0, -ext.length);\n return rel;\n}\n\nfunction comment(s: string): string {\n return s.replace(/\\*\\//g, '*\\\\/').replace(/\\r?\\n/g, ' ');\n}\n\nfunction title(s: string): string {\n return JSON.stringify(s.length > 120 ? `${s.slice(0, 119)}\u2026` : s);\n}\n\n/** Assertion source for one example, or a reason it cannot be pinned. */\nfunction assertion(local: string, ex: Example): { code: string } | { skip: string } {\n if (ex.argsCode === undefined) return { skip: 'arguments cannot be written as code' };\n const call = `${local}(${ex.argsCode})`;\n const out = ex.new;\n if (ex.mutation) {\n if (ex.mutation.newCode === undefined) return { skip: 'mutated argument cannot be written as code' };\n return {\n code: [\n `const args = [${ex.argsCode}] as const;`,\n out.kind === 'throw'\n ? `try { ${out.async ? 'await ' : ''}${local}(...(args as unknown as Parameters<typeof ${local}>)); } catch { /* expected to throw */ }`\n : `${out.async ? 'await ' : ''}${local}(...(args as unknown as Parameters<typeof ${local}>));`,\n `expect(args[${ex.mutation.argIndex}]).toEqual(${ex.mutation.newCode});`,\n ].join('\\n '),\n };\n }\n switch (out.kind) {\n case 'return': {\n if (out.code === undefined) return { skip: `return value cannot be written as code (${out.display})` };\n const matcher =\n out.code === 'NaN'\n ? 'toBeNaN()'\n : PRIMITIVE_CODE.test(out.code)\n ? `toBe(${out.code})`\n : `toEqual(${out.code})`;\n return {\n code: out.async ? `await expect(${call}).resolves.${matcher};` : `expect(${call}).${matcher};`,\n };\n }\n case 'throw': {\n const checks: string[] = [];\n if (out.errorClass && BUILTIN_ERRORS.has(out.errorClass)) checks.push(`toThrow(${out.errorClass})`);\n if (out.message !== undefined) checks.push(`toThrow(${JSON.stringify(out.message)})`);\n if (checks.length === 0) checks.push('toThrow()');\n return {\n code: checks\n .map((c) => (out.async ? `await expect(${call}).rejects.${c};` : `expect(() => ${call}).${c};`))\n .join('\\n '),\n };\n }\n default:\n return { skip: `new version ${out.display}` };\n }\n}\n\nfunction fileFor(f: FunctionReport, outDir: string, taken: Set<string>, ts: boolean): string {\n const ext = ts ? '.test.ts' : '.test.js';\n const safe = f.exportName === 'default' ? basename(f.file).replace(/\\.[^.]+$/, '') : f.exportName;\n let p = posix.join(outDir, `${safe}${ext}`);\n if (taken.has(p)) p = posix.join(outDir, `${basename(f.file).replace(/\\.[^.]+$/, '')}.${safe}${ext}`);\n taken.add(p);\n return p;\n}\n\nfunction renderFile(\n r: Report,\n f: FunctionReport,\n path: string,\n framework: Framework,\n): { content: string; cases: number } {\n const ts = path.endsWith('.ts');\n const local = f.exportName === 'default' ? 'subject' : f.exportName;\n const imp = importPath(path, f.file);\n const lines: string[] = [];\n lines.push(\n `// Generated by doppeldiff v${r.tool.version}: pins the current behavior of \\`${f.exportName}\\` (${f.file}).`,\n );\n lines.push(\n `// Observed differences against ${r.base.sha.slice(0, 7)}; review before committing. Regenerate with \\`npx doppeldiff --write-tests\\`.`,\n );\n if (r.settings.freeze) {\n lines.push(\n `// Values were observed with the clock frozen at ${new Date(DEFAULT_NOW).toISOString()} and TZ=UTC.`,\n );\n }\n if (framework === 'vitest')\n lines.push(`import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest';`);\n else lines.push(`import { afterAll, beforeAll, describe, expect, it, jest } from '@jest/globals';`);\n lines.push(\n f.exportName === 'default' ? `import ${local} from '${imp}';` : `import { ${local} } from '${imp}';`,\n );\n lines.push('');\n lines.push(`describe(${JSON.stringify(`${f.exportName} (doppeldiff)`)}, () => {`);\n if (r.settings.freeze) {\n if (framework === 'vitest') {\n lines.push(\n ` beforeAll(() => {`,\n ` vi.useFakeTimers({ now: ${DEFAULT_NOW}, toFake: ['Date'] });`,\n ` });`,\n );\n lines.push(` afterAll(() => {`, ` vi.useRealTimers();`, ` });`);\n } else {\n lines.push(\n ` beforeAll(() => {`,\n ` jest.useFakeTimers({ now: ${DEFAULT_NOW}, doNotFake: ['nextTick', 'setImmediate', 'clearImmediate', 'setTimeout', 'clearTimeout', 'setInterval', 'clearInterval', 'queueMicrotask', 'hrtime', 'performance'] });`,\n ` });`,\n ` afterAll(() => {`,\n ` jest.useRealTimers();`,\n ` });`,\n );\n }\n }\n let cases = 0;\n f.behaviors.forEach((b: Behavior) => {\n lines.push('');\n if (b.label === 'unclaimed' || b.label === 'suspicious') {\n lines.push(\n ` // \u26A0\uFE0F ${b.label === 'unclaimed' ? 'Unclaimed' : 'Suspicious'} behavior change: ${comment(b.title)}.`,\n );\n lines.push(` // These tests pin the NEW behavior. Delete them if the change is a bug.`);\n } else {\n lines.push(` // ${comment(b.title)}`);\n }\n for (const ex of b.examples) {\n const a = assertion(local, ex);\n if ('skip' in a) {\n lines.push(` // Not pinned: ${comment(ex.call)}: ${comment(a.skip)}`);\n continue;\n }\n const isAsync = a.code.includes('await ');\n lines.push(` it(${title(ex.call)}, ${isAsync ? 'async ' : ''}() => {`);\n lines.push(` // Before: ${comment(ex.old.display)}`);\n lines.push(\n ` ${ts ? a.code : a.code.replace(/ as const;/, ';').replace(/ as unknown as Parameters<typeof \\w+>/, '')}`,\n );\n lines.push(` });`);\n cases++;\n }\n });\n lines.push('});', '');\n return { content: lines.join('\\n'), cases };\n}\n\n/** Generate one regression test file per function with behavior changes. */\nexport function generateTests(\n r: Report,\n options: TestgenOptions,\n): { framework: Framework; files: GeneratedFile[] } {\n const outDir = (options.outDir ?? 'tests/doppeldiff').replace(/\\\\/g, '/').replace(/\\/$/, '');\n const changed = r.functions.filter((f) => f.behaviors.length > 0);\n const framework: Framework =\n options.framework && options.framework !== 'auto'\n ? options.framework\n : detectFramework(options.root, changed[0]?.file ?? '.');\n const taken = new Set<string>();\n const files: GeneratedFile[] = [];\n for (const f of changed) {\n const ts = /\\.(?:ts|tsx|mts|cts)$/.test(f.file);\n const path = fileFor(f, outDir, taken, ts);\n const { content, cases } = renderFile(r, f, path, framework);\n if (cases === 0) continue;\n files.push({ path, content, cases });\n if (options.write !== false) {\n const abs = join(options.root, path);\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(abs, content);\n }\n }\n return { framework, files };\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type fcType from 'fast-check';\nimport type { Arbitrary } from 'fast-check';\nimport type { CompareOptions } from './core/compare/compare.js';\n\nexport interface FunctionConfig {\n /** Custom argument generator: return an arbitrary of the full argument list. */\n args?: (fc: typeof fcType) => Arbitrary<unknown[]>;\n /** Extra inputs to always try first. */\n examples?: unknown[][];\n /**\n * Input domain: only inputs for which this returns true are generated and reported, e.g.\n * `where: ([a, b]) => typeof a !== 'number' || a >= 0`.\n */\n where?: (args: unknown[]) => boolean;\n /** Do not verify this function (true or a reason). */\n skip?: boolean | string;\n runs?: number;\n}\n\nexport interface DoppeldiffConfig {\n include?: string[];\n exclude?: string[];\n runs?: number;\n timeoutMs?: number;\n seed?: number;\n freeze?: boolean;\n failOn?: 'unclaimed' | 'any' | 'never';\n compare?: CompareOptions;\n /** Per-function settings, keyed by `path/to/file.ts#exportName` or just `exportName`. */\n functions?: Record<string, FunctionConfig>;\n /** Regression test output directory (default tests/doppeldiff). */\n testsDir?: string;\n}\n\n/** Identity helper for typed config files. */\nexport function defineConfig(config: DoppeldiffConfig): DoppeldiffConfig {\n return config;\n}\n\nexport const CONFIG_FILES = [\n 'doppeldiff.config.ts',\n 'doppeldiff.config.mts',\n 'doppeldiff.config.js',\n 'doppeldiff.config.mjs',\n];\n\n/**\n * Load `doppeldiff.config.*` from the repository root. The config runs in the main process (it builds\n * arbitraries), so it is treated like any other project build script: trusted code from the checkout.\n */\nexport async function loadConfig(\n root: string,\n explicit?: string,\n): Promise<{ config: DoppeldiffConfig; path: string | null }> {\n const path = explicit\n ? join(root, explicit)\n : CONFIG_FILES.map((f) => join(root, f)).find((p) => existsSync(p));\n if (!path) return { config: {}, path: null };\n if (!existsSync(path)) throw new Error(`config file not found: ${path}`);\n const esbuild = await import('esbuild');\n const result = await esbuild.build({\n entryPoints: [path],\n bundle: true,\n platform: 'node',\n format: 'esm',\n target: 'node22',\n write: false,\n logLevel: 'silent',\n banner: {\n js: \"import { createRequire as __ddRequire } from 'node:module'; const require = __ddRequire(import.meta.url);\",\n },\n // `import { defineConfig } from 'doppeldiff'` should work even when doppeldiff is not installed locally.\n plugins: [\n {\n name: 'doppeldiff-self',\n setup(build) {\n build.onResolve({ filter: /^doppeldiff$/ }, () => ({\n path: 'doppeldiff',\n namespace: 'doppeldiff-self',\n }));\n build.onLoad({ filter: /.*/, namespace: 'doppeldiff-self' }, () => ({\n contents: 'export const defineConfig = (c) => c;',\n loader: 'js',\n }));\n },\n },\n ],\n });\n const code = result.outputFiles[0]!.text;\n const hash = createHash('sha256').update(code).digest('hex').slice(0, 16);\n const dir = join(tmpdir(), 'doppeldiff-config');\n mkdirSync(dir, { recursive: true });\n const file = join(dir, `config-${hash}.mjs`);\n writeFileSync(file, code);\n const mod = (await import(pathToFileURL(file).href)) as { default?: DoppeldiffConfig };\n return { config: mod.default ?? {}, path };\n}\n\n/** Find the per-function config entry for a target. */\nexport function functionConfig(\n config: DoppeldiffConfig,\n id: string,\n exportName: string,\n): FunctionConfig | undefined {\n return config.functions?.[id] ?? config.functions?.[exportName];\n}\n"],
5
- "mappings": "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",
6
- "names": ["existsSync", "realpathSync", "tmpdir", "dirname", "join", "relative", "sep", "build", "code", "createHash", "existsSync", "mkdirSync", "readFileSync", "realpathSync", "writeFileSync", "tmpdir", "join", "join", "existsSync", "esbuild", "code", "createHash", "tmpdir", "mkdirSync", "readFileSync", "writeFileSync", "realpathSync", "resolve", "join", "tmpdir", "existsSync", "realpathSync", "dirname", "relative", "sep", "key", "text", "n", "fc", "n", "key", "fc", "n", "size", "key", "leaves", "fc", "Node", "SyntaxKind", "Node", "SyntaxKind", "Node", "SyntaxKind", "ts", "n", "text", "fc", "n", "n", "ts", "key", "n", "round", "fc", "n", "Node", "ts", "ts", "o", "key", "Node", "Node", "SyntaxKind", "compile", "n", "n", "leaves", "Node", "n", "Node", "existsSync", "realpathSync", "join", "fc", "clip", "key", "m", "v", "n", "text", "existsSync", "readFileSync", "realpathSync", "dirname", "join", "code", "realpathSync", "existsSync", "join", "text", "readFileSync", "n", "key", "dirname", "readFileSync", "basename", "join", "ts", "key", "n", "text", "execFileSync", "createHash", "existsSync", "mkdirSync", "readdirSync", "readFileSync", "realpathSync", "dirname", "join", "createHash", "existsSync", "mkdirSync", "rmSync", "tmpdir", "join", "createHash", "join", "tmpdir", "samePath", "existsSync", "mkdirSync", "rmSync", "require", "join", "existsSync", "realpathSync", "stem", "fc", "key", "text", "title", "IDENT", "key", "num", "n", "entries", "proto", "text", "code", "run", "n", "clip", "n", "clip", "s", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "basename", "dirname", "extname", "join", "join", "existsSync", "readFileSync", "extname", "ts", "basename", "mkdirSync", "dirname", "writeFileSync"]
3
+ "sources": ["../src/core/verify/session.ts", "../src/core/materialize/bundle.ts", "../src/core/runner/pool.ts", "../src/core/runner/netguard.ts", "../src/core/runner/tags.ts", "../src/core/arbitraries/mine.ts", "../src/core/arbitraries/compile.ts", "../src/core/arbitraries/regex.ts", "../src/core/analyze/locate.ts", "../src/core/analyze/sizeParams.ts", "../src/core/detect/toplevel.ts", "../src/core/explore/explore.ts", "../src/core/compare/compare.ts", "../src/core/format/format.ts", "../src/core/util/stableKey.ts", "../src/core/explore/cluster.ts", "../src/core/explore/humanize.ts", "../src/core/types/fromType.ts", "../src/core/types/spec.ts", "../src/core/analyze/guards.ts", "../src/core/explore/realism.ts", "../src/core/verify/verifyFunction.ts", "../src/core/types/accepts.ts", "../src/core/run.ts", "../src/core/claims/suggest.ts", "../src/core/detect/detect.ts", "../src/core/git/git.ts", "../src/core/analyze/usage.ts", "../src/core/git/deps.ts", "../src/core/git/worktree.ts", "../src/core/report/behaviors.ts", "../src/core/claims/rules.ts", "../src/core/report/codegen.ts", "../src/core/report/model.ts", "../src/core/report/build.ts", "../src/core/report/markdown.ts", "../src/core/report/terminal.ts", "../src/core/report/testgen.ts", "../src/config.ts"],
4
+ "sourcesContent": ["import { existsSync, realpathSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { dirname, join, relative, resolve, sep } from 'node:path';\nimport { Project, ts, type SourceFile } from 'ts-morph';\nimport { bundleModule } from '../materialize/bundle.js';\nimport { RunnerPool, type LoadResult } from '../runner/pool.js';\n\nexport type Side = 'base' | 'head';\n\nexport interface SessionOptions {\n /** Root directory of the base version (repo root or worktree). */\n baseRoot: string;\n /** Root directory of the head version. */\n headRoot: string;\n timeoutMs: number;\n freeze: boolean;\n /** Frozen clock value; default 2025-01-15T12:00:00Z. */\n now?: number;\n seed: number;\n poolSize?: number;\n memoryMb?: number;\n showConsole?: boolean;\n noSandbox?: boolean;\n /** Extra directories the runners may read (e.g. node_modules real paths). */\n extraReadPaths?: string[];\n /** The user's working copy (whose node_modules both versions share), for monorepo workspace mapping. */\n sourceRepo?: string;\n}\n\nexport interface LoadedModule {\n moduleId: string;\n load: LoadResult;\n}\n\nexport const DEFAULT_NOW = Date.UTC(2025, 0, 15, 12, 0, 0);\n\nfunction readPathsFor(root: string, extra: string[]): string[] {\n const paths = [root, join(tmpdir(), 'doppeldiff-bundles'), ...extra];\n const nm = join(root, 'node_modules');\n if (existsSync(nm)) paths.push(realpathSync(nm));\n return paths;\n}\n\n/**\n * Nearest directory at or above `file` (but not above `root`) that contains a tsconfig.json or\n * package.json: the \"package root\" used for type analysis and bundling.\n */\nexport function packageRootOf(root: string, file: string): string {\n const absRoot = resolve(root);\n let dir = dirname(resolve(file));\n while (dir.startsWith(absRoot)) {\n if (existsSync(join(dir, 'tsconfig.json')) || existsSync(join(dir, 'package.json'))) return dir;\n if (dir === absRoot) break;\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return absRoot;\n}\n\n/** Repo-relative, forward-slash path. */\nexport function relPath(root: string, file: string): string {\n return relative(root, file).split(sep).join('/');\n}\n\n/**\n * Holds everything shared across functions of one run: the two runner pools (base/head), a ts-morph\n * project per package root and version, and the bundled modules.\n */\nexport class VerifySession {\n readonly pools: Record<Side, RunnerPool>;\n readonly roots: Record<Side, string>;\n private readonly projects = new Map<string, Project>();\n private readonly modules = new Map<string, Promise<LoadedModule>>();\n\n constructor(readonly options: SessionOptions) {\n this.roots = { base: options.baseRoot, head: options.headRoot };\n const common = {\n timeoutMs: options.timeoutMs,\n freeze: options.freeze,\n now: options.now ?? DEFAULT_NOW,\n seed: options.seed,\n ...(options.poolSize !== undefined ? { size: options.poolSize } : {}),\n ...(options.memoryMb !== undefined ? { memoryMb: options.memoryMb } : {}),\n ...(options.showConsole !== undefined ? { showConsole: options.showConsole } : {}),\n ...(options.noSandbox !== undefined ? { noSandbox: options.noSandbox } : {}),\n };\n const extra = options.extraReadPaths ?? [];\n this.pools = {\n base: new RunnerPool({ ...common, label: 'base', readPaths: readPathsFor(options.baseRoot, extra) }),\n head: new RunnerPool({ ...common, label: 'head', readPaths: readPathsFor(options.headRoot, extra) }),\n };\n }\n\n /** ts-morph project for the package containing `file` in the given version. */\n project(side: Side, file: string): Project {\n const pkg = packageRootOf(this.roots[side], file);\n const key = `${side}:${pkg}`;\n let p = this.projects.get(key);\n if (!p) {\n const tsconfig = join(pkg, 'tsconfig.json');\n const fallback = () =>\n new Project({\n compilerOptions: {\n strict: true,\n allowJs: true,\n checkJs: false,\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n },\n });\n try {\n p = existsSync(tsconfig)\n ? new Project({\n tsConfigFilePath: tsconfig,\n skipAddingFilesFromTsConfig: true,\n compilerOptions: { allowJs: true, noEmit: true },\n })\n : fallback();\n } catch {\n // e.g. `extends` pointing into a package that is not installed: analyze with strict defaults.\n p = fallback();\n }\n this.projects.set(key, p);\n }\n return p;\n }\n\n /** Parsed source file (with its imports resolved for the type checker). */\n sourceFile(side: Side, file: string): SourceFile {\n const project = this.project(side, file);\n const existing = project.getSourceFile(file);\n if (existing) return existing;\n // No resolveSourceFileDependencies(): the TypeScript program loads imported files for the type checker on\n // its own, and re-resolving the whole project per file was O(files\u00B2) on large repositories.\n return project.addSourceFileAtPath(file);\n }\n\n /** Bundle and load a module in the side's runner pool (memoized). */\n loadModule(side: Side, file: string): Promise<LoadedModule> {\n const key = `${side}:${file}`;\n let p = this.modules.get(key);\n if (!p) {\n p = (async () => {\n const ws = this.options.sourceRepo\n ? { workspace: { sourceRepo: this.options.sourceRepo, versionRepo: this.roots[side] } }\n : {};\n const bundle = await bundleModule(packageRootOf(this.roots[side], file), file, side, ws);\n const load = await this.pools[side].load(key, bundle.path);\n return { moduleId: key, load };\n })();\n this.modules.set(key, p);\n }\n return p;\n }\n\n close(): void {\n this.pools.base.close();\n this.pools.head.close();\n }\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';\nimport { builtinModules } from 'node:module';\nimport { tmpdir } from 'node:os';\nimport { isAbsolute, join, relative, sep } from 'node:path';\nimport * as esbuild from 'esbuild';\n\nexport interface BundleResult {\n /** Absolute path of the bundled ESM module. */\n path: string;\n /** Directory the runner must be allowed to read. */\n dir: string;\n /** Bare package imports left external. */\n externals: string[];\n}\n\nconst BUILTINS = new Set(builtinModules.flatMap((m) => [m, `node:${m}`]));\n\n/** ESM output that still supports `require()` of external packages from bundled CommonJS code. */\nconst REQUIRE_SHIM =\n \"import { createRequire as __ddCreateRequire } from 'node:module'; const require = __ddCreateRequire(import.meta.url);\";\n\n/**\n * Bundle one module of one version of the project with esbuild: TypeScript, JSX, ESM/CJS interop and\n * tsconfig `paths` are handled here. Packages stay external and resolve against the version's own\n * node_modules, so the bundle is written inside `<root>/node_modules/.cache/doppeldiff/` when the module\n * imports packages, and to the OS temp dir otherwise.\n */\nexport interface BundleOptions {\n /**\n * Monorepo support: the working copy whose node_modules are shared with this version, and this version's\n * repo root. Bare imports that resolve (through workspace symlinks) to source files inside the working\n * copy are redirected to the same path in this version's tree and bundled, so each version uses its own\n * workspace packages.\n */\n workspace?: { sourceRepo: string; versionRepo: string };\n}\n\nfunction isInside(child: string, parent: string): boolean {\n const rel = relative(parent, child);\n return rel !== '' && !rel.startsWith('..') && !isAbsolute(rel);\n}\n\n/** Workspace globs from package.json `workspaces` (array or `{ packages }`) or pnpm-workspace.yaml. */\nfunction workspaceGlobs(repo: string): string[] {\n const globs: string[] = [];\n try {\n const pkg = JSON.parse(readFileSync(join(repo, 'package.json'), 'utf8')) as { workspaces?: unknown };\n const w = pkg.workspaces;\n if (Array.isArray(w)) globs.push(...w.filter((x): x is string => typeof x === 'string'));\n else if (w && typeof w === 'object' && Array.isArray((w as { packages?: unknown }).packages)) {\n globs.push(\n ...(w as { packages: unknown[] }).packages.filter((x): x is string => typeof x === 'string'),\n );\n }\n } catch {\n /* no root package.json */\n }\n try {\n const yaml = readFileSync(join(repo, 'pnpm-workspace.yaml'), 'utf8');\n for (const m of yaml.matchAll(/^\\s*-\\s*['\"]?([^'\"#\\n]+?)['\"]?\\s*$/gm)) globs.push(m[1]!);\n } catch {\n /* not pnpm */\n }\n return globs.filter((g) => !g.startsWith('!'));\n}\n\n/** Workspace package name \u2192 directory, read from a version's own tree (supports `dir`, `dir/*`, `dir/**`). */\nexport function workspacePackages(repo: string): Map<string, string> {\n const out = new Map<string, string>();\n const add = (dir: string) => {\n try {\n const name = (JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8')) as { name?: unknown }).name;\n if (typeof name === 'string') out.set(name, dir);\n } catch {\n /* not a package */\n }\n };\n for (const glob of workspaceGlobs(repo)) {\n const clean = glob.replace(/\\/+$/, '');\n const star = clean.search(/\\*/);\n if (star === -1) {\n add(join(repo, clean));\n continue;\n }\n const base = join(repo, clean.slice(0, star).replace(/\\/+$/, ''));\n try {\n for (const e of readdirSync(base, { withFileTypes: true }))\n if (e.isDirectory()) add(join(base, e.name));\n } catch {\n /* missing dir */\n }\n }\n return out;\n}\n\nfunction packageNameOf(spec: string): string {\n const parts = spec.split('/');\n return spec.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0]!;\n}\n\nfunction workspacePlugin(ws: NonNullable<BundleOptions['workspace']>): esbuild.Plugin {\n const sourceRepo = realpathSync(ws.sourceRepo);\n const versionRepo = realpathSync(ws.versionRepo);\n // Workspace packages are resolved from this version's own tree, never through node_modules links\n // (which point at the working copy and are junction chains on Windows).\n const packages = workspacePackages(ws.versionRepo);\n return {\n name: 'doppeldiff-workspaces',\n setup(build) {\n build.onResolve({ filter: /^[^./]|^\\.[^./]|^\\.\\.[^/]/ }, async (args) => {\n if (args.pluginData === 'doppeldiff-skip' || BUILTINS.has(args.path) || args.kind === 'entry-point')\n return undefined;\n const name = packageNameOf(args.path);\n const pkgDir = packages.get(name);\n if (pkgDir) {\n const sub = args.path.slice(name.length).replace(/^\\//, '');\n const target = sub ? join(pkgDir, sub) : pkgDir;\n const w = await build.resolve(`./${relative(args.resolveDir, target).split(sep).join('/')}`, {\n resolveDir: args.resolveDir,\n kind: args.kind,\n pluginData: 'doppeldiff-skip',\n });\n if (w.errors.length === 0 && w.path) return { path: w.path };\n }\n const r = await build.resolve(args.path, {\n resolveDir: args.resolveDir,\n kind: args.kind,\n pluginData: 'doppeldiff-skip',\n });\n if (r.errors.length > 0 || !r.path) return { path: args.path, external: true };\n let real: string;\n try {\n real = realpathSync(r.path);\n } catch {\n return { path: args.path, external: true };\n }\n if (real.split(sep).includes('node_modules')) return { path: args.path, external: true };\n // tsconfig `paths` aliases and similar: already inside this version's tree.\n if (isInside(real, versionRepo) || isInside(r.path, ws.versionRepo)) return { path: r.path };\n if (!isInside(real, sourceRepo)) return { path: args.path, external: true };\n // A workspace package symlinked from the shared node_modules: bundle this version's copy of it.\n const mapped = join(ws.versionRepo, relative(sourceRepo, real));\n return { path: existsSync(mapped) ? mapped : real };\n });\n },\n };\n}\n\nexport async function bundleModule(\n root: string,\n entry: string,\n label: string,\n options: BundleOptions = {},\n): Promise<BundleResult> {\n const tsconfig = existsSync(join(root, 'tsconfig.json')) ? join(root, 'tsconfig.json') : undefined;\n const build = (withTsconfig: boolean) =>\n esbuild.build({\n entryPoints: [entry],\n absWorkingDir: root,\n bundle: true,\n platform: 'node',\n format: 'esm',\n target: 'node22',\n ...(options.workspace\n ? { plugins: [workspacePlugin(options.workspace)] }\n : { packages: 'external' as const }),\n write: false,\n metafile: true,\n logLevel: 'silent',\n banner: { js: REQUIRE_SHIM },\n ...(tsconfig && withTsconfig ? { tsconfig } : {}),\n });\n let result: Awaited<ReturnType<typeof build>>;\n try {\n result = await build(true);\n } catch (e) {\n // A tsconfig that cannot be loaded (e.g. `extends` from an uninstalled package): retry without it.\n if (!tsconfig) throw e;\n result = await build(false);\n }\n const code = result.outputFiles[0]!.text;\n const externals = new Set<string>();\n for (const out of Object.values(result.metafile.outputs)) {\n for (const imp of out.imports) if (imp.external && !BUILTINS.has(imp.path)) externals.add(imp.path);\n }\n const hash = createHash('sha256').update(code).digest('hex').slice(0, 12);\n const name = `${label}-${relative(root, entry).replace(/[^\\w.-]+/g, '_')}-${hash}.mjs`;\n const dir =\n externals.size > 0 && existsSync(join(root, 'node_modules'))\n ? join(root, 'node_modules', '.cache', 'doppeldiff')\n : join(tmpdir(), 'doppeldiff-bundles');\n mkdirSync(dir, { recursive: true });\n const path = join(dir, name);\n if (!existsSync(path)) writeFileSync(path, code);\n return { path, dir, externals: [...externals] };\n}\n", "import { fork, type ChildProcess } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';\nimport { availableParallelism, tmpdir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { Outcome } from '../compare/observed.js';\nimport { nativeNetPermission } from './netguard.js';\nimport type { ChildMessage, LoadedMessage, ParentMessage } from './protocol.js';\nimport { toWire } from './tags.js';\n\nexport interface PoolOptions {\n /** Number of runner processes (default: max(1, floor(cpus / 2))). */\n size?: number;\n /** Directories the code under test may read (module bundles, node_modules, project root). */\n readPaths: string[];\n /** Per-call timeout in ms. */\n timeoutMs: number;\n /** V8 old-space limit per runner in MB (default 512). */\n memoryMb?: number;\n freeze: boolean;\n now: number;\n seed: number;\n showConsole?: boolean;\n /** Disable the Node permission model (debugging only). */\n noSandbox?: boolean;\n /** Label for diagnostics, e.g. \"base\" / \"head\". */\n label: string;\n}\n\nexport interface LoadResult {\n ok: boolean;\n error?: LoadedMessage['error'];\n exports: string[];\n}\n\n/** Resolve (and if running from source, build) the runner child entry script. */\nlet childEntryCache: string | undefined;\nexport async function resolveChildEntry(): Promise<string> {\n if (childEntryCache) return childEntryCache;\n const here = dirname(fileURLToPath(import.meta.url));\n const built = [join(here, 'child.js'), join(here, 'runner-child.js')].find((p) => existsSync(p));\n if (built) return (childEntryCache = built);\n const source = join(here, 'child.ts');\n if (!existsSync(source)) throw new Error(`doppeldiff: runner entry not found next to ${here}`);\n // Running from TypeScript sources (development/tests): bundle the child once into a temp cache.\n const esbuild = await import('esbuild');\n const result = await esbuild.build({\n entryPoints: [source],\n bundle: true,\n platform: 'node',\n format: 'esm',\n target: 'node22',\n write: false,\n logLevel: 'silent',\n });\n const code = result.outputFiles[0]!.text;\n const hash = createHash('sha256').update(code).digest('hex').slice(0, 16);\n const dir = join(tmpdir(), 'doppeldiff-runner');\n mkdirSync(dir, { recursive: true });\n const file = join(dir, `child-${hash}.mjs`);\n if (!existsSync(file) || readFileSync(file, 'utf8') !== code) writeFileSync(file, code);\n return (childEntryCache = file);\n}\n\nfunction realpaths(paths: string[]): string[] {\n const out = new Set<string>();\n for (const p of paths) {\n out.add(p);\n try {\n out.add(realpathSync(p));\n } catch {\n /* ignore */\n }\n }\n return [...out];\n}\n\ninterface Job {\n moduleId: string;\n exportName: string;\n inputs: unknown[][];\n /** Per-call timeout multiplier (re-checks of suspected timeouts use a longer limit). */\n timeoutScale?: number;\n}\n\n/** One sandboxed runner process, respawned transparently after timeouts and crashes. */\nclass RunnerProcess {\n private child: ChildProcess | undefined;\n private reqCounter = 0;\n private stderrTail = '';\n private listeners = new Set<(msg: ChildMessage) => void>();\n private exitListeners = new Set<(reason: string) => void>();\n spawns = 0;\n\n constructor(\n private readonly entry: string,\n private readonly options: PoolOptions,\n private readonly loads: Map<string, string>,\n /** Functions that hung synchronously once; their calls run in vm-guarded mode from then on. */\n private readonly guarded: Set<string>,\n ) {}\n\n private execArgv(): string[] {\n const args = [`--max-old-space-size=${this.options.memoryMb ?? 512}`];\n if (!this.options.noSandbox) {\n args.push('--permission');\n for (const p of realpaths([dirname(this.entry), ...this.options.readPaths]))\n args.push(`--allow-fs-read=${p}`);\n }\n return args;\n }\n\n async start(): Promise<void> {\n this.spawns++;\n const child = fork(this.entry, [], {\n execArgv: this.execArgv(),\n serialization: 'advanced',\n stdio: ['ignore', 'ignore', 'pipe', 'ipc'],\n env: { TZ: 'UTC', LANG: 'en_US.UTF-8', NODE_ENV: 'test', DOPPELDIFF_RUNNER: '1' },\n });\n this.child = child;\n child.stderr?.on('data', (d: Buffer) => {\n this.stderrTail = (this.stderrTail + d.toString()).slice(-2000);\n });\n child.on('message', (m) => {\n for (const l of [...this.listeners]) l(m as ChildMessage);\n });\n child.on('exit', (code, signal) => {\n if (this.child !== child) return;\n this.child = undefined;\n const reason = signal ? `killed by ${signal}` : `exited with code ${code}`;\n const oom = /heap out of memory|Allocation failed/i.test(this.stderrTail) ? ' (out of memory)' : '';\n for (const l of [...this.exitListeners]) l(reason + oom);\n });\n await this.request(\n {\n t: 'init',\n freeze: this.options.freeze,\n now: this.options.now,\n seed: this.options.seed,\n netGuard: !nativeNetPermission(),\n showConsole: this.options.showConsole ?? false,\n },\n (m) => m.t === 'ready',\n );\n for (const [moduleId, path] of this.loads) await this.loadModule(moduleId, path);\n }\n\n /** Send a message and wait for the first reply matching `done`. Rejects if the process exits. */\n private request<T extends ChildMessage>(\n msg: ParentMessage,\n done: (m: ChildMessage) => boolean,\n ): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const onMsg = (m: ChildMessage) => {\n if (!done(m)) return;\n cleanup();\n resolve(m as T);\n };\n const onExit = (reason: string) => {\n cleanup();\n reject(new Error(`runner (${this.options.label}) ${reason}: ${this.stderrTail.trim().slice(-500)}`));\n };\n const cleanup = () => {\n this.listeners.delete(onMsg);\n this.exitListeners.delete(onExit);\n };\n this.listeners.add(onMsg);\n this.exitListeners.add(onExit);\n this.child!.send(msg);\n });\n }\n\n async loadModule(moduleId: string, path: string): Promise<LoadResult> {\n const m = await this.request<LoadedMessage>(\n { t: 'load', moduleId, path: realpathSync(path) },\n (r) => r.t === 'loaded' && r.moduleId === moduleId,\n );\n return { ok: m.ok, exports: m.exports, ...(m.error ? { error: m.error } : {}) };\n }\n\n kill(): void {\n const c = this.child;\n this.child = undefined;\n c?.removeAllListeners('exit');\n c?.kill('SIGKILL');\n }\n\n /** Execute a job; timeouts and crashes become outcomes, and the process is respawned. */\n async run(job: Job): Promise<Outcome[]> {\n const timeoutMs = Math.round(this.options.timeoutMs * (job.timeoutScale ?? 1));\n const watchdogMs = timeoutMs + Math.max(150, Math.round(timeoutMs * 0.3));\n const guardKey = `${job.moduleId}#${job.exportName}`;\n const outcomes: Outcome[] = new Array(job.inputs.length);\n let next = 0;\n while (next < job.inputs.length) {\n if (!this.child) await this.start();\n const reqId = ++this.reqCounter;\n const offset = next;\n const segment = job.inputs.slice(offset);\n const received = await new Promise<{ count: number; failure?: Outcome }>((resolve) => {\n let count = 0;\n let timer: NodeJS.Timeout;\n const arm = () => {\n clearTimeout(timer);\n timer = setTimeout(\n () => finish({ count, failure: { kind: 'timeout', ms: timeoutMs } }, true),\n watchdogMs,\n );\n };\n const onMsg = (m: ChildMessage) => {\n if (m.t === 'result' && m.reqId === reqId) {\n outcomes[offset + m.index] = m.outcome;\n count = m.index + 1;\n // A call stopped by the in-process timeout may leave a huge heap behind (an array growing towards\n // 2^31 elements); later inputs would then time out in garbage collection. Start over in a new process.\n if (m.outcome.kind === 'timeout') {\n this.guarded.add(guardKey);\n finish({ count }, true);\n return;\n }\n arm();\n } else if (m.t === 'done' && m.reqId === reqId) {\n finish({ count }, false);\n }\n };\n const onExit = (reason: string) => finish({ count, failure: { kind: 'crash', reason } }, false);\n const finish = (r: { count: number; failure?: Outcome }, kill: boolean) => {\n clearTimeout(timer);\n this.listeners.delete(onMsg);\n this.exitListeners.delete(onExit);\n if (kill) this.kill();\n resolve(r);\n };\n this.listeners.add(onMsg);\n this.exitListeners.add(onExit);\n arm();\n try {\n this.child!.send({\n t: 'run',\n reqId,\n moduleId: job.moduleId,\n exportName: job.exportName,\n inputs: segment.map((input) => input.map((a) => toWire(a))),\n timeoutMs,\n guard: this.guarded.has(guardKey),\n });\n } catch (e) {\n // Non-serializable input: report every remaining input as a crash rather than hanging.\n for (let i = 0; i < segment.length; i++) {\n outcomes[offset + i] = {\n kind: 'crash',\n reason: `input not serializable: ${(e as Error).message}`,\n };\n }\n finish({ count: segment.length }, false);\n }\n });\n next = offset + received.count;\n if (received.failure && next < job.inputs.length) {\n if (received.failure.kind === 'timeout') this.guarded.add(guardKey);\n outcomes[next] = received.failure;\n next++;\n if (this.child) this.kill();\n }\n }\n return outcomes;\n }\n}\n\n/** A pool of runner processes for one version (base or head) of the code. */\nexport class RunnerPool {\n private procs: RunnerProcess[] = [];\n private readonly loads = new Map<string, string>();\n private readonly guarded = new Set<string>();\n private started = false;\n private lock: Promise<unknown> = Promise.resolve();\n\n constructor(private readonly options: PoolOptions) {}\n\n get size(): number {\n return this.options.size ?? Math.max(1, Math.floor(availableParallelism() / 2));\n }\n\n /** Total number of process spawns so far (initial + respawns after timeouts/crashes). */\n get spawns(): number {\n return this.procs.reduce((s, p) => s + p.spawns, 0);\n }\n\n async start(): Promise<void> {\n if (this.started) return;\n // Real paths: on macOS the temp dir is under /var -> /private/var, and resolving a symlinked path makes\n // Node read the symlink itself, which the permission model denies.\n const entry = realpathSync(await resolveChildEntry());\n this.procs = Array.from(\n { length: this.size },\n () => new RunnerProcess(entry, this.options, this.loads, this.guarded),\n );\n await Promise.all(this.procs.map((p) => p.start()));\n this.started = true;\n }\n\n async load(moduleId: string, path: string): Promise<LoadResult> {\n await this.start();\n this.loads.set(moduleId, path);\n const results = await Promise.all(this.procs.map((p) => p.loadModule(moduleId, path)));\n return results[0]!;\n }\n\n /** Run inputs, spreading them across processes. Outcomes are returned in input order. */\n run(\n moduleId: string,\n exportName: string,\n inputs: unknown[][],\n options: { timeoutScale?: number } = {},\n ): Promise<Outcome[]> {\n const result = this.lock.then(() => this.runUnlocked(moduleId, exportName, inputs, options.timeoutScale));\n this.lock = result.catch(() => undefined);\n return result;\n }\n\n private async runUnlocked(\n moduleId: string,\n exportName: string,\n inputs: unknown[][],\n timeoutScale?: number,\n ): Promise<Outcome[]> {\n await this.start();\n const chunkSize = Math.max(16, Math.ceil(inputs.length / this.procs.length));\n const chunks: unknown[][][] = [];\n for (let i = 0; i < inputs.length; i += chunkSize) chunks.push(inputs.slice(i, i + chunkSize));\n const results = await Promise.all(\n chunks.map((c, i) => this.procs[i]!.run({ moduleId, exportName, inputs: c, timeoutScale })),\n );\n return results.flat();\n }\n\n close(): void {\n for (const p of this.procs) p.kill();\n this.procs = [];\n this.started = false;\n }\n}\n", "import { createRequire, syncBuiltinESMExports } from 'node:module';\n\n/**\n * Network guard for Node versions whose permission model does not restrict network access.\n * This is a guardrail against accidental network use by code under test, NOT a security boundary.\n */\nexport function installNetGuard(): void {\n const require = createRequire(import.meta.url);\n const deny = (what: string) =>\n function denied(): never {\n const err = new Error(`doppeldiff: network access denied (${what})`) as Error & { code: string };\n err.code = 'ERR_ACCESS_DENIED';\n throw err;\n };\n const patch = (mod: Record<string, unknown>, keys: string[], label: string) => {\n for (const k of keys) {\n if (typeof mod[k] === 'function') {\n try {\n mod[k] = deny(`${label}.${k}`);\n } catch {\n /* ignore */\n }\n }\n }\n };\n const net = require('node:net') as Record<string, unknown> & {\n Socket: { prototype: Record<string, unknown> };\n };\n patch(net, ['connect', 'createConnection', 'createServer'], 'net');\n net.Socket.prototype.connect = deny('net.Socket.connect');\n patch(require('node:tls') as Record<string, unknown>, ['connect', 'createServer'], 'tls');\n patch(require('node:http') as Record<string, unknown>, ['request', 'get', 'createServer'], 'http');\n patch(require('node:https') as Record<string, unknown>, ['request', 'get', 'createServer'], 'https');\n patch(require('node:http2') as Record<string, unknown>, ['connect', 'createServer'], 'http2');\n patch(require('node:dgram') as Record<string, unknown>, ['createSocket'], 'dgram');\n const dnsKeys = [\n 'lookup',\n 'resolve',\n 'resolve4',\n 'resolve6',\n 'resolveAny',\n 'resolveMx',\n 'resolveTxt',\n 'reverse',\n ];\n const dns = require('node:dns') as Record<string, unknown>;\n patch(dns, dnsKeys, 'dns');\n if (dns.promises) patch(dns.promises as Record<string, unknown>, dnsKeys, 'dns.promises');\n const g = globalThis as Record<string, unknown>;\n for (const k of ['fetch', 'WebSocket', 'EventSource']) {\n if (typeof g[k] === 'function') g[k] = deny(k);\n }\n syncBuiltinESMExports();\n}\n\n/** True if this Node's permission model restricts network access natively (`--allow-net` exists). */\nexport function nativeNetPermission(): boolean {\n return process.allowedNodeEnvironmentFlags.has('--allow-net');\n}\n", "/**\n * Values that cannot cross the IPC boundary (functions) are sent as tagged descriptors and\n * materialized inside the runner.\n */\nexport const FN_TAG = '__doppeldiff_fn__';\n\nexport interface FnDescriptor {\n [FN_TAG]: { returns: unknown; async: boolean };\n}\n\nexport function isFnDescriptor(v: unknown): v is FnDescriptor {\n return typeof v === 'object' && v !== null && Object.prototype.hasOwnProperty.call(v, FN_TAG);\n}\n\n/**\n * Objects with inherited enumerable properties cannot cross IPC (structured clone drops prototypes): they are sent\n * as `{ [PROTO_TAG]: { proto, own } }` and rebuilt in the runner as `Object.assign(Object.create(proto), own)`.\n */\nexport const PROTO_TAG = '__doppeldiff_proto__';\n\nexport interface ProtoDescriptor {\n [PROTO_TAG]: { proto: Record<string, unknown>; own: Record<string, unknown> };\n}\n\nexport function isProtoDescriptor(v: unknown): v is ProtoDescriptor {\n return typeof v === 'object' && v !== null && Object.prototype.hasOwnProperty.call(v, PROTO_TAG);\n}\n\n/** Bytes of an ArrayBuffer or of the window of an ArrayBufferView. */\nexport function viewBytes(v: ArrayBuffer | ArrayBufferView): number[] {\n // `ArrayBuffer.isView` works across realms (values from the sandbox context); `instanceof` does not.\n return ArrayBuffer.isView(v)\n ? Array.from(new Uint8Array(v.buffer, v.byteOffset, v.byteLength))\n : Array.from(new Uint8Array(v));\n}\n\n/**\n * Typed arrays and DataViews cannot cross IPC faithfully: Node deserializes a view as a window into the whole\n * message buffer, so `view.buffer` would contain unrelated bytes that change from batch to batch. They are sent as\n * `{ [VIEW_TAG]: { ctor, buffer, byteOffset, length } }` (an ArrayBuffer crosses as an exact copy) and rebuilt.\n */\nexport const VIEW_TAG = '__doppeldiff_view__';\n\nexport interface ViewDescriptor {\n [VIEW_TAG]: { ctor: string; buffer: ArrayBuffer; byteOffset: number; length: number };\n}\n\nexport function isViewDescriptor(v: unknown): v is ViewDescriptor {\n return typeof v === 'object' && v !== null && Object.prototype.hasOwnProperty.call(v, VIEW_TAG);\n}\n\n/** Prepare an input for IPC: replace typed arrays and DataViews (at any depth) with view descriptors. */\nexport function toWire(value: unknown, depth = 0): unknown {\n if (typeof value !== 'object' || value === null || depth > 32) return value;\n if (ArrayBuffer.isView(value)) {\n const v = value as ArrayBufferView & { length?: number };\n return {\n [VIEW_TAG]: {\n ctor: v.constructor.name,\n buffer: (v.buffer as ArrayBuffer).slice(0),\n byteOffset: v.byteOffset,\n length: v instanceof DataView ? v.byteLength : (v.length ?? 0),\n },\n } satisfies ViewDescriptor;\n }\n if (Array.isArray(value)) return value.map((x) => toWire(x, depth + 1));\n if (value instanceof Map)\n return new Map([...value].map(([k, x]) => [toWire(k, depth + 1), toWire(x, depth + 1)]));\n if (value instanceof Set) return new Set([...value].map((x) => toWire(x, depth + 1)));\n if (Object.getPrototypeOf(value) !== Object.prototype) return value;\n const out: Record<string, unknown> = {};\n for (const [k, x] of Object.entries(value)) out[k] = toWire(x, depth + 1);\n return out;\n}\n", "import { Node, SyntaxKind } from 'ts-morph';\nimport type { MinedRegex } from './regex.js';\n\n/** Values mined from source code, used to bias generation towards interesting regions. */\nexport interface MinedValues {\n /** Numeric literals and their neighbours (v, v\u00B11, v\u00B10.01, -v) plus universal boundaries. */\n numbers: number[];\n /** Numeric literals that appear as an operand of a comparison: decision boundaries. */\n thresholds: number[];\n /** String literals and simple variants. */\n strings: string[];\n /** Property names the code reads (`options.min`, `obj[\"key\"]`, destructured names): keys for untyped objects. */\n keys: string[];\n /** Short string literals as-is: fragments for composing structured strings (paths, URLs, formats). */\n fragments: string[];\n /** Regular expressions in the code: inputs in the format the code parses. */\n regexes: MinedRegex[];\n /** Strings that a changed regex classifies differently in the two versions (see `regexDiffStrings`). */\n distinguishing?: string[];\n}\n\nexport const NUMBER_BOUNDARIES: readonly number[] = [\n 0,\n -0,\n 1,\n -1,\n 0.5,\n NaN,\n Infinity,\n -Infinity,\n Number.MAX_SAFE_INTEGER,\n Number.MIN_SAFE_INTEGER,\n Number.MIN_VALUE,\n Number.EPSILON,\n];\n\nexport const STRING_BOUNDARIES: readonly string[] = ['', ' ', 'a', 'A', '0', '-', ' a ', '\u00E9', '\uD83D\uDE00', '\\n'];\n\nconst COMPARISON_OPERATORS = new Set([\n SyntaxKind.LessThanToken,\n SyntaxKind.LessThanEqualsToken,\n SyntaxKind.GreaterThanToken,\n SyntaxKind.GreaterThanEqualsToken,\n SyntaxKind.EqualsEqualsEqualsToken,\n SyntaxKind.EqualsEqualsToken,\n SyntaxKind.ExclamationEqualsEqualsToken,\n SyntaxKind.ExclamationEqualsToken,\n]);\n\nconst MAX_STRING_LITERAL = 64;\nconst MAX_MINED = 200;\n\nfunction numericValue(node: Node): number | undefined {\n if (Node.isNumericLiteral(node)) {\n const v = node.getLiteralValue();\n const parent = node.getParent();\n if (\n parent &&\n Node.isPrefixUnaryExpression(parent) &&\n parent.getOperatorToken() === SyntaxKind.MinusToken\n ) {\n return -v;\n }\n return v;\n }\n if (Node.isPrefixUnaryExpression(node) && node.getOperatorToken() === SyntaxKind.MinusToken) {\n const operand = node.getOperand();\n if (Node.isNumericLiteral(operand)) return -operand.getLiteralValue();\n }\n return undefined;\n}\n\nfunction round(v: number): number {\n return Math.round(v * 1e9) / 1e9;\n}\n\n/** Mine literals from a set of nodes (both versions of a function and helpers it reaches). */\nexport function mineValues(nodes: Node[]): MinedValues {\n const literals = new Set<number>();\n const thresholds = new Set<number>();\n const strings = new Set<string>();\n const keys = new Set<string>();\n const regexes = new Map<string, MinedRegex>();\n\n for (const root of nodes) {\n root.forEachDescendant((node) => {\n if (Node.isNumericLiteral(node)) {\n const v = numericValue(node);\n if (v !== undefined && Number.isFinite(v)) literals.add(v);\n } else if (Node.isStringLiteral(node) || Node.isNoSubstitutionTemplateLiteral(node)) {\n // Skip import specifiers and property keys in object literals that are pure syntax.\n const parent = node.getParent();\n if (parent && (Node.isImportDeclaration(parent) || Node.isExportDeclaration(parent))) return;\n const v = node.getLiteralValue();\n if (v.length <= MAX_STRING_LITERAL) strings.add(v);\n } else if (Node.isRegularExpressionLiteral(node)) {\n const text = node.getText();\n const end = text.lastIndexOf('/');\n const r = { source: text.slice(1, end), flags: text.slice(end + 1) };\n if (r.source.length <= 400) regexes.set(text, r);\n } else if (Node.isNewExpression(node) && node.getExpression().getText() === 'RegExp') {\n const [src, fl] = node.getArguments();\n if (src && Node.isStringLiteral(src)) {\n const r = {\n source: src.getLiteralValue(),\n flags: fl && Node.isStringLiteral(fl) ? fl.getLiteralValue() : '',\n };\n if (r.source.length <= 400) regexes.set(`${r.source}/${r.flags}`, r);\n }\n } else if (Node.isPropertyAccessExpression(node)) {\n // Property names the code reads (`options.min`): keys for untyped objects.\n const name = node.getName();\n if (name.length <= 32 && !BUILTIN_MEMBERS.has(name)) keys.add(name);\n } else if (Node.isBindingElement(node)) {\n const prop = node.getPropertyNameNode()?.getText() ?? node.getName();\n if (/^[A-Za-z_$][\\w$]*$/.test(prop) && prop.length <= 32) keys.add(prop);\n } else if (\n Node.isBinaryExpression(node) &&\n COMPARISON_OPERATORS.has(node.getOperatorToken().getKind())\n ) {\n for (const side of [node.getLeft(), node.getRight()]) {\n const v = numericValue(side);\n if (v !== undefined && Number.isFinite(v)) thresholds.add(v);\n }\n }\n });\n }\n\n const numbers = new Set<number>(NUMBER_BOUNDARIES);\n for (const v of [...literals, ...thresholds]) {\n for (const n of [v, -v, v + 1, v - 1, round(v + 0.01), round(v - 0.01), v * 10, v / 10]) {\n if (Number.isFinite(n)) numbers.add(n);\n }\n }\n for (const t of thresholds) {\n // The nearest representable doubles around a decision boundary.\n numbers.add(nextAfter(t, Infinity));\n numbers.add(nextAfter(t, -Infinity));\n }\n\n const strs = new Set<string>(STRING_BOUNDARIES);\n for (const s of strings) {\n for (const v of [s, ` ${s} `, s.toUpperCase(), s.toLowerCase(), s + s, s.slice(0, 1)]) strs.add(v);\n }\n\n return {\n numbers: [...numbers].slice(0, MAX_MINED),\n thresholds: [...thresholds].sort((a, b) => a - b),\n strings: [...strs].slice(0, MAX_MINED),\n keys: [...keys].slice(0, 40),\n fragments: [...strings].filter((x) => x.length > 0 && x.length <= 12).slice(0, 60),\n regexes: [...regexes.values()].slice(0, 20),\n };\n}\n\n/** Members of built-ins that say nothing about the shape of inputs. */\nconst BUILTIN_MEMBERS = new Set([\n 'length',\n 'push',\n 'pop',\n 'shift',\n 'unshift',\n 'slice',\n 'splice',\n 'map',\n 'filter',\n 'reduce',\n 'forEach',\n 'some',\n 'every',\n 'find',\n 'findIndex',\n 'includes',\n 'indexOf',\n 'join',\n 'split',\n 'replace',\n 'replaceAll',\n 'trim',\n 'trimStart',\n 'trimEnd',\n 'toLowerCase',\n 'toUpperCase',\n 'startsWith',\n 'endsWith',\n 'charAt',\n 'charCodeAt',\n 'codePointAt',\n 'substring',\n 'substr',\n 'concat',\n 'match',\n 'test',\n 'exec',\n 'keys',\n 'values',\n 'entries',\n 'assign',\n 'freeze',\n 'isArray',\n 'isInteger',\n 'isNaN',\n 'isFinite',\n 'floor',\n 'ceil',\n 'round',\n 'abs',\n 'min',\n 'max',\n 'pow',\n 'sqrt',\n 'toString',\n 'toFixed',\n 'valueOf',\n 'call',\n 'apply',\n 'bind',\n 'prototype',\n 'hasOwnProperty',\n 'get',\n 'set',\n 'has',\n 'add',\n 'delete',\n 'size',\n 'then',\n 'catch',\n 'log',\n 'normalize',\n 'padStart',\n 'padEnd',\n 'repeat',\n 'sort',\n 'reverse',\n 'flat',\n 'flatMap',\n 'fill',\n 'from',\n 'of',\n 'parse',\n 'stringify',\n 'getTime',\n 'now',\n 'create',\n 'defineProperty',\n]);\n\n/** Smallest double strictly after `x` in the direction of `toward`. */\nexport function nextAfter(x: number, toward: number): number {\n if (Number.isNaN(x) || Number.isNaN(toward)) return NaN;\n if (x === toward) return toward;\n if (x === 0) return toward > 0 ? Number.MIN_VALUE : -Number.MIN_VALUE;\n const buf = new DataView(new ArrayBuffer(8));\n buf.setFloat64(0, x);\n let bits = buf.getBigUint64(0);\n bits += toward > x === x > 0 ? 1n : -1n;\n buf.setBigUint64(0, bits);\n return buf.getFloat64(0);\n}\n\nexport function emptyMined(): MinedValues {\n return {\n numbers: [...NUMBER_BOUNDARIES],\n thresholds: [],\n strings: [...STRING_BOUNDARIES],\n keys: [],\n fragments: [],\n regexes: [],\n };\n}\n", "import fc, { type Arbitrary } from 'fast-check';\nimport type { ArbSpec, BinaryCtor, SignatureSpec } from '../types/spec.js';\nimport { FN_TAG, PROTO_TAG, type FnDescriptor, type ProtoDescriptor } from '../runner/tags.js';\nimport { emptyMined, type MinedValues } from './mine.js';\nimport { regexArbitraries } from './regex.js';\n\nexport interface CompileOptions {\n mined?: MinedValues;\n /** Max nesting of recursive types (default 3). */\n maxRecursionDepth?: number;\n /** Max array / collection length (default 8). */\n maxLength?: number;\n /** Relative weight of mined values vs type-driven values, 0..1 (default 0.3). */\n minedWeight?: number;\n}\n\ninterface Ctx {\n mined: MinedValues;\n defs: Map<string, ArbSpec>;\n depth: Map<string, number>;\n maxDepth: number;\n maxLength: number;\n minedWeight: number;\n /** When true, references are not followed (used to build terminating base cases). */\n terminal: boolean;\n}\n\n/** UTF-16 edge cases that random code points almost never hit. */\nconst UTF16_EDGES = [\n '\\uD800',\n '\\uDBFF',\n '\\uDC00',\n '\\uDFFF',\n '\\uD83D\\uDE00',\n '\\u0301',\n '\\u200B',\n '\\uFEFF',\n 'a',\n '\u00E9',\n];\n\n/** Structural fragments common in paths, URLs, queries and formats. */\nconst STRUCTURAL_FRAGMENTS = [\n '/',\n '//',\n '?',\n '#',\n '&',\n '=',\n ':',\n '.',\n '..',\n '-',\n '_',\n ' ',\n 'a',\n 'b',\n '1',\n '%20',\n '@',\n ',',\n];\n\nconst INTERESTING_CHARS = [\n ' ',\n '-',\n '_',\n '.',\n '/',\n 'a',\n 'Z',\n '0',\n '9',\n '\u00E9',\n '\u00DF',\n '\u0130',\n '\uD83D\uDE00',\n '\\t',\n '\u00A0',\n '&',\n \"'\",\n];\n\nconst SPECIAL_DATES = [\n new Date(0),\n new Date('2024-02-29T00:00:00.000Z'),\n new Date('2024-12-31T23:59:59.999Z'),\n new Date('2025-03-30T01:30:00.000Z'),\n new Date('2025-10-26T00:59:59.000Z'),\n new Date('1999-12-31T23:59:59.000Z'),\n new Date(NaN),\n];\n\nfunction weighted(typeDriven: Arbitrary<unknown>, mined: readonly unknown[], ctx: Ctx): Arbitrary<unknown> {\n if (mined.length === 0 || ctx.minedWeight <= 0) return typeDriven;\n const w = Math.round(ctx.minedWeight * 100);\n return fc.oneof(\n { arbitrary: typeDriven, weight: 100 - w },\n { arbitrary: fc.constantFrom(...mined), weight: w },\n );\n}\n\nfunction numberArb(ctx: Ctx): Arbitrary<unknown> {\n // Mostly realistic magnitudes; the full double range (NaN, \u00B1Infinity, 1e308, 5e-324) stays in the mix.\n const typeDriven = fc.oneof(\n { arbitrary: fc.integer({ min: -1000, max: 1000 }), weight: 4 },\n { arbitrary: fc.integer({ min: -100_000_000, max: 100_000_000 }).map((n) => n / 100), weight: 4 },\n { arbitrary: fc.double(), weight: 2 },\n );\n return weighted(typeDriven, ctx.mined.numbers, ctx);\n}\n\n/** Values that make loops and allocations explode; rare for size-like parameters. */\nconst HUGE_SIZES = [2 ** 31 - 1, 2 ** 32, Number.MAX_SAFE_INTEGER, 1e15, Infinity, -Infinity, NaN];\n\n/**\n * Counts, lengths, indexes and loop bounds: mostly small non-negative integers and values from the code, its tests\n * and call sites; some negatives and non-integers (validation); huge values and NaN/Infinity only rarely (~1.5%).\n */\nfunction sizeArb(ctx: Ctx): Arbitrary<unknown> {\n const typeDriven = fc.oneof(\n { arbitrary: fc.integer({ min: 0, max: 10 }), weight: 40 },\n { arbitrary: fc.integer({ min: 0, max: 100 }), weight: 25 },\n { arbitrary: fc.integer({ min: 0, max: 1000 }), weight: 8 },\n { arbitrary: fc.constantFrom(-1, -2, -10), weight: 3 },\n { arbitrary: fc.constantFrom(0.5, 1.5, 2.25), weight: 2 },\n { arbitrary: fc.constantFrom(...HUGE_SIZES), weight: 1 },\n );\n // Values from the code, its tests and call sites, at most 1,000: the pool is shared by all parameters, and a\n // price of 9000 is not a realistic count of people.\n const mined = ctx.mined.numbers.filter((n) => Number.isInteger(n) && n >= -10 && n <= 1000);\n return weighted(typeDriven, mined, ctx);\n}\n\nconst regexCache = new WeakMap<object, Arbitrary<string>[]>();\n\nconst sampleCache = new WeakMap<object, string[]>();\n\n/** A few short strings per code regex, as fragments: composed strings then contain format-shaped words. */\nfunction regexSamples(arbs: Arbitrary<string>[]): string[] {\n let out = sampleCache.get(arbs);\n if (!out) {\n out = [];\n arbs.forEach((arb, i) => {\n try {\n out!.push(\n ...fc\n .sample(arb, { numRuns: 6, seed: 7 + i })\n .filter((x) => x.length > 0 && x.length <= 12)\n .slice(0, 3),\n );\n } catch {\n /* skip */\n }\n });\n sampleCache.set(arbs, out);\n }\n return out;\n}\n\nfunction stringArb(ctx: Ctx): Arbitrary<unknown> {\n // Strings in the formats the code parses (its own regex literals), when there are any.\n let fromRegexes = regexCache.get(ctx.mined.regexes);\n if (!fromRegexes) {\n fromRegexes = regexArbitraries(ctx.mined.regexes);\n regexCache.set(ctx.mined.regexes, fromRegexes);\n }\n // Strings composed from a small shared pool of fragments (mined literals + structural characters): two\n // independently generated arguments then often share prefixes/suffixes, as paths and URLs do in real calls.\n const fragments = [\n ...new Set([...ctx.mined.fragments, ...STRUCTURAL_FRAGMENTS, ...regexSamples(fromRegexes)]),\n ];\n const composed = fc\n .array(fc.constantFrom(...fragments), { minLength: 1, maxLength: 5 })\n .map((xs) => xs.join(''));\n const typeDriven = fc.oneof(\n { arbitrary: fc.string({ maxLength: 16 }), weight: 3 },\n { arbitrary: fc.string({ unit: fc.constantFrom(...INTERESTING_CHARS), maxLength: 12 }), weight: 2 },\n { arbitrary: composed, weight: 3 },\n { arbitrary: fc.string({ unit: 'grapheme', maxLength: 8 }), weight: 1 },\n // UTF-16 edge cases: lone high/low surrogates, a valid pair, combining marks, zero-width and BOM.\n {\n arbitrary: fc.string({ unit: fc.constantFrom(...UTF16_EDGES), minLength: 1, maxLength: 6 }),\n weight: 1,\n },\n ...(fromRegexes.length > 0 ? [{ arbitrary: fc.oneof(...fromRegexes), weight: 3 }] : []),\n ...(ctx.mined.distinguishing?.length\n ? [{ arbitrary: fc.constantFrom(...ctx.mined.distinguishing), weight: 3 }]\n : []),\n );\n return weighted(typeDriven, ctx.mined.strings, ctx);\n}\n\nfunction dateArb(ctx: Ctx): Arbitrary<unknown> {\n const typeDriven = fc.date({\n min: new Date('1900-01-01T00:00:00.000Z'),\n max: new Date('2200-01-01T00:00:00.000Z'),\n noInvalidDate: true,\n });\n return weighted(typeDriven, SPECIAL_DATES, { ...ctx, minedWeight: 0.2 });\n}\n\nconst TYPED_ARRAYS = {\n Uint8Array,\n Uint8ClampedArray,\n Int8Array,\n Uint16Array,\n Int16Array,\n Uint32Array,\n Int32Array,\n Float32Array,\n Float64Array,\n BigInt64Array,\n BigUint64Array,\n} as const;\n\n/**\n * Typed arrays, ArrayBuffers and DataViews. Views are often windows into a larger buffer (non-zero `byteOffset`,\n * shorter `byteLength`): code that copies `view.buffer` without the window is a classic bug.\n */\nfunction binaryArb(ctor: BinaryCtor, ctx: Ctx): Arbitrary<unknown> {\n const max = Math.max(1, ctx.maxLength);\n const bytes = fc.uint8Array({ maxLength: max * 2 });\n if (ctor === 'ArrayBuffer')\n return bytes.map((b) => b.buffer.slice(b.byteOffset, b.byteOffset + b.byteLength));\n if (ctor === 'DataView') {\n return fc\n .tuple(fc.uint8Array({ minLength: 0, maxLength: max * 2 }), fc.noBias(fc.nat(4)), fc.noBias(fc.nat(4)))\n .map(([b, before, after]) => {\n const buf = new Uint8Array(before + b.length + after);\n buf.set(b, before);\n return new DataView(buf.buffer, before, b.length);\n });\n }\n const Ctor = TYPED_ARRAYS[ctor];\n const size = Ctor.BYTES_PER_ELEMENT;\n return fc\n .tuple(\n fc.nat(max),\n fc.noBias(fc.nat(2)),\n fc.noBias(fc.nat(2)),\n fc.uint8Array({ minLength: max * size, maxLength: max * size }),\n )\n .map(([len, before, after, raw]) => {\n // Elements from random bytes (covers NaN/negative values), viewed through a window of a larger buffer.\n const buf = new ArrayBuffer((before + len + after) * size);\n new Uint8Array(buf, before * size, len * size).set(raw.subarray(0, len * size));\n return new Ctor(buf, before * size, len);\n });\n}\n\n/**\n * Objects with enumerable properties on their prototype (`Object.create({ inherited: 1 })`): `for...in` sees them,\n * `Object.keys` does not. Sent to the runner as a descriptor (structured clone drops prototypes).\n */\nfunction protoObjectArb(key: Arbitrary<string>, value: Arbitrary<unknown>): Arbitrary<unknown> {\n const dict = (min: number) =>\n fc.dictionary(key, value, { minKeys: min, maxKeys: 3, noNullPrototype: true });\n return fc.tuple(dict(1), dict(0)).map(([proto, own]): ProtoDescriptor => ({ [PROTO_TAG]: { proto, own } }));\n}\n\n/** Rarer object kinds that untyped code handles specially: binary data and objects with inherited properties. */\nfunction zooArb(ctx: Ctx, key: Arbitrary<string>, value: Arbitrary<unknown>): Arbitrary<unknown> {\n return fc.oneof(\n binaryArb('Uint8Array', ctx),\n binaryArb('Float64Array', ctx),\n binaryArb('ArrayBuffer', ctx),\n binaryArb('DataView', ctx),\n protoObjectArb(key, value),\n );\n}\n\nfunction anythingArb(ctx: Ctx): Arbitrary<unknown> {\n // Untyped parameters (`any`, plain JS): objects use the property names the code reads as keys, and leaves\n // reuse the number/string generators (with mined values).\n const key =\n ctx.mined.keys.length > 0\n ? fc.oneof(fc.constantFrom(...ctx.mined.keys), fc.string({ maxLength: 6 }))\n : fc.string({ maxLength: 6 });\n const leaves = [numberArb(ctx), stringArb(ctx), fc.boolean(), fc.constant(undefined), fc.constant(null)];\n const shaped = fc.anything({\n maxDepth: 2,\n maxKeys: 4,\n key,\n values: leaves,\n withDate: true,\n withMap: false,\n withSet: false,\n });\n const anything = fc.anything({\n maxDepth: 2,\n maxKeys: 4,\n withBigInt: true,\n withDate: true,\n withMap: true,\n withSet: true,\n withTypedArray: false,\n withSparseArray: false,\n withNullPrototype: false,\n withBoxedValues: false,\n withObjectString: false,\n });\n const leaf = fc.oneof(numberArb(ctx), stringArb(ctx), fc.boolean());\n const mixed = fc.oneof(\n { arbitrary: anything, weight: 4 },\n { arbitrary: shaped, weight: 6 },\n { arbitrary: numberArb(ctx), weight: 4 },\n { arbitrary: stringArb(ctx), weight: 4 },\n { arbitrary: zooArb(ctx, key, leaf), weight: 2 },\n );\n return weighted(mixed, [...ctx.mined.numbers.slice(0, 20), ...ctx.mined.strings.slice(0, 20)], ctx);\n}\n\nfunction compile(spec: ArbSpec, ctx: Ctx): Arbitrary<unknown> | null {\n switch (spec.kind) {\n case 'number':\n return spec.size ? sizeArb(ctx) : numberArb(ctx);\n case 'bigint':\n return fc.oneof(fc.bigInt({ min: -1000n, max: 1000n }), fc.bigInt());\n case 'string':\n return stringArb(ctx);\n case 'boolean':\n return fc.boolean();\n case 'undefined':\n return fc.constant(undefined);\n case 'null':\n return fc.constant(null);\n case 'literal':\n return fc.constant(spec.value);\n case 'bigintLiteral':\n return fc.constant(BigInt(spec.value));\n case 'union': {\n const options = spec.options\n .map((o) => compile(o, ctx))\n .filter((a): a is Arbitrary<unknown> => a !== null);\n if (options.length === 0) return null;\n return options.length === 1 ? options[0]! : fc.oneof(...options);\n }\n case 'array': {\n const items = compile(spec.items, ctx);\n if (!items) return fc.constant([]);\n return ctx.terminal ? fc.constant([]) : fc.array(items, { maxLength: ctx.maxLength });\n }\n case 'tuple': {\n const items = spec.items.map((i) => compile(i, ctx));\n if (items.some((i) => i === null)) return null;\n const fixed = fc.tuple(...(items as Arbitrary<unknown>[]));\n const restArb = spec.rest ? compile(spec.rest, ctx) : null;\n const withRest: Arbitrary<unknown[]> = restArb\n ? fc\n .tuple(fixed, fc.array(restArb, { maxLength: Math.min(4, ctx.maxLength) }))\n .map(([f, r]) => [...f, ...r])\n : fixed;\n if (spec.optionalFrom === undefined) return withRest;\n const min = spec.optionalFrom;\n return fc\n .tuple(withRest, fc.integer({ min, max: spec.items.length }))\n .map(([vals, len]) => (len < spec.items.length ? vals.slice(0, len) : vals));\n }\n case 'object': {\n const model: Record<string, Arbitrary<unknown>> = {};\n const required: string[] = [];\n for (const p of spec.props) {\n const a = compile(p.spec, ctx);\n if (!a) {\n if (p.optional) continue;\n return null;\n }\n model[p.name] = a;\n if (!p.optional) required.push(p.name);\n }\n return fc.record(model, { requiredKeys: required, noNullPrototype: true });\n }\n case 'record': {\n const values = compile(spec.values, ctx);\n if (!values || ctx.terminal) return fc.constant({});\n const key =\n spec.key === 'number'\n ? fc.integer({ min: 0, max: 99 }).map(String)\n : fc.string({ maxLength: 8 }).filter((k) => k !== '__proto__');\n return fc.dictionary(key, values, { maxKeys: Math.min(5, ctx.maxLength), noNullPrototype: true });\n }\n case 'date':\n return dateArb(ctx);\n case 'binary':\n return binaryArb(spec.ctor, ctx);\n case 'map': {\n const k = compile(spec.key, ctx);\n const v = compile(spec.value, ctx);\n if (!k || !v || ctx.terminal) return fc.constant(new Map());\n return fc.array(fc.tuple(k, v), { maxLength: Math.min(5, ctx.maxLength) }).map((es) => new Map(es));\n }\n case 'set': {\n const i = compile(spec.items, ctx);\n if (!i || ctx.terminal) return fc.constant(new Set());\n return fc.array(i, { maxLength: Math.min(5, ctx.maxLength) }).map((xs) => new Set(xs));\n }\n case 'function': {\n const ret = compile(spec.returns, ctx) ?? fc.constant(undefined);\n return ret.map((v): FnDescriptor => ({ [FN_TAG]: { returns: v, async: spec.async } }));\n }\n case 'recursive': {\n ctx.defs.set(spec.id, spec.spec);\n return compileRef(spec.id, ctx);\n }\n case 'ref':\n return compileRef(spec.id, ctx);\n case 'anything':\n return anythingArb(ctx);\n case 'unsupported':\n return null;\n }\n}\n\nfunction compileRef(id: string, ctx: Ctx): Arbitrary<unknown> | null {\n const def = ctx.defs.get(id);\n if (!def) return null;\n const d = ctx.depth.get(id) ?? 0;\n if (ctx.terminal) return null;\n if (d >= ctx.maxDepth) return compile(def, { ...ctx, terminal: true });\n ctx.depth.set(id, d + 1);\n try {\n return compile(def, ctx);\n } finally {\n ctx.depth.set(id, d);\n }\n}\n\nfunction makeCtx(options: CompileOptions): Ctx {\n return {\n mined: options.mined ?? emptyMined(),\n defs: new Map(),\n depth: new Map(),\n maxDepth: options.maxRecursionDepth ?? 3,\n maxLength: options.maxLength ?? 8,\n minedWeight: options.minedWeight ?? 0.3,\n terminal: false,\n };\n}\n\n/** Compile a single spec. Returns null if the spec cannot produce any value. */\nexport function compileSpec(spec: ArbSpec, options: CompileOptions = {}): Arbitrary<unknown> | null {\n return compile(spec, makeCtx(options));\n}\n\n/** Compile a signature into an arbitrary of argument lists. */\nexport function compileSignature(\n sig: SignatureSpec,\n options: CompileOptions = {},\n): Arbitrary<unknown[]> | null {\n const ctx = makeCtx(options);\n const fixed: Arbitrary<unknown>[] = [];\n let rest: Arbitrary<unknown> | null = null;\n for (const p of sig.params) {\n const a = compile(p.spec, ctx);\n if (p.rest) {\n rest = a;\n continue;\n }\n if (!a) {\n if (p.optional) {\n fixed.push(fc.constant(undefined));\n continue;\n }\n return null;\n }\n fixed.push(a);\n }\n const base: Arbitrary<unknown[]> = fc.tuple(...fixed);\n if (!rest) return base;\n return fc.tuple(base, fc.array(rest, { maxLength: 4 })).map(([f, r]) => [...f, ...r]);\n}\n", "import fc, { type Arbitrary } from 'fast-check';\n\n/** A regular expression found in the code under test (serializable). */\nexport interface MinedRegex {\n source: string;\n flags: string;\n}\n\n/**\n * Remove lookaround groups `(?=\u2026)`, `(?!\u2026)`, `(?<=\u2026)`, `(?<!\u2026)` (unsupported by fast-check's stringMatching).\n * The result describes a superset-ish shape of the original, which is what we want: inputs in the right format,\n * including near misses.\n */\nexport function stripLookarounds(source: string): string {\n let out = '';\n for (let i = 0; i < source.length; i++) {\n const c = source[i]!;\n if (c === '\\\\') {\n out += c + (source[i + 1] ?? '');\n i++;\n continue;\n }\n if (c === '(' && /^\\(\\?<?[=!]/.test(source.slice(i, i + 4))) {\n let depth = 0;\n let inClass = false;\n for (; i < source.length; i++) {\n const d = source[i]!;\n if (d === '\\\\') {\n i++;\n continue;\n }\n if (inClass) {\n if (d === ']') inClass = false;\n continue;\n }\n if (d === '[') inClass = true;\n else if (d === '(') depth++;\n else if (d === ')' && --depth === 0) break;\n }\n continue;\n }\n out += c;\n }\n return out;\n}\n\n/**\n * Replace backreferences (`\\\\3`) with a copy of the group they refer to (`(?:-?)`): fast-check cannot generate\n * backreferences. The copy matches a superset of what the backreference matches; that is fine for generating\n * inputs in the right format (the real regex still decides).\n */\nexport function inlineBackreferences(source: string): string {\n const groups: string[] = [];\n // Open groups: index into `groups` (-1 for non-capturing) and start position.\n const open: { idx: number; start: number }[] = [];\n let inClass = false;\n for (let i = 0; i < source.length; i++) {\n const c = source[i]!;\n if (c === '\\\\') {\n i++;\n continue;\n }\n if (inClass) {\n if (c === ']') inClass = false;\n continue;\n }\n if (c === '[') inClass = true;\n else if (c === '(') {\n const capturing = source[i + 1] !== '?' || /^\\(\\?<[A-Za-z_$]/.test(source.slice(i, i + 4));\n open.push({ idx: capturing ? groups.push('') - 1 : -1, start: i });\n } else if (c === ')') {\n const g = open.pop();\n if (g && g.idx >= 0) groups[g.idx] = source.slice(g.start, i + 1);\n }\n }\n if (groups.length === 0 || !/\\\\[1-9]/.test(source)) return source;\n let out = '';\n inClass = false;\n for (let i = 0; i < source.length; i++) {\n const c = source[i]!;\n if (c === '\\\\') {\n const m = /^[1-9]\\d*/.exec(source.slice(i + 1));\n const n = m ? Number(m[0]) : 0;\n if (!inClass && m && n <= groups.length) {\n // Drop capturing/named-ness: `(?<x>a)` / `(a)` become `(?:a)`.\n const g = groups[n - 1]!.replace(/^\\((?:\\?<[A-Za-z_$][\\w$]*>)?/, '(?:');\n out += g.includes('\\\\') && /\\\\[1-9]/.test(g) ? '(?:)' : g;\n i += m[0].length;\n continue;\n }\n out += c + (source[i + 1] ?? '');\n i++;\n continue;\n }\n if (inClass) {\n if (c === ']') inClass = false;\n } else if (c === '[') inClass = true;\n out += c;\n }\n return out;\n}\n\n/** Readable stand-ins for common Unicode property classes (generation only; the real regex still decides). */\nconst PROPERTY_CLASSES: [RegExp, string][] = [\n [/^(?:L|Letter|Alphabetic|Alpha|ID_Start|ID_Continue)$/, 'a-zA-Z\\\\u00e9\\\\u00df\\\\u0130'],\n [/^(?:Lu|Uppercase_Letter|Uppercase|Upper)$/, 'A-Z\\\\u00c9\\\\u0130'],\n [/^(?:Ll|Lowercase_Letter|Lowercase|Lower)$/, 'a-z\\\\u00e9\\\\u00df'],\n [/^(?:N|Nd|Number|Decimal_Number|digit)$/, '0-9'],\n [/^(?:P|Punctuation|Po)$/, '.,!?;:\\\\-'],\n [/^(?:Z|Zs|White_Space|Space_Separator)$/, ' '],\n [/^(?:M|Mark|Mn)$/, '\\\\u0301'],\n];\n\n/**\n * Replace `\\p{Alphabetic}`, `\\p{Lu}`, \u2026 with small readable classes. fast-check generates from the full Unicode\n * class, which yields mostly unassigned astral code points: valid, but nothing like real input.\n */\nexport function approximateProperties(source: string): string {\n let out = '';\n let inClass = false;\n for (let i = 0; i < source.length; i++) {\n const c = source[i]!;\n if (c === '\\\\') {\n const m = /^([pP])\\{([^}]+)\\}/.exec(source.slice(i + 1));\n const name = m?.[2]?.replace(/^(?:General_Category|gc|Script|sc)=/, '');\n const cls = name ? PROPERTY_CLASSES.find(([re]) => re.test(name))?.[1] : undefined;\n if (m && cls && !(inClass && m[1] === 'P')) {\n out += inClass ? cls : m[1] === 'p' ? `[${cls}]` : `[^${cls}]`;\n i += m[0].length;\n continue;\n }\n out += c + (source[i + 1] ?? '');\n i++;\n continue;\n }\n if (inClass) {\n if (c === ']') inClass = false;\n } else if (c === '[') inClass = true;\n out += c;\n }\n return out;\n}\n\n/** Arbitraries generating strings that match regexes from the code (skipping ones fast-check cannot handle). */\nexport function regexArbitraries(regexes: readonly MinedRegex[]): Arbitrary<string>[] {\n const out: Arbitrary<string>[] = [];\n for (const r of regexes) {\n try {\n const flags = r.flags.replace(/[gyi]/g, '');\n const re = new RegExp(approximateProperties(stripLookarounds(inlineBackreferences(r.source))), flags);\n const arb = fc.stringMatching(re, { size: 'small' });\n // Probe once: some patterns construct fine but fail on generation.\n fc.sample(arb, { numRuns: 3, seed: 1 });\n out.push(arb);\n } catch {\n /* unsupported pattern: skip */\n }\n }\n return out;\n}\n\nconst MUTATION_CHARS = [...'0123456789aZ-_. /:'];\n\nfunction testable(r: MinedRegex): RegExp | undefined {\n try {\n return new RegExp(r.source, r.flags.replace(/[gy]/g, ''));\n } catch {\n return undefined;\n }\n}\n\n/**\n * Strings that the regexes of one version classify differently from the regexes of the other version. When a fix\n * changes a regex (`3([0-5]\\d|6[1-6])` to `3([0-5]\\d|6[0-6])`), random strings in the format almost never land\n * on the few inputs where the two disagree; sampling both regexes and keeping the strings where they disagree\n * finds them directly. Only regexes that differ between the versions take part.\n */\nexport function regexDiffStrings(\n base: readonly MinedRegex[],\n head: readonly MinedRegex[],\n options: { samples?: number; seed?: number; max?: number } = {},\n): string[] {\n const key = (r: MinedRegex) => `${r.source}/${r.flags}`;\n const headKeys = new Set(head.map(key));\n const baseKeys = new Set(base.map(key));\n const oldOnly = base.filter((r) => !headKeys.has(key(r)));\n const newOnly = head.filter((r) => !baseKeys.has(key(r)));\n if (oldOnly.length === 0 || newOnly.length === 0) return [];\n const oldRes = oldOnly.map(testable).filter((r): r is RegExp => !!r);\n const newRes = newOnly.map(testable).filter((r): r is RegExp => !!r);\n if (oldRes.length === 0 || newRes.length === 0) return [];\n const verdict = (res: RegExp[], s: string) => res.map((r) => r.test(s)).join();\n // Pairwise when the counts match (the usual case: each changed regex has one counterpart), otherwise \"any\".\n const differs = (s: string) =>\n oldRes.length === newRes.length\n ? verdict(oldRes, s) !== verdict(newRes, s)\n : oldRes.some((r) => r.test(s)) !== newRes.some((r) => r.test(s));\n const max = options.max ?? 30;\n const samples = options.samples ?? 400;\n const out = new Set<string>();\n const arbs = regexArbitraries([...oldOnly, ...newOnly]);\n arbs.forEach((arb, i) => {\n let xs: string[];\n try {\n xs = fc.sample(arb, { numRuns: samples, seed: (options.seed ?? 1) + i });\n } catch {\n return;\n }\n for (const s of xs) if (differs(s)) out.add(s);\n // Local search: the disagreement is usually one character away from a sample (\"2009-361\" -> \"2009-360\").\n for (const s of xs.slice(0, 120)) {\n if (s.length > 40 || out.size >= max * 4) break;\n const alphabet = [...new Set([...MUTATION_CHARS, ...s])];\n for (let p = 0; p < s.length; p++) {\n for (const ch of alphabet) {\n if (ch === s[p]) continue;\n const v = s.slice(0, p) + ch + s.slice(p + 1);\n if (differs(v)) out.add(v);\n }\n }\n }\n });\n return [...out].sort((a, b) => a.length - b.length || (a < b ? -1 : 1)).slice(0, max);\n}\n", "import { Node, SyntaxKind, type SourceFile, type VariableDeclaration } from 'ts-morph';\nimport type { FunctionLikeNode } from '../types/fromType.js';\n\nexport type LocateResult =\n | { ok: true; node: FunctionLikeNode | VariableDeclaration; declaration: Node; callable?: boolean }\n | { ok: false; reason: string; missing?: boolean };\n\nfunction unwrapExpression(node: Node | undefined): Node | undefined {\n let cur = node;\n while (\n cur &&\n (Node.isParenthesizedExpression(cur) ||\n Node.isAsExpression(cur) ||\n Node.isSatisfiesExpression(cur) ||\n Node.isTypeAssertion(cur) ||\n Node.isNonNullExpression(cur))\n ) {\n cur = cur.getExpression();\n }\n return cur;\n}\n\n/** Resolve a declaration node to the function-like node that implements it, or a skip reason. */\nexport function asFunctionLike(decl: Node): LocateResult {\n if (Node.isFunctionDeclaration(decl)) {\n if (decl.isGenerator()) return { ok: false, reason: 'generator function' };\n if (decl.getOverloads().length > 0) return { ok: false, reason: 'overloaded function' };\n if (!decl.hasBody()) return { ok: false, reason: 'declaration without body' };\n return { ok: true, node: decl, declaration: decl };\n }\n if (Node.isVariableDeclaration(decl)) {\n const init = unwrapExpression(decl.getInitializer());\n if (init && (Node.isArrowFunction(init) || Node.isFunctionExpression(init))) {\n if (Node.isFunctionExpression(init) && init.isGenerator())\n return { ok: false, reason: 'generator function' };\n return { ok: true, node: init, declaration: decl };\n }\n // A value whose type is callable, e.g. `export const defu = createDefu()` or `export const f = memoize(g)`.\n try {\n const sigs = decl.getType().getCallSignatures();\n if (sigs.length === 1 && decl.getType().getConstructSignatures().length === 0) {\n return { ok: true, node: decl, declaration: decl, callable: true };\n }\n if (sigs.length > 1) return { ok: false, reason: 'callable value with overloaded signatures' };\n } catch {\n /* fall through */\n }\n return { ok: false, reason: 'not a function (exported value)' };\n }\n if (Node.isClassDeclaration(decl))\n return { ok: false, reason: 'class (class methods are out of scope in v1)' };\n if (\n Node.isInterfaceDeclaration(decl) ||\n Node.isTypeAliasDeclaration(decl) ||\n Node.isEnumDeclaration(decl)\n ) {\n return { ok: false, reason: 'type-only export' };\n }\n if (Node.isExportAssignment(decl)) {\n const expr = unwrapExpression(decl.getExpression());\n if (expr && (Node.isArrowFunction(expr) || Node.isFunctionExpression(expr))) {\n return { ok: true, node: expr, declaration: decl };\n }\n return { ok: false, reason: 'default export is not a function' };\n }\n if (Node.isArrowFunction(decl) || Node.isFunctionExpression(decl)) {\n return { ok: true, node: decl, declaration: decl };\n }\n return { ok: false, reason: `unsupported declaration kind (${decl.getKindName()})` };\n}\n\n/** Find an exported function by export name (follows re-exports). */\nexport function findExportedFunction(sf: SourceFile, exportName: string): LocateResult {\n const decls = sf.getExportedDeclarations().get(exportName);\n if (!decls || decls.length === 0)\n return { ok: false, reason: `no export named \\`${exportName}\\``, missing: true };\n const funcs = decls.filter((d) => !Node.isInterfaceDeclaration(d) && !Node.isTypeAliasDeclaration(d));\n if (funcs.length === 0) return { ok: false, reason: 'type-only export' };\n return asFunctionLike(funcs[0]!);\n}\n\n/** Uses of `this` or `arguments` inside a function body (not nested functions). */\nexport function usesThis(fn: FunctionLikeNode | VariableDeclaration): boolean {\n if (Node.isArrowFunction(fn) || Node.isVariableDeclaration(fn)) return false;\n return fn\n .getDescendantsOfKind(SyntaxKind.ThisKeyword)\n .some((t) => t.getFirstAncestor((a) => Node.isFunctionLikeDeclaration(a)) === fn);\n}\n\n/**\n * Top-level functions in the same file reachable from `fn` through identifier references,\n * up to `depth` hops. Used for literal mining (and for transitive impact in change detection).\n */\nexport function reachableLocalFunctions(fn: Node, depth: number): Node[] {\n const sf = fn.getSourceFile();\n const result = new Set<Node>();\n let frontier: Node[] = [fn];\n for (let d = 0; d < depth && frontier.length > 0; d++) {\n const next: Node[] = [];\n for (const node of frontier) {\n for (const id of node.getDescendantsOfKind(SyntaxKind.Identifier)) {\n const sym = id.getSymbol();\n for (const decl of sym?.getDeclarations() ?? []) {\n if (decl.getSourceFile() !== sf) continue;\n const loc = asFunctionLike(decl);\n if (!loc.ok || loc.node === fn || result.has(loc.node)) continue;\n // Only module-level declarations.\n if (loc.declaration.getFirstAncestor((a) => Node.isFunctionLikeDeclaration(a))) continue;\n result.add(loc.node);\n next.push(loc.node);\n }\n }\n }\n frontier = next;\n }\n return [...result];\n}\n\n/**\n * Declarations of module-level constants (in the same file) that `nodes` reference and that are not functions:\n * `const iso8601 = /^.../`, `const UNITS = { ms: 1, s: 1000 }`. Their literals describe the inputs the code expects.\n */\nexport function referencedModuleValues(nodes: Node[]): Node[] {\n const result = new Set<Node>();\n for (const node of nodes) {\n const sf = node.getSourceFile();\n for (const id of node.getDescendantsOfKind(SyntaxKind.Identifier)) {\n for (const decl of id.getSymbol()?.getDeclarations() ?? []) {\n if (decl.getSourceFile() !== sf || !Node.isVariableDeclaration(decl)) continue;\n if (decl.getFirstAncestor((a) => Node.isFunctionLikeDeclaration(a))) continue;\n const init = decl.getInitializer();\n if (!init || Node.isArrowFunction(init) || Node.isFunctionExpression(init) || result.has(decl))\n continue;\n if (init.getText().length > 20_000) continue;\n // The declaration, not the initializer: miners visit descendants, and a bare literal has none.\n result.add(decl);\n }\n }\n }\n return [...result];\n}\n", "import { Node, SyntaxKind } from 'ts-morph';\n\n/**\n * Size-like parameters: counts, lengths, indexes and loop bounds. Code that loops `n` times or allocates `n`\n * elements is slow (or hangs) for n = 1e15, which says nothing about its behavior; such parameters are generated\n * mostly in realistic ranges (see `sizeArb` in compile.ts), with huge values only as rare edge cases.\n *\n * A parameter is size-like when the code uses it as one, in either version:\n * - loop bound: `i < n` / `n > i` in a `for` or `while` condition\n * - length or count: `new Array(n)`, `Array(n)`, `{ length: n }`, `s.repeat(n)`, `padStart(n)`, `padEnd(n)`\n * - index: `xs[n]`, `xs.at(n)`, `slice(\u2026n\u2026)`, `substring(\u2026)`, `splice(n, \u2026)`\n * directly or through a local variable computed from it (`let remaining = Math.abs(days)`), or when its name says\n * so (`count`, `size`, `length`, `index`, `limit`, `times`, `pageSize`, \u2026).\n */\nconst SIZE_NAME =\n /^(n|k|count|size|length|len|times|limit|index|idx|width|height|depth|pages?|parts|chunks?|rows|cols|columns|steps|retries|attempts|digits|places|precision|decimals|people|items|level|levels)$|(Count|Size|Length|Index|Limit|Width|Height|Depth|Times)$/;\n\nconst LENGTH_CALLS = new Set([\n 'repeat',\n 'padStart',\n 'padEnd',\n 'at',\n 'slice',\n 'substring',\n 'substr',\n 'splice',\n]);\n\nfunction isLoopCondition(node: Node): boolean {\n for (let p: Node | undefined = node.getParent(); p; p = p.getParent()) {\n if (Node.isForStatement(p)) return p.getCondition() !== undefined && isWithin(node, p.getCondition()!);\n if (Node.isWhileStatement(p) || Node.isDoStatement(p)) return isWithin(node, p.getExpression());\n if (Node.isBlock(p) || Node.isFunctionLikeDeclaration(p)) return false;\n }\n return false;\n}\n\nfunction isWithin(node: Node, container: Node): boolean {\n return node.getPos() >= container.getPos() && node.getEnd() <= container.getEnd();\n}\n\nfunction usedAsSize(id: Node): boolean {\n const parent = id.getParent();\n if (!parent) return false;\n if (Node.isBinaryExpression(parent)) {\n const op = parent.getOperatorToken().getKind();\n const comparison =\n op === SyntaxKind.LessThanToken ||\n op === SyntaxKind.LessThanEqualsToken ||\n op === SyntaxKind.GreaterThanToken ||\n op === SyntaxKind.GreaterThanEqualsToken;\n if (comparison && isLoopCondition(parent)) return true;\n }\n if (Node.isElementAccessExpression(parent) && parent.getArgumentExpression() === id) return true;\n if (Node.isPropertyAssignment(parent) && parent.getName() === 'length' && parent.getInitializer() === id)\n return true;\n if (Node.isShorthandPropertyAssignment(parent) && parent.getName() === 'length') return true;\n if ((Node.isCallExpression(parent) || Node.isNewExpression(parent)) && parent.getArguments().includes(id)) {\n const callee = parent.getExpression();\n const name = Node.isPropertyAccessExpression(callee) ? callee.getName() : callee.getText();\n if (name === 'Array' || LENGTH_CALLS.has(name)) return true;\n }\n return false;\n}\n\n/** Names of size-like parameters of `fns` (both versions of a function). Only plain identifier parameters. */\nexport function sizeLikeParams(fns: Node[]): Set<string> {\n const out = new Set<string>();\n for (const fn of fns) {\n if (!(Node.isFunctionDeclaration(fn) || Node.isFunctionExpression(fn) || Node.isArrowFunction(fn)))\n continue;\n const params = fn\n .getParameters()\n .map((p) => p.getNameNode())\n .filter((n) => Node.isIdentifier(n))\n .map((n) => n.getText());\n for (const name of params) {\n if (SIZE_NAME.test(name)) {\n out.add(name);\n continue;\n }\n const body = fn.getBody();\n if (!body) continue;\n const refs = body\n .getDescendantsOfKind(SyntaxKind.Identifier)\n .filter((id) => id.getText() === name)\n .filter((id) => {\n const p = id.getParent();\n return !(Node.isPropertyAccessExpression(p) && p.getNameNode() === id);\n });\n if (refs.some(usedAsSize)) {\n out.add(name);\n continue;\n }\n // One step further: `let remaining = Math.abs(days); while (remaining > 0) \u2026` makes `days` a size.\n for (const decl of body.getDescendantsOfKind(SyntaxKind.VariableDeclaration)) {\n const init = decl.getInitializer();\n const local = decl.getNameNode();\n if (!init || !Node.isIdentifier(local) || !refs.some((r) => isWithin(r, init))) continue;\n const localRefs = body\n .getDescendantsOfKind(SyntaxKind.Identifier)\n .filter((id) => id.getText() === local.getText() && id !== local);\n if (localRefs.some(usedAsSize)) {\n out.add(name);\n break;\n }\n }\n }\n }\n return out;\n}\n", "import { Node, SyntaxKind, ts, type SourceFile } from 'ts-morph';\n\n/** A module-level runtime binding: function, variable, class, enum, import or default export. */\nexport interface TopLevel {\n name: string;\n kind: 'function' | 'variable' | 'class' | 'enum' | 'import' | 'default';\n /** The declaration node (for imports: the import specifier/clause). */\n node: Node;\n /** Normalized source text (comments and formatting removed). */\n normalized: string;\n /** Raw source text. */\n raw: string;\n}\n\nexport interface ModuleIndex {\n sf: SourceFile;\n decls: Map<string, TopLevel>;\n /** Normalized text of top-level statements that are not declarations (module side effects). */\n sideEffects: string[];\n /** Export name \u2192 top-level name declared in this file (re-exports from other files excluded). */\n exports: Map<string, string>;\n}\n\n/**\n * Normalized text of a node: its leaf tokens joined by single spaces. Comments, JSDoc and whitespace are\n * dropped and string literals are compared by value, so formatting-only edits normalize to the same text.\n */\nexport function normalize(node: Node): string {\n const sf = node.getSourceFile().compilerNode;\n const out: string[] = [];\n const walk = (n: ts.Node) => {\n if (ts.isJSDoc(n) || n.kind === ts.SyntaxKind.JSDocComment) return;\n const children = n.getChildren(sf);\n if (children.length === 0) {\n if (ts.isStringLiteral(n) || ts.isNoSubstitutionTemplateLiteral(n)) out.push(JSON.stringify(n.text));\n else if (n.kind !== ts.SyntaxKind.EndOfFileToken) out.push(n.getText(sf));\n return;\n }\n for (const c of children) walk(c);\n };\n walk(node.compilerNode);\n return out.join(' ');\n}\n\nfunction topLevelNameOf(decl: Node): string | undefined {\n if (Node.isFunctionDeclaration(decl) || Node.isClassDeclaration(decl) || Node.isEnumDeclaration(decl)) {\n return decl.getName() ?? 'default';\n }\n if (Node.isVariableDeclaration(decl)) return decl.getName();\n if (Node.isExportAssignment(decl)) return 'default';\n return undefined;\n}\n\n/** Index all top-level runtime bindings of a module. */\nexport function indexModule(sf: SourceFile): ModuleIndex {\n const decls = new Map<string, TopLevel>();\n const sideEffects: string[] = [];\n const cjsExports = new Map<string, string>();\n const cjsStatements: Node[] = [];\n const add = (name: string, kind: TopLevel['kind'], node: Node, printed: Node = node) =>\n decls.set(name, { name, kind, node, normalized: normalize(printed), raw: printed.getText() });\n\n for (const st of sf.getStatements()) {\n if (Node.isFunctionDeclaration(st)) {\n const name = st.getName() ?? 'default';\n // Overloads: keep the implementation, but include all signatures in the normalized text.\n const prev = decls.get(name);\n add(name, 'function', st);\n if (prev && prev.kind === 'function') {\n const cur = decls.get(name)!;\n cur.normalized = prev.normalized + cur.normalized;\n cur.raw = prev.raw + cur.raw;\n }\n } else if (Node.isVariableStatement(st)) {\n for (const d of st.getDeclarations()) {\n const nameNode = d.getNameNode();\n if (Node.isIdentifier(nameNode)) {\n add(d.getName(), 'variable', d);\n } else {\n for (const id of nameNode.getDescendantsOfKind(SyntaxKind.Identifier))\n add(id.getText(), 'variable', d);\n }\n }\n } else if (Node.isClassDeclaration(st)) {\n add(st.getName() ?? 'default', 'class', st);\n } else if (Node.isEnumDeclaration(st)) {\n add(st.getName(), 'enum', st);\n } else if (Node.isImportDeclaration(st)) {\n if (st.isTypeOnly()) continue;\n const spec = st.getModuleSpecifierValue();\n const def = st.getDefaultImport();\n if (def)\n decls.set(def.getText(), {\n name: def.getText(),\n kind: 'import',\n node: st,\n normalized: `import default from ${spec}`,\n raw: `default from ${spec}`,\n });\n const ns = st.getNamespaceImport();\n if (ns)\n decls.set(ns.getText(), {\n name: ns.getText(),\n kind: 'import',\n node: st,\n normalized: `import * from ${spec}`,\n raw: `* from ${spec}`,\n });\n for (const n of st.getNamedImports()) {\n if (n.isTypeOnly()) continue;\n const local = n.getAliasNode()?.getText() ?? n.getName();\n decls.set(local, {\n name: local,\n kind: 'import',\n node: n,\n normalized: `import ${n.getName()} from ${spec}`,\n raw: `${n.getName()} from ${spec}`,\n });\n }\n } else if (Node.isExportAssignment(st)) {\n add('default', 'default', st);\n } else if (isCjsExport(st)) {\n // Handled after the loop: `module.exports = parse` may precede the (hoisted) `function parse`.\n cjsStatements.push(st);\n continue;\n } else if (\n Node.isInterfaceDeclaration(st) ||\n Node.isTypeAliasDeclaration(st) ||\n Node.isExportDeclaration(st) ||\n Node.isModuleDeclaration(st) ||\n Node.isEmptyStatement(st)\n ) {\n continue;\n } else {\n sideEffects.push(normalize(st));\n }\n }\n\n for (const st of cjsStatements) cjsExport(st, decls, cjsExports, add);\n\n const exports = new Map<string, string>(cjsExports);\n for (const [exportName, ds] of sf.getExportedDeclarations()) {\n for (const d of ds) {\n if (d.getSourceFile() !== sf) continue;\n const top = topLevelNameOf(d);\n if (top && decls.has(top)) {\n exports.set(exportName, top);\n break;\n }\n }\n }\n return { sf, decls, sideEffects, exports };\n}\n\nfunction isCjsExport(st: Node): boolean {\n if (!Node.isExpressionStatement(st)) return false;\n const expr = st.getExpression();\n return (\n Node.isBinaryExpression(expr) &&\n expr.getOperatorToken().getKind() === SyntaxKind.EqualsToken &&\n cjsTarget(expr.getLeft()) !== undefined\n );\n}\n\n/** `module.exports` / `exports` target of an assignment's left side: undefined, '' (whole object) or a name. */\nfunction cjsTarget(left: Node): string | undefined {\n const text = left.getText().replace(/\\s+/g, '');\n if (text === 'module.exports') return '';\n const m =\n /^(?:module\\.)?exports\\.([A-Za-z_$][\\w$]*)$/.exec(text) ??\n /^(?:module\\.)?exports\\[['\"]([^'\"]+)['\"]\\]$/.exec(text);\n return m ? m[1] : undefined;\n}\n\n/**\n * Recognize CommonJS export statements. Functions defined inline become synthetic top-level bindings\n * named `exports.<name>` so they can be compared and tested like ESM exports.\n */\nfunction cjsExport(\n st: Node,\n decls: Map<string, TopLevel>,\n exportsMap: Map<string, string>,\n add: (name: string, kind: TopLevel['kind'], node: Node, printed?: Node) => void,\n): boolean {\n if (!Node.isExpressionStatement(st)) return false;\n const expr = st.getExpression();\n if (!Node.isBinaryExpression(expr) || expr.getOperatorToken().getKind() !== SyntaxKind.EqualsToken)\n return false;\n const target = cjsTarget(expr.getLeft());\n if (target === undefined) return false;\n const bind = (exportName: string, value: Node) => {\n if (Node.isIdentifier(value) && decls.has(value.getText())) {\n exportsMap.set(exportName, value.getText());\n return;\n }\n const synthetic = `exports.${exportName}`;\n const isFn = Node.isArrowFunction(value) || Node.isFunctionExpression(value);\n add(synthetic, isFn ? 'function' : 'variable', value);\n exportsMap.set(exportName, synthetic);\n };\n const rhs = expr.getRight();\n if (target !== '') {\n bind(target, rhs);\n return true;\n }\n if (Node.isObjectLiteralExpression(rhs)) {\n for (const prop of rhs.getProperties()) {\n if (Node.isShorthandPropertyAssignment(prop)) bind(prop.getName(), prop.getNameNode());\n else if (Node.isPropertyAssignment(prop))\n bind(prop.getName().replace(/^['\"]|['\"]$/g, ''), prop.getInitializerOrThrow());\n else if (Node.isMethodDeclaration(prop)) {\n add(`exports.${prop.getName()}`, 'variable', prop);\n exportsMap.set(prop.getName(), `exports.${prop.getName()}`);\n }\n }\n return true;\n }\n bind('default', rhs);\n return true;\n}\n\n/** Names whose normalized declaration differs between two module versions (including added/removed). */\nexport function changedTopLevel(base: ModuleIndex | undefined, head: ModuleIndex | undefined): Set<string> {\n const changed = new Set<string>();\n const names = new Set([...(base?.decls.keys() ?? []), ...(head?.decls.keys() ?? [])]);\n for (const n of names) {\n const a = base?.decls.get(n);\n const b = head?.decls.get(n);\n if (!a || !b || a.normalized !== b.normalized) changed.add(n);\n }\n return changed;\n}\n\nexport interface Reach {\n /** Top-level names of this module reachable from the start node, with the path that reached them. */\n local: Map<string, string[]>;\n /** Imported bindings reachable: local name \u2192 resolved declaration (file + top-level name). */\n imported: Map<string, { file: string; name: string; via: string[] }>;\n}\n\n/** References from a node to module-level bindings, followed transitively up to `depth` hops. */\nexport function reach(index: ModuleIndex, start: Node, depth: number): Reach {\n const local = new Map<string, string[]>();\n const imported = new Map<string, { file: string; name: string; via: string[] }>();\n let frontier: { node: Node; path: string[] }[] = [{ node: start, path: [] }];\n for (let d = 0; d < depth && frontier.length > 0; d++) {\n const next: { node: Node; path: string[] }[] = [];\n for (const { node, path } of frontier) {\n for (const id of node.getDescendantsOfKind(SyntaxKind.Identifier)) {\n const name = id.getText();\n const top = index.decls.get(name);\n if (!top || local.has(name) || top.node === start) continue;\n // Make sure the identifier really refers to the module-level binding (not a shadowing local).\n const sym = id.getSymbol();\n const decls = sym?.getDeclarations() ?? [];\n if (sym && !decls.some((dn) => isWithin(dn, top.node))) continue;\n if (top.kind === 'import') {\n const aliased = sym?.isAlias() ? sym.getAliasedSymbol() : undefined;\n for (const ad of aliased?.getDeclarations() ?? []) {\n const target = topLevelNameOf(ad);\n if (target)\n imported.set(name, {\n file: ad.getSourceFile().getFilePath(),\n name: target,\n via: [...path, name],\n });\n }\n local.set(name, [...path, name]);\n continue;\n }\n local.set(name, [...path, name]);\n next.push({ node: top.node, path: [...path, name] });\n }\n }\n frontier = next;\n }\n return { local, imported };\n}\n\nfunction isWithin(node: Node, ancestor: Node): boolean {\n for (let cur: Node | undefined = node; cur; cur = cur.getParent()) if (cur === ancestor) return true;\n return false;\n}\n", "import fc, { type Arbitrary } from 'fast-check';\nimport { xoroshiro128plus } from 'pure-rand/generator/xoroshiro128plus';\nimport { diffOutcome, type CompareOptions, type OutcomeDiff } from '../compare/compare.js';\nimport type { Outcome } from '../compare/observed.js';\nimport { formatArgs, formatOutcome } from '../format/format.js';\nimport { stableKey } from '../util/stableKey.js';\nimport { clusterKey, describeTransition, inputFeatures } from './cluster.js';\nimport { humanize, inputComplexity } from './humanize.js';\nimport type { Realism } from './realism.js';\n\nexport interface PairOutcome {\n base: Outcome;\n head: Outcome;\n}\n\n/**\n * Runs inputs on both versions. Must return outcomes in input order. `timeoutScale` multiplies the per-call timeout\n * (used to re-check suspected timeouts).\n */\nexport type Evaluator = (inputs: unknown[][], options?: { timeoutScale?: number }) => Promise<PairOutcome[]>;\n\nexport interface ExploreOptions {\n arbitrary: Arbitrary<unknown[]>;\n evaluate: Evaluator;\n seed: number;\n /** Max number of distinct generated inputs to run during exploration. */\n runs: number;\n /** Wall-clock deadline (epoch ms) for exploration; shrinking gets a small grace period. */\n deadline?: number;\n /** Explicit inputs evaluated first (e.g. mined from existing tests). */\n examples?: unknown[][];\n compare?: CompareOptions;\n /** Numeric decision thresholds used for input features. */\n thresholds?: readonly number[];\n maxClusters?: number;\n /** Max shrink evaluations per cluster. */\n shrinkBudget?: number;\n /** Max witnesses kept per cluster. */\n maxWitnesses?: number;\n /**\n * Stop exploring after this many timeouts/crashes on realistic inputs (they are expensive: the runner is\n * respawned). Timeouts on edge-case inputs (huge numbers, NaN, \u2026) do not count: after `maxEdgeFailures` of them,\n * further edge-case inputs are skipped and exploration continues with the rest.\n */\n maxFailures?: number;\n maxEdgeFailures?: number;\n /** Max timeouts on ordinary inputs re-checked with a longer limit (see `confirmTimeouts`). */\n maxTimeoutChecks?: number;\n /** Number of inputs run twice per version to detect nondeterminism. */\n selfCheck?: number;\n /** Max evaluations of the humanizing pass per witness. */\n humanizeBudget?: number;\n /**\n * Input domain: generated inputs outside it are skipped. Strict (config `where`) skips all of them; otherwise\n * (guards inferred from the old version) 3 of 4 are skipped, so changed validation is still exercised.\n */\n inDomain?: (input: unknown[]) => boolean;\n strictDomain?: boolean;\n /** Realism of an input; witnesses are chosen most-realistic first. */\n realism?: (input: unknown[]) => Realism;\n onProgress?: (p: { inputsRun: number; clusters: number }) => void;\n}\n\nexport interface Witness {\n input: unknown[];\n base: Outcome;\n head: Outcome;\n diff: OutcomeDiff;\n /** True for the simplest example of the cluster (after shrinking and humanizing). */\n minimal: boolean;\n /** How realistic the input is (see realism.ts). */\n realism?: Realism;\n}\n\nexport interface Cluster {\n key: string;\n transition: string;\n features: string[];\n /** Number of explored inputs that fell into this cluster. */\n count: number;\n witnesses: Witness[];\n}\n\nexport interface NondeterminismReport {\n side: 'base' | 'head';\n input: unknown[];\n first: Outcome;\n second: Outcome;\n}\n\nexport interface ExploreResult {\n inputsRun: number;\n differingInputs: number;\n clusters: Cluster[];\n nondeterministic?: NondeterminismReport;\n /** Clusters dropped because a re-run did not reproduce them. */\n flakyClusters: number;\n stoppedBy: 'runs' | 'deadline' | 'failures' | 'exhausted';\n shrinkEvaluations: number;\n failures: number;\n /** Timeouts/crashes on edge-case inputs (included in `failures`). */\n edgeFailures: number;\n /** Generated edge-case inputs skipped after `maxEdgeFailures` timeouts on edge-case inputs. */\n skippedEdgeInputs: number;\n}\n\ninterface Pending {\n value: fc.Value<unknown[]>;\n key: string;\n}\n\n/** fast-check's own bias schedule: strongly biased towards small values first, then broader. */\nfunction biasFor(runIndex: number): number {\n return 2 + Math.floor(Math.log(runIndex + 1) / Math.log(10));\n}\n\nconst size = (input: unknown[]) => formatArgs(input, 10_000).length;\n\n/** How hard a witness is to read: its input, plus long outputs (a 1,000-element array is a poor example). */\nfunction witnessCost(input: unknown[], r: PairOutcome | undefined): number {\n const out = r ? formatOutcome(r.base, 2000, false).length + formatOutcome(r.head, 2000, false).length : 0;\n return inputComplexity(input) + Math.max(0, out - 40) / 20;\n}\n\nexport async function explore(options: ExploreOptions): Promise<ExploreResult> {\n const {\n arbitrary,\n evaluate,\n seed,\n runs,\n deadline,\n compare = {},\n maxClusters = 24,\n shrinkBudget = 500,\n maxWitnesses = 3,\n maxFailures = 20,\n maxEdgeFailures = 2,\n maxTimeoutChecks = 12,\n selfCheck = 50,\n humanizeBudget = 150,\n } = options;\n const thresholds = options.thresholds ?? [0];\n const mrng = new fc.Random(xoroshiro128plus(seed));\n\n const realismCache = new Map<string, number>();\n const tierOf = (input: unknown[]): number => {\n if (!options.realism) return 0;\n const k = stableKey(input);\n let t = realismCache.get(k);\n if (t === undefined) {\n t = options.realism(input).tier;\n realismCache.set(k, t);\n }\n return t;\n };\n let outOfDomain = 0;\n let edgeFailures = 0;\n let skippedEdgeInputs = 0;\n /** Domain filter for generated inputs (see `inDomain`), and no more edge cases once they keep timing out. */\n const wanted = (input: unknown[]): boolean => {\n if (options.realism && edgeFailures >= maxEdgeFailures && tierOf(input) === 0) {\n skippedEdgeInputs++;\n return false;\n }\n if (!options.inDomain || options.inDomain(input)) return true;\n if (options.strictDomain) return false;\n return outOfDomain++ % 4 === 0;\n };\n const cache = new Map<string, PairOutcome>();\n /** Values that came from explicit examples have no shrink context. */\n const exampleValues = new WeakSet<fc.Value<unknown[]>>();\n const exampleValue = (ex: unknown[]) => {\n const v = new fc.Value(ex, undefined);\n exampleValues.add(v);\n return v;\n };\n const seen = new Set<string>();\n const clusters = new Map<string, Cluster & { seed: fc.Value<unknown[]> }>();\n let inputsRun = 0;\n let differingInputs = 0;\n let failures = 0;\n let shrinkEvaluations = 0;\n let stoppedBy: ExploreResult['stoppedBy'] = 'runs';\n\n /** Inputs that timed out or crashed on either side (each one is expensive). */\n const countFailures = (input: unknown[], r: PairOutcome) => {\n if (![r.base, r.head].some((o) => o.kind === 'timeout' || o.kind === 'crash')) return;\n failures++;\n if (options.realism && tierOf(input) === 0) edgeFailures++;\n };\n /** Failures that say something about the code (not about absurd inputs). */\n const realisticFailures = () => failures - edgeFailures;\n\n /**\n * A timeout on an ordinary input is re-run once with a 4x longer limit before it is believed: on a busy machine,\n * or for a call that takes about as long as the limit, one version can finish just under it and the other just\n * over, which is not a behavior change. A real hang still times out. Edge-case inputs are not re-run: they are\n * expected to be slow, and each re-run costs a long timeout. At most `maxTimeoutChecks` re-checks per function.\n */\n let timeoutChecks = 0;\n const timedOut = (r: PairOutcome) => r.base.kind === 'timeout' || r.head.kind === 'timeout';\n const confirmTimeouts = async (inputs: unknown[][], results: PairOutcome[]): Promise<void> => {\n const idx = results\n .map((r, i) => i)\n .filter((i) => timedOut(results[i]!) && !(options.realism && tierOf(inputs[i]!) === 0))\n .slice(0, Math.max(0, maxTimeoutChecks - timeoutChecks));\n if (idx.length === 0) return;\n timeoutChecks += idx.length;\n const again = await evaluate(\n idx.map((i) => inputs[i]!),\n { timeoutScale: 4 },\n );\n idx.forEach((i, j) => {\n const first = results[i]!;\n const second = again[j]!;\n results[i] = {\n base: first.base.kind === 'timeout' ? second.base : first.base,\n head: first.head.kind === 'timeout' ? second.head : first.head,\n };\n });\n };\n\n const evalCached = async (inputs: unknown[][]): Promise<PairOutcome[]> => {\n const keys = inputs.map(stableKey);\n const missing: unknown[][] = [];\n const missingKeys: string[] = [];\n keys.forEach((k, i) => {\n if (!cache.has(k) && !missingKeys.includes(k)) {\n missing.push(inputs[i]!);\n missingKeys.push(k);\n }\n });\n if (missing.length > 0) {\n const results = await evaluate(missing);\n await confirmTimeouts(missing, results);\n results.forEach((r, i) => {\n cache.set(missingKeys[i]!, r);\n countFailures(missing[i]!, r);\n });\n }\n return keys.map((k) => cache.get(k)!);\n };\n\n const classify = (\n input: unknown[],\n r: PairOutcome,\n ): { key: string; transition: string; features: string[]; diff: OutcomeDiff } | null => {\n const diff = diffOutcome(r.base, r.head, compare);\n if (!diff) return null;\n const transition = describeTransition(r.base, r.head, diff);\n const features = inputFeatures(input, thresholds);\n return { key: clusterKey(transition, features), transition, features, diff };\n };\n\n const record = (value: fc.Value<unknown[]>, r: PairOutcome) => {\n const c = classify(value.value, r);\n if (!c) return;\n differingInputs++;\n const existing = clusters.get(c.key);\n const witness: Witness = { input: value.value, base: r.base, head: r.head, diff: c.diff, minimal: false };\n if (existing) {\n existing.count++;\n existing.witnesses.push(witness);\n existing.witnesses.sort((a, b) => tierOf(b.input) - tierOf(a.input) || size(a.input) - size(b.input));\n existing.witnesses.length = Math.min(existing.witnesses.length, maxWitnesses);\n return;\n }\n if (clusters.size >= maxClusters) return;\n clusters.set(c.key, {\n key: c.key,\n transition: c.transition,\n features: c.features,\n count: 1,\n witnesses: [witness],\n seed: value,\n });\n };\n\n // 1. Self-consistency check on the first inputs: run them twice per version.\n const first: fc.Value<unknown[]>[] = [];\n for (const ex of options.examples ?? []) {\n if (first.length >= selfCheck) break;\n const k = stableKey(ex);\n if (seen.has(k)) continue;\n seen.add(k);\n first.push(exampleValue(ex));\n }\n let runIndex = 0;\n let stale = 0;\n while (first.length < Math.min(selfCheck, runs) && stale < 100) {\n const v = arbitrary.generate(mrng, biasFor(runIndex++));\n const k = stableKey(v.value);\n if (seen.has(k) || !wanted(v.value)) {\n stale++;\n continue;\n }\n seen.add(k);\n first.push(v);\n }\n if (first.length > 0) {\n const inputs = first.map((v) => v.value);\n const twice = await evaluate([...inputs, ...inputs]);\n const a = twice.slice(0, inputs.length);\n const b = twice.slice(inputs.length);\n for (let i = 0; i < inputs.length; i++) {\n for (const side of ['base', 'head'] as const) {\n const x = a[i]![side];\n const y = b[i]![side];\n if (x.kind === 'timeout' || x.kind === 'crash' || y.kind === 'timeout' || y.kind === 'crash')\n continue;\n if (diffOutcome(x, y, compare)) {\n return {\n inputsRun: inputs.length,\n differingInputs: 0,\n clusters: [],\n nondeterministic: { side, input: inputs[i]!, first: x, second: y },\n flakyClusters: 0,\n stoppedBy: 'runs',\n shrinkEvaluations: 0,\n failures,\n edgeFailures,\n skippedEdgeInputs,\n };\n }\n }\n cache.set(stableKey(inputs[i]!), a[i]!);\n countFailures(inputs[i]!, a[i]!);\n record(first[i]!, a[i]!);\n }\n inputsRun = inputs.length;\n }\n\n // 2. Remaining explicit examples, then batched exploration.\n const pendingExamples = (options.examples ?? []).filter((ex) => !seen.has(stableKey(ex))).map(exampleValue);\n let batchSize = 64;\n let staleBatches = 0;\n while (inputsRun < runs) {\n if (deadline !== undefined && Date.now() >= deadline) {\n stoppedBy = 'deadline';\n break;\n }\n if (realisticFailures() >= maxFailures) {\n stoppedBy = 'failures';\n break;\n }\n const batch: Pending[] = [];\n const want = Math.min(batchSize, runs - inputsRun);\n let attempts = 0;\n while (batch.length < want && attempts < want * 4) {\n attempts++;\n const example = pendingExamples.shift();\n const v = example ?? arbitrary.generate(mrng, biasFor(runIndex++));\n if (!example && !wanted(v.value)) continue;\n const k = stableKey(v.value);\n if (seen.has(k)) continue;\n seen.add(k);\n batch.push({ value: v, key: k });\n }\n if (batch.length === 0) {\n if (++staleBatches >= 3) {\n stoppedBy = 'exhausted';\n break;\n }\n continue;\n }\n staleBatches = 0;\n const results = await evaluate(batch.map((p) => p.value.value));\n await confirmTimeouts(\n batch.map((p) => p.value.value),\n results,\n );\n results.forEach((r, i) => {\n cache.set(batch[i]!.key, r);\n countFailures(batch[i]!.value.value, r);\n record(batch[i]!.value, r);\n });\n inputsRun += batch.length;\n batchSize = Math.min(256, batchSize * 2);\n options.onProgress?.({ inputsRun, clusters: clusters.size });\n }\n\n // 3. Shrink one witness per cluster, accepting only candidates that stay in the same cluster.\n for (const cluster of clusters.values()) {\n let cur = cluster.seed;\n let evals = 0;\n // A behavior that involves a timeout is not shrunk or humanized: every candidate may cost a full timeout.\n // One example is enough to report it.\n const w0 = cluster.witnesses[0]!;\n if (w0.base.kind === 'timeout' || w0.head.kind === 'timeout') {\n cluster.witnesses.length = 1;\n cluster.witnesses[0]!.minimal = true;\n continue;\n }\n if (exampleValues.has(cur) && !arbitrary.canShrinkWithoutContext(cur.value)) continue;\n let improved = true;\n while (improved && evals < shrinkBudget) {\n improved = false;\n const it = arbitrary.shrink(cur.value, cur.context)[Symbol.iterator]();\n let done = false;\n while (!done && evals < shrinkBudget) {\n const chunk: fc.Value<unknown[]>[] = [];\n while (chunk.length < 16) {\n const n = it.next();\n if (n.done) {\n done = true;\n break;\n }\n chunk.push(n.value);\n }\n if (chunk.length === 0) break;\n const results = await evalCached(chunk.map((c) => c.value));\n evals += chunk.length;\n const hit = chunk.findIndex((c, i) => classify(c.value, results[i]!)?.key === cluster.key);\n if (hit !== -1) {\n cur = chunk[hit]!;\n improved = true;\n break;\n }\n }\n if (realisticFailures() >= maxFailures * 2) break;\n }\n shrinkEvaluations += evals;\n // Humanize the shrunk witness and the other kept witnesses, then keep the simplest distinct ones.\n const sameCluster = async (candidates: unknown[][]) => {\n const results = await evalCached(candidates);\n return candidates.map((c, i) => classify(c, results[i]!)?.key === cluster.key);\n };\n const starts = [cur.value, ...cluster.witnesses.map((w) => w.input)];\n const finals = new Map<string, unknown[]>();\n for (const start of starts.slice(0, maxWitnesses + 1)) {\n const h = await humanize(start, { sameCluster, thresholds, budget: humanizeBudget });\n shrinkEvaluations += h.evaluations;\n finals.set(stableKey(h.input), h.input);\n finals.set(stableKey(start), start);\n }\n const ranked = [...finals.values()]\n .filter((input) => classify(input, cache.get(stableKey(input))!)?.key === cluster.key)\n .sort(\n (a, b) =>\n tierOf(b) - tierOf(a) ||\n witnessCost(a, cache.get(stableKey(a))) - witnessCost(b, cache.get(stableKey(b))),\n )\n .slice(0, maxWitnesses);\n cluster.witnesses = ranked.map((input, i) => {\n const r = cache.get(stableKey(input))!;\n const w: Witness = {\n input,\n base: r.base,\n head: r.head,\n diff: classify(input, r)!.diff,\n minimal: i === 0,\n };\n if (options.realism) w.realism = options.realism(input);\n return w;\n });\n }\n\n // Score every witness (including clusters that could not be shrunk) and order them most realistic first.\n if (options.realism) {\n for (const cluster of clusters.values()) {\n for (const w of cluster.witnesses) w.realism ??= options.realism(w.input);\n cluster.witnesses.sort(\n (a, b) =>\n b.realism!.tier - a.realism!.tier ||\n witnessCost(a.input, { base: a.base, head: a.head }) -\n witnessCost(b.input, { base: b.base, head: b.head }),\n );\n cluster.witnesses.forEach((w, i) => (w.minimal = i === 0));\n }\n }\n\n // 4. Confirmation: re-run every reported witness once more (uncached) and drop clusters that do not reproduce.\n let flakyClusters = 0;\n const confirmed: Cluster[] = [];\n const all = [...clusters.values()];\n const witnessInputs = all.flatMap((c) => c.witnesses.map((w) => w.input));\n const rerun = witnessInputs.length > 0 ? await evaluate(witnessInputs) : [];\n let idx = 0;\n for (const c of all) {\n let stable = true;\n for (const w of c.witnesses) {\n const r = rerun[idx++]!;\n if (diffOutcome(w.base, r.base, compare) || diffOutcome(w.head, r.head, compare)) stable = false;\n }\n if (!stable) {\n flakyClusters++;\n continue;\n }\n const { seed: _seed, ...rest } = c;\n confirmed.push(rest);\n }\n confirmed.sort((a, b) => b.count - a.count);\n\n return {\n inputsRun,\n differingInputs,\n clusters: confirmed,\n flakyClusters,\n stoppedBy,\n shrinkEvaluations,\n failures,\n edgeFailures,\n skippedEdgeInputs,\n };\n}\n", "import type { Enc, Outcome } from './observed.js';\n\nexport interface CompareOptions {\n /** Treat `{a: undefined}` and `{}` as different (default false: equal). */\n strictUndefined?: boolean;\n /** Compare thrown errors by class only (default false: class + message). */\n ignoreErrorMessages?: boolean;\n /** Absolute/relative tolerance for numbers (default 0: exact, but NaN equals NaN). */\n epsilon?: number;\n /** Compare argument mutations (default true). */\n compareMutations?: boolean;\n}\n\nexport type DiffPath = (string | number)[];\n\n/** Returns null if equal, otherwise the path to the first difference. */\nexport function diffEnc(a: Enc, b: Enc, opts: CompareOptions = {}, path: DiffPath = []): DiffPath | null {\n if (a.t !== b.t) return path;\n switch (a.t) {\n case 'undefined':\n case 'null':\n case 'promise':\n return null;\n case 'boolean':\n case 'bigint':\n case 'string':\n return a.v === (b as typeof a).v ? null : path;\n case 'number':\n return numbersEqual(a.v, (b as typeof a).v, opts.epsilon ?? 0) ? null : path;\n case 'date': {\n const bv = (b as typeof a).v;\n return Object.is(a.v, bv) || (Number.isNaN(a.v) && Number.isNaN(bv)) ? null : path;\n }\n case 'symbol':\n return a.d === (b as typeof a).d ? null : path;\n case 'regexp': {\n const bb = b as typeof a;\n return a.source === bb.source && a.flags === bb.flags ? null : path;\n }\n case 'function': {\n const bb = b as typeof a;\n return a.name === bb.name && a.length === bb.length ? null : path;\n }\n case 'cycle':\n return a.up === (b as typeof a).up ? null : path;\n case 'truncated':\n return a.reason === (b as typeof a).reason ? null : path;\n case 'typed': {\n const bb = b as typeof a;\n if (a.ctor !== bb.ctor || a.items.length !== bb.items.length) return path;\n for (let i = 0; i < a.items.length; i++) {\n if (!numbersEqual(a.items[i]!, bb.items[i]!, opts.epsilon ?? 0)) return [...path, i];\n }\n return null;\n }\n case 'array': {\n const bb = b as typeof a;\n const n = Math.max(a.items.length, bb.items.length);\n for (let i = 0; i < n; i++) {\n const x = a.items[i];\n const y = bb.items[i];\n if (!x || !y) return [...path, 'length'];\n const d = diffEnc(x, y, opts, [...path, i]);\n if (d) return d;\n }\n return null;\n }\n case 'object': {\n const bb = b as typeof a;\n if (a.ctor !== bb.ctor) return [...path, '[[prototype]]'];\n return diffEntries(a.entries, bb.entries, opts, path);\n }\n case 'error': {\n const bb = b as typeof a;\n if (a.ctor !== bb.ctor) return [...path, '[[class]]'];\n if (!opts.ignoreErrorMessages && a.message !== bb.message) return [...path, 'message'];\n return opts.ignoreErrorMessages ? null : diffEntries(a.props, bb.props, opts, path);\n }\n case 'map': {\n const bb = b as typeof a;\n if (a.entries.length !== bb.entries.length) return [...path, 'size'];\n // Order-insensitive: every key of a must exist in b with an equal value.\n for (const [k, v] of a.entries) {\n const match = bb.entries.find(([k2]) => diffEnc(k, k2, opts) === null);\n if (!match) return [...path, `key ${shortEnc(k)}`];\n const d = diffEnc(v, match[1], opts, [...path, `get(${shortEnc(k)})`]);\n if (d) return d;\n }\n return null;\n }\n case 'set': {\n const bb = b as typeof a;\n if (a.items.length !== bb.items.length) return [...path, 'size'];\n const used = new Set<number>();\n for (const x of a.items) {\n const j = bb.items.findIndex((y, idx) => !used.has(idx) && diffEnc(x, y, opts) === null);\n if (j === -1) return [...path, `has(${shortEnc(x)})`];\n used.add(j);\n }\n return null;\n }\n }\n}\n\nfunction diffEntries(\n a: [string, Enc][],\n b: [string, Enc][],\n opts: CompareOptions,\n path: DiffPath,\n): DiffPath | null {\n const keep = (e: [string, Enc]) => opts.strictUndefined || e[1].t !== 'undefined';\n const am = new Map(a.filter(keep));\n const bm = new Map(b.filter(keep));\n for (const [k, v] of am) {\n const w = bm.get(k);\n if (!w) return [...path, k];\n const d = diffEnc(v, w, opts, [...path, k]);\n if (d) return d;\n }\n for (const k of bm.keys()) if (!am.has(k)) return [...path, k];\n return null;\n}\n\nfunction numbersEqual(x: number, y: number, epsilon: number): boolean {\n if (Number.isNaN(x) && Number.isNaN(y)) return true;\n if (Object.is(x, y)) return true;\n if (epsilon > 0 && Number.isFinite(x) && Number.isFinite(y)) {\n // With a tolerance, -0 and 0 are considered equal.\n return Math.abs(x - y) <= epsilon * Math.max(1, Math.abs(x), Math.abs(y));\n }\n return false;\n}\n\nfunction shortEnc(e: Enc): string {\n switch (e.t) {\n case 'string':\n return JSON.stringify(e.v);\n case 'number':\n return Object.is(e.v, -0) ? '-0' : String(e.v);\n case 'boolean':\n case 'bigint':\n return String(e.v);\n default:\n return e.t;\n }\n}\n\nexport interface OutcomeDiff {\n /** Which aspect differs. */\n aspect: 'kind' | 'value' | 'error' | 'mutation' | 'async';\n /** Path inside the value (for value/error) or `[argIndex, ...]` for mutations. */\n path: DiffPath;\n}\n\n/** Compare two outcomes. Returns null if behavior is the same. */\nexport function diffOutcome(a: Outcome, b: Outcome, opts: CompareOptions = {}): OutcomeDiff | null {\n if (a.kind !== b.kind) return { aspect: 'kind', path: [] };\n switch (a.kind) {\n case 'timeout':\n return null;\n case 'crash':\n return null;\n case 'return': {\n const bb = b as typeof a;\n if (a.async !== bb.async) return { aspect: 'async', path: [] };\n const d = diffEnc(a.value, bb.value, opts);\n if (d) return { aspect: 'value', path: d };\n return diffArgs(a.args, bb.args, opts);\n }\n case 'throw': {\n const bb = b as typeof a;\n if (a.async !== bb.async) return { aspect: 'async', path: [] };\n const d = diffEnc(a.error, bb.error, opts);\n if (d) return { aspect: 'error', path: d };\n return diffArgs(a.args, bb.args, opts);\n }\n }\n}\n\nfunction diffArgs(a: Enc[], b: Enc[], opts: CompareOptions): OutcomeDiff | null {\n if (opts.compareMutations === false) return null;\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const x = a[i];\n const y = b[i];\n if (!x || !y) return { aspect: 'mutation', path: [i] };\n const d = diffEnc(x, y, opts, [i]);\n if (d) return { aspect: 'mutation', path: d };\n }\n return null;\n}\n", "import type { Enc, Outcome } from '../compare/observed.js';\nimport { FN_TAG, isFnDescriptor, isProtoDescriptor, PROTO_TAG, viewBytes } from '../runner/tags.js';\n\nconst MAX_LEN = 120;\n\nfunction clip(s: string, max = MAX_LEN): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}\u2026`;\n}\n\nfunction num(n: number): string {\n if (Object.is(n, -0)) return '-0';\n return String(n);\n}\n\n/** Long lists are abbreviated for display: `[1, 1, 1, 1, 1, 1, \u2026 994 more]`. */\nconst MAX_ITEMS = 10;\nconst SHOWN_ITEMS = 6;\nlet abbreviateLists = true;\nfunction list<T>(items: readonly T[], f: (x: T) => string): string {\n if (!abbreviateLists || items.length <= MAX_ITEMS) return items.map(f).join(', ');\n return `${items.slice(0, SHOWN_ITEMS).map(f).join(', ')}, \u2026 ${items.length - SHOWN_ITEMS} more`;\n}\n\nconst IDENT = /^[A-Za-z_$][\\w$]*$/;\nconst key = (k: string) => (IDENT.test(k) ? k : JSON.stringify(k));\n\n/** Render a raw JavaScript value (a generated input) as a JS-like literal. */\nexport function formatValue(v: unknown, max = MAX_LEN): string {\n const seen = new Set<unknown>();\n const f = (x: unknown): string => {\n if (isFnDescriptor(x)) {\n const { returns, async } = x[FN_TAG];\n return `${async ? 'async ' : ''}() => ${f(returns)}`;\n }\n switch (typeof x) {\n case 'undefined':\n return 'undefined';\n case 'number':\n return num(x);\n case 'bigint':\n return `${x}n`;\n case 'string':\n return JSON.stringify(x);\n case 'boolean':\n return String(x);\n case 'symbol':\n return x.toString();\n case 'function':\n return `[Function ${x.name || 'anonymous'}]`;\n }\n if (x === null) return 'null';\n if (seen.has(x)) return '[Circular]';\n seen.add(x);\n try {\n if (Array.isArray(x)) return `[${list(x, f)}]`;\n if (x instanceof Date)\n return Number.isNaN(x.getTime()) ? 'new Date(NaN)' : `new Date(${JSON.stringify(x.toISOString())})`;\n if (x instanceof Map) return `new Map([${list([...x], ([k, val]) => `[${f(k)}, ${f(val)}]`)}])`;\n if (x instanceof Set) return `new Set([${list([...x], f)}])`;\n if (x instanceof RegExp) return String(x);\n if (isProtoDescriptor(x)) {\n const { proto, own } = x[PROTO_TAG];\n return `Object.assign(Object.create(${f(proto)}), ${f(own)})`;\n }\n if (x instanceof ArrayBuffer) return `new Uint8Array([${viewBytes(x).join(', ')}]).buffer`;\n if (x instanceof DataView) {\n return `new DataView(new Uint8Array([${viewBytes(new Uint8Array(x.buffer)).join(', ')}]).buffer, ${x.byteOffset}, ${x.byteLength})`;\n }\n if (ArrayBuffer.isView(x))\n return `new ${x.constructor.name}([${Array.from(x as unknown as ArrayLike<number>).join(', ')}])`;\n const entries = Object.entries(x as Record<string, unknown>);\n if (entries.length === 0) return '{}';\n return `{ ${list(entries, ([k, val]) => `${key(k)}: ${f(val)}`)} }`;\n } finally {\n seen.delete(x);\n }\n };\n return clip(f(v), max);\n}\n\nexport function formatArgs(args: unknown[], max = MAX_LEN): string {\n return clip(args.map((a) => formatValue(a, max)).join(', '), max);\n}\n\n/**\n * Render an encoded value as a JS-like literal. Long lists are abbreviated unless `abbreviate` is false (used when\n * two abbreviated values would look identical).\n */\nexport function formatEnc(e: Enc, max = MAX_LEN, abbreviate = true): string {\n const previous = abbreviateLists;\n abbreviateLists = abbreviate;\n try {\n return formatEncInner(e, max);\n } finally {\n abbreviateLists = previous;\n }\n}\n\nfunction formatEncInner(e: Enc, max: number): string {\n const f = (x: Enc): string => {\n switch (x.t) {\n case 'undefined':\n return 'undefined';\n case 'null':\n return 'null';\n case 'boolean':\n return String(x.v);\n case 'number':\n return num(x.v);\n case 'bigint':\n return `${x.v}n`;\n case 'string':\n return JSON.stringify(x.v);\n case 'symbol':\n return `Symbol(${x.d})`;\n case 'array':\n return `[${list(x.items, f)}]`;\n case 'object': {\n const prefix = x.ctor && x.ctor !== 'null-prototype' ? `${x.ctor} ` : '';\n if (x.entries.length === 0) return `${prefix}{}`;\n return `${prefix}{ ${list(x.entries, ([k, v]) => `${key(k)}: ${f(v)}`)} }`;\n }\n case 'date':\n return Number.isNaN(x.v) ? 'Invalid Date' : new Date(x.v).toISOString();\n case 'map':\n return `Map(${x.entries.length}) { ${list(x.entries, ([k, v]) => `${f(k)} => ${f(v)}`)} }`;\n case 'set':\n return `Set(${x.items.length}) { ${list(x.items, f)} }`;\n case 'regexp':\n return `/${x.source}/${x.flags}`;\n case 'function':\n return `[Function ${x.name || 'anonymous'}]`;\n case 'error':\n return `${x.ctor}: ${x.message}`;\n case 'typed':\n return `${x.ctor} [${list(x.items, String)}]`;\n case 'promise':\n return 'Promise';\n case 'cycle':\n return '[Circular]';\n case 'truncated':\n return `<${x.reason}>`;\n }\n };\n return clip(f(e), max);\n}\n\n/** Short behavior summary, e.g. `1104.99`, `throws RangeError: bad price`, `timeout`. */\nexport function formatOutcome(o: Outcome, max = MAX_LEN, abbreviate = true): string {\n switch (o.kind) {\n case 'return':\n return o.async\n ? `resolves ${formatEnc(o.value, max, abbreviate)}`\n : formatEnc(o.value, max, abbreviate);\n case 'throw': {\n const e =\n o.error.t === 'error' ? `${o.error.ctor}: ${o.error.message}` : formatEnc(o.error, max, abbreviate);\n return clip(`${o.async ? 'rejects' : 'throws'} ${e}`, max);\n }\n case 'timeout':\n return `timeout (>${o.ms}ms)`;\n case 'crash':\n return `crash (${o.reason})`;\n }\n}\n\n/** Coarse category of a value, used to describe outcome transitions (e.g. \"number \u2192 NaN\"). */\nexport function encCategory(e: Enc): string {\n switch (e.t) {\n case 'number':\n if (Number.isNaN(e.v)) return 'NaN';\n if (!Number.isFinite(e.v)) return e.v > 0 ? 'Infinity' : '-Infinity';\n if (Object.is(e.v, -0)) return '-0';\n if (e.v === 0) return '0';\n return e.v < 0 ? 'negative number' : 'positive number';\n case 'object':\n return e.ctor && e.ctor !== 'null-prototype' ? e.ctor : 'object';\n case 'date':\n return Number.isNaN(e.v) ? 'Invalid Date' : 'Date';\n case 'string':\n return e.v.length === 0 ? 'empty string' : 'string';\n case 'array':\n return e.items.length === 0 ? 'empty array' : 'array';\n case 'error':\n return e.ctor;\n default:\n return e.t;\n }\n}\n\n/** Category of a whole outcome, e.g. `returns number`, `throws RangeError`, `timeout`. */\nexport function outcomeCategory(o: Outcome): string {\n switch (o.kind) {\n case 'return':\n return `${o.async ? 'resolves' : 'returns'} ${encCategory(o.value)}`;\n case 'throw':\n return `${o.async ? 'rejects' : 'throws'} ${encCategory(o.error)}`;\n case 'timeout':\n return 'timeout';\n case 'crash':\n return 'crash';\n }\n}\n", "import { FN_TAG, isFnDescriptor, isProtoDescriptor, PROTO_TAG, viewBytes } from '../runner/tags.js';\n\n/**\n * Deterministic string key for a generated JavaScript value. Distinguishes -0/0, NaN, undefined,\n * Dates, Maps, Sets and bigint; used for de-duplicating inputs and caching evaluations.\n */\nexport function stableKey(value: unknown): string {\n const seen = new Set<unknown>();\n const k = (v: unknown): string => {\n switch (typeof v) {\n case 'undefined':\n return 'u';\n case 'number':\n return Object.is(v, -0) ? '-0' : Number.isNaN(v) ? 'NaN' : `#${v}`;\n case 'bigint':\n return `${v}n`;\n case 'string':\n return JSON.stringify(v);\n case 'boolean':\n return v ? 'T' : 'F';\n case 'symbol':\n return `sym(${v.description ?? ''})`;\n case 'function':\n return `fn(${v.name})`;\n }\n if (v === null) return 'null';\n if (seen.has(v)) return '<cycle>';\n seen.add(v);\n try {\n if (isFnDescriptor(v)) return `fn->${k(v[FN_TAG].returns)}${v[FN_TAG].async ? 'a' : ''}`;\n if (Array.isArray(v)) return `[${v.map(k).join(',')}]`;\n if (v instanceof Date) return `D${v.getTime()}`;\n if (isProtoDescriptor(v)) return `P{${k(v[PROTO_TAG].proto)}|${k(v[PROTO_TAG].own)}}`;\n if (v instanceof ArrayBuffer) return `AB[${viewBytes(v).join(',')}]`;\n if (ArrayBuffer.isView(v))\n return `V:${v.constructor.name}:${v.byteOffset}:${v.byteLength}:[${viewBytes(new Uint8Array(v.buffer)).join(',')}]`;\n if (v instanceof Map) return `M{${[...v].map(([a, b]) => `${k(a)}=>${k(b)}`).join(',')}}`;\n if (v instanceof Set) return `S{${[...v].map(k).join(',')}}`;\n const proto = Object.getPrototypeOf(v) as unknown;\n const tag =\n proto === Object.prototype\n ? ''\n : proto === null\n ? 'N'\n : `C:${(proto as { constructor?: { name?: string } }).constructor?.name ?? '?'}`;\n return `${tag}{${Object.entries(v as Record<string, unknown>)\n .map(([a, b]) => `${JSON.stringify(a)}:${k(b)}`)\n .join(',')}}`;\n } finally {\n seen.delete(v);\n }\n };\n return k(value);\n}\n\n/** 32-bit FNV-1a hash of a string. */\nexport function fnv1a(s: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return h >>> 0;\n}\n", "import type { OutcomeDiff } from '../compare/compare.js';\nimport type { Outcome } from '../compare/observed.js';\nimport { outcomeCategory } from '../format/format.js';\nimport { isFnDescriptor, isProtoDescriptor } from '../runner/tags.js';\n\n/**\n * A behavior difference is described by (a) the outcome transition, e.g. \"returns number \u2192 returns NaN\",\n * and (b) a coarse input feature vector, e.g. \"arg0>1000\". Together they form the cluster key.\n */\nexport function describeTransition(base: Outcome, head: Outcome, diff: OutcomeDiff): string {\n const a = outcomeCategory(base);\n const b = outcomeCategory(head);\n if (a !== b) return `${a} \u2192 ${b}`;\n switch (diff.aspect) {\n case 'value':\n return `${a}: value changed`;\n case 'error':\n return `${a}: ${diff.path.includes('message') ? 'message changed' : 'error changed'}`;\n case 'mutation':\n return `${a}: argument ${String(diff.path[0])} mutated differently`;\n case 'async':\n return `${a}: sync/async changed`;\n default:\n return `${a} \u2192 ${b}`;\n }\n}\n\nfunction fmtThreshold(t: number): string {\n return Object.is(t, -0) ? '-0' : String(t);\n}\n\n/** Coarse feature of a single argument. Numeric features are relative to mined decision thresholds. */\nexport function argFeature(v: unknown, thresholds: readonly number[]): string {\n switch (typeof v) {\n case 'number': {\n if (Number.isNaN(v)) return 'NaN';\n if (v === Infinity) return '+Inf';\n if (v === -Infinity) return '-Inf';\n if (Object.is(v, -0)) return '-0';\n const ts = thresholds.length > 0 ? thresholds : [0];\n const eq = ts.find((t) => t === v);\n if (eq !== undefined) return `=${fmtThreshold(eq)}`;\n const below = ts.find((t) => v < t);\n const above = [...ts].reverse().find((t) => v > t);\n if (above === undefined) return `<${fmtThreshold(below!)}`;\n if (below === undefined) return `>${fmtThreshold(above)}`;\n return `(${fmtThreshold(above)},${fmtThreshold(below)})`;\n }\n case 'string':\n return v.length === 0 ? 'empty' : v.trim().length === 0 ? 'blank' : 'text';\n case 'boolean':\n return String(v);\n case 'undefined':\n return 'undefined';\n case 'bigint':\n return v < 0n ? 'neg' : v === 0n ? '0n' : 'pos';\n case 'object':\n if (v === null) return 'null';\n if (isFnDescriptor(v)) return 'fn';\n if (isProtoDescriptor(v)) return 'inherited{\u2026}';\n if (v instanceof ArrayBuffer || ArrayBuffer.isView(v)) return 'binary';\n if (Array.isArray(v)) return v.length === 0 ? 'empty[]' : '[\u2026]';\n if (v instanceof Date) return Number.isNaN(v.getTime()) ? 'InvalidDate' : 'Date';\n if (v instanceof Map || v instanceof Set) return v.size === 0 ? 'empty' : 'nonempty';\n return Object.keys(v).length === 0 ? '{}' : '{\u2026}';\n default:\n return typeof v;\n }\n}\n\nexport function inputFeatures(input: unknown[], thresholds: readonly number[]): string[] {\n return input.map((v) => argFeature(v, thresholds));\n}\n\nexport function clusterKey(transition: string, features: string[]): string {\n return `${transition} | ${features.join(' ')}`;\n}\n", "import { isFnDescriptor, isProtoDescriptor } from '../runner/tags.js';\n\n/**\n * \"Humanizing\" shrink pass. fast-check's shrinker minimizes structurally, but a minimal double such as\n * 9007199254740991 or 2.220446049250313e-16 is not what a reviewer wants to read. This pass tries to\n * replace each numeric/string leaf of an input with a simpler value (0, 1, 0.5, 1001, \"a\", \u2026) while the\n * input stays in the same behavior cluster.\n */\nexport type LeafPath = (string | number)[];\n\nexport interface Leaf {\n path: LeafPath;\n value: number | string;\n}\n\n/** Enumerate numeric and string leaves of an input (arrays and plain objects only). */\nexport function leaves(input: unknown[]): Leaf[] {\n const out: Leaf[] = [];\n const walk = (v: unknown, path: LeafPath, depth: number) => {\n if (depth > 6) return;\n if (typeof v === 'number' || typeof v === 'string') {\n out.push({ path, value: v });\n return;\n }\n if (typeof v !== 'object' || v === null || isFnDescriptor(v)) return;\n if (Array.isArray(v)) {\n v.forEach((x, i) => walk(x, [...path, i], depth + 1));\n return;\n }\n if (Object.getPrototypeOf(v) !== Object.prototype) return;\n for (const [k, x] of Object.entries(v as Record<string, unknown>)) walk(x, [...path, k], depth + 1);\n };\n input.forEach((v, i) => walk(v, [i], 0));\n return out;\n}\n\n/** Copy of `input` with the leaf at `path` replaced. Only arrays and plain objects along the path are copied. */\nexport function setLeaf(input: unknown[], path: LeafPath, value: unknown): unknown[] {\n const copy = (node: unknown, i: number): unknown => {\n if (i === path.length) return value;\n const key = path[i]!;\n if (Array.isArray(node)) {\n const arr = node.slice();\n arr[key as number] = copy(node[key as number], i + 1);\n return arr;\n }\n const obj = { ...(node as Record<string, unknown>) };\n obj[key as string] = copy(obj[key as string], i + 1);\n return obj;\n };\n return copy(input, 0) as unknown[];\n}\n\n/** Lower is simpler. 0 < small integers < round decimals < long or special values. */\nexport function numberComplexity(n: number): number {\n if (Object.is(n, 0)) return 0;\n if (Number.isNaN(n) || !Number.isFinite(n)) return 6;\n if (Object.is(n, -0)) return 3;\n const s = String(Math.abs(n));\n if (s.includes('e')) return 25;\n const digits = s.replace('.', '').replace(/^0+/, '').replace(/0+$/, '').length || 1;\n return digits + (n < 0 ? 1 : 0) + (Number.isInteger(n) ? 0 : 1);\n}\n\nexport function stringComplexity(s: string): number {\n let c = s.length;\n for (const ch of s) if (!/[a-z0-9 ]/.test(ch)) c += 1;\n return c;\n}\n\nexport function valueComplexity(v: number | string): number {\n return typeof v === 'number' ? numberComplexity(v) : stringComplexity(v);\n}\n\n/** Total complexity of an input: used to rank witnesses. */\nexport function inputComplexity(input: unknown[]): number {\n return (\n leaves(input).reduce((s, l) => s + valueComplexity(l.value), 0) +\n exoticObjects(input) * 4 +\n JSON.stringify(input, (_k, v) => (typeof v === 'bigint' ? String(v) : v))?.length / 100\n );\n}\n\n/** Binary data, objects with inherited properties, Maps, Sets and Dates: harder to read than plain values. */\nfunction exoticObjects(v: unknown, depth = 0): number {\n if (typeof v !== 'object' || v === null || depth > 6) return 0;\n if (v instanceof ArrayBuffer || ArrayBuffer.isView(v) || isProtoDescriptor(v)) return 1;\n if (v instanceof Map || v instanceof Set || v instanceof Date) return 0.5;\n if (Array.isArray(v)) return v.reduce((n: number, x) => n + exoticObjects(x, depth + 1), 0);\n if (Object.getPrototypeOf(v) !== Object.prototype) return 0;\n return Object.values(v).reduce((n: number, x) => n + exoticObjects(x, depth + 1), 0);\n}\n\nconst NICE_NUMBERS = [\n 0, 1, -1, 2, 0.5, 10, 0.1, 0.15, 0.25, 0.2, 3, 5, 100, -10, 1.5, 0.01, 1000, 0.99, 99.99,\n];\n\nfunction round(n: number, decimals: number): number {\n const f = 10 ** decimals;\n return Math.round(n * f) / f;\n}\n\nexport function numberCandidates(n: number, thresholds: readonly number[]): number[] {\n const set = new Set<number>(NICE_NUMBERS);\n if (Number.isFinite(n)) {\n for (const d of [0, 1, 2]) set.add(round(n, d));\n set.add(Math.trunc(n));\n if (n !== 0) {\n const mag = 10 ** Math.floor(Math.log10(Math.abs(n)));\n for (const m of [1, 2, 5]) set.add(Math.sign(n) * m * mag);\n set.add(-n);\n }\n }\n for (const t of thresholds) {\n for (const d of [0, 1, -1, 0.5, -0.5, 0.01, -0.01, 0.07, -0.07, 0.99, 0.1]) set.add(round(t + d, 2));\n set.add(t * 2);\n }\n const c = numberComplexity(n);\n return [...set]\n .filter((x) => Number.isFinite(x) && !Object.is(x, n) && numberComplexity(x) < c)\n .sort((a, b) => numberComplexity(a) - numberComplexity(b) || Math.abs(a) - Math.abs(b))\n .slice(0, 40);\n}\n\nexport function stringCandidates(s: string): string[] {\n const set = new Set<string>(['', 'a', ' ', '-', 'A', '0', 'a b', '\u00E9']);\n const ascii = s.replace(/[^\\x20-\\x7e]/g, '');\n set.add(ascii);\n set.add(s.trim());\n for (let k = 1; k < Math.min(s.length, 8); k++) set.add(s.slice(0, k));\n for (const ch of new Set(s)) set.add(ch);\n const c = stringComplexity(s);\n return [...set]\n .filter((x) => x !== s && stringComplexity(x) < c)\n .sort((a, b) => stringComplexity(a) - stringComplexity(b))\n .slice(0, 24);\n}\n\nexport interface HumanizeOptions {\n /** True if `candidate` still exhibits the same behavior difference. Evaluates in batches. */\n sameCluster: (candidates: unknown[][]) => Promise<boolean[]>;\n thresholds: readonly number[];\n budget: number;\n}\n\n/** Simplify leaves one at a time until no leaf can be simplified or the budget is used. */\nexport async function humanize(\n input: unknown[],\n options: HumanizeOptions,\n): Promise<{ input: unknown[]; evaluations: number }> {\n let cur = input;\n let evaluations = 0;\n let improved = true;\n while (improved && evaluations < options.budget) {\n improved = false;\n for (const leaf of leaves(cur)) {\n if (evaluations >= options.budget) break;\n const values =\n typeof leaf.value === 'number'\n ? numberCandidates(leaf.value, options.thresholds)\n : stringCandidates(leaf.value);\n if (values.length === 0) continue;\n const take = values.slice(0, Math.max(1, options.budget - evaluations));\n const candidates = take.map((v) => setLeaf(cur, leaf.path, v));\n const ok = await options.sameCluster(candidates);\n evaluations += candidates.length;\n const hit = ok.findIndex(Boolean);\n if (hit !== -1) {\n cur = candidates[hit]!;\n improved = true;\n }\n }\n }\n return { input: cur, evaluations };\n}\n", "import {\n Node,\n ts,\n type ArrowFunction,\n type FunctionDeclaration,\n type FunctionExpression,\n type ParameterDeclaration,\n type Type,\n type VariableDeclaration,\n} from 'ts-morph';\nimport {\n BINARY_CTORS,\n type ArbSpec,\n type BinaryCtor,\n type ParamSpec,\n type PropSpec,\n type SignatureSpec,\n} from './spec.js';\n\n/** Function-like nodes we can test. */\nexport type FunctionLikeNode = FunctionDeclaration | ArrowFunction | FunctionExpression;\n\nconst MAX_UNION_OPTIONS = 64;\nconst MAX_PROPS = 40;\n\n/** Built-in (lib.d.ts) types we know how to generate; everything else from the default lib is unsupported. */\nconst HANDLED_BUILTINS = new Set([\n 'Date',\n 'Map',\n 'ReadonlyMap',\n 'Set',\n 'ReadonlySet',\n 'Array',\n 'ReadonlyArray',\n]);\n\ninterface Ctx {\n /** Node used as location for resolving property types. */\n location: Node;\n /** Object type ids currently being expanded, mapped to the recursion id assigned (if referenced). */\n stack: Map<number, { id: string; referenced: boolean }>;\n nextId: { n: number };\n}\n\nfunction typeId(type: Type): number {\n return (type.compilerType as unknown as { id: number }).id;\n}\n\nfunction isFromDefaultLib(type: Type): boolean {\n const symbol = type.getSymbol() ?? type.getAliasSymbol();\n const decls = symbol?.getDeclarations() ?? [];\n if (decls.length === 0) return false;\n return decls.every((d) => {\n const sf = d.getSourceFile();\n return (\n sf.getProject().getProgram().compilerObject.isSourceFileDefaultLibrary(sf.compilerNode) ||\n /[\\\\/]typescript[\\\\/]lib[\\\\/]lib\\./.test(sf.getFilePath())\n );\n });\n}\n\nfunction symbolName(type: Type): string | undefined {\n return type.getSymbol()?.getName();\n}\n\n/** Derive the ArbSpec for a TypeScript type. */\nexport function specFromType(type: Type, location: Node): ArbSpec {\n return fromType(type, { location, stack: new Map(), nextId: { n: 0 } });\n}\n\nfunction fromType(type: Type, ctx: Ctx): ArbSpec {\n const flags = type.getFlags();\n\n if (flags & ts.TypeFlags.Any || flags & ts.TypeFlags.Unknown) return { kind: 'anything' };\n if (flags & ts.TypeFlags.Never) return { kind: 'unsupported', reason: 'never' };\n if (flags & ts.TypeFlags.Void || flags & ts.TypeFlags.Undefined) return { kind: 'undefined' };\n if (flags & ts.TypeFlags.Null) return { kind: 'null' };\n if (type.isBoolean()) return { kind: 'boolean' };\n if (type.isBooleanLiteral()) return { kind: 'literal', value: type.getText() === 'true' };\n if (type.isStringLiteral() || type.isNumberLiteral()) {\n const v = type.getLiteralValue();\n if (typeof v === 'string' || typeof v === 'number') return { kind: 'literal', value: v };\n }\n if (flags & ts.TypeFlags.BigIntLiteral) {\n const v = (type.compilerType as ts.BigIntLiteralType).value;\n return { kind: 'bigintLiteral', value: `${v.negative ? '-' : ''}${v.base10Value}` };\n }\n if (type.isEnumLiteral()) {\n const v = type.getLiteralValue();\n if (typeof v === 'string' || typeof v === 'number') return { kind: 'literal', value: v };\n }\n if (flags & ts.TypeFlags.Number) return { kind: 'number' };\n if (flags & ts.TypeFlags.String) return { kind: 'string' };\n if (flags & ts.TypeFlags.TemplateLiteral) return { kind: 'string' };\n if (flags & ts.TypeFlags.BigInt) return { kind: 'bigint' };\n if (flags & ts.TypeFlags.ESSymbol || flags & ts.TypeFlags.UniqueESSymbol)\n return { kind: 'unsupported', reason: 'symbol' };\n\n if (type.isTypeParameter()) {\n const c = type.getConstraint();\n return c ? fromType(c, ctx) : { kind: 'anything' };\n }\n\n if (type.isUnion()) {\n const parts = type.getUnionTypes();\n if (parts.length > MAX_UNION_OPTIONS) {\n return { kind: 'union', options: parts.slice(0, MAX_UNION_OPTIONS).map((t) => fromType(t, ctx)) };\n }\n return simplifyUnion(parts.map((t) => fromType(t, ctx)));\n }\n\n if (type.isIntersection()) {\n // Branded primitives: `number & { __brand: 'Cents' }` -> number.\n const prim = type.getIntersectionTypes().find((t) => {\n const f = t.getFlags();\n return (\n f &\n (ts.TypeFlags.NumberLike |\n ts.TypeFlags.StringLike |\n ts.TypeFlags.BigIntLike |\n ts.TypeFlags.BooleanLike)\n );\n });\n if (prim) return fromType(prim, ctx);\n return objectSpec(type, ctx);\n }\n\n if (type.isObject()) return objectLike(type, ctx);\n\n if (flags & ts.TypeFlags.NonPrimitive) return { kind: 'anything' }; // `object`\n return { kind: 'unsupported', reason: `type \\`${type.getText()}\\`` };\n}\n\nfunction simplifyUnion(options: ArbSpec[]): ArbSpec {\n const seen = new Set<string>();\n const out: ArbSpec[] = [];\n for (const o of options.flatMap((o) => (o.kind === 'union' ? o.options : [o]))) {\n const key = JSON.stringify(o);\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(o);\n }\n // `true | false` from e.g. `boolean | undefined` arrives as two literals.\n const hasTrue = out.some((o) => o.kind === 'literal' && o.value === true);\n const hasFalse = out.some((o) => o.kind === 'literal' && o.value === false);\n const merged =\n hasTrue && hasFalse\n ? [\n ...out.filter((o) => !(o.kind === 'literal' && typeof o.value === 'boolean')),\n { kind: 'boolean' } as ArbSpec,\n ]\n : out;\n return merged.length === 1 ? merged[0]! : { kind: 'union', options: merged };\n}\n\nfunction objectLike(type: Type, ctx: Ctx): ArbSpec {\n if (type.isArray() || type.isReadonlyArray?.()) {\n const el = type.getArrayElementType() ?? type.getTypeArguments()[0];\n return { kind: 'array', items: el ? fromType(el, ctx) : { kind: 'anything' } };\n }\n if (type.isTuple()) return tupleSpec(type, ctx);\n\n const callSigs = type.getCallSignatures();\n if (callSigs.length > 0 && type.getProperties().length === 0) {\n const ret = callSigs[0]!.getReturnType();\n const promised = unwrapPromise(ret);\n return {\n kind: 'function',\n returns: fromType(promised ?? ret, ctx),\n async: promised !== undefined,\n };\n }\n\n const name = symbolName(type);\n if (name && isFromDefaultLib(type)) {\n if (name === 'Date') return { kind: 'date' };\n if ((BINARY_CTORS as readonly string[]).includes(name))\n return { kind: 'binary', ctor: name as BinaryCtor };\n if (name === 'Map' || name === 'ReadonlyMap') {\n const [k, v] = type.getTypeArguments();\n return {\n kind: 'map',\n key: k ? fromType(k, ctx) : { kind: 'anything' },\n value: v ? fromType(v, ctx) : { kind: 'anything' },\n };\n }\n if (name === 'Set' || name === 'ReadonlySet') {\n const [t] = type.getTypeArguments();\n return { kind: 'set', items: t ? fromType(t, ctx) : { kind: 'anything' } };\n }\n // JSDoc `{Object}` (the global Object interface): any object.\n if (name === 'Object') return { kind: 'anything' };\n if (!HANDLED_BUILTINS.has(name) && name !== '__type' && name !== '__object') {\n return { kind: 'unsupported', reason: `built-in type \\`${name}\\`` };\n }\n }\n if (type.isClass() || isClassInstance(type)) {\n return { kind: 'unsupported', reason: `class instance \\`${name ?? type.getText()}\\`` };\n }\n return objectSpec(type, ctx);\n}\n\nfunction isClassInstance(type: Type): boolean {\n const decls = type.getSymbol()?.getDeclarations() ?? [];\n return decls.some((d) => Node.isClassDeclaration(d) || Node.isClassExpression(d));\n}\n\nfunction unwrapPromise(type: Type): Type | undefined {\n const name = symbolName(type);\n if ((name === 'Promise' || name === 'PromiseLike') && isFromDefaultLib(type)) {\n return type.getTypeArguments()[0];\n }\n return undefined;\n}\n\nfunction tupleSpec(type: Type, ctx: Ctx): ArbSpec {\n const target = (type.compilerType as ts.TypeReference).target as ts.TupleType | undefined;\n const elementFlags = target?.elementFlags ?? [];\n const elems = type.getTupleElements();\n const items: ArbSpec[] = [];\n let optionalFrom: number | undefined;\n let rest: ArbSpec | undefined;\n elems.forEach((el, i) => {\n const f = elementFlags[i] ?? ts.ElementFlags.Required;\n if (f & ts.ElementFlags.Rest || f & ts.ElementFlags.Variadic) {\n rest = fromType(el, ctx);\n return;\n }\n if (f & ts.ElementFlags.Optional && optionalFrom === undefined) optionalFrom = items.length;\n items.push(fromType(el, ctx));\n });\n const spec: ArbSpec = { kind: 'tuple', items };\n if (optionalFrom !== undefined) spec.optionalFrom = optionalFrom;\n if (rest) spec.rest = rest;\n return spec;\n}\n\nfunction objectSpec(type: Type, ctx: Ctx): ArbSpec {\n const id = typeId(type);\n const active = ctx.stack.get(id);\n if (active) {\n active.referenced = true;\n return { kind: 'ref', id: active.id };\n }\n const entry = { id: `T${ctx.nextId.n++}`, referenced: false };\n ctx.stack.set(id, entry);\n try {\n const checker = ctx.location.getProject().getTypeChecker();\n const props: PropSpec[] = [];\n for (const sym of type.getProperties().slice(0, MAX_PROPS)) {\n const propType = checker.getTypeOfSymbolAtLocation(sym, ctx.location);\n const optional = (sym.getFlags() & ts.SymbolFlags.Optional) !== 0;\n let spec = fromType(propType, ctx);\n // With strictNullChecks the optional prop type already includes undefined; drop it, `optional` covers it.\n if (optional && spec.kind === 'union') {\n const rest = spec.options.filter((o) => o.kind !== 'undefined');\n spec = rest.length === 1 ? rest[0]! : { kind: 'union', options: rest };\n }\n props.push({ name: sym.getName(), spec, optional });\n }\n const stringIndex = type.getStringIndexType();\n const numberIndex = type.getNumberIndexType();\n let result: ArbSpec;\n if (props.length === 0 && stringIndex) {\n result = { kind: 'record', key: 'string', values: fromType(stringIndex, ctx) };\n } else if (props.length === 0 && numberIndex) {\n result = { kind: 'record', key: 'number', values: fromType(numberIndex, ctx) };\n } else {\n result = { kind: 'object', props };\n }\n return entry.referenced ? { kind: 'recursive', id: entry.id, spec: result } : result;\n } finally {\n ctx.stack.delete(id);\n }\n}\n\nfunction paramSpec(p: ParameterDeclaration, location: Node, index: number): ParamSpec {\n const rest = p.isRestParameter();\n const optional = !rest && (p.isOptional() || p.hasInitializer() || p.hasQuestionToken());\n let type = p.getType();\n if (rest) {\n const el = type.getArrayElementType();\n type = el ?? type;\n }\n let spec = specFromType(type, location);\n if (optional && !rest) {\n // Make `undefined` an explicit option so omitted arguments are exercised.\n spec =\n spec.kind === 'union'\n ? spec.options.some((o) => o.kind === 'undefined')\n ? spec\n : { kind: 'union', options: [...spec.options, { kind: 'undefined' }] }\n : spec.kind === 'undefined'\n ? spec\n : { kind: 'union', options: [spec, { kind: 'undefined' }] };\n }\n const name = Node.isIdentifier(p.getNameNode()) ? p.getName() : `arg${index}`;\n return { name, spec, optional, rest };\n}\n\n/** Signature spec for a function-like node. Destructured parameters are named `argN`. */\nexport function signatureFromNode(fn: FunctionLikeNode): SignatureSpec {\n const params = fn\n .getParameters()\n .filter((p) => p.getName() !== 'this')\n .map((p, i) => paramSpec(p, fn, i));\n const ret = fn.getReturnType();\n const async = fn.isAsync() || unwrapPromise(ret) !== undefined;\n return { params, async };\n}\n\n/** Signature spec for a callable value (no function node), from its type's single call signature. */\nexport function signatureFromCallable(decl: VariableDeclaration): SignatureSpec {\n const sig = decl.getType().getCallSignatures()[0]!;\n const checker = decl.getProject().getTypeChecker();\n const params: ParamSpec[] = sig.getParameters().map((sym, i) => {\n const pdecl = sym.getValueDeclaration();\n const isParam = pdecl !== undefined && Node.isParameterDeclaration(pdecl);\n const rest = isParam && pdecl.isRestParameter();\n const optional =\n !rest &&\n ((sym.getFlags() & ts.SymbolFlags.Optional) !== 0 ||\n (isParam && (pdecl.isOptional() || pdecl.hasInitializer())));\n let type = checker.getTypeOfSymbolAtLocation(sym, decl);\n if (rest) type = type.getArrayElementType() ?? type;\n let spec = specFromType(type, decl);\n if (optional && spec.kind !== 'union') spec = { kind: 'union', options: [spec, { kind: 'undefined' }] };\n else if (optional && spec.kind === 'union' && !spec.options.some((o) => o.kind === 'undefined')) {\n spec = { kind: 'union', options: [...spec.options, { kind: 'undefined' }] };\n }\n return { name: sym.getName() || `arg${i}`, spec, optional, rest };\n });\n return { params, async: unwrapPromise(sig.getReturnType()) !== undefined };\n}\n\n/** Signature for whatever `locate` found: a function node or a callable value. */\nexport function signatureOf(node: FunctionLikeNode | VariableDeclaration): SignatureSpec {\n return Node.isVariableDeclaration(node) ? signatureFromCallable(node) : signatureFromNode(node);\n}\n", "/**\n * ArbSpec: a plain, JSON-serializable description of the values a parameter can take.\n *\n * It is derived from TypeScript types (see `fromType.ts`) and compiled to fast-check arbitraries\n * (see `../arbitraries/compile.ts`). Keeping this intermediate representation separate makes type\n * analysis testable without fast-check and lets us hash, compare and print specs.\n */\nexport type ArbSpec =\n /** `size`: a count, length, index or loop bound (see analyze/sizeParams.ts), generated in realistic ranges. */\n | { kind: 'number'; size?: boolean }\n | { kind: 'bigint' }\n | { kind: 'string' }\n | { kind: 'boolean' }\n | { kind: 'undefined' }\n | { kind: 'null' }\n | { kind: 'literal'; value: string | number | boolean }\n | { kind: 'bigintLiteral'; value: string }\n | { kind: 'union'; options: ArbSpec[] }\n | { kind: 'array'; items: ArbSpec }\n | { kind: 'tuple'; items: ArbSpec[]; optionalFrom?: number; rest?: ArbSpec }\n | { kind: 'object'; props: PropSpec[] }\n | { kind: 'record'; key: 'string' | 'number'; values: ArbSpec }\n | { kind: 'date' }\n | { kind: 'binary'; ctor: BinaryCtor }\n | { kind: 'map'; key: ArbSpec; value: ArbSpec }\n | { kind: 'set'; items: ArbSpec }\n | { kind: 'function'; returns: ArbSpec; async: boolean }\n | { kind: 'recursive'; id: string; spec: ArbSpec }\n | { kind: 'ref'; id: string }\n | { kind: 'anything' }\n | { kind: 'unsupported'; reason: string };\n\n/** Binary built-ins: typed arrays, ArrayBuffer and DataView. */\nexport const BINARY_CTORS = [\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Int8Array',\n 'Uint16Array',\n 'Int16Array',\n 'Uint32Array',\n 'Int32Array',\n 'Float32Array',\n 'Float64Array',\n 'BigInt64Array',\n 'BigUint64Array',\n 'ArrayBuffer',\n 'DataView',\n] as const;\nexport type BinaryCtor = (typeof BINARY_CTORS)[number];\n\nexport interface PropSpec {\n name: string;\n spec: ArbSpec;\n optional: boolean;\n}\n\nexport interface ParamSpec {\n name: string;\n spec: ArbSpec;\n /** Optional or defaulted parameter: `undefined` is a valid argument. */\n optional: boolean;\n /** Rest parameter: `spec` describes one element; zero or more are spread at the end. */\n rest: boolean;\n}\n\nexport interface SignatureSpec {\n params: ParamSpec[];\n /** The function's declared return type is a Promise / it is declared `async`. */\n async: boolean;\n}\n\n/** Returns the first `unsupported` reason found in a spec, or undefined if the spec is fully supported. */\nexport function findUnsupported(spec: ArbSpec): string | undefined {\n switch (spec.kind) {\n case 'unsupported':\n return spec.reason;\n case 'union':\n // A union is usable if at least one option is supported; unsupported options are dropped at compile time.\n return spec.options.every((o) => findUnsupported(o) !== undefined)\n ? findUnsupported(spec.options[0] ?? { kind: 'unsupported', reason: 'empty union' })\n : undefined;\n case 'array':\n case 'set':\n return findUnsupported(spec.items);\n case 'tuple':\n for (const item of spec.items) {\n const r = findUnsupported(item);\n if (r) return r;\n }\n return spec.rest ? findUnsupported(spec.rest) : undefined;\n case 'object':\n for (const p of spec.props) {\n const r = p.optional ? undefined : findUnsupported(p.spec);\n if (r) return `${p.name}: ${r}`;\n }\n return undefined;\n case 'record':\n return findUnsupported(spec.values);\n case 'map':\n return findUnsupported(spec.key) ?? findUnsupported(spec.value);\n case 'function':\n return findUnsupported(spec.returns);\n case 'recursive':\n return findUnsupported(spec.spec);\n default:\n return undefined;\n }\n}\n\nexport function signatureUnsupported(sig: SignatureSpec): string | undefined {\n for (const p of sig.params) {\n const r = p.optional ? undefined : findUnsupported(p.spec);\n if (r) return `parameter \\`${p.name}\\`: ${r}`;\n }\n return undefined;\n}\n\n/** Compact human-readable rendering of a spec, TypeScript-like. Used in reports and tests. */\nexport function printSpec(spec: ArbSpec): string {\n switch (spec.kind) {\n case 'literal':\n return typeof spec.value === 'string' ? JSON.stringify(spec.value) : String(spec.value);\n case 'bigintLiteral':\n return `${spec.value}n`;\n case 'union':\n return spec.options.map(printSpec).join(' | ');\n case 'array': {\n const inner = printSpec(spec.items);\n return spec.items.kind === 'union' || spec.items.kind === 'function' ? `(${inner})[]` : `${inner}[]`;\n }\n case 'tuple': {\n const items = spec.items.map((s, i) =>\n spec.optionalFrom !== undefined && i >= spec.optionalFrom ? `${printSpec(s)}?` : printSpec(s),\n );\n if (spec.rest) items.push(`...${printSpec(spec.rest)}[]`);\n return `[${items.join(', ')}]`;\n }\n case 'object':\n return `{ ${spec.props.map((p) => `${p.name}${p.optional ? '?' : ''}: ${printSpec(p.spec)}`).join('; ')} }`;\n case 'record':\n return `Record<${spec.key}, ${printSpec(spec.values)}>`;\n case 'date':\n return 'Date';\n case 'binary':\n return spec.ctor;\n case 'map':\n return `Map<${printSpec(spec.key)}, ${printSpec(spec.value)}>`;\n case 'set':\n return `Set<${printSpec(spec.items)}>`;\n case 'function':\n return `() => ${spec.async ? `Promise<${printSpec(spec.returns)}>` : printSpec(spec.returns)}`;\n case 'recursive':\n return `${spec.id}=${printSpec(spec.spec)}`;\n case 'ref':\n return spec.id;\n case 'anything':\n return 'unknown';\n case 'unsupported':\n return `<unsupported: ${spec.reason}>`;\n default:\n return spec.kind;\n }\n}\n\n/** Mark number-typed parts of a parameter spec (including inside unions) as size-like. */\nexport function markSize(spec: ArbSpec): ArbSpec {\n if (spec.kind === 'number') return { kind: 'number', size: true };\n if (spec.kind === 'union') return { ...spec, options: spec.options.map(markSize) };\n return spec;\n}\n", "import { Node, SyntaxKind, type ParameterDeclaration } from 'ts-morph';\n\n/**\n * Input domain inferred from the OLD version's guard clauses: the leading `if (cond) throw ...` /\n * `if (cond) return ...` statements of the function body. The conditions are evaluated by a tiny interpreter that\n * understands comparisons with literals, typeof, Number.isInteger/isNaN/isFinite/isSafeInteger, isNaN,\n * Array.isArray, `.length`, `!`, `&&`, `||`. Anything else evaluates to \"unknown\" and is ignored (never guessed).\n */\nexport interface Guards {\n /** Human-readable guard conditions that could be evaluated. */\n conditions: string[];\n /** True if the input passes every guard (or the guard cannot be evaluated for it). */\n accepts(input: unknown[]): boolean;\n}\n\ntype Env = Map<string, unknown>;\nconst UNKNOWN = Symbol('unknown');\ntype Value = unknown;\ntype Expr = (env: Env) => Value;\n\nfunction compile(node: Node, params: Set<string>): Expr | undefined {\n if (Node.isParenthesizedExpression(node)) return compile(node.getExpression(), params);\n if (Node.isNumericLiteral(node)) {\n const v = node.getLiteralValue();\n return () => v;\n }\n if (Node.isStringLiteral(node) || Node.isNoSubstitutionTemplateLiteral(node)) {\n const v = node.getLiteralValue();\n return () => v;\n }\n if (node.getKind() === SyntaxKind.TrueKeyword) return () => true;\n if (node.getKind() === SyntaxKind.FalseKeyword) return () => false;\n if (node.getKind() === SyntaxKind.NullKeyword) return () => null;\n if (Node.isIdentifier(node)) {\n const name = node.getText();\n if (name === 'undefined') return () => undefined;\n if (name === 'NaN') return () => NaN;\n if (name === 'Infinity') return () => Infinity;\n if (params.has(name)) return (env) => env.get(name);\n return undefined;\n }\n if (Node.isPropertyAccessExpression(node) && node.getName() === 'length') {\n const obj = compile(node.getExpression(), params);\n if (!obj) return undefined;\n return (env) => {\n const v = obj(env);\n return typeof v === 'string' || Array.isArray(v) ? v.length : UNKNOWN;\n };\n }\n if (Node.isTypeOfExpression(node)) {\n const e = compile(node.getExpression(), params);\n if (!e) return undefined;\n return (env) => {\n const v = e(env);\n return v === UNKNOWN ? UNKNOWN : v === null ? 'object' : typeof v;\n };\n }\n if (Node.isPrefixUnaryExpression(node)) {\n const e = compile(node.getOperand(), params);\n if (!e) return undefined;\n const op = node.getOperatorToken();\n if (op === SyntaxKind.ExclamationToken) return (env) => (e(env) === UNKNOWN ? UNKNOWN : !e(env));\n if (op === SyntaxKind.MinusToken)\n return (env) => (typeof e(env) === 'number' ? -(e(env) as number) : UNKNOWN);\n return undefined;\n }\n if (Node.isCallExpression(node)) {\n const callee = node.getExpression().getText().replace(/\\s+/g, '');\n const fns: Record<string, (v: unknown) => boolean> = {\n 'Number.isInteger': Number.isInteger,\n 'Number.isSafeInteger': Number.isSafeInteger,\n 'Number.isFinite': Number.isFinite,\n 'Number.isNaN': Number.isNaN,\n isNaN: (v) => isNaN(v as number),\n isFinite: (v) => isFinite(v as number),\n 'Array.isArray': Array.isArray,\n };\n const fn = fns[callee];\n const [arg] = node.getArguments();\n if (!fn || !arg || node.getArguments().length !== 1) return undefined;\n const e = compile(arg, params);\n if (!e) return undefined;\n return (env) => {\n const v = e(env);\n return v === UNKNOWN ? UNKNOWN : fn(v);\n };\n }\n if (Node.isBinaryExpression(node)) {\n const l = compile(node.getLeft(), params);\n const r = compile(node.getRight(), params);\n if (!l || !r) return undefined;\n const op = node.getOperatorToken().getKind();\n const cmp =\n (f: (a: never, b: never) => boolean): Expr =>\n (env) => {\n const a = l(env);\n const b = r(env);\n return a === UNKNOWN || b === UNKNOWN ? UNKNOWN : f(a as never, b as never);\n };\n switch (op) {\n case SyntaxKind.LessThanToken:\n return cmp((a, b) => a < b);\n case SyntaxKind.LessThanEqualsToken:\n return cmp((a, b) => a <= b);\n case SyntaxKind.GreaterThanToken:\n return cmp((a, b) => a > b);\n case SyntaxKind.GreaterThanEqualsToken:\n return cmp((a, b) => a >= b);\n case SyntaxKind.EqualsEqualsEqualsToken:\n return cmp((a, b) => a === b);\n case SyntaxKind.ExclamationEqualsEqualsToken:\n return cmp((a, b) => a !== b);\n case SyntaxKind.EqualsEqualsToken:\n return cmp((a, b) => a == b);\n case SyntaxKind.ExclamationEqualsToken:\n return cmp((a, b) => a != b);\n case SyntaxKind.AmpersandAmpersandToken:\n return (env) => {\n const a = l(env);\n if (a === UNKNOWN) return UNKNOWN;\n return a ? r(env) : a;\n };\n case SyntaxKind.BarBarToken:\n return (env) => {\n const a = l(env);\n if (a === UNKNOWN) return UNKNOWN;\n return a ? a : r(env);\n };\n default:\n return undefined;\n }\n }\n return undefined;\n}\n\nfunction isExit(stmt: Node): boolean {\n if (Node.isThrowStatement(stmt) || Node.isReturnStatement(stmt)) return true;\n if (Node.isBlock(stmt)) {\n const s = stmt.getStatements();\n return s.length >= 1 && isExit(s[s.length - 1]!);\n }\n return false;\n}\n\n/** Infer guards from a function-like node (the old version). Returns undefined when there are none. */\nexport function inferGuards(fn: Node): Guards | undefined {\n if (!(Node.isFunctionDeclaration(fn) || Node.isFunctionExpression(fn) || Node.isArrowFunction(fn)))\n return undefined;\n const body = fn.getBody();\n if (!body || !Node.isBlock(body)) return undefined;\n const paramDecls: ParameterDeclaration[] = fn.getParameters();\n const names = paramDecls.map((p) => (Node.isIdentifier(p.getNameNode()) ? p.getName() : undefined));\n const params = new Set(names.filter((n): n is string => !!n));\n const checks: { text: string; expr: Expr }[] = [];\n for (const stmt of body.getStatements()) {\n if (Node.isIfStatement(stmt) && !stmt.getElseStatement() && isExit(stmt.getThenStatement())) {\n const expr = compile(stmt.getExpression(), params);\n if (expr) checks.push({ text: stmt.getExpression().getText(), expr });\n continue;\n }\n // Assertion calls (`assertString(str)`) and variable declarations may precede guards; anything else ends them.\n if (Node.isExpressionStatement(stmt) && Node.isCallExpression(stmt.getExpression())) continue;\n if (Node.isVariableStatement(stmt) && checks.length === 0) continue;\n break;\n }\n if (checks.length === 0) return undefined;\n return {\n conditions: checks.map((c) => c.text),\n accepts(input) {\n const env: Env = new Map();\n names.forEach((n, i) => n && env.set(n, input[i]));\n return checks.every((c) => {\n try {\n const v = c.expr(env);\n return v === UNKNOWN || !v;\n } catch {\n return true;\n }\n });\n },\n };\n}\n", "import { isFnDescriptor, isProtoDescriptor, PROTO_TAG } from '../runner/tags.js';\n\n/**\n * How realistic is an input? Findings on inputs that real callers pass matter more than findings on NaN, -0 or\n * lone surrogates. Tiers (higher is more realistic):\n * 3 seen every number/string in the input appears in the project's tests or call sites\n * 2 ordinary no exotic values, and within the domain observed in tests/call sites\n * 1 unusual outside the observed domain (e.g. negative while every observed number is >= 0), or objects with\n * inherited enumerable properties\n * 0 edge exotic values: NaN, \u00B1Infinity, -0, huge/tiny magnitudes, lone surrogates, control or zero-width\n * characters, invalid dates\n */\nexport type RealismTier = 0 | 1 | 2 | 3;\nexport const REALISM_NAMES = ['edge', 'unusual', 'ordinary', 'seen'] as const;\nexport type RealismName = (typeof REALISM_NAMES)[number];\n\nexport interface RealismContext {\n numbers: ReadonlySet<number>;\n strings: ReadonlySet<string>;\n /** Every observed number is >= 0 (with enough observations). */\n nonNegative: boolean;\n /** Every observed number is an integer (with enough observations). */\n integerOnly: boolean;\n}\n\nexport interface Realism {\n tier: RealismTier;\n /** Why the input is not more realistic, e.g. \"NaN\", \"negative number (tests only use >= 0)\". */\n reason?: string;\n}\n\nconst MIN_OBSERVATIONS = 3;\n\nexport function realismContext(\n usage: { numbers: number[]; strings: string[]; numberObservations?: number } | undefined,\n): RealismContext {\n const numbers = usage?.numbers ?? [];\n const enough = (usage?.numberObservations ?? numbers.length) >= MIN_OBSERVATIONS && numbers.length > 0;\n return {\n numbers: new Set(numbers),\n strings: new Set(usage?.strings ?? []),\n nonNegative: enough && numbers.every((n) => n >= 0),\n integerOnly: enough && numbers.every((n) => Number.isInteger(n)),\n };\n}\n\n// Lone surrogates, C0/C1 control characters (except tab/newline/CR), zero-width characters and BOM.\nconst EXOTIC_CHARS = new RegExp(\n '[\\\\uD800-\\\\uDBFF](?![\\\\uDC00-\\\\uDFFF])|(?<![\\\\uD800-\\\\uDBFF])[\\\\uDC00-\\\\uDFFF]|' +\n '[\\\\u0000-\\\\u0008\\\\u000B\\\\u000C\\\\u000E-\\\\u001F\\\\u007F-\\\\u009F\\\\u200B-\\\\u200F\\\\u2028\\\\u2029\\\\uFEFF]',\n);\n// A string that starts with a combining mark has nothing to combine with.\nconst LEADING_COMBINING = /^\\p{M}/u;\n\nfunction numberRealism(n: number, ctx: RealismContext): Realism {\n if (Number.isNaN(n)) return { tier: 0, reason: 'NaN' };\n if (!Number.isFinite(n)) return { tier: 0, reason: n > 0 ? 'Infinity' : '-Infinity' };\n if (Object.is(n, -0)) return { tier: 0, reason: '-0' };\n if (Math.abs(n) >= 1e9) return { tier: 0, reason: 'huge number' };\n if (n !== 0 && Math.abs(n) < 1e-6) return { tier: 0, reason: 'tiny number' };\n if (ctx.numbers.has(n)) return { tier: 3 };\n if (ctx.nonNegative && n < 0)\n return { tier: 1, reason: 'negative number (tests and call sites only use values >= 0)' };\n if (ctx.integerOnly && !Number.isInteger(n))\n return { tier: 1, reason: 'non-integer (tests and call sites only use integers)' };\n return { tier: 2 };\n}\n\nfunction stringRealism(s: string, ctx: RealismContext): Realism {\n if (EXOTIC_CHARS.test(s))\n return { tier: 0, reason: 'control, zero-width or unpaired surrogate characters' };\n if (LEADING_COMBINING.test(s)) return { tier: 0, reason: 'leading combining mark' };\n if (ctx.strings.has(s)) return { tier: 3 };\n return { tier: 2 };\n}\n\n/** Realism of one input: its least realistic value decides. */\nexport function inputRealism(input: unknown[], ctx: RealismContext): Realism {\n let worst: Realism = { tier: 3 };\n let leaves = 0;\n const consider = (r: Realism) => {\n leaves++;\n if (r.tier < worst.tier) worst = r;\n };\n const seen = new Set<unknown>();\n const walk = (v: unknown, depth: number) => {\n if (depth > 8) return;\n if (typeof v === 'number') return consider(numberRealism(v, ctx));\n if (typeof v === 'string') return consider(stringRealism(v, ctx));\n if (typeof v !== 'object' || v === null || seen.has(v)) return;\n seen.add(v);\n if (isFnDescriptor(v)) return;\n if (isProtoDescriptor(v)) {\n consider({ tier: 1, reason: 'object with inherited enumerable properties' });\n walk(v[PROTO_TAG].proto, depth + 1);\n walk(v[PROTO_TAG].own, depth + 1);\n return;\n }\n if (v instanceof ArrayBuffer || ArrayBuffer.isView(v)) {\n consider({ tier: 2 });\n return;\n }\n if (v instanceof Date) {\n const t = v.getTime();\n if (Number.isNaN(t)) consider({ tier: 0, reason: 'Invalid Date' });\n else if (v.getUTCFullYear() < 1900 || v.getUTCFullYear() > 2200)\n consider({ tier: 0, reason: 'date far from the present' });\n else consider({ tier: 2 });\n return;\n }\n if (v instanceof Map) {\n for (const [k, x] of v) {\n walk(k, depth + 1);\n walk(x, depth + 1);\n }\n return;\n }\n if (v instanceof Set) {\n for (const x of v) walk(x, depth + 1);\n return;\n }\n for (const x of Object.values(v as Record<string, unknown>)) walk(x, depth + 1);\n };\n input.forEach((v) => walk(v, 0));\n // Inputs without any number or string (booleans, empty arrays, undefined) are ordinary, not \"seen\".\n if (leaves === 0) return { tier: 2 };\n return worst;\n}\n", "import { mineValues, type MinedValues } from '../arbitraries/mine.js';\nimport { compileSignature } from '../arbitraries/compile.js';\nimport {\n asFunctionLike,\n reachableLocalFunctions,\n referencedModuleValues,\n usesThis,\n type LocateResult,\n} from '../analyze/locate.js';\nimport { regexDiffStrings } from '../arbitraries/regex.js';\nimport { sizeLikeParams } from '../analyze/sizeParams.js';\nimport { indexModule } from '../detect/toplevel.js';\nimport type { SourceFile } from 'ts-morph';\nimport type { Arbitrary } from 'fast-check';\nimport type { CompareOptions } from '../compare/compare.js';\nimport {\n explore,\n type Cluster,\n type ExploreResult,\n type NondeterminismReport,\n type PairOutcome,\n} from '../explore/explore.js';\nimport { signatureOf } from '../types/fromType.js';\nimport { inferGuards } from '../analyze/guards.js';\nimport type { Usage } from '../analyze/usage.js';\nimport { inputRealism, realismContext } from '../explore/realism.js';\nimport { Node } from 'ts-morph';\nimport { signatureAccepts } from '../types/accepts.js';\nimport { markSize, printSpec, signatureUnsupported, type SignatureSpec } from '../types/spec.js';\nimport { fnv1a } from '../util/stableKey.js';\nimport type { VerifySession } from './session.js';\n\nexport interface FunctionTarget {\n /** Stable identifier, e.g. `src/pricing.ts#applyDiscount`. */\n id: string;\n /** Export name in the base and head version (usually identical). */\n exportName: string;\n baseFile: string;\n headFile: string;\n /** Why this function is a target (e.g. \"body changed\", \"calls changed helper toCents()\"). */\n reason?: string;\n}\n\nexport interface VerifyFunctionOptions {\n /** Root seed of the run. Each function derives its own seed from it. */\n seed: number;\n runs: number;\n /** Absolute wall-clock deadline for this function's exploration (epoch ms). */\n deadline?: number;\n compare?: CompareOptions;\n examples?: unknown[][];\n /** Usage of the function in the repository (call sites, test values). */\n usage?: Usage;\n /** Declared input domain (config `where`): inputs outside it are never generated or reported. */\n where?: (args: unknown[]) => boolean;\n /** Custom argument generator (from the config file); replaces the type-derived one. */\n arbitrary?: Arbitrary<unknown[]>;\n /** Optional source of extra inputs (e.g. LLM edge-case suggestions); results are validated against the types. */\n suggest?: (ctx: {\n name: string;\n signature: string;\n spec: SignatureSpec;\n baseSource: string;\n headSource: string;\n }) => Promise<unknown[][]>;\n onWarning?: (message: string) => void;\n onProgress?: (p: { inputsRun: number; clusters: number }) => void;\n}\n\nexport type FunctionStatus = 'changed' | 'unchanged' | 'skipped' | 'nondeterministic';\n\nexport interface FunctionResult {\n id: string;\n exportName: string;\n file: string;\n status: FunctionStatus;\n reason?: string;\n targetReason?: string;\n signature?: string;\n seed: number;\n inputsRun: number;\n differingInputs: number;\n clusters: Cluster[];\n flakyClusters: number;\n nondeterministic?: NondeterminismReport;\n stoppedBy?: ExploreResult['stoppedBy'];\n failures: number;\n edgeFailures?: number;\n skippedEdgeInputs?: number;\n shrinkEvaluations: number;\n durationMs: number;\n mined?: { numbers: number; strings: number; thresholds: number[] };\n /** How the function is used in the repository (call sites and tests). */\n usage?: { files: number; callSites: number; values: number };\n /** Guard conditions inferred from the old version (used to focus generation). */\n guards?: string[];\n /** Number of suggested (LLM) inputs that passed type validation and were run first. */\n llmInputs?: number;\n}\n\n/** Locate an exported function through the module index (ESM exports, re-exports and CommonJS). */\nexport function locateExport(sf: SourceFile, exportName: string): LocateResult {\n const index = indexModule(sf);\n const top = index.exports.get(exportName);\n if (top === undefined) return { ok: false, reason: `no export named \\`${exportName}\\``, missing: true };\n return asFunctionLike(index.decls.get(top)!.node);\n}\n\nexport function printSignature(name: string, sig: SignatureSpec): string {\n const params = sig.params.map(\n (p) =>\n `${p.rest ? '...' : ''}${p.name}${p.optional && !p.rest ? '?' : ''}: ${printSpec(p.spec)}${p.rest ? '[]' : ''}`,\n );\n return `${name}(${params.join(', ')})`;\n}\n\nexport function functionSeed(rootSeed: number, id: string): number {\n return fnv1a(`${rootSeed}:${id}`);\n}\n\nconst FEATURE_THRESHOLDS = 8;\n\nfunction featureThresholds(mined: MinedValues): number[] {\n const all = [...new Set([0, ...mined.thresholds])].sort((a, b) => a - b);\n if (all.length <= FEATURE_THRESHOLDS) return all;\n // Keep 0 and the thresholds closest to it in magnitude (most likely to be \"real\" boundaries).\n return [\n 0,\n ...all\n .filter((t) => t !== 0)\n .sort((a, b) => Math.abs(a) - Math.abs(b))\n .slice(0, FEATURE_THRESHOLDS - 1),\n ].sort((a, b) => a - b);\n}\n\nexport async function verifyFunction(\n session: VerifySession,\n target: FunctionTarget,\n options: VerifyFunctionOptions,\n): Promise<FunctionResult> {\n const started = Date.now();\n const seed = functionSeed(options.seed, target.id);\n const base: FunctionResult = {\n id: target.id,\n exportName: target.exportName,\n file: target.id.split('#')[0] ?? target.headFile,\n status: 'skipped',\n seed,\n inputsRun: 0,\n differingInputs: 0,\n clusters: [],\n flakyClusters: 0,\n failures: 0,\n shrinkEvaluations: 0,\n durationMs: 0,\n ...(target.reason ? { targetReason: target.reason } : {}),\n };\n const skip = (reason: string): FunctionResult => ({\n ...base,\n status: 'skipped',\n reason,\n durationMs: Date.now() - started,\n });\n\n // 1. Locate both versions.\n let baseLoc, headLoc;\n try {\n baseLoc = locateExport(session.sourceFile('base', target.baseFile), target.exportName);\n headLoc = locateExport(session.sourceFile('head', target.headFile), target.exportName);\n } catch (e) {\n return skip(`could not parse source: ${(e as Error).message}`);\n }\n if (!headLoc.ok) return skip(headLoc.reason);\n if (!baseLoc.ok) return skip(`base version: ${baseLoc.reason}`);\n if (usesThis(headLoc.node) || usesThis(baseLoc.node))\n return skip('uses `this` (methods are out of scope in v1)');\n\n // 2. Signatures.\n const headSig = signatureOf(headLoc.node);\n const baseSig = signatureOf(baseLoc.node);\n const signature = printSignature(target.exportName, headSig);\n base.signature = signature;\n const unsupported = options.arbitrary ? undefined : signatureUnsupported(headSig);\n if (unsupported)\n return skip(`unsupported parameter type: ${unsupported} (provide \\`args\\` in doppeldiff.config.ts)`);\n if (!options.arbitrary && !signatureAccepts(baseSig, headSig)) {\n return skip(\n `signature changed incompatibly: ${printSignature(target.exportName, baseSig)} \u2192 ${signature}`,\n );\n }\n\n // 3. Inputs: type-driven arbitrary biased with values mined from both versions and reachable helpers.\n const baseNodes = [baseLoc.node, ...reachableLocalFunctions(baseLoc.node, 3)];\n const headNodes = [headLoc.node, ...reachableLocalFunctions(headLoc.node, 3)];\n // Module-level constants the code reads (`const iso8601 = /.../`) count too.\n baseNodes.push(...referencedModuleValues(baseNodes));\n headNodes.push(...referencedModuleValues(headNodes));\n const mined = mineValues([...baseNodes, ...headNodes]);\n // Strings on which a changed regex disagrees between the versions.\n mined.distinguishing = regexDiffStrings(mineValues(baseNodes).regexes, mineValues(headNodes).regexes);\n // Values real callers and tests use come first: they bias generation and make findings more realistic.\n const usage = options.usage;\n if (usage) {\n const finite = usage.numbers.filter((n) => Number.isFinite(n));\n mined.numbers = [...new Set([...finite.slice(0, 60), ...mined.numbers])].slice(0, 260);\n mined.strings = [...new Set([...usage.strings.slice(0, 60), ...mined.strings])].slice(0, 260);\n mined.fragments = [\n ...new Set([\n ...mined.fragments,\n ...usage.strings.filter((s) => s.length > 0 && s.length <= 12).slice(0, 30),\n ]),\n ];\n base.usage = {\n files: usage.files,\n callSites: usage.tuples.length,\n values: usage.numbers.length + usage.strings.length,\n };\n }\n const guards = Node.isVariableDeclaration(baseLoc.node) ? undefined : inferGuards(baseLoc.node);\n if (guards) base.guards = guards.conditions;\n const realismCtx = realismContext(usage);\n base.mined = { numbers: mined.numbers.length, strings: mined.strings.length, thresholds: mined.thresholds };\n // Counts, lengths, indexes and loop bounds are generated in realistic ranges (huge values only rarely).\n const sizeNames = sizeLikeParams([baseLoc.node, headLoc.node]);\n const genSig =\n sizeNames.size === 0\n ? headSig\n : {\n ...headSig,\n params: headSig.params.map((p) => (sizeNames.has(p.name) ? { ...p, spec: markSize(p.spec) } : p)),\n };\n const arbitrary = options.arbitrary ?? compileSignature(genSig, { mined });\n if (!arbitrary) return skip('could not build an input generator for the signature');\n\n // Optional suggested inputs (validated against the signature by the suggester).\n // Literal call sites from the repository run first (filtered by a declared domain, if any).\n let examples = [...(usage?.tuples ?? []), ...(options.examples ?? [])];\n if (options.where) examples = examples.filter((e) => safeWhere(options.where!, e));\n if (options.suggest) {\n try {\n const suggested = await options.suggest({\n name: target.exportName,\n signature,\n spec: headSig,\n baseSource: baseLoc.node.getText(),\n headSource: headLoc.node.getText(),\n });\n base.llmInputs = suggested.length;\n examples = [...suggested, ...examples];\n } catch (e) {\n options.onWarning?.(`input suggestions for ${target.exportName} failed: ${(e as Error).message}`);\n }\n }\n\n // 4. Load both versions in their sandboxes.\n let baseMod, headMod;\n try {\n [baseMod, headMod] = await Promise.all([\n session.loadModule('base', target.baseFile),\n session.loadModule('head', target.headFile),\n ]);\n } catch (e) {\n return skip(`could not bundle or start runner: ${(e as Error).message.split('\\n')[0]}`);\n }\n for (const [label, m] of [\n ['base', baseMod],\n ['head', headMod],\n ] as const) {\n if (!m.load.ok) {\n const err = m.load.error;\n return skip(\n `module failed to load (${label}): ${err?.code ? `${err.code} ` : ''}${err?.message ?? 'unknown error'}`,\n );\n }\n if (!m.load.exports.includes(target.exportName))\n return skip(`export \\`${target.exportName}\\` not found at runtime (${label})`);\n }\n\n // 5. Explore.\n const evaluate = async (inputs: unknown[][], opts?: { timeoutScale?: number }): Promise<PairOutcome[]> => {\n const [b, h] = await Promise.all([\n session.pools.base.run(baseMod.moduleId, target.exportName, inputs, opts),\n session.pools.head.run(headMod.moduleId, target.exportName, inputs, opts),\n ]);\n return b.map((o, i) => ({ base: o, head: h[i]! }));\n };\n const result = await explore({\n arbitrary,\n evaluate,\n seed,\n runs: options.runs,\n thresholds: featureThresholds(mined),\n ...(options.deadline !== undefined ? { deadline: options.deadline } : {}),\n ...(options.compare ? { compare: options.compare } : {}),\n ...(examples.length ? { examples } : {}),\n ...(options.onProgress ? { onProgress: options.onProgress } : {}),\n ...(options.where\n ? { inDomain: (input: unknown[]) => safeWhere(options.where!, input), strictDomain: true }\n : guards\n ? { inDomain: (input: unknown[]) => guards.accepts(input) }\n : {}),\n realism: (input: unknown[]) => inputRealism(input, realismCtx),\n });\n\n const common = {\n ...base,\n inputsRun: result.inputsRun,\n differingInputs: result.differingInputs,\n clusters: result.clusters,\n flakyClusters: result.flakyClusters,\n stoppedBy: result.stoppedBy,\n failures: result.failures,\n edgeFailures: result.edgeFailures,\n skippedEdgeInputs: result.skippedEdgeInputs,\n shrinkEvaluations: result.shrinkEvaluations,\n durationMs: Date.now() - started,\n };\n if (result.nondeterministic) {\n return {\n ...common,\n status: 'nondeterministic',\n nondeterministic: result.nondeterministic,\n reason: `the ${result.nondeterministic.side} version returned different results for the same input`,\n };\n }\n return { ...common, status: result.clusters.length > 0 ? 'changed' : 'unchanged' };\n}\n\nfunction safeWhere(where: (args: unknown[]) => boolean, input: unknown[]): boolean {\n try {\n return where(structuredClone(input)) !== false;\n } catch {\n return false;\n }\n}\n", "import type { ArbSpec, SignatureSpec } from './spec.js';\n\n/**\n * Conservative check that every value described by `head` is also a valid value for `base`,\n * so inputs generated from the head signature are legal for the base version.\n */\nexport function accepts(base: ArbSpec, head: ArbSpec): boolean {\n if (base.kind === 'anything') return true;\n if (head.kind === 'union') return head.options.every((o) => accepts(base, o));\n if (base.kind === 'union') return base.options.some((o) => accepts(o, head));\n if (JSON.stringify(base) === JSON.stringify(head)) return true;\n if (head.kind === 'literal') {\n return (\n (base.kind === 'number' && typeof head.value === 'number') ||\n (base.kind === 'string' && typeof head.value === 'string') ||\n (base.kind === 'boolean' && typeof head.value === 'boolean')\n );\n }\n if (head.kind === 'bigintLiteral') return base.kind === 'bigint';\n if (base.kind !== head.kind) return false;\n switch (base.kind) {\n case 'array':\n return accepts(base.items, (head as typeof base).items);\n case 'set':\n return accepts(base.items, (head as typeof base).items);\n case 'map': {\n const h = head as typeof base;\n return accepts(base.key, h.key) && accepts(base.value, h.value);\n }\n case 'record':\n return accepts(base.values, (head as typeof base).values);\n case 'tuple': {\n const h = head as typeof base;\n if (h.items.length < (base.optionalFrom ?? base.items.length)) return false;\n return h.items.every((it, i) => {\n const b = base.items[i] ?? base.rest;\n return b !== undefined && accepts(b, it);\n });\n }\n case 'object': {\n const h = head as typeof base;\n return base.props.every((bp) => {\n const hp = h.props.find((p) => p.name === bp.name);\n if (!hp) return bp.optional;\n if (hp.optional && !bp.optional) return false;\n return accepts(bp.spec, hp.spec);\n });\n }\n case 'function':\n return accepts(base.returns, (head as typeof base).returns);\n default:\n return true;\n }\n}\n\nexport function signatureAccepts(base: SignatureSpec, head: SignatureSpec): boolean {\n const baseRest = base.params.find((p) => p.rest);\n const headFixed = head.params.filter((p) => !p.rest);\n for (let i = 0; i < headFixed.length; i++) {\n const hp = headFixed[i]!;\n const bp = base.params[i] && !base.params[i]!.rest ? base.params[i] : baseRest;\n if (!bp) {\n // Extra head parameter: only fine if the base ignores it, i.e. it is optional in head.\n if (!hp.optional) return false;\n continue;\n }\n if (!accepts(bp.spec, hp.spec)) return false;\n }\n // Base parameters that head does not pass must be optional.\n for (let i = headFixed.length; i < base.params.length; i++) {\n const bp = base.params[i]!;\n if (!bp.optional && !bp.rest) return false;\n }\n const headRest = head.params.find((p) => p.rest);\n if (headRest) {\n const target = baseRest ?? undefined;\n if (!target || !accepts(target.spec, headRest.spec)) return false;\n }\n return true;\n}\n", "import { existsSync, realpathSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { join } from 'node:path';\nimport type { CompareOptions } from './compare/compare.js';\nimport fc from 'fast-check';\nimport type { FunctionConfig } from '../config.js';\nimport type { LlmProvider } from './claims/providers.js';\nimport { suggestInputs } from './claims/suggest.js';\nimport { detectChanges, listSourceFiles, type Detection, type ListedFunction } from './detect/detect.js';\nimport { collectUsage } from './analyze/usage.js';\nimport { prepareDependencies, type DepsResult } from './git/deps.js';\nimport { isWorkingTreeClean, mergeBase, repoRoot, resolveCommit, git } from './git/git.js';\nimport { addWorktree, type Worktree } from './git/worktree.js';\nimport { packageRootOf, relPath, VerifySession } from './verify/session.js';\nimport { verifyFunction, type FunctionResult, type FunctionTarget } from './verify/verifyFunction.js';\n\nexport interface RunOptions {\n /** Any directory inside the repository. */\n cwd: string;\n /** Base revision (default: HEAD). */\n base?: string;\n /** Head revision (default: the working tree, including uncommitted changes). */\n head?: string;\n /** Compare against merge-base(base, head) like a pull request does (default true). */\n mergeBase?: boolean;\n seed?: number;\n /** Max inputs per function (default 1000). */\n runs?: number;\n /** Per-call timeout in ms (default 250). */\n timeoutMs?: number;\n /** Total time budget for exploring all functions, in ms. Undefined: no budget. */\n timeBudgetMs?: number;\n /** Freeze the clock and seed randomness in the code under test (default true). */\n freeze?: boolean;\n include?: string[];\n exclude?: string[];\n /** Only verify these functions (ids or export names). */\n only?: string[];\n compare?: CompareOptions;\n keepWorktrees?: boolean;\n /** Allow installing dependencies in the base worktree when the lockfile changed (default true). */\n install?: boolean;\n /** Cache directory for dependency installs (default ~/.cache/doppeldiff/deps). */\n depsCacheDir?: string;\n poolSize?: number;\n noSandbox?: boolean;\n showConsole?: boolean;\n /** Optional LLM provider for edge-case input suggestions. */\n suggestProvider?: LlmProvider | null;\n onWarning?: (message: string) => void;\n /** Per-function overrides (from the config file), keyed by id (`file#export`) or export name. */\n functions?: Record<string, FunctionConfig>;\n onEvent?: (event: RunEvent) => void;\n}\n\nexport type RunEvent =\n | { type: 'phase'; phase: 'materialize' | 'dependencies' | 'detect' | 'verify'; detail?: string }\n | { type: 'detected'; detection: Detection }\n | { type: 'function-start'; target: FunctionTarget; index: number; total: number }\n | { type: 'function-progress'; target: FunctionTarget; inputsRun: number; clusters: number }\n | { type: 'function-done'; result: FunctionResult; index: number; total: number };\n\nexport interface RunResult {\n tool: { name: 'doppeldiff'; version: string };\n base: { ref: string; sha: string };\n head: { ref: string; sha: string | null };\n seed: number;\n settings: { runs: number; timeoutMs: number; timeBudgetMs: number | null; freeze: boolean };\n /** Results for every function whose behavior may have changed. */\n functions: FunctionResult[];\n skipped: ListedFunction[];\n added: ListedFunction[];\n removed: ListedFunction[];\n identical: ListedFunction[];\n errors: { file: string; message: string }[];\n changedFiles: number;\n dependencies: DepsResult['actions'];\n timing: {\n totalMs: number;\n materializeMs: number;\n dependenciesMs: number;\n detectMs: number;\n verifyMs: number;\n };\n}\n\nexport const DEFAULT_SEED = 1;\nexport const DEFAULT_RUNS = 1000;\nexport const DEFAULT_TIMEOUT_MS = 250;\n\nexport function toolVersion(): string {\n try {\n const require = createRequire(import.meta.url);\n for (const p of ['../package.json', '../../package.json']) {\n try {\n return (require(p) as { version: string }).version;\n } catch {\n /* try next */\n }\n }\n } catch {\n /* ignore */\n }\n return '0.0.0';\n}\n\nexport async function run(options: RunOptions): Promise<RunResult> {\n const t0 = Date.now();\n const emit = options.onEvent ?? (() => {});\n const seed = options.seed ?? DEFAULT_SEED;\n const runs = options.runs ?? DEFAULT_RUNS;\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const freeze = options.freeze ?? true;\n\n // 1. Resolve revisions and materialize both versions.\n emit({ type: 'phase', phase: 'materialize' });\n const repo = repoRoot(options.cwd);\n const baseRef = options.base ?? 'HEAD';\n const headRef = options.head;\n const headSha = headRef ? resolveCommit(repo, headRef) : undefined;\n let baseSha = resolveCommit(repo, baseRef);\n if (options.mergeBase !== false) baseSha = mergeBase(repo, baseSha, headSha ?? 'HEAD');\n\n const worktrees: Worktree[] = [];\n let session: VerifySession | undefined;\n try {\n const baseWt = addWorktree(repo, baseSha, { keep: options.keepWorktrees ?? false });\n worktrees.push(baseWt);\n let headRoot = repo;\n const currentHead = git(['rev-parse', 'HEAD'], repo).trim();\n if (headSha && !(headSha === currentHead && isWorkingTreeClean(repo))) {\n const headWt = addWorktree(repo, headSha, { keep: options.keepWorktrees ?? false });\n worktrees.push(headWt);\n headRoot = headWt.path;\n }\n const materializeMs = Date.now() - t0;\n\n // 2. Detect changed functions (parsing only needs sources, not dependencies).\n emit({ type: 'phase', phase: 'detect' });\n const tDetect = Date.now();\n const parser = new VerifySession({ baseRoot: baseWt.path, headRoot, timeoutMs, freeze, seed });\n const detection = detectChanges({\n repo,\n baseSha,\n ...(headSha ? { headSha } : {}),\n baseRoot: baseWt.path,\n headRoot,\n ...(options.include ? { include: options.include } : {}),\n ...(options.exclude ? { exclude: options.exclude } : {}),\n sourceFile: (side, file) => parser.sourceFile(side, file),\n });\n // Config: functions explicitly skipped.\n for (const t of [...detection.targets]) {\n const fcfg = options.functions?.[t.id] ?? options.functions?.[t.exportName];\n if (fcfg?.skip) {\n detection.targets.splice(detection.targets.indexOf(t), 1);\n detection.skipped.push({\n id: t.id,\n file: t.id.split('#')[0]!,\n exportName: t.exportName,\n kind: 'function',\n reason: typeof fcfg.skip === 'string' ? fcfg.skip : 'skipped in doppeldiff.config',\n });\n }\n }\n const only = options.only;\n if (only?.length) {\n detection.targets = detection.targets.filter((t) => only.some((o) => o === t.id || o === t.exportName));\n }\n emit({ type: 'detected', detection });\n const detectMs = Date.now() - tDetect;\n\n // 3. Dependencies for the worktrees (only the package dirs that contain targets).\n emit({ type: 'phase', phase: 'dependencies' });\n const tDeps = Date.now();\n const packageDirs = [\n ...new Set(detection.targets.map((t) => relPath(headRoot, packageRootOf(headRoot, t.headFile)))),\n ];\n const deps: DepsResult = { readPaths: [], actions: [] };\n if (detection.targets.length > 0) {\n for (const wt of worktrees) {\n const r = prepareDependencies({\n targetRoot: wt.path,\n sourceRoot: repo,\n packageDirs,\n ...(options.install !== undefined ? { install: options.install } : {}),\n ...(options.depsCacheDir !== undefined ? { cacheDir: options.depsCacheDir } : {}),\n });\n deps.readPaths.push(...r.readPaths);\n deps.actions.push(...r.actions);\n }\n // Package-level node_modules of the working copy may be symlinks (pnpm, workspaces): allow their targets.\n for (const dir of packageDirs) {\n const nm = join(repo, dir, 'node_modules');\n if (existsSync(nm)) deps.readPaths.push(realpathSync(nm));\n }\n }\n const dependenciesMs = Date.now() - tDeps;\n\n // 4. Verify each target in the sandboxed runners.\n emit({ type: 'phase', phase: 'verify' });\n const tVerify = Date.now();\n session = new VerifySession({\n baseRoot: baseWt.path,\n headRoot,\n timeoutMs,\n freeze,\n seed,\n // Both runners may read the working copy (for symlinked workspace packages); writes stay denied.\n extraReadPaths: [repo, ...deps.readPaths],\n sourceRepo: repo,\n ...(options.poolSize !== undefined ? { poolSize: options.poolSize } : {}),\n ...(options.noSandbox !== undefined ? { noSandbox: options.noSandbox } : {}),\n ...(options.showConsole !== undefined ? { showConsole: options.showConsole } : {}),\n });\n const functions: FunctionResult[] = [];\n let fileList: string[] | undefined;\n const repoFiles = () => (fileList ??= listSourceFiles(repo, headSha));\n const total = detection.targets.length;\n for (const [index, target] of detection.targets.entries()) {\n emit({ type: 'function-start', target, index, total });\n let deadline: number | undefined;\n if (options.timeBudgetMs !== undefined) {\n const remaining = options.timeBudgetMs - (Date.now() - tVerify);\n deadline = Date.now() + Math.max(500, remaining / (total - index));\n }\n const fcfg = options.functions?.[target.id] ?? options.functions?.[target.exportName];\n const stem = target.id\n .split('#')[0]!\n .split('/')\n .pop()!\n .replace(/\\.[^.]+$/, '');\n const usage = collectUsage(headRoot, repoFiles(), [\n target.exportName === 'default' ? stem : target.exportName,\n ]);\n const result = await verifyFunction(session, target, {\n seed,\n runs: fcfg?.runs ?? runs,\n usage,\n ...(fcfg?.where ? { where: fcfg.where } : {}),\n ...(fcfg?.args ? { arbitrary: fcfg.args(fc) } : {}),\n ...(fcfg?.examples ? { examples: fcfg.examples } : {}),\n ...(options.suggestProvider\n ? {\n suggest: async (ctx) => {\n const r = await suggestInputs(options.suggestProvider!, ctx);\n return r.accepted;\n },\n }\n : {}),\n ...(options.onWarning ? { onWarning: options.onWarning } : {}),\n ...(deadline !== undefined ? { deadline } : {}),\n ...(options.compare ? { compare: options.compare } : {}),\n onProgress: (p) => emit({ type: 'function-progress', target, ...p }),\n });\n functions.push(result);\n emit({ type: 'function-done', result, index, total });\n }\n const verifyMs = Date.now() - tVerify;\n\n return {\n tool: { name: 'doppeldiff', version: toolVersion() },\n base: { ref: baseRef, sha: baseSha },\n head: { ref: headRef ?? 'working tree', sha: headSha ?? null },\n seed,\n settings: { runs, timeoutMs, timeBudgetMs: options.timeBudgetMs ?? null, freeze },\n functions,\n skipped: detection.skipped,\n added: detection.added,\n removed: detection.removed,\n identical: detection.identical,\n errors: detection.errors,\n changedFiles: detection.files.length,\n dependencies: deps.actions,\n timing: { totalMs: Date.now() - t0, materializeMs, dependenciesMs, detectMs, verifyMs },\n };\n } finally {\n session?.close();\n for (const wt of worktrees) wt.dispose();\n }\n}\n", "import type { ArbSpec, SignatureSpec } from '../types/spec.js';\nimport type { LlmProvider } from './providers.js';\n\n/**\n * Optional LLM step: suggest targeted edge-case inputs for a changed function. Suggestions are plain\n * literals parsed with a small safe parser (never eval'd) and must conform to the parameter types.\n */\nexport const SUGGEST_SCHEMA = {\n type: 'object',\n additionalProperties: false,\n required: ['inputs'],\n properties: {\n inputs: {\n type: 'array',\n items: {\n type: 'object',\n additionalProperties: false,\n required: ['args'],\n properties: {\n args: {\n type: 'string',\n description:\n 'The argument list as a JavaScript array literal, e.g. [1000.01, 0.15]. Use only literals.',\n },\n },\n },\n },\n },\n} as const;\n\nconst SYSTEM = `You help a differential-testing tool find inputs where the old and new version of a function behave differently.\nGiven both versions and the parameter types, propose up to 20 argument lists that are most likely to expose a difference: boundary values around constants in the code, empty/negative/zero/NaN values, special characters, edge cases the change touches.\nWrite each argument list as a JavaScript array literal using only: numbers (including NaN, Infinity, -Infinity, -0), strings in double quotes, true, false, null, undefined, arrays and plain objects with quoted or identifier keys. No expressions, no function calls.`;\n\nexport function buildSuggestPrompt(\n name: string,\n signature: string,\n baseSource: string,\n headSource: string,\n): string {\n const clip = (s: string) => (s.length > 8000 ? `${s.slice(0, 8000)}\\n// \u2026 truncated` : s);\n return `Function: ${signature}\\n\\n<old_version>\\n${clip(baseSource)}\\n</old_version>\\n\\n<new_version>\\n${clip(headSource)}\\n</new_version>\\n\\nPropose argument lists for ${name}.`;\n}\n\n/** Safe parser for JavaScript literal values (no evaluation). Throws on anything else. */\nexport function parseLiteral(src: string): unknown {\n let i = 0;\n const ws = () => {\n while (i < src.length && /\\s/.test(src[i]!)) i++;\n };\n const fail = (msg: string): never => {\n throw new Error(`${msg} at ${i}`);\n };\n const value = (depth: number): unknown => {\n if (depth > 20) fail('too deep');\n ws();\n const c = src[i];\n if (c === '[') {\n i++;\n const arr: unknown[] = [];\n ws();\n if (src[i] === ']') {\n i++;\n return arr;\n }\n for (;;) {\n arr.push(value(depth + 1));\n ws();\n if (src[i] === ',') {\n i++;\n ws();\n if (src[i] === ']') {\n i++;\n return arr;\n }\n continue;\n }\n if (src[i] === ']') {\n i++;\n return arr;\n }\n fail('expected , or ]');\n }\n }\n if (c === '{') {\n i++;\n const obj: Record<string, unknown> = {};\n ws();\n if (src[i] === '}') {\n i++;\n return obj;\n }\n for (;;) {\n ws();\n let key: string;\n if (src[i] === '\"' || src[i] === \"'\") key = str();\n else {\n const m = /^[A-Za-z_$][\\w$]*/.exec(src.slice(i));\n if (!m) fail('expected key');\n key = m![0];\n i += key.length;\n }\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') fail('forbidden key');\n ws();\n if (src[i] !== ':') fail('expected :');\n i++;\n obj[key] = value(depth + 1);\n ws();\n if (src[i] === ',') {\n i++;\n ws();\n if (src[i] === '}') {\n i++;\n return obj;\n }\n continue;\n }\n if (src[i] === '}') {\n i++;\n return obj;\n }\n fail('expected , or }');\n }\n }\n if (c === '\"' || c === \"'\") return str();\n const rest = src.slice(i);\n for (const [word, v] of [\n ['true', true],\n ['false', false],\n ['null', null],\n ['undefined', undefined],\n ['NaN', NaN],\n ['Infinity', Infinity],\n ['-Infinity', -Infinity],\n ] as const) {\n if (rest.startsWith(word) && !/[\\w$]/.test(rest[word.length] ?? '')) {\n i += word.length;\n return v;\n }\n }\n const m = /^-?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?/i.exec(rest);\n if (m) {\n i += m[0].length;\n return Number(m[0]);\n }\n return fail('unexpected token');\n };\n const str = (): string => {\n const q = src[i];\n i++;\n let out = '';\n while (i < src.length && src[i] !== q) {\n if (src[i] === '\\\\') {\n const n = src[i + 1];\n const map: Record<string, string> = {\n n: '\\n',\n t: '\\t',\n r: '\\r',\n '\\\\': '\\\\',\n '\"': '\"',\n \"'\": \"'\",\n '0': '\\0',\n };\n if (n === 'u') {\n out += String.fromCharCode(parseInt(src.slice(i + 2, i + 6), 16));\n i += 6;\n continue;\n }\n out += map[n ?? ''] ?? n ?? '';\n i += 2;\n continue;\n }\n out += src[i++];\n }\n if (src[i] !== q) fail('unterminated string');\n i++;\n return out;\n };\n const v = value(0);\n ws();\n if (i !== src.length) fail('trailing characters');\n return v;\n}\n\n/** Does a value conform to a spec? Used to validate LLM suggestions before running them. */\nexport function conforms(spec: ArbSpec, v: unknown, defs = new Map<string, ArbSpec>()): boolean {\n switch (spec.kind) {\n case 'number':\n return typeof v === 'number';\n case 'bigint':\n return typeof v === 'bigint';\n case 'string':\n return typeof v === 'string';\n case 'boolean':\n return typeof v === 'boolean';\n case 'undefined':\n return v === undefined;\n case 'null':\n return v === null;\n case 'literal':\n return Object.is(v, spec.value) || v === spec.value;\n case 'bigintLiteral':\n return typeof v === 'bigint' && v.toString() === spec.value;\n case 'union':\n return spec.options.some((o) => conforms(o, v, defs));\n case 'array':\n return Array.isArray(v) && v.every((x) => conforms(spec.items, x, defs));\n case 'tuple': {\n if (!Array.isArray(v)) return false;\n const min = spec.optionalFrom ?? spec.items.length;\n if (v.length < min || (!spec.rest && v.length > spec.items.length)) return false;\n return v.every((x, idx) => {\n const s = spec.items[idx] ?? spec.rest;\n return s !== undefined && conforms(s, x, defs);\n });\n }\n case 'object': {\n if (typeof v !== 'object' || v === null || Array.isArray(v)) return false;\n const o = v as Record<string, unknown>;\n return spec.props.every((p) =>\n p.name in o\n ? (p.optional && o[p.name] === undefined) || conforms(p.spec, o[p.name], defs)\n : p.optional,\n );\n }\n case 'record':\n return (\n typeof v === 'object' &&\n v !== null &&\n !Array.isArray(v) &&\n Object.values(v).every((x) => conforms(spec.values, x, defs))\n );\n case 'recursive':\n defs.set(spec.id, spec.spec);\n return conforms(spec.spec, v, defs);\n case 'ref': {\n const d = defs.get(spec.id);\n return d !== undefined && conforms(d, v, defs);\n }\n case 'anything':\n return true;\n default:\n // Dates, Maps, Sets and callbacks cannot be written as plain literals; unsupported never conforms.\n return false;\n }\n}\n\nexport function conformsSignature(sig: SignatureSpec, args: unknown[]): boolean {\n const fixed = sig.params.filter((p) => !p.rest);\n const rest = sig.params.find((p) => p.rest);\n if (args.length < fixed.filter((p) => !p.optional).length) return false;\n if (!rest && args.length > fixed.length) return false;\n return args.every((a, idx) => {\n const p = fixed[idx] ?? rest;\n return p !== undefined && conforms(p.spec, a);\n });\n}\n\nexport interface SuggestResult {\n accepted: unknown[][];\n rejected: number;\n}\n\nexport async function suggestInputs(\n provider: LlmProvider,\n ctx: { name: string; signature: string; spec: SignatureSpec; baseSource: string; headSource: string },\n): Promise<SuggestResult> {\n const text = await provider.complete({\n system: SYSTEM,\n user: buildSuggestPrompt(ctx.name, ctx.signature, ctx.baseSource, ctx.headSource),\n schema: SUGGEST_SCHEMA,\n schemaName: 'edge_case_inputs',\n maxTokens: 8000,\n });\n let parsed: { inputs?: { args?: unknown }[] };\n try {\n parsed = JSON.parse(text) as typeof parsed;\n } catch {\n return { accepted: [], rejected: 0 };\n }\n const accepted: unknown[][] = [];\n let rejected = 0;\n for (const item of (parsed.inputs ?? []).slice(0, 30)) {\n try {\n const args = parseLiteral(String(item.args ?? ''));\n if (Array.isArray(args) && conformsSignature(ctx.spec, args)) accepted.push(args);\n else rejected++;\n } catch {\n rejected++;\n }\n }\n return { accepted, rejected };\n}\n", "import { existsSync, readFileSync, realpathSync } from 'node:fs';\nimport { basename, dirname, extname, join } from 'node:path';\nimport picomatch from 'picomatch';\nimport { asFunctionLike } from '../analyze/locate.js';\nimport { changedFiles, git, type ChangedFile } from '../git/git.js';\nimport type { Side } from '../verify/session.js';\nimport type { FunctionTarget } from '../verify/verifyFunction.js';\nimport { changedTopLevel, indexModule, reach, type ModuleIndex } from './toplevel.js';\nimport type { SourceFile } from 'ts-morph';\n\nexport const SOURCE_EXTENSIONS = ['.ts', '.tsx', '.mts', '.cts', '.js', '.jsx', '.mjs', '.cjs'];\n\nexport const DEFAULT_EXCLUDE = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/coverage/**',\n '**/*.d.ts',\n '**/*.d.mts',\n '**/*.d.cts',\n '**/*.test.*',\n '**/*.spec.*',\n '**/__tests__/**',\n '**/__mocks__/**',\n '**/test/**',\n '**/tests/**',\n '**/test.{js,ts,mjs,cjs}',\n '**/tests.{js,ts,mjs,cjs}',\n '**/*.config.*',\n '**/.*/**',\n];\n\nexport interface DetectOptions {\n /** Repository root of the head version (where git commands run). */\n repo: string;\n baseSha: string;\n /** Head revision, or undefined for the working tree. */\n headSha?: string;\n baseRoot: string;\n headRoot: string;\n include?: string[];\n exclude?: string[];\n /** Depth for following references inside a module (default 3). */\n transitiveDepth?: number;\n /** Follow imports one module deep (default true). */\n crossModule?: boolean;\n sourceFile: (side: Side, absFile: string) => SourceFile;\n}\n\nexport interface ListedFunction {\n id: string;\n file: string;\n exportName: string;\n kind: string;\n reason?: string;\n}\n\nexport interface Detection {\n /** Changed source files considered (after include/exclude). */\n files: ChangedFile[];\n targets: FunctionTarget[];\n /** Changed exports that cannot be tested in v1 (classes, values, generators, \u2026). */\n skipped: ListedFunction[];\n added: ListedFunction[];\n removed: ListedFunction[];\n /** Exports whose code changed only in comments/formatting. */\n identical: ListedFunction[];\n /** Changed files that could not be analyzed. */\n errors: { file: string; message: string }[];\n}\n\n/** Canonical path key: real path with forward slashes (TypeScript reports resolved, posix-style paths). */\nfunction pathKey(p: string): string {\n let r = p;\n try {\n r = realpathSync.native(p);\n } catch {\n /* keep as is */\n }\n return r.replace(/\\\\/g, '/');\n}\n\nfunction isSource(path: string): boolean {\n return SOURCE_EXTENSIONS.includes(extname(path));\n}\n\nfunction exportKind(\n index: ModuleIndex,\n topName: string,\n): { testable: boolean; kind: string; reason?: string } {\n const top = index.decls.get(topName)!;\n if (top.kind === 'class')\n return { testable: false, kind: 'class', reason: 'class (class methods are out of scope in v1)' };\n if (top.kind === 'enum') return { testable: false, kind: 'enum', reason: 'enum (not a function)' };\n if (top.kind === 'import') return { testable: false, kind: 'import', reason: 're-exported import' };\n const loc = asFunctionLike(top.node);\n if (loc.ok) return { testable: true, kind: 'function' };\n return { testable: false, kind: top.kind === 'variable' ? 'value' : top.kind, reason: loc.reason };\n}\n\n/**\n * Determine which exported functions may have changed behavior between two versions:\n * - directly: their normalized declaration differs;\n * - transitively: they reference (within `transitiveDepth` hops) a changed module-level binding,\n * or an imported binding whose declaration changed in another module (one module deep).\n */\nexport function detectChanges(options: DetectOptions): Detection {\n const include = options.include?.length ? picomatch(options.include, { dot: true }) : () => true;\n const exclude = picomatch([...DEFAULT_EXCLUDE, ...(options.exclude ?? [])], { dot: true });\n const wanted = (p: string | undefined) => !!p && isSource(p) && include(p) && !exclude(p);\n const depth = options.transitiveDepth ?? 3;\n\n const all = changedFiles(options.repo, options.baseSha, options.headSha);\n const files = all.filter((f) => wanted(f.headPath) || wanted(f.basePath));\n const detection: Detection = {\n files,\n targets: [],\n skipped: [],\n added: [],\n removed: [],\n identical: [],\n errors: [],\n };\n\n /** Changed top-level names per head file (absolute path). */\n const changedByFile = new Map<string, Set<string>>();\n /** `file#name` of unchanged bindings that use a changed binding of the same file \u2192 that changed binding. */\n const indirect = new Map<string, string>();\n const targetIds = new Set<string>();\n\n const pushTarget = (t: FunctionTarget) => {\n if (targetIds.has(t.id)) return;\n targetIds.add(t.id);\n detection.targets.push(t);\n };\n\n // Add every file analysis will need to the projects *before* querying the type checker: each addition\n // invalidates the TypeScript program, and rebuilding it per file is quadratic on large repositories.\n const preload = (side: Side, abs: string) => {\n try {\n if (existsSync(abs)) options.sourceFile(side, abs);\n } catch {\n /* reported when analyzed */\n }\n };\n const changedStems = new Set<string>();\n for (const f of files) {\n if (f.headPath) {\n preload('head', join(options.headRoot, f.headPath));\n changedStems.add(basename(f.headPath).replace(/\\.[^.]+$/, ''));\n const name = nearestPackageName(join(options.headRoot, f.headPath), options.headRoot);\n if (name) changedStems.add(name);\n }\n if (f.basePath) preload('base', join(options.baseRoot, f.basePath));\n }\n const changedHeadKeys = new Set(\n files.filter((f) => f.headPath).map((f) => pathKey(join(options.headRoot, f.headPath!))),\n );\n const crossCandidates =\n options.crossModule === false || files.length === 0\n ? []\n : listSourceFiles(options.repo, options.headSha)\n .filter((p) => wanted(p))\n .map((p) => ({ rel: p, abs: join(options.headRoot, p) }))\n .filter(({ abs }) => existsSync(abs) && !changedHeadKeys.has(pathKey(abs)))\n .filter(({ abs }) => {\n const text = readFileSync(abs, 'utf8');\n return [...changedStems].some((st) => text.includes(st));\n });\n for (const c of crossCandidates) preload('head', c.abs);\n\n for (const f of files) {\n const headFile = f.headPath ? join(options.headRoot, f.headPath) : undefined;\n const baseFile = f.basePath ? join(options.baseRoot, f.basePath) : undefined;\n let head: ModuleIndex | undefined;\n let base: ModuleIndex | undefined;\n try {\n if (headFile && existsSync(headFile)) head = indexModule(options.sourceFile('head', headFile));\n if (baseFile && existsSync(baseFile)) base = indexModule(options.sourceFile('base', baseFile));\n } catch (e) {\n detection.errors.push({ file: (f.headPath ?? f.basePath)!, message: (e as Error).message });\n continue;\n }\n const displayPath = (f.headPath ?? f.basePath)!;\n const changed = changedTopLevel(base, head);\n const sideEffectsChanged =\n JSON.stringify(base?.sideEffects ?? []) !== JSON.stringify(head?.sideEffects ?? []);\n if (headFile && head) {\n // Importers are affected by changed bindings and by bindings that reach them (`decorateResult` calling a\n // changed `applyNumberFormatting` in the same file), so both count for cross-module impact.\n const affected = new Set(changed);\n if (changed.size > 0) {\n for (const [name, top] of head.decls) {\n if (affected.has(name) || top.kind === 'import') continue;\n const r = reach(head, top.node, depth);\n const via = [...r.local.keys()].find((n) => changed.has(n));\n if (via) {\n affected.add(name);\n indirect.set(`${pathKey(headFile)}#${name}`, via);\n }\n }\n }\n changedByFile.set(pathKey(headFile), affected);\n } else if (headFile) changedByFile.set(pathKey(headFile), changed);\n\n // Removed exports.\n if (base) {\n for (const [exportName, topName] of base.exports) {\n if (head?.exports.has(exportName)) continue;\n detection.removed.push({\n id: `${f.basePath}#${exportName}`,\n file: f.basePath!,\n exportName,\n kind: exportKind(base, topName).kind,\n });\n }\n }\n if (!head) continue;\n\n // A changed module with runtime code but no recognizable exports (UMD/IIFE wrappers, globals) must not be\n // reported as \"nothing changed\": list it as not verified.\n if (head.exports.size === 0 && (changed.size > 0 || sideEffectsChanged)) {\n detection.skipped.push({\n id: `${displayPath}#*`,\n file: displayPath,\n exportName: '*',\n kind: 'module',\n reason:\n 'changed, but no ESM/CommonJS exports were recognized (UMD/IIFE wrappers are not supported in v1)',\n });\n continue;\n }\n\n for (const [exportName, topName] of head.exports) {\n const id = `${displayPath}#${exportName}`;\n const kind = exportKind(head, topName);\n const baseTop = base?.exports.get(exportName);\n if (!base || baseTop === undefined) {\n detection.added.push({ id, file: displayPath, exportName, kind: kind.kind });\n continue;\n }\n const top = head.decls.get(topName)!;\n const baseDecl = base.decls.get(baseTop);\n const directlyChanged = !baseDecl || baseDecl.normalized !== top.normalized;\n let reason: string | undefined;\n if (directlyChanged) {\n reason = 'code changed';\n } else {\n const r = reach(head, top.node, depth);\n const hit = [...r.local].find(([name]) => changed.has(name));\n if (hit)\n reason = `uses changed \\`${hit[0]}\\`${hit[1].length > 1 ? ` (via ${hit[1].slice(0, -1).join(' \u2192 ')})` : ''}`;\n else if (sideEffectsChanged) reason = 'module-level code changed';\n }\n if (!reason) {\n if (baseDecl && baseDecl.raw !== top.raw) {\n detection.identical.push({\n id,\n file: displayPath,\n exportName,\n kind: kind.kind,\n reason: 'only comments or formatting changed',\n });\n }\n continue;\n }\n if (!kind.testable) {\n detection.skipped.push({\n id,\n file: displayPath,\n exportName,\n kind: kind.kind,\n reason: kind.reason ?? 'not testable',\n });\n continue;\n }\n pushTarget({\n id,\n exportName,\n baseFile: join(options.baseRoot, f.basePath!),\n headFile: headFile!,\n reason,\n });\n }\n }\n\n // Cross-module impact: exported functions anywhere in the head tree that import a changed binding.\n if (options.crossModule !== false && changedByFile.size > 0) {\n const changedFilesAbs = [...changedByFile.entries()].filter(([, set]) => set.size > 0);\n // Cheap pre-filter: a file can only import a changed module if it mentions its file stem or package name.\n const stems = new Set(changedFilesAbs.map(([p]) => basename(p).replace(/\\.[^.]+$/, '')));\n for (const [p] of changedFilesAbs) {\n const name = nearestPackageName(p, options.headRoot);\n if (name) stems.add(name);\n }\n const candidates = crossCandidates.filter(({ abs }) => !changedByFile.has(pathKey(abs)));\n for (const { rel, abs } of candidates) {\n const text = readFileSync(abs, 'utf8');\n if (![...stems].some((s) => text.includes(s))) continue;\n const baseAbs = join(options.baseRoot, rel);\n if (!existsSync(baseAbs)) continue;\n let index: ModuleIndex;\n try {\n index = indexModule(options.sourceFile('head', abs));\n } catch {\n continue;\n }\n for (const [exportName, topName] of index.exports) {\n const id = `${rel}#${exportName}`;\n if (targetIds.has(id)) continue;\n const top = index.decls.get(topName)!;\n const r = reach(index, top.node, depth);\n let reason: string | undefined;\n for (const [, imp] of r.imported) {\n const key = pathKey(imp.file);\n if (changedByFile.get(key)?.has(imp.name)) {\n const from = relativeTo(pathKey(options.headRoot), key);\n const via = indirect.get(`${key}#${imp.name}`);\n reason = via\n ? `uses \\`${imp.name}\\` from ${from}, which uses changed \\`${via}\\``\n : `uses changed \\`${imp.name}\\` from ${from}`;\n break;\n }\n }\n if (!reason) continue;\n const kind = exportKind(index, topName);\n if (!kind.testable) continue;\n pushTarget({ id, exportName, baseFile: baseAbs, headFile: abs, reason });\n }\n }\n }\n return detection;\n}\n\nfunction nearestPackageName(file: string, root: string): string | undefined {\n let dir = dirname(file);\n const stop = pathKey(root);\n for (let i = 0; i < 20; i++) {\n const pkg = join(dir, 'package.json');\n if (existsSync(pkg)) {\n try {\n const name = (JSON.parse(readFileSync(pkg, 'utf8')) as { name?: unknown }).name;\n if (typeof name === 'string') return name;\n } catch {\n /* ignore */\n }\n }\n if (pathKey(dir) === stop) break;\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return undefined;\n}\n\nfunction relativeTo(root: string, abs: string): string {\n return abs.startsWith(root + '/') ? abs.slice(root.length + 1) : abs;\n}\n\n/** Tracked (and, for the working tree, untracked non-ignored) files of the head version. */\nexport function listSourceFiles(repo: string, headSha?: string): string[] {\n const out = headSha\n ? git(['ls-tree', '-r', '--name-only', '-z', headSha], repo)\n : git(['ls-files', '--cached', '--others', '--exclude-standard', '-z'], repo);\n return out.split('\\0').filter((p) => p.length > 0 && isSource(p));\n}\n", "import { execFileSync } from 'node:child_process';\n\nexport class GitError extends Error {\n constructor(\n message: string,\n readonly stderr: string,\n ) {\n super(message);\n this.name = 'GitError';\n }\n}\n\nexport function git(args: string[], cwd: string): string {\n try {\n return execFileSync('git', args, {\n cwd,\n encoding: 'utf8',\n maxBuffer: 256 * 1024 * 1024,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: { ...process.env, GIT_TERMINAL_PROMPT: '0', LC_ALL: 'C' },\n });\n } catch (e) {\n const err = e as { stderr?: string | Buffer; message: string };\n const stderr = String(err.stderr ?? '');\n throw new GitError(`git ${args.join(' ')} failed: ${stderr.trim() || err.message}`, stderr);\n }\n}\n\nexport function repoRoot(cwd: string): string {\n return git(['rev-parse', '--show-toplevel'], cwd).trim();\n}\n\n/** Resolve a revision to a full commit SHA. */\nexport function resolveCommit(cwd: string, rev: string): string {\n return git(['rev-parse', '--verify', '--quiet', `${rev}^{commit}`], cwd).trim();\n}\n\nexport function mergeBase(cwd: string, a: string, b: string): string {\n return git(['merge-base', a, b], cwd).trim();\n}\n\nexport type FileStatus = 'added' | 'modified' | 'deleted' | 'renamed';\n\nexport interface ChangedFile {\n status: FileStatus;\n /** Path in the base revision (repo-relative, forward slashes); undefined for added files. */\n basePath?: string;\n /** Path in the head revision; undefined for deleted files. */\n headPath?: string;\n}\n\n/**\n * Files changed between `base` and `head`. `head === undefined` means the working tree\n * (staged + unstaged changes and untracked, non-ignored files).\n */\nexport function changedFiles(cwd: string, base: string, head?: string): ChangedFile[] {\n const args = ['diff', '--name-status', '-z', '-M', base];\n if (head) args.push(head);\n const out = git(args, cwd);\n const parts = out.split('\\0').filter((p) => p.length > 0);\n const files: ChangedFile[] = [];\n for (let i = 0; i < parts.length;) {\n const code = parts[i++]!;\n if (code.startsWith('R')) {\n files.push({ status: 'renamed', basePath: parts[i++]!, headPath: parts[i++]! });\n } else if (code.startsWith('C')) {\n i++; // copy source\n files.push({ status: 'added', headPath: parts[i++]! });\n } else if (code === 'A') {\n files.push({ status: 'added', headPath: parts[i++]! });\n } else if (code === 'D') {\n files.push({ status: 'deleted', basePath: parts[i++]! });\n } else {\n const p = parts[i++]!;\n files.push({ status: 'modified', basePath: p, headPath: p });\n }\n }\n if (!head) {\n const untracked = git(['ls-files', '--others', '--exclude-standard', '-z'], cwd)\n .split('\\0')\n .filter((p) => p.length > 0);\n for (const p of untracked) files.push({ status: 'added', headPath: p });\n }\n return files;\n}\n\n/** Line ranges touched by a diff, per side. Lines are 1-based, ranges inclusive. */\nexport interface Hunk {\n baseStart: number;\n baseLines: number;\n headStart: number;\n headLines: number;\n}\n\nexport function parseHunks(diff: string): Hunk[] {\n const hunks: Hunk[] = [];\n const re = /^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/gm;\n for (const m of diff.matchAll(re)) {\n hunks.push({\n baseStart: Number(m[1]),\n baseLines: m[2] === undefined ? 1 : Number(m[2]),\n headStart: Number(m[3]),\n headLines: m[4] === undefined ? 1 : Number(m[4]),\n });\n }\n return hunks;\n}\n\nexport function fileHunks(cwd: string, base: string, head: string | undefined, file: ChangedFile): Hunk[] {\n const args = ['diff', '-U0', '-M', '--no-color', '--no-ext-diff', base];\n if (head) args.push(head);\n args.push('--', ...new Set([file.basePath, file.headPath].filter((p): p is string => !!p)));\n return parseHunks(git(args, cwd));\n}\n\n/** Contents of a file at a revision. */\nexport function showFile(cwd: string, rev: string, path: string): string {\n return git(['show', `${rev}:${path}`], cwd);\n}\n\nexport function isWorkingTreeClean(cwd: string): boolean {\n return git(['status', '--porcelain'], cwd).trim().length === 0;\n}\n\n/** Unified diff text between base and head (or the working tree) restricted to `paths`. */\nexport function diffText(cwd: string, base: string, head: string | undefined, paths: string[]): string {\n if (paths.length === 0) return '';\n const args = ['diff', '-U3', '-M', '--no-color', '--no-ext-diff', base];\n if (head) args.push(head);\n args.push('--', ...paths);\n return git(args, cwd);\n}\n", "import { readFileSync } from 'node:fs';\nimport { basename, join } from 'node:path';\nimport { ts } from 'ts-morph';\n\n/**\n * How a function is actually used in the repository: literal arguments at call sites (in sources and tests) and the\n * literal values of test files that exercise it. Used to run real inputs first, to bias generation towards them, and\n * to judge how realistic a counterexample is.\n */\nexport interface Usage {\n /** Argument lists of call sites whose arguments are all literals. */\n tuples: unknown[][];\n /** Literal numbers seen at call sites and in tests of the function. */\n numbers: number[];\n /** Literal strings seen at call sites and in tests of the function. */\n strings: string[];\n /** Number of files that referenced the function. */\n files: number;\n /** Number of numeric literal occurrences behind `numbers` (repeated values count). */\n numberObservations: number;\n}\n\nexport function emptyUsage(): Usage {\n return { tuples: [], numbers: [], strings: [], files: 0, numberObservations: 0 };\n}\n\nconst TEST_FILE = /(^|\\/)(test|tests|__tests__|spec)\\/|\\.(test|spec)\\.[cm]?[jt]sx?$/;\nconst MAX_TUPLES = 60;\nconst MAX_POOL = 400;\nconst MAX_FILE_BYTES = 512 * 1024;\n\nconst NOT_LITERAL = Symbol('not-literal');\n\n/** Evaluate a literal expression (numbers, strings, booleans, null/undefined, arrays/objects of literals). */\nfunction literalValue(node: ts.Node, depth = 0): unknown {\n if (depth > 6) return NOT_LITERAL;\n if (ts.isNumericLiteral(node)) return Number(node.text);\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) return node.text;\n if (ts.isPrefixUnaryExpression(node) && ts.isNumericLiteral(node.operand)) {\n if (node.operator === ts.SyntaxKind.MinusToken) return -Number(node.operand.text);\n if (node.operator === ts.SyntaxKind.PlusToken) return Number(node.operand.text);\n }\n if (node.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (node.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (node.kind === ts.SyntaxKind.NullKeyword) return null;\n if (ts.isIdentifier(node)) {\n if (node.text === 'undefined') return undefined;\n if (node.text === 'NaN') return NaN;\n if (node.text === 'Infinity') return Infinity;\n return NOT_LITERAL;\n }\n if (ts.isParenthesizedExpression(node) || ts.isAsExpression(node))\n return literalValue(node.expression, depth + 1);\n if (ts.isArrayLiteralExpression(node)) {\n const out: unknown[] = [];\n for (const el of node.elements) {\n const v = literalValue(el, depth + 1);\n if (v === NOT_LITERAL) return NOT_LITERAL;\n out.push(v);\n }\n return out;\n }\n if (ts.isObjectLiteralExpression(node)) {\n const out: Record<string, unknown> = {};\n for (const p of node.properties) {\n if (!ts.isPropertyAssignment(p)) return NOT_LITERAL;\n const key =\n ts.isIdentifier(p.name) || ts.isStringLiteral(p.name) || ts.isNumericLiteral(p.name)\n ? p.name.text\n : undefined;\n if (key === undefined || key === '__proto__') return NOT_LITERAL;\n const v = literalValue(p.initializer, depth + 1);\n if (v === NOT_LITERAL) return NOT_LITERAL;\n out[key] = v;\n }\n return out;\n }\n return NOT_LITERAL;\n}\n\nfunction calleeName(expr: ts.Expression): string | undefined {\n if (ts.isIdentifier(expr)) return expr.text;\n if (ts.isPropertyAccessExpression(expr)) return expr.name.text;\n return undefined;\n}\n\n/**\n * Collect usage of `names` (export name, plus the file stem for default exports) across `files`\n * (repo-relative paths under `root`).\n */\nexport function collectUsage(root: string, files: string[], names: string[]): Usage {\n const usage = emptyUsage();\n const nameSet = new Set(names.filter((n) => n && n !== 'default'));\n if (nameSet.size === 0) return usage;\n const pattern = new RegExp(`\\\\b(${[...nameSet].map((n) => n.replace(/[$]/g, '\\\\$')).join('|')})\\\\b`);\n const numbers = new Set<number>();\n const strings = new Set<string>();\n const tupleKeys = new Set<string>();\n\n for (const rel of files) {\n let text: string;\n try {\n text = readFileSync(join(root, rel), 'utf8');\n } catch {\n continue;\n }\n if (text.length > MAX_FILE_BYTES || !pattern.test(text)) continue;\n usage.files++;\n const isTest = TEST_FILE.test(rel);\n const sf = ts.createSourceFile(basename(rel), text, ts.ScriptTarget.Latest, true);\n const visit = (node: ts.Node) => {\n if (ts.isCallExpression(node)) {\n const name = calleeName(node.expression);\n if (name && nameSet.has(name)) {\n const args = node.arguments.map((a) => literalValue(a));\n for (const a of args) if (typeof a === 'number') usage.numberObservations++;\n for (const a of args) collectLeaves(a, numbers, strings);\n if (args.length > 0 && args.every((a) => a !== NOT_LITERAL) && usage.tuples.length < MAX_TUPLES) {\n const key = JSON.stringify(args, (_k, v) =>\n typeof v === 'number' && !Number.isFinite(v) ? String(v) : v,\n );\n if (!tupleKeys.has(key)) {\n tupleKeys.add(key);\n usage.tuples.push(args);\n }\n }\n }\n }\n // Tests often keep inputs in tables (`[['1', '2'], [1, 2]].forEach(...)`): their literals are usage too.\n if (isTest && numbers.size + strings.size < MAX_POOL) {\n const v =\n ts.isNumericLiteral(node) || ts.isStringLiteral(node) || ts.isPrefixUnaryExpression(node)\n ? literalValue(node)\n : NOT_LITERAL;\n if (v !== NOT_LITERAL && !isImportSpecifier(node) && !isTestTitle(node) && !isExpectedValue(node)) {\n if (typeof v === 'number') usage.numberObservations++;\n collectLeaves(v, numbers, strings);\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(sf);\n }\n usage.numbers = [...numbers].slice(0, MAX_POOL);\n usage.strings = [...strings].slice(0, MAX_POOL);\n return usage;\n}\n\n/** Assertion calls whose arguments after the first (or all, for matchers) are expected outputs, not inputs. */\nconst ASSERT_SECOND = new Set([\n 'equal',\n 'equals',\n 'strictEqual',\n 'deepEqual',\n 'deepStrictEqual',\n 'notEqual',\n 'same',\n 'is',\n 'eq',\n 'assertEquals',\n 'match',\n]);\nconst MATCHERS = new Set([\n 'toBe',\n 'toEqual',\n 'toStrictEqual',\n 'toMatchObject',\n 'toContain',\n 'toBeCloseTo',\n 'toThrow',\n 'toHaveLength',\n 'toBeGreaterThan',\n 'toBeLessThan',\n 'toBeGreaterThanOrEqual',\n 'toBeLessThanOrEqual',\n 'eql',\n 'equal',\n]);\n\n/** Is this literal (part of) an expected value in an assertion? */\nfunction isExpectedValue(node: ts.Node): boolean {\n let child: ts.Node = node;\n for (let p = node.parent; p; child = p, p = p.parent) {\n if (ts.isCallExpression(p)) {\n const name = calleeName(p.expression);\n const index = p.arguments.indexOf(child as ts.Expression);\n if (name && index >= 0) {\n if (MATCHERS.has(name) && ts.isPropertyAccessExpression(p.expression)) return true;\n if (ASSERT_SECOND.has(name) && index >= 1) return true;\n }\n return false;\n }\n if (ts.isSourceFile(p) || ts.isBlock(p)) return false;\n }\n return false;\n}\n\nconst TEST_FUNCTIONS = new Set(['describe', 'it', 'test', 'suite', 'context', 'bench']);\n\nfunction isTestTitle(node: ts.Node): boolean {\n const p = node.parent;\n if (!p || !ts.isCallExpression(p) || p.arguments[0] !== node) return false;\n const callee = ts.isPropertyAccessExpression(p.expression) ? p.expression.expression : p.expression;\n return ts.isIdentifier(callee) && TEST_FUNCTIONS.has(callee.text);\n}\n\nfunction isImportSpecifier(node: ts.Node): boolean {\n const p = node.parent;\n return (\n !!p &&\n (ts.isImportDeclaration(p) ||\n ts.isExportDeclaration(p) ||\n (ts.isCallExpression(p) && ts.isIdentifier(p.expression) && p.expression.text === 'require'))\n );\n}\n\nfunction collectLeaves(v: unknown, numbers: Set<number>, strings: Set<string>): void {\n if (v === NOT_LITERAL) return;\n if (typeof v === 'number') numbers.add(v);\n else if (typeof v === 'string') {\n if (v.length <= 200) strings.add(v);\n } else if (Array.isArray(v)) v.forEach((x) => collectLeaves(x, numbers, strings));\n else if (v && typeof v === 'object') Object.values(v).forEach((x) => collectLeaves(x, numbers, strings));\n}\n", "import { execFileSync } from 'node:child_process';\nimport { createHash } from 'node:crypto';\nimport {\n existsSync,\n type Dirent,\n lstatSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n realpathSync,\n renameSync,\n rmSync,\n symlinkSync,\n} from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\nconst LOCKFILES: [string, PackageManager][] = [\n ['pnpm-lock.yaml', 'pnpm'],\n ['yarn.lock', 'yarn'],\n ['bun.lock', 'bun'],\n ['bun.lockb', 'bun'],\n ['package-lock.json', 'npm'],\n ['npm-shrinkwrap.json', 'npm'],\n];\n\nexport interface DepsResult {\n /** node_modules directories (real paths) the runners must be allowed to read. */\n readPaths: string[];\n /** What happened, for the report's timing/diagnostics section. */\n actions: { dir: string; action: 'linked' | 'installed' | 'cached' | 'none'; reason: string; ms: number }[];\n}\n\nexport interface DepsOptions {\n /** Repo root of the worktree that needs dependencies. */\n targetRoot: string;\n /** Repo root of the checkout whose node_modules are installed (the user's working copy). */\n sourceRoot: string;\n /** Package directories (repo-relative) that contain code under test. */\n packageDirs: string[];\n /** Allow running the package manager when the lockfile changed (default true). */\n install?: boolean;\n cacheDir?: string;\n}\n\n/** Content hash of a text file, insensitive to CRLF vs LF (Windows checkouts convert line endings). */\nfunction hashFile(path: string): string {\n if (!existsSync(path)) return 'missing';\n return createHash('sha256').update(readFileSync(path, 'utf8').replace(/\\r\\n/g, '\\n')).digest('hex');\n}\n\n/** Dependency-relevant fields of a package.json. */\nfunction manifestDeps(path: string): string {\n if (!existsSync(path)) return 'missing';\n try {\n const pkg = JSON.parse(readFileSync(path, 'utf8')) as Record<string, unknown>;\n return JSON.stringify([\n pkg.dependencies,\n pkg.devDependencies,\n pkg.optionalDependencies,\n pkg.peerDependencies,\n pkg.workspaces,\n pkg.overrides,\n pkg.resolutions,\n pkg.pnpm,\n ]);\n } catch {\n return 'invalid';\n }\n}\n\nfunction detectPackageManager(root: string): { pm: PackageManager; lockfile?: string } {\n for (const [file, pm] of LOCKFILES) if (existsSync(join(root, file))) return { pm, lockfile: file };\n return { pm: 'npm' };\n}\n\n/** Directory whose lockfile governs `packageDir`: the package itself if it has one, else the repo root. */\nfunction lockRoot(root: string, packageDir: string): string {\n const own = join(root, packageDir);\n return LOCKFILES.some(([f]) => existsSync(join(own, f))) ? own : root;\n}\n\n/** Identity of the dependency tree for a package: lockfile content plus dependency fields of manifests. */\nfunction lockKey(root: string, packageDir: string): string {\n const lr = lockRoot(root, packageDir);\n const { lockfile } = detectPackageManager(lr);\n const h = createHash('sha256');\n h.update(lockfile ? `${lockfile}:${hashFile(join(lr, lockfile))}` : 'no-lockfile');\n h.update(manifestDeps(join(root, 'package.json')));\n h.update(manifestDeps(join(root, packageDir, 'package.json')));\n return h.digest('hex');\n}\n\nfunction link(target: string, path: string): void {\n if (existsSync(path) || isSymlink(path)) rmSync(path, { recursive: true, force: true });\n mkdirSync(dirname(path), { recursive: true });\n symlinkSync(target, path, process.platform === 'win32' ? 'junction' : 'dir');\n}\n\nfunction isSymlink(p: string): boolean {\n try {\n return lstatSync(p).isSymbolicLink();\n } catch {\n return false;\n }\n}\n\nfunction installCommand(pm: PackageManager, hasLock: boolean): [string, string[]] {\n switch (pm) {\n case 'pnpm':\n return [\n 'pnpm',\n ['install', hasLock ? '--frozen-lockfile' : '--no-frozen-lockfile', '--ignore-scripts'],\n ];\n case 'yarn':\n return ['yarn', ['install', '--immutable', '--mode=skip-build']];\n case 'bun':\n return ['bun', ['install', '--frozen-lockfile', '--ignore-scripts']];\n default:\n return ['npm', [hasLock ? 'ci' : 'install', '--ignore-scripts', '--no-audit', '--no-fund']];\n }\n}\n\n/**\n * Make dependencies available to the base worktree:\n * - unchanged lockfile and manifests \u2192 symlink the head's node_modules (fast path, the common case);\n * - changed \u2192 install in the worktree with lifecycle scripts disabled, and cache the result by lock hash.\n */\nexport function prepareDependencies(options: DepsOptions): DepsResult {\n const result: DepsResult = { readPaths: [], actions: [] };\n const cacheDir = options.cacheDir ?? join(homedir(), '.cache', 'doppeldiff', 'deps');\n const dirs = [...new Set(['', ...options.packageDirs])];\n\n for (const dir of dirs) {\n const headNm = join(options.sourceRoot, dir, 'node_modules');\n const baseNm = join(options.targetRoot, dir, 'node_modules');\n const started = Date.now();\n if (!existsSync(headNm)) {\n if (dir === '' || existsSync(join(options.sourceRoot, dir, 'package.json'))) {\n result.actions.push({ dir, action: 'none', reason: 'no node_modules in the working copy', ms: 0 });\n }\n continue;\n }\n result.readPaths.push(realpathSync(headNm), ...symlinkedPackageTargets(headNm));\n if (samePath(options.targetRoot, options.sourceRoot)) continue;\n\n const baseKey = lockKey(options.targetRoot, dir);\n const headKey = lockKey(options.sourceRoot, dir);\n if (baseKey === headKey) {\n link(realpathSync(headNm), baseNm);\n result.actions.push({ dir, action: 'linked', reason: 'lockfile unchanged', ms: Date.now() - started });\n continue;\n }\n\n const cached = join(\n cacheDir,\n baseKey.slice(0, 24),\n dir.replace(/[\\\\/]/g, '__') || '_root',\n 'node_modules',\n );\n if (existsSync(cached)) {\n link(cached, baseNm);\n result.readPaths.push(realpathSync(cached));\n result.actions.push({\n dir,\n action: 'cached',\n reason: 'lockfile changed; reused cached install',\n ms: Date.now() - started,\n });\n continue;\n }\n if (options.install === false) {\n link(realpathSync(headNm), baseNm);\n result.actions.push({\n dir,\n action: 'linked',\n reason: 'lockfile changed but installs are disabled; reusing the working copy dependencies',\n ms: Date.now() - started,\n });\n continue;\n }\n // Install where the governing lockfile lives (package dir or repo root for workspaces).\n const installRoot = lockRoot(options.targetRoot, dir);\n const { pm, lockfile } = detectPackageManager(installRoot);\n const [cmd, args] = installCommand(pm, lockfile !== undefined);\n try {\n execFileSync(cmd, args, {\n cwd: installRoot,\n stdio: 'pipe',\n env: { ...process.env, npm_config_ignore_scripts: 'true' },\n shell: process.platform === 'win32',\n });\n } catch (e) {\n const stderr = String((e as { stderr?: Buffer }).stderr ?? '').slice(-500);\n link(realpathSync(headNm), baseNm);\n result.actions.push({\n dir,\n action: 'linked',\n reason: `install failed (${cmd} ${args.join(' ')}): ${stderr.trim() || (e as Error).message}; reusing the working copy dependencies`,\n ms: Date.now() - started,\n });\n continue;\n }\n // Cache the install unless it contains relative links that would break when moved (file: deps, workspaces).\n if (existsSync(baseNm) && !isSymlink(baseNm) && symlinkedPackageTargets(baseNm).length > 0) {\n result.readPaths.push(realpathSync(baseNm), ...symlinkedPackageTargets(baseNm));\n } else if (existsSync(baseNm) && !isSymlink(baseNm)) {\n try {\n mkdirSync(dirname(cached), { recursive: true });\n renameSync(baseNm, cached);\n link(cached, baseNm);\n result.readPaths.push(realpathSync(cached));\n } catch {\n result.readPaths.push(realpathSync(baseNm));\n }\n }\n result.actions.push({\n dir,\n action: 'installed',\n reason: `lockfile changed; ran ${cmd} ${args[0]}`,\n ms: Date.now() - started,\n });\n }\n return result;\n}\n\n/**\n * Real paths of symlinked packages in a node_modules dir (npm `file:` deps, workspaces, `npm link`) that\n * live outside it: the runners need read access to them because Node resolves modules to real paths.\n */\nexport function symlinkedPackageTargets(nodeModules: string): string[] {\n const out = new Set<string>();\n const root = realpathSync(nodeModules);\n const visit = (dir: string, depth: number) => {\n let entries: Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const e of entries) {\n const p = join(dir, e.name);\n if (e.name.startsWith('@') && e.isDirectory() && depth === 0) {\n visit(p, 1);\n } else if (e.isSymbolicLink()) {\n try {\n const target = realpathSync(p);\n if (!target.startsWith(root)) out.add(target);\n } catch {\n /* dangling link */\n }\n }\n }\n };\n visit(nodeModules, 0);\n return [...out];\n}\n\nfunction samePath(a: string, b: string): boolean {\n return a.replace(/\\\\/g, '/').toLowerCase() === b.replace(/\\\\/g, '/').toLowerCase();\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, rmSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { git } from './git.js';\n\nexport interface Worktree {\n path: string;\n sha: string;\n /** Remove the worktree (no-op for reused checkouts). */\n dispose(): void;\n}\n\nfunction worktreeBase(repo: string): string {\n const id = createHash('sha256').update(repo).digest('hex').slice(0, 10);\n return join(tmpdir(), 'doppeldiff-worktrees', id);\n}\n\n/**\n * Materialize `sha` of `repo` in a detached git worktree under the OS temp dir.\n * Reuses an existing worktree for the same commit (e.g. from a `--keep-worktrees` run).\n */\nexport function addWorktree(repo: string, sha: string, options: { keep?: boolean } = {}): Worktree {\n const dir = join(worktreeBase(repo), sha.slice(0, 12));\n const registered = git(['worktree', 'list', '--porcelain'], repo)\n .split('\\n')\n .filter((l) => l.startsWith('worktree '))\n .map((l) => l.slice('worktree '.length));\n const isRegistered = registered.some((p) => samePath(p, dir));\n if (isRegistered && existsSync(join(dir, '.git'))) {\n const head = git(['rev-parse', 'HEAD'], dir).trim();\n if (head === sha) return { path: dir, sha, dispose: () => options.keep || removeWorktree(repo, dir) };\n }\n if (isRegistered || existsSync(dir)) removeWorktree(repo, dir);\n mkdirSync(worktreeBase(repo), { recursive: true });\n git(['worktree', 'add', '--detach', '--force', dir, sha], repo);\n return { path: dir, sha, dispose: () => options.keep || removeWorktree(repo, dir) };\n}\n\nexport function removeWorktree(repo: string, dir: string): void {\n try {\n git(['worktree', 'remove', '--force', dir], repo);\n } catch {\n rmSync(dir, { recursive: true, force: true });\n try {\n git(['worktree', 'prune'], repo);\n } catch {\n /* ignore */\n }\n }\n}\n\nfunction samePath(a: string, b: string): boolean {\n const norm = (p: string) => p.replace(/\\\\/g, '/').replace(/\\/+$/, '').toLowerCase();\n return norm(a) === norm(b);\n}\n", "import type { Outcome } from '../compare/observed.js';\nimport type { Cluster, Witness } from '../explore/explore.js';\nimport { encCategory, formatOutcome } from '../format/format.js';\nimport { inputComplexity } from '../explore/humanize.js';\nimport type { RealismTier } from '../explore/realism.js';\n\n/**\n * A behavior is what a reviewer reasons about: \"now returns NaN where it used to return a number\".\n * It groups fine-grained clusters whose coarse transition is the same.\n */\nexport interface Behavior {\n /** Coarse transition key, e.g. \"returns number \u2192 returns NaN\". */\n key: string;\n /** Human-readable title, e.g. \"now returns NaN (previously a number)\". */\n title: string;\n /** Number of explored inputs that showed this behavior. */\n count: number;\n /** Fine-grained variants (transition + input region). */\n variants: { transition: string; features: string[]; count: number }[];\n /** Up to `maxExamples` examples, most realistic and simplest first, from distinct variants when possible. */\n examples: Witness[];\n /** Realism of the most realistic witness (0 edge \u2026 3 seen) and why it is not higher. */\n realism: { tier: RealismTier; reason?: string };\n}\n\n/** Coarse value category: numbers of any sign (including \u00B1Infinity) are \"number\"; NaN stays distinct. */\nfunction coarseCategory(o: Outcome): string {\n switch (o.kind) {\n case 'return': {\n let c = encCategory(o.value);\n if (['0', '-0', 'positive number', 'negative number', 'Infinity', '-Infinity'].includes(c))\n c = 'number';\n else if (c === 'empty string') c = 'string';\n else if (c === 'empty array') c = 'array';\n return `${o.async ? 'resolves' : 'returns'} ${c}`;\n }\n case 'throw':\n return `${o.async ? 'rejects' : 'throws'} ${encCategory(o.error)}`;\n case 'timeout':\n return 'timeout';\n case 'crash':\n return 'crash';\n }\n}\n\nexport function coarseKey(w: Witness): string {\n const a = coarseCategory(w.base);\n const b = coarseCategory(w.head);\n if (a !== b) return `${a} \u2192 ${b}`;\n if (w.diff.aspect === 'mutation') return `${a}: mutates argument ${String(w.diff.path[0])} differently`;\n if (w.diff.aspect === 'async') return `${a}: sync/async changed`;\n if (w.diff.aspect === 'error') return `${a}: error changed`;\n return `${a}: value changed`;\n}\n\nconst NO_ARTICLE = new Set(['undefined', 'null', 'NaN', 'Infinity', '-Infinity', 'Invalid Date']);\nconst valueWord = (cat: string) => (NO_ARTICLE.has(cat) ? cat : `a ${cat}`.replace(/^a ([aeiou])/i, 'an $1'));\n\n/** Plain-English title for a coarse transition. */\nexport function behaviorTitle(w: Witness): string {\n const a = coarseCategory(w.base);\n const b = coarseCategory(w.head);\n const [aVerb, ...aRest] = a.split(' ');\n const [bVerb, ...bRest] = b.split(' ');\n const aWhat = aRest.join(' ');\n const bWhat = bRest.join(' ');\n if (a === b) {\n switch (w.diff.aspect) {\n case 'mutation':\n return `mutates argument ${Number(w.diff.path[0]) + 1} differently`;\n case 'async':\n return 'changed between sync and async';\n case 'error':\n return `still ${aVerb} ${aWhat}, but with a different ${w.diff.path.includes('message') ? 'message' : 'error'}`;\n default:\n return aVerb === 'resolves' ? 'resolved value changed' : 'return value changed';\n }\n }\n if (b === 'timeout') return 'now hangs (times out)';\n if (a === 'timeout') return `no longer hangs; now ${b}`;\n if (b === 'crash') return 'now crashes the process';\n if (a === 'crash') return `no longer crashes; now ${b}`;\n const isThrow = (v: string | undefined) => v === 'throws' || v === 'rejects';\n if (isThrow(bVerb) && !isThrow(aVerb))\n return `now ${bVerb} ${bWhat} (previously ${aVerb === 'resolves' ? 'resolved' : 'returned'} ${valueWord(aWhat)})`;\n if (isThrow(aVerb) && !isThrow(bVerb))\n return `no longer ${aVerb === 'throws' ? 'throws' : 'rejects with'} ${aWhat}; now ${bVerb} ${valueWord(bWhat)}`;\n if (isThrow(aVerb) && isThrow(bVerb)) return `now ${bVerb} ${bWhat} instead of ${aWhat}`;\n if (aVerb !== bVerb)\n return `now ${bVerb === 'resolves' ? 'returns a promise' : 'returns synchronously'} (${b}, previously ${a})`;\n return `now ${bVerb} ${valueWord(bWhat)} (previously ${valueWord(aWhat)})`;\n}\n\n/** Group clusters into behaviors, ordered by number of affected inputs. */\nexport function groupBehaviors(clusters: Cluster[], maxExamples = 3): Behavior[] {\n const groups = new Map<string, { title: string; clusters: Cluster[] }>();\n for (const c of clusters) {\n const w = c.witnesses[0];\n if (!w) continue;\n const key = coarseKey(w);\n const g = groups.get(key) ?? { title: behaviorTitle(w), clusters: [] };\n g.clusters.push(c);\n groups.set(key, g);\n }\n const behaviors: Behavior[] = [];\n for (const [key, g] of groups) {\n const sorted = [...g.clusters].sort((x, y) => y.count - x.count);\n // Prefer simple examples that show *different* old \u2192 new outcomes; then fill with the next simplest.\n const tier = (w: Witness) => w.realism?.tier ?? 2;\n const order = (x: Witness, y: Witness) =>\n tier(y) - tier(x) || inputComplexity(x.input) - inputComplexity(y.input);\n const firsts = sorted.map((c) => c.witnesses[0]!).sort(order);\n const rest = sorted.flatMap((c) => c.witnesses.slice(1)).sort(order);\n const candidates = [...firsts, ...rest];\n const pairKey = (w: Witness) => `${formatOutcome(w.base)}\\u0000${formatOutcome(w.head)}`;\n const usedPairs = new Set<string>();\n const examples: Witness[] = [];\n for (const w of candidates) {\n if (examples.length >= maxExamples) break;\n if (usedPairs.has(pairKey(w))) continue;\n usedPairs.add(pairKey(w));\n examples.push(w);\n }\n for (const w of candidates) {\n if (examples.length >= maxExamples) break;\n if (!examples.includes(w)) examples.push(w);\n }\n const best = [...firsts, ...rest].sort(order)[0];\n behaviors.push({\n realism: {\n tier: best ? (tier(best) as RealismTier) : 2,\n ...(best?.realism?.reason ? { reason: best.realism.reason } : {}),\n },\n key,\n title: g.title,\n count: sorted.reduce((s, c) => s + c.count, 0),\n variants: sorted.map((c) => ({ transition: c.transition, features: c.features, count: c.count })),\n examples: examples.map((e, i) => ({ ...e, minimal: i === 0 })),\n });\n }\n return behaviors.sort((x, y) => y.realism.tier - x.realism.tier || y.count - x.count);\n}\n", "/**\n * Keyless, deterministic claim matching: compares observed behavior changes with the PR title/description\n * using documented rules. This is the default; no LLM or API key is involved.\n *\n * Rules (first match wins), see docs/CLAIMS.md:\n * 1. Intent \"no behavior change\": an explicit phrase (\"no behavior change\", \"pure refactor\", \"behavior-preserving\",\n * ...), a conventional-commit type refactor/perf/chore/style/build/ci/test/docs, a fix/feat title whose text is\n * only about performance (\"fix: faster paths for compare\"), or refactor-style words (\"refactor\", \"cleanup\",\n * \"rename\", \"simplify\", \"faster\", ...) without change words. Every behavior change is **unclaimed**.\n * 2. The PR text names the function (its export name, a distinctive word of a camelCase name, or a changed\n * helper it calls): **claimed**.\n * 3. The PR text names other changed functions but not this one: **unclaimed**.\n * 4. Otherwise: neutral **behavior change**.\n */\nexport type Intent = 'no-change' | 'change' | 'unknown';\n\nexport interface ClaimAnalysis {\n intent: Intent;\n /** The words that decided the intent, for explanations. */\n intentEvidence?: string;\n /** Lower-cased identifier-like words of the claim. */\n words: Set<string>;\n /** Identifiers written as code (`foo`) or in camelCase/snake_case, as written. */\n identifiers: Set<string>;\n}\n\nconst NO_CHANGE_TYPES = new Set([\n 'refactor',\n 'perf',\n 'chore',\n 'style',\n 'build',\n 'ci',\n 'test',\n 'tests',\n 'docs',\n]);\nconst CHANGE_TYPES = new Set(['fix', 'feat', 'feature', 'bugfix', 'hotfix', 'revert', 'security']);\n\nconst EXPLICIT_NO_CHANGE = [\n /\\bno (?:functional|behaviou?ral|behaviou?r|logic|user[- ]facing|runtime) changes?\\b/i,\n /\\bno changes? (?:in|to) (?:behaviou?r|functionality|logic|output)\\b/i,\n /\\bpure(?:ly)?[- ]refactor/i,\n /\\bbehaviou?r[- ]preserving\\b/i,\n /\\bnon[- ]functional (?:change|refactor)/i,\n /\\bwithout (?:changing|any change (?:in|to)) (?:behaviou?r|functionality|output)\\b/i,\n /\\bsemantics?[- ]preserving\\b/i,\n];\n\nconst NO_CHANGE_WORDS =\n /\\b(refactor(?:s|ed|ing)?|clean(?:s|ed|ing)?[- ]?up|cleanups?|tidy|tidies|renam(?:e|es|ed|ing)|simplif(?:y|ies|ied|ication)|moderni[sz](?:e|es|ed|ation)|restructur(?:e|es|ed|ing)|reorgani[sz](?:e|es|ed)|extract(?:s|ed)?|perf(?:ormance)?|optimi[sz](?:e|es|ed|ation)|faster|speed[- ]?up|lint|formatting|typos?|dead code)\\b/i;\n\nconst CHANGE_WORDS =\n /\\b(fix(?:es|ed|ing)?|bugs?|regression|crash(?:es|ed)?|errors?|wrong|incorrect(?:ly)?|broken|issues?|feat(?:ure)?s?|add(?:s|ed|ing)?|support(?:s|ed)?|handle(?:s|d)?|allow(?:s|ed)?|reject(?:s|ed)?|correct(?:s|ed|ly)?|prevent(?:s|ed)?|now (?:returns?|throws?|accepts?)|change(?:s|d)? (?:the )?behaviou?r|breaking)\\b/i;\n\nconst PERF_WORDS =\n /\\b(perf(?:ormance)?|faster|speed[- ]?up|optimi[sz](?:e|es|ed|ation)|fast[- ]path|cach(?:e|ing))\\b/i;\n\n/** Generic name parts that say nothing about which function a PR is about. */\nconst STOP_PARTS = new Set([\n 'get',\n 'set',\n 'is',\n 'has',\n 'to',\n 'from',\n 'with',\n 'without',\n 'for',\n 'of',\n 'on',\n 'in',\n 'and',\n 'or',\n 'by',\n 'as',\n 'make',\n 'create',\n 'build',\n 'new',\n 'apply',\n 'use',\n 'run',\n 'do',\n 'can',\n 'should',\n 'parse',\n 'format',\n 'value',\n 'values',\n 'data',\n 'item',\n 'items',\n 'list',\n 'util',\n 'utils',\n 'helper',\n 'helpers',\n 'default',\n 'index',\n 'main',\n 'all',\n 'any',\n 'each',\n 'some',\n 'find',\n 'first',\n 'last',\n 'string',\n 'number',\n 'array',\n 'object',\n]);\n\n/** Split `applyDiscount`, `apply_discount`, `HTTPServer` into lower-case words. */\nexport function nameParts(name: string): string[] {\n return name\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((w) => w.toLowerCase());\n}\n\nexport function analyzeClaim(text: string | null | undefined): ClaimAnalysis {\n const t = (text ?? '').trim();\n const words = new Set((t.toLowerCase().match(/[a-z0-9_$]+/g) ?? []).flatMap((w) => [w, ...nameParts(w)]));\n const identifiers = new Set<string>();\n for (const m of t.matchAll(/`([^`]+)`/g))\n for (const id of m[1]!.match(/[A-Za-z_$][\\w$]*/g) ?? []) identifiers.add(id);\n for (const m of t.matchAll(/\\b[a-z]+[A-Z][A-Za-z0-9]*\\b|\\b[a-z0-9]+_[a-z0-9_]+\\b/g)) identifiers.add(m[0]);\n\n const base = { words, identifiers };\n if (!t) return { intent: 'unknown', ...base };\n const explicit = EXPLICIT_NO_CHANGE.map((re) => re.exec(t)).find(Boolean);\n if (explicit) return { intent: 'no-change', intentEvidence: explicit[0], ...base };\n\n const title = t.split(/\\r?\\n/)[0]!.replace(/^#+\\s*/, '');\n const conventional =\n /^\\s*([a-z]+)(?:\\([^)]*\\))?!?:/i.exec(title) ?? /^\\s*([a-z]+)\\[[^\\]]*\\]:?/i.exec(title);\n const type = conventional?.[1]?.toLowerCase();\n if (type && NO_CHANGE_TYPES.has(type)) return { intent: 'no-change', intentEvidence: `${type}:`, ...base };\n if (type && CHANGE_TYPES.has(type)) {\n // \"fix: faster paths for compare\" is a performance change: perf wording and no change words after the prefix.\n const rest = title.slice(conventional![0].length);\n const perf = PERF_WORDS.exec(rest);\n if (perf && !CHANGE_WORDS.exec(rest)) return { intent: 'no-change', intentEvidence: perf[0], ...base };\n return { intent: 'change', intentEvidence: `${type}:`, ...base };\n }\n\n const change = CHANGE_WORDS.exec(t);\n const noChange = NO_CHANGE_WORDS.exec(t);\n if (noChange && !change) return { intent: 'no-change', intentEvidence: noChange[0], ...base };\n if (change) return { intent: 'change', intentEvidence: change[0], ...base };\n return { intent: 'unknown', ...base };\n}\n\nexport interface RuleTarget {\n exportName: string;\n file: string;\n /** Changed helpers this function uses (from detection, e.g. \"uses changed `toCents`\"). */\n helpers: string[];\n}\n\nexport interface RuleLabel {\n label: 'claimed' | 'unclaimed' | 'behavior-change';\n explanation?: string;\n}\n\nfunction stem(file: string): string {\n return (file.split('/').pop() ?? file).replace(/\\.[^.]+$/, '');\n}\n\n/** Which names of this function (export name, file stem for default exports, helpers) does the claim mention? */\nexport function mentionedNames(target: RuleTarget, a: ClaimAnalysis): string[] {\n const names = [target.exportName === 'default' ? stem(target.file) : target.exportName, ...target.helpers];\n const hits: string[] = [];\n for (const name of names) {\n if (a.identifiers.has(name) || a.words.has(name.toLowerCase())) {\n hits.push(name);\n continue;\n }\n const parts = nameParts(name).filter((p) => p.length >= 5 && !STOP_PARTS.has(p));\n const part = parts.find((p) => a.words.has(p));\n if (part) hits.push(`${name} (\"${part}\")`);\n }\n return hits;\n}\n\n/** Label one function's behavior changes. `others` are all changed functions in the report. */\nexport function ruleLabel(target: RuleTarget, a: ClaimAnalysis, others: RuleTarget[]): RuleLabel {\n if (a.intent === 'no-change') return { label: 'unclaimed' };\n const hits = mentionedNames(target, a);\n if (hits.length > 0) {\n const described = hits.map((h) => {\n const part = / \\(\"(.+)\"\\)$/.exec(h);\n const name = h.replace(/ \\(.*$/, '');\n return part ? `\"${part[1]}\" (\\`${name}\\`)` : `\\`${name}\\``;\n });\n return { label: 'claimed', explanation: `The PR mentions ${described.join(', ')}.` };\n }\n const othersMentioned = others.filter((o) => o !== target && mentionedNames(o, a).length > 0);\n if (othersMentioned.length > 0) {\n return {\n label: 'unclaimed',\n explanation: `The PR mentions ${othersMentioned\n .map((o) => `\\`${o.exportName}\\``)\n .slice(0, 3)\n .join(', ')} but not \\`${target.exportName}\\`.`,\n };\n }\n return { label: 'behavior-change' };\n}\n\n/** Helper names from a detection reason like \"uses changed `toCents` (via wrap)\". */\nexport function helpersFromReason(reason: string | undefined): string[] {\n return [...(reason ?? '').matchAll(/`([^`]+)`/g)].map((m) => m[1]!);\n}\n", "import type { Enc } from '../compare/observed.js';\nimport { FN_TAG, isFnDescriptor, isProtoDescriptor, PROTO_TAG, viewBytes } from '../runner/tags.js';\n\n/**\n * JavaScript source for values, used in reports (copy-pasteable calls) and generated regression tests.\n * Returns undefined when a value cannot be expressed faithfully as a literal.\n */\nconst IDENT = /^[A-Za-z_$][\\w$]*$/;\nconst key = (k: string) => (IDENT.test(k) ? k : JSON.stringify(k));\n\nfunction num(n: number): string {\n if (Number.isNaN(n)) return 'NaN';\n if (n === Infinity) return 'Infinity';\n if (n === -Infinity) return '-Infinity';\n if (Object.is(n, -0)) return '-0';\n return String(n);\n}\n\n/** Code for a generated input value (plain data, Dates, Maps, Sets, callback descriptors). */\nexport function valueToCode(v: unknown): string | undefined {\n const seen = new Set<unknown>();\n const f = (x: unknown): string | undefined => {\n if (isFnDescriptor(x)) {\n const { returns, async } = x[FN_TAG];\n const r = f(returns);\n if (r === undefined) return undefined;\n const body = r.startsWith('{') ? `(${r})` : r;\n return `${async ? 'async ' : ''}() => ${body}`;\n }\n switch (typeof x) {\n case 'undefined':\n return 'undefined';\n case 'number':\n return num(x);\n case 'bigint':\n return `${x}n`;\n case 'string':\n return JSON.stringify(x);\n case 'boolean':\n return String(x);\n case 'symbol':\n case 'function':\n return undefined;\n }\n if (x === null) return 'null';\n if (seen.has(x)) return undefined;\n seen.add(x);\n try {\n if (Array.isArray(x)) {\n const items = x.map(f);\n return items.some((i) => i === undefined) ? undefined : `[${items.join(', ')}]`;\n }\n if (x instanceof Date)\n return Number.isNaN(x.getTime()) ? 'new Date(NaN)' : `new Date(${JSON.stringify(x.toISOString())})`;\n if (x instanceof Map) {\n const entries = [...x].map(([k, val]) => {\n const a = f(k);\n const b = f(val);\n return a === undefined || b === undefined ? undefined : `[${a}, ${b}]`;\n });\n return entries.some((e) => e === undefined) ? undefined : `new Map([${entries.join(', ')}])`;\n }\n if (x instanceof Set) {\n const items = [...x].map(f);\n return items.some((i) => i === undefined) ? undefined : `new Set([${items.join(', ')}])`;\n }\n if (x instanceof RegExp) return String(x);\n if (isProtoDescriptor(x)) {\n const { proto, own } = x[PROTO_TAG];\n const p = f(proto);\n const o = f(own);\n return p === undefined || o === undefined ? undefined : `Object.assign(Object.create(${p}), ${o})`;\n }\n if (x instanceof ArrayBuffer) return `new Uint8Array([${viewBytes(x).join(', ')}]).buffer`;\n if (x instanceof DataView) {\n return `new DataView(new Uint8Array([${viewBytes(new Uint8Array(x.buffer)).join(', ')}]).buffer, ${x.byteOffset}, ${x.byteLength})`;\n }\n if (ArrayBuffer.isView(x) && /^(?:Int|Uint|Float)\\d+(?:Clamped)?Array$/.test(x.constructor.name)) {\n return `new ${x.constructor.name}([${Array.from(x as unknown as ArrayLike<number>).join(', ')}])`;\n }\n const proto = Object.getPrototypeOf(x) as unknown;\n if (proto !== Object.prototype && proto !== null) return undefined;\n const entries = Object.entries(x as Record<string, unknown>).map(([k, val]) => {\n const c = f(val);\n return c === undefined ? undefined : `${key(k)}: ${c}`;\n });\n if (entries.some((e) => e === undefined)) return undefined;\n return entries.length === 0 ? '{}' : `{ ${entries.join(', ')} }`;\n } finally {\n seen.delete(x);\n }\n };\n return f(v);\n}\n\nexport function argsToCode(args: unknown[]): string | undefined {\n const parts = args.map(valueToCode);\n return parts.some((p) => p === undefined) ? undefined : parts.join(', ');\n}\n\n/** Code for an observed (encoded) value; undefined for class instances, functions, cycles, symbols. */\nexport function encToCode(e: Enc): string | undefined {\n const f = (x: Enc): string | undefined => {\n switch (x.t) {\n case 'undefined':\n return 'undefined';\n case 'null':\n return 'null';\n case 'boolean':\n return String(x.v);\n case 'number':\n return num(x.v);\n case 'bigint':\n return `${x.v}n`;\n case 'string':\n return JSON.stringify(x.v);\n case 'array': {\n const items = x.items.map(f);\n return items.some((i) => i === undefined) ? undefined : `[${items.join(', ')}]`;\n }\n case 'object': {\n if (x.ctor !== null) return undefined;\n const entries = x.entries.map(([k, v]) => {\n const c = f(v);\n return c === undefined ? undefined : `${key(k)}: ${c}`;\n });\n if (entries.some((en) => en === undefined)) return undefined;\n return entries.length === 0 ? '{}' : `{ ${entries.join(', ')} }`;\n }\n case 'date':\n return Number.isNaN(x.v)\n ? 'new Date(NaN)'\n : `new Date(${JSON.stringify(new Date(x.v).toISOString())})`;\n case 'map': {\n const entries = x.entries.map(([k, v]) => {\n const a = f(k);\n const b = f(v);\n return a === undefined || b === undefined ? undefined : `[${a}, ${b}]`;\n });\n return entries.some((en) => en === undefined) ? undefined : `new Map([${entries.join(', ')}])`;\n }\n case 'set': {\n const items = x.items.map(f);\n return items.some((i) => i === undefined) ? undefined : `new Set([${items.join(', ')}])`;\n }\n case 'regexp':\n return `/${x.source}/${x.flags}`;\n case 'typed':\n return /^(?:Big)?(?:Int|Uint|Float)\\d+(?:Clamped)?Array$/.test(x.ctor) && !x.ctor.startsWith('Big')\n ? `new ${x.ctor}([${x.items.map(num).join(', ')}])`\n : undefined;\n default:\n return undefined;\n }\n };\n return f(e);\n}\n", "import { z } from 'zod';\n\n/**\n * The stable, machine-readable report (schemaVersion 1). Every renderer (terminal, Markdown, JSON,\n * regression tests) consumes only this model. It is also the artifact that crosses the trust boundary in\n * the GitHub Action, so it is validated with this schema before use.\n */\nexport const SCHEMA_VERSION = 1 as const;\n\nconst MAX_TEXT = 4000;\nconst text = (max = MAX_TEXT) => z.string().max(max);\n\nexport const OutcomeView = z.object({\n kind: z.enum(['return', 'throw', 'timeout', 'crash']),\n async: z.boolean(),\n /** Human-readable rendering, e.g. `1104.99`, `throws RangeError: bad price`, `timeout (>250ms)`. */\n display: text(),\n /** JavaScript expression reproducing a returned value (absent if not expressible). */\n code: text().optional(),\n errorClass: text(200).optional(),\n message: text().optional(),\n});\nexport type OutcomeView = z.infer<typeof OutcomeView>;\n\nexport const Example = z.object({\n /** e.g. `applyDiscount(2000, 0.07)` */\n call: text(),\n /** Arguments as JavaScript source (absent if not expressible). */\n argsCode: text().optional(),\n old: OutcomeView,\n new: OutcomeView,\n /** Present when the difference is in how arguments were mutated. */\n mutation: z\n .object({ argIndex: z.number().int(), old: text(), new: text(), newCode: text().optional() })\n .optional(),\n minimal: z.boolean(),\n});\nexport type Example = z.infer<typeof Example>;\n\nexport const BehaviorLabel = z.enum(['behavior-change', 'claimed', 'unclaimed', 'suspicious']);\nexport type BehaviorLabel = z.infer<typeof BehaviorLabel>;\n\nexport const Behavior = z.object({\n /** Stable id within the report, e.g. `src/pricing.ts#applyDiscount/1`. */\n id: text(600),\n key: text(),\n title: text(),\n label: BehaviorLabel,\n /** Where the label came from: no claim analysis, the deterministic refactor rule, or an LLM. */\n labelSource: z.enum(['none', 'rules', 'llm']),\n explanation: text(1000).optional(),\n /**\n * How realistic the inputs are: seen (values from tests/call sites), ordinary, unusual (outside what tests and\n * call sites use), edge (NaN, Infinity, -0, lone surrogates, \u2026). Edge-only behaviors are listed separately.\n */\n realism: z.enum(['seen', 'ordinary', 'unusual', 'edge']),\n realismNote: text(300).optional(),\n count: z.number().int().nonnegative(),\n variants: z.array(z.object({ transition: text(), features: z.array(text(200)), count: z.number().int() })),\n examples: z.array(Example),\n});\nexport type Behavior = z.infer<typeof Behavior>;\n\nexport const FunctionStatus = z.enum(['changed', 'unchanged', 'skipped', 'nondeterministic']);\n\nexport const FunctionReport = z.object({\n id: text(600),\n file: text(500),\n exportName: text(200),\n signature: text().optional(),\n status: FunctionStatus,\n reason: text().optional(),\n /** Why the function was analyzed: \"code changed\", \"uses changed `toCents`\", \u2026 */\n targetReason: text().optional(),\n inputsRun: z.number().int().nonnegative(),\n stoppedBy: z.enum(['runs', 'deadline', 'failures', 'exhausted']).optional(),\n failures: z.number().int().nonnegative(),\n /** Timeouts/crashes on edge-case inputs (huge numbers, NaN, \u2026), included in `failures`. */\n edgeTimeouts: z.number().int().nonnegative().optional(),\n /** Edge-case inputs skipped after repeated timeouts on edge-case inputs. */\n skippedEdgeInputs: z.number().int().nonnegative().optional(),\n durationMs: z.number().nonnegative(),\n seed: z.number().int(),\n usage: z\n .object({ files: z.number().int(), callSites: z.number().int(), values: z.number().int() })\n .optional(),\n guards: z.array(text(300)).optional(),\n /** Inputs suggested by the optional LLM step that passed type validation. */\n llmInputs: z.number().int().nonnegative().optional(),\n behaviors: z.array(Behavior),\n nondeterministic: z\n .object({ side: z.enum(['base', 'head']), call: text(), first: text(), second: text() })\n .optional(),\n});\nexport type FunctionReport = z.infer<typeof FunctionReport>;\n\nexport const Listed = z.object({\n id: text(600),\n file: text(500),\n exportName: text(200),\n kind: text(100),\n reason: text().optional(),\n});\nexport type Listed = z.infer<typeof Listed>;\n\nexport const Report = z.object({\n schemaVersion: z.literal(SCHEMA_VERSION),\n tool: z.object({ name: z.literal('doppeldiff'), version: text(50) }),\n base: z.object({ ref: text(300), sha: text(64) }),\n head: z.object({ ref: text(300), sha: text(64).nullable() }),\n claim: z.object({\n source: z.enum(['pr', 'flag', 'none']),\n text: text(20_000).nullable(),\n /** The claim asserts no behavior change (refactor mode): every behavior change is unclaimed. */\n refactor: z.boolean(),\n /** Claim matching by an LLM was performed (labels are \"claimed\"/\"unclaimed\"/\"suspicious\"). */\n llm: z.object({ provider: text(50), model: text(100) }).nullable(),\n }),\n settings: z.object({\n seed: z.number().int(),\n runs: z.number().int(),\n timeoutMs: z.number().int(),\n timeBudgetMs: z.number().int().nullable(),\n freeze: z.boolean(),\n }),\n summary: z.object({\n /** `no-change` can still come with edge-case-only behaviors (see edgeCaseBehaviors). */\n verdict: z.enum(['no-change', 'changes', 'unclaimed']),\n functions: z.number().int(),\n changed: z.number().int(),\n unchanged: z.number().int(),\n skipped: z.number().int(),\n nondeterministic: z.number().int(),\n /** Behavior changes on realistic or unusual inputs (edge-case-only ones excluded). */\n behaviors: z.number().int(),\n /** Behavior changes that only occur on edge-case inputs. */\n edgeCaseBehaviors: z.number().int(),\n /** Unclaimed/suspicious behaviors (edge-case-only ones excluded). */\n unclaimed: z.number().int(),\n /** Unclaimed/suspicious behaviors on seen or ordinary inputs: what `--fail-on unclaimed` counts. */\n unclaimedRealistic: z.number().int(),\n inputsRun: z.number().int(),\n durationMs: z.number(),\n }),\n functions: z.array(FunctionReport),\n skipped: z.array(Listed),\n added: z.array(Listed),\n removed: z.array(Listed),\n identical: z.array(Listed),\n errors: z.array(z.object({ file: text(500), message: text() })),\n regressionTests: z\n .object({ framework: z.enum(['vitest', 'jest']), files: z.array(text(500)), cases: z.number().int() })\n .nullable(),\n timing: z.object({\n totalMs: z.number(),\n materializeMs: z.number(),\n dependenciesMs: z.number(),\n detectMs: z.number(),\n verifyMs: z.number(),\n }),\n});\nexport type Report = z.infer<typeof Report>;\n\n/** JSON Schema of the report, published as schema/report.schema.json. */\nexport function reportJsonSchema(): unknown {\n return z.toJSONSchema(Report);\n}\n", "import type { Outcome } from '../compare/observed.js';\nimport type { Witness } from '../explore/explore.js';\nimport { formatArgs, formatEnc, formatOutcome } from '../format/format.js';\nimport type { RunResult } from '../run.js';\nimport type { FunctionResult } from '../verify/verifyFunction.js';\nimport { groupBehaviors } from './behaviors.js';\nimport { REALISM_NAMES } from '../explore/realism.js';\nimport { analyzeClaim, helpersFromReason, ruleLabel, type RuleLabel } from '../claims/rules.js';\nimport { argsToCode, encToCode } from './codegen.js';\nimport {\n SCHEMA_VERSION,\n type Behavior,\n type Example,\n type FunctionReport,\n type OutcomeView,\n type Report,\n} from './model.js';\n\nexport interface ClaimInput {\n text: string | null;\n source: 'pr' | 'flag' | 'none';\n /** Force refactor mode (assert no behavior change), e.g. `--refactor` or the MCP verify_refactor tool. */\n refactor?: boolean;\n}\n\n/**\n * True when the claim says the change should not alter behavior (see the rules in ../claims/rules.ts):\n * explicit phrases, refactor-type conventional commits, or refactor-style wording without change words.\n */\nexport function isRefactorClaim(text: string | null | undefined): boolean {\n return analyzeClaim(text).intent === 'no-change';\n}\n\n/**\n * Label every behavior from the claim with the deterministic rules (no LLM). Mutates and returns the report.\n * `forceRefactor` comes from --refactor / verify_refactor.\n */\nexport function applyRuleLabels(report: Report, forceRefactor = false): Report {\n const a = analyzeClaim(report.claim.text);\n const refactor = forceRefactor || a.intent === 'no-change';\n report.claim.refactor = refactor;\n const targets = new Map(\n report.functions\n .filter((f) => f.behaviors.length > 0)\n .map(\n (f) =>\n [\n f,\n { exportName: f.exportName, file: f.file, helpers: helpersFromReason(f.targetReason) },\n ] as const,\n ),\n );\n const all = [...targets.values()];\n for (const [f, target] of targets) {\n const r: RuleLabel = refactor\n ? { label: 'unclaimed' }\n : report.claim.text\n ? ruleLabel(target, a, all)\n : { label: 'behavior-change' };\n for (const b of f.behaviors) {\n b.label = r.label;\n b.labelSource = r.label === 'behavior-change' ? 'none' : 'rules';\n if (r.explanation) b.explanation = r.explanation;\n else delete b.explanation;\n }\n }\n report.summary = summarize(report.functions, report.skipped.length, report.summary.durationMs);\n return report;\n}\n\nconst MAX_DISPLAY = 300;\n\nexport function outcomeView(o: Outcome, abbreviate = true): OutcomeView {\n switch (o.kind) {\n case 'return': {\n const code = encToCode(o.value);\n return {\n kind: 'return',\n async: o.async,\n display: formatOutcome(o, MAX_DISPLAY, abbreviate),\n ...(code !== undefined && code.length < 4000 ? { code } : {}),\n };\n }\n case 'throw': {\n const e = o.error;\n return {\n kind: 'throw',\n async: o.async,\n display: formatOutcome(o, MAX_DISPLAY, abbreviate),\n ...(e.t === 'error' ? { errorClass: e.ctor.slice(0, 200), message: e.message.slice(0, 4000) } : {}),\n };\n }\n default:\n return { kind: o.kind, async: false, display: formatOutcome(o, MAX_DISPLAY) };\n }\n}\n\nexport function exampleFrom(exportName: string, w: Witness): Example {\n const argsCode = argsToCode(w.input);\n const ex: Example = {\n call: `${exportName}(${formatArgs(w.input, MAX_DISPLAY)})`.slice(0, 4000),\n ...(argsCode !== undefined && argsCode.length < 4000 ? { argsCode } : {}),\n old: outcomeView(w.base),\n new: outcomeView(w.head),\n minimal: w.minimal,\n };\n // Abbreviated long lists can hide the difference: then show both in full (still length-limited).\n if (ex.old.display === ex.new.display) {\n ex.old = outcomeView(w.base, false);\n ex.new = outcomeView(w.head, false);\n }\n if (\n w.diff.aspect === 'mutation' &&\n (w.base.kind === 'return' || w.base.kind === 'throw') &&\n (w.head.kind === 'return' || w.head.kind === 'throw')\n ) {\n const i = Number(w.diff.path[0]);\n const a = w.base.args[i];\n const b = w.head.args[i];\n if (a && b) {\n const newCode = encToCode(b);\n const full = formatEnc(a, MAX_DISPLAY) === formatEnc(b, MAX_DISPLAY);\n ex.mutation = {\n argIndex: i,\n old: formatEnc(a, MAX_DISPLAY, !full),\n new: formatEnc(b, MAX_DISPLAY, !full),\n ...(newCode !== undefined && newCode.length < 4000 ? { newCode } : {}),\n };\n }\n }\n return ex;\n}\n\nfunction functionReport(f: FunctionResult): FunctionReport {\n const behaviors: Behavior[] = groupBehaviors(f.clusters).map((b, i) => ({\n id: `${f.id}/${i + 1}`,\n key: b.key,\n title: b.title,\n realism: REALISM_NAMES[b.realism.tier],\n ...(b.realism.tier < 2 && b.realism.reason ? { realismNote: b.realism.reason } : {}),\n label: 'behavior-change',\n labelSource: 'none',\n count: b.count,\n variants: b.variants,\n examples: b.examples.map((w) => exampleFrom(f.exportName, w)),\n }));\n const nd = f.nondeterministic;\n return {\n id: f.id,\n file: f.file,\n exportName: f.exportName,\n ...(f.signature ? { signature: f.signature } : {}),\n status: f.status,\n ...(f.reason ? { reason: f.reason } : {}),\n ...(f.targetReason ? { targetReason: f.targetReason } : {}),\n inputsRun: f.inputsRun,\n ...(f.stoppedBy ? { stoppedBy: f.stoppedBy } : {}),\n failures: f.failures,\n ...(f.edgeFailures ? { edgeTimeouts: f.edgeFailures } : {}),\n ...(f.skippedEdgeInputs ? { skippedEdgeInputs: f.skippedEdgeInputs } : {}),\n durationMs: f.durationMs,\n seed: f.seed,\n ...(f.usage ? { usage: f.usage } : {}),\n ...(f.guards ? { guards: f.guards.map((g) => g.slice(0, 300)) } : {}),\n ...(f.llmInputs !== undefined ? { llmInputs: f.llmInputs } : {}),\n behaviors,\n ...(nd\n ? {\n nondeterministic: {\n side: nd.side,\n call: `${f.exportName}(${formatArgs(nd.input, MAX_DISPLAY)})`,\n first: formatOutcome(nd.first, MAX_DISPLAY),\n second: formatOutcome(nd.second, MAX_DISPLAY),\n },\n }\n : {}),\n };\n}\n\nexport function summarize(\n functions: FunctionReport[],\n skippedListed: number,\n durationMs: number,\n): Report['summary'] {\n const all = functions.flatMap((f) => f.behaviors);\n const behaviors = all.filter((b) => b.realism !== 'edge');\n const isUnclaimed = (b: Behavior) => b.label === 'unclaimed' || b.label === 'suspicious';\n const unclaimed = behaviors.filter(isUnclaimed).length;\n const unclaimedRealistic = behaviors.filter(\n (b) => isUnclaimed(b) && (b.realism === 'seen' || b.realism === 'ordinary'),\n ).length;\n return {\n verdict: behaviors.length === 0 ? 'no-change' : unclaimed > 0 ? 'unclaimed' : 'changes',\n functions: functions.length,\n changed: functions.filter((f) => f.status === 'changed').length,\n unchanged: functions.filter((f) => f.status === 'unchanged').length,\n skipped: functions.filter((f) => f.status === 'skipped').length + skippedListed,\n nondeterministic: functions.filter((f) => f.status === 'nondeterministic').length,\n behaviors: behaviors.length,\n edgeCaseBehaviors: all.length - behaviors.length,\n unclaimed,\n unclaimedRealistic,\n inputsRun: functions.reduce((s, f) => s + f.inputsRun, 0),\n durationMs,\n };\n}\n\nexport function buildReport(run: RunResult, claim: ClaimInput = { text: null, source: 'none' }): Report {\n const functions = run.functions.map((f) => functionReport(f));\n const report: Report = {\n schemaVersion: SCHEMA_VERSION,\n tool: run.tool,\n base: run.base,\n head: run.head,\n claim: { source: claim.source, text: claim.text, refactor: false, llm: null },\n settings: { seed: run.seed, ...run.settings },\n summary: summarize(functions, run.skipped.length, run.timing.totalMs),\n functions,\n skipped: run.skipped,\n added: run.added,\n removed: run.removed,\n identical: run.identical,\n errors: run.errors,\n regressionTests: null,\n timing: run.timing,\n };\n return applyRuleLabels(report, claim.refactor ?? false);\n}\n\n/**\n * Re-derive claim fields and deterministic labels for a report from a (trusted) claim text, discarding any\n * labels it carried. Used by the GitHub Action's trusted job on the report produced by the untrusted job.\n */\nexport function relabel(report: Report, claim: ClaimInput): Report {\n const out: Report = structuredClone(report);\n out.claim = { source: claim.source, text: claim.text, refactor: false, llm: null };\n for (const f of out.functions) for (const b of f.behaviors) delete b.explanation;\n return applyRuleLabels(out, claim.refactor ?? false);\n}\n", "import type { Behavior, BehaviorLabel, FunctionReport, Report } from './model.js';\n\nexport const STICKY_MARKER = '<!-- doppeldiff:sticky -->';\nconst GITHUB_LIMIT = 60_000;\nconst PROJECT_URL = 'https://github.com/7suheel/doppeldiff';\n\n/** Escape untrusted text for Markdown prose: HTML, mentions, and Markdown control characters. */\nexport function escapeText(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/@/g, '@\u200B')\n .replace(/([\\\\`*_[\\]#|~])/g, '\\\\$1')\n .replace(/\\r?\\n/g, ' ');\n}\n\n/** Inline code span that survives backticks and table pipes. */\nexport function code(s: string, max = 160): string {\n let v = s.replace(/\\r?\\n/g, '\u21B5');\n if (v.length > max) v = `${v.slice(0, max - 1)}\u2026`;\n v = v.replace(/\\|/g, '\\\\|');\n const ticks = (v.match(/`+/g) ?? []).reduce((m, t) => Math.max(m, t.length), 0);\n const fence = '`'.repeat(ticks + 1);\n const pad = v.startsWith('`') || v.endsWith('`') || v.startsWith(' ') ? ' ' : '';\n return `${fence}${pad}${v}${pad}${fence}`;\n}\n\nconst n = (x: number) => x.toLocaleString('en-US');\n\nfunction duration(ms: number): string {\n return ms < 1000\n ? `${ms}ms`\n : ms < 60_000\n ? `${(ms / 1000).toFixed(1)}s`\n : `${Math.floor(ms / 60_000)}m ${Math.round((ms % 60_000) / 1000)}s`;\n}\n\nconst SECTIONS: { label: BehaviorLabel; heading: string }[] = [\n { label: 'unclaimed', heading: '\u26A0\uFE0F Unclaimed behavior change' },\n { label: 'suspicious', heading: '\u2753 Suspicious behavior change' },\n { label: 'claimed', heading: '\u2705 Claimed change verified' },\n { label: 'behavior-change', heading: '\uD83D\uDD0D Behavior change' },\n];\n\nfunction behaviorBlock(f: FunctionReport, b: Behavior, maxExamples: number): string {\n const lines: string[] = [];\n const region = f.inputsRun > 0 ? ` \u00B7 ${n(b.count)} of ${n(f.inputsRun)} inputs` : '';\n lines.push(`**${code(f.exportName, 80)}** in ${code(f.file, 120)}: ${escapeText(b.title)}${region}`);\n if (b.explanation) lines.push(`<br>${b.labelSource === 'llm' ? '\uD83E\uDD16 ' : ''}${escapeText(b.explanation)}`);\n if (b.realism === 'unusual') {\n lines.push(\n `<br>\u2139\uFE0F Only on inputs unlike those in the project's tests and call sites: ${escapeText(b.realismNote ?? 'unusual values')}.`,\n );\n }\n lines.push('');\n const examples = b.examples.slice(0, maxExamples);\n const hasMutation = examples.some((e) => e.mutation);\n lines.push(hasMutation ? '| Call | Old | New | Argument after call (old \u2192 new) |' : '| Call | Old | New |');\n lines.push(hasMutation ? '| --- | --- | --- | --- |' : '| --- | --- | --- |');\n for (const e of examples) {\n const cells = [code(e.call), code(e.old.display, 100), code(e.new.display, 100)];\n if (hasMutation)\n cells.push(e.mutation ? `${code(e.mutation.old, 60)} \u2192 ${code(e.mutation.new, 60)}` : '');\n lines.push(`| ${cells.join(' | ')} |`);\n }\n return lines.join('\\n');\n}\n\nfunction claimLine(r: Report): string | undefined {\n if (!r.claim.text) return undefined;\n const firstLine = r.claim.text\n .trim()\n .split(/\\r?\\n/)[0]!\n .replace(/^#+\\s*/, '');\n return `**PR claims:** \u201C${escapeText(firstLine.slice(0, 200))}\u201D${r.claim.refactor ? ' (no behavior change)' : ''}`;\n}\n\nexport interface MarkdownOptions {\n maxExamples?: number;\n /** Include the hidden sticky-comment marker (GitHub Action). */\n sticky?: boolean;\n}\n\nexport function renderMarkdown(r: Report, options: MarkdownOptions = {}): string {\n const out = render(r, options.maxExamples ?? 3, options.sticky ?? false);\n if (out.length <= GITHUB_LIMIT) return out;\n const shorter = render(r, 1, options.sticky ?? false);\n if (shorter.length <= GITHUB_LIMIT) return shorter;\n const cut = shorter.slice(0, GITHUB_LIMIT - 400);\n return `${cut.slice(0, cut.lastIndexOf('\\n'))}\\n\\n_Report truncated. The full report is in the JSON artifact._\\n${options.sticky ? STICKY_MARKER : ''}`;\n}\n\nfunction render(r: Report, maxExamples: number, sticky: boolean): string {\n const lines: string[] = [];\n lines.push('## \uD83D\uDD2C doppeldiff: behavioral diff');\n const claim = claimLine(r);\n if (claim) lines.push('', claim);\n\n const s = r.summary;\n lines.push('');\n if (s.functions === 0) {\n lines.push(\n r.skipped.length + r.added.length + r.removed.length > 0\n ? '> No existing exported function with changed behavior to compare.'\n : '> No changed exported functions found.',\n );\n } else if (s.behaviors === 0 && s.edgeCaseBehaviors === 0) {\n lines.push(\n `> \u2705 **No behavior change** detected in ${n(s.unchanged)} function${s.unchanged === 1 ? '' : 's'} across ${n(s.inputsRun)} generated inputs.`,\n );\n } else if (s.behaviors === 0) {\n lines.push(\n `> \u2705 **No behavior change on realistic inputs** across ${n(s.inputsRun)} generated inputs; ${s.edgeCaseBehaviors} difference${s.edgeCaseBehaviors === 1 ? '' : 's'} only on edge-case inputs (below).`,\n );\n } else {\n const all = r.functions.flatMap((f) => f.behaviors).filter((b) => b.realism !== 'edge');\n const realistic = all.filter((b) => b.realism === 'seen' || b.realism === 'ordinary').length;\n const unusual = all.length - realistic;\n const plural = (k: number, w: string) => `${k} ${w}${k === 1 ? '' : 's'}`;\n const parts: string[] = [];\n if (realistic > 0) {\n parts.push(`**${plural(realistic, 'behavior change')}** on realistic inputs`);\n if (s.unclaimedRealistic > 0)\n parts.push(`**${s.unclaimedRealistic} not covered by the PR description**`);\n if (unusual > 0) parts.push(`${unusual} more only on unusual inputs`);\n } else {\n parts.push(\n `${plural(unusual, 'behavior change')} only on unusual inputs${s.unclaimed > 0 ? ` (${s.unclaimed} not covered by the PR description)` : ''}`,\n );\n }\n if (s.edgeCaseBehaviors > 0) parts.push(`${s.edgeCaseBehaviors} only on edge-case inputs`);\n const icon = s.unclaimedRealistic > 0 ? '\u26A0\uFE0F' : realistic > 0 ? '\uD83D\uDD0D' : '\u2139\uFE0F';\n lines.push(`> ${icon} ${parts.join(', ')}.`);\n }\n\n const rank = { seen: 0, ordinary: 1, unusual: 2, edge: 3 } as const;\n for (const sec of SECTIONS) {\n const items = r.functions\n .flatMap((f) =>\n f.behaviors.filter((b) => b.label === sec.label && b.realism !== 'edge').map((b) => ({ f, b })),\n )\n .sort((x, y) => rank[x.b.realism] - rank[y.b.realism]);\n if (items.length === 0) continue;\n lines.push(\n '',\n `### ${sec.heading}`,\n '',\n items.map(({ f, b }) => behaviorBlock(f, b, maxExamples)).join('\\n\\n'),\n );\n }\n\n const edge = r.functions.flatMap((f) =>\n f.behaviors.filter((b) => b.realism === 'edge').map((b) => ({ f, b })),\n );\n const timedOut = r.functions.filter((f) => (f.edgeTimeouts ?? 0) > 0);\n const timeoutLine = timedOut.length\n ? `\u23F1\uFE0F Timed out on edge-case inputs (huge numbers, NaN, \u2026); similar inputs were skipped: ${timedOut\n .map((f) => `${code(f.exportName, 60)} (${n(f.edgeTimeouts ?? 0)})`)\n .join(', ')}.`\n : '';\n if (edge.length === 0 && timeoutLine) {\n lines.push(\n '',\n `<details><summary>\u23F1\uFE0F Some edge-case inputs timed out</summary>`,\n '',\n timeoutLine,\n '',\n '</details>',\n );\n }\n if (edge.length > 0) {\n const reasons = [...new Set(edge.map(({ b }) => b.realismNote).filter(Boolean))].slice(0, 4).join(', ');\n const tag: Record<string, string> = {\n unclaimed: '\u26A0\uFE0F unclaimed: ',\n suspicious: '\u2753 suspicious: ',\n claimed: '\u2705 claimed: ',\n 'behavior-change': '',\n };\n lines.push(\n '',\n `<details><summary>\uD83E\uDDEA ${edge.length} behavior change${edge.length === 1 ? '' : 's'} only on edge-case inputs${reasons ? ` (${escapeText(reasons)})` : ''}</summary>`,\n '',\n // Compact: one example per edge-case behavior.\n edge.map(({ f, b }) => `${tag[b.label] ?? ''}${behaviorBlock(f, b, 1)}`).join('\\n\\n'),\n ...(timeoutLine ? ['', timeoutLine] : []),\n '',\n '</details>',\n );\n }\n\n const unchanged = r.functions.filter((f) => f.status === 'unchanged');\n if (unchanged.length > 0) {\n lines.push('', '### \u2705 No behavior change', '');\n lines.push(\n unchanged\n .map(\n (f) =>\n `${code(f.exportName, 80)} (${n(f.inputsRun)} inputs${f.stoppedBy === 'failures' ? ', stopped early after repeated timeouts' : ''})`,\n )\n .join(' \u00B7 '),\n );\n }\n\n const notVerified = [\n ...r.functions\n .filter((f) => f.status === 'skipped' || f.status === 'nondeterministic')\n .map((f) => ({ name: f.exportName, file: f.file, reason: f.reason ?? f.status })),\n ...r.skipped.map((x) => ({ name: x.exportName, file: x.file, reason: x.reason ?? x.kind })),\n ];\n if (notVerified.length > 0) {\n lines.push('', '### \u23ED\uFE0F Not verified', '');\n for (const x of notVerified)\n lines.push(`- ${code(x.name, 80)} in ${code(x.file, 120)}: ${escapeText(x.reason)}`);\n }\n\n const extras: string[] = [];\n if (r.added.length) extras.push(`**Added:** ${r.added.map((a) => code(a.exportName, 60)).join(', ')}`);\n if (r.removed.length)\n extras.push(`**Removed:** ${r.removed.map((a) => code(a.exportName, 60)).join(', ')}`);\n if (r.identical.length)\n extras.push(\n `**Only comments/formatting changed:** ${r.identical.map((a) => code(a.exportName, 60)).join(', ')}`,\n );\n if (r.errors.length)\n extras.push(\n `**Could not analyze:** ${r.errors.map((e) => `${code(e.file, 120)} (${escapeText(e.message.slice(0, 200))})`).join(', ')}`,\n );\n if (extras.length) {\n const counts = [\n r.added.length ? `${r.added.length} added` : '',\n r.removed.length ? `${r.removed.length} removed` : '',\n r.identical.length ? `${r.identical.length} formatting-only` : '',\n r.errors.length ? `${r.errors.length} not analyzable` : '',\n ].filter(Boolean);\n lines.push(\n '',\n `<details><summary>${counts.join(' \u00B7 ')}</summary>`,\n '',\n extras.join('<br>\\n'),\n '',\n '</details>',\n );\n }\n\n if (r.regressionTests && r.regressionTests.files.length > 0) {\n lines.push(\n '',\n `\uD83D\uDCCE Regression tests (${r.regressionTests.cases} cases): ${r.regressionTests.files.map((f) => code(f, 200)).join(', ')}`,\n );\n }\n\n const footer = [\n `${n(s.inputsRun)} inputs`,\n `${s.functions} function${s.functions === 1 ? '' : 's'}`,\n duration(Math.round(s.durationMs)),\n `seed ${r.settings.seed}`,\n `${r.base.sha.slice(0, 7)} \u2192 ${r.head.sha ? r.head.sha.slice(0, 7) : 'working tree'}`,\n `[doppeldiff](${PROJECT_URL}) v${r.tool.version}`,\n ];\n lines.push('', `<sub>${footer.join(' \u00B7 ')}</sub>`);\n if (r.claim.llm && s.behaviors > 0) {\n lines.push(\n `<sub>\uD83E\uDD16 Claimed/unclaimed labels and explanations by ${escapeText(r.claim.llm.model)}, checked against the observed examples. The examples themselves come from running the code.</sub>`,\n );\n } else if (s.behaviors > 0) {\n const labeled = r.functions.some((f) => f.behaviors.some((b) => b.labelSource === 'rules'));\n lines.push(\n labeled\n ? `<sub>Claimed/unclaimed labels come from the PR text via [deterministic rules](${PROJECT_URL}/blob/main/docs/CLAIMS.md) (no LLM, no API key).</sub>`\n : `<sub>Not matched against the PR description: name the functions you meant to change, or say \"no behavior change\" for a refactor ([rules](${PROJECT_URL}/blob/main/docs/CLAIMS.md)).</sub>`,\n );\n }\n if (sticky) lines.push(STICKY_MARKER);\n return lines.join('\\n') + '\\n';\n}\n", "import pc from 'picocolors';\nimport { groupBehaviors } from './behaviors.js';\nimport type { RunEvent } from '../run.js';\nimport type { Behavior, FunctionReport, Report } from './model.js';\n\nconst n = (x: number) => x.toLocaleString('en-US');\nconst secs = (ms: number) => (ms < 1000 ? `${Math.round(ms)}ms` : `${(ms / 1000).toFixed(1)}s`);\n\nconst LABEL: Record<Behavior['label'], (s: string) => string> = {\n unclaimed: (s) => pc.yellow(`\u26A0 unclaimed ${s}`),\n suspicious: (s) => pc.magenta(`? suspicious ${s}`),\n claimed: (s) => pc.green(`\u2713 claimed ${s}`),\n 'behavior-change': (s) => pc.cyan(`\u25CF changed ${s}`),\n};\n\nfunction clip(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}\u2026`;\n}\n\n/** Live progress lines for a run (written to stderr by the CLI). */\nexport function progressPrinter(write: (line: string) => void): (e: RunEvent) => void {\n return (e) => {\n switch (e.type) {\n case 'phase':\n if (e.phase === 'detect') write(pc.dim(' detecting changed functions\u2026'));\n break;\n case 'detected': {\n const d = e.detection;\n write(\n pc.dim(\n ` ${d.targets.length} function${d.targets.length === 1 ? '' : 's'} to verify in ${d.files.length} changed file${d.files.length === 1 ? '' : 's'}` +\n (d.skipped.length ? `, ${d.skipped.length} not verifiable` : ''),\n ),\n );\n break;\n }\n case 'function-done': {\n const r = e.result;\n const name = `${pc.bold(r.exportName)} ${pc.dim(r.file)}`;\n const meta = pc.dim(`${n(r.inputsRun)} inputs \u00B7 ${secs(r.durationMs)}`);\n const nb = groupBehaviors(r.clusters).length;\n if (r.status === 'changed')\n write(` ${pc.yellow('\u2260')} ${name} ${nb} behavior change${nb === 1 ? '' : 's'} ${meta}`);\n else if (r.status === 'unchanged') write(` ${pc.green('=')} ${name} no behavior change ${meta}`);\n else if (r.status === 'nondeterministic')\n write(` ${pc.magenta('~')} ${name} nondeterministic ${pc.dim(r.reason ?? '')}`);\n else write(` ${pc.dim('-')} ${name} ${pc.dim(`skipped: ${r.reason ?? ''}`)}`);\n break;\n }\n default:\n break;\n }\n };\n}\n\nfunction behaviorLines(f: FunctionReport, b: Behavior, width: number): string[] {\n const lines = [\n ` ${LABEL[b.label](pc.bold(b.title))} ${pc.dim(`(${n(b.count)} of ${n(f.inputsRun)} inputs)`)}`,\n ];\n if (b.explanation) lines.push(` ${pc.dim(clip(b.explanation, width - 6))}`);\n if (b.realism === 'unusual')\n lines.push(` ${pc.dim(clip(`only on unusual inputs: ${b.realismNote ?? ''}`, width - 6))}`);\n for (const ex of b.examples) {\n lines.push(` ${clip(ex.call, width - 6)}`);\n lines.push(` ${pc.dim('old:')} ${clip(ex.old.display, width - 14)}`);\n lines.push(` ${pc.dim('new:')} ${clip(ex.new.display, width - 14)}`);\n if (ex.mutation)\n lines.push(\n ` ${pc.dim(`arg ${ex.mutation.argIndex + 1} after call:`)} ${clip(`${ex.mutation.old} \u2192 ${ex.mutation.new}`, width - 30)}`,\n );\n }\n return lines;\n}\n\n/** Final human-readable report. */\nexport function renderTerminal(r: Report, width = Math.min(process.stdout.columns ?? 100, 120)): string {\n const out: string[] = [''];\n if (r.claim.text)\n out.push(\n `${pc.dim('Claim:')} ${clip(\n r.claim.text\n .trim()\n .split('\\n')[0]!\n .replace(/^#+\\s*/, ''),\n width - 8,\n )}${r.claim.refactor ? pc.dim(' (no behavior change)') : ''}`,\n '',\n );\n\n for (const f of r.functions.filter((x) => x.behaviors.length > 0)) {\n out.push(\n ` ${pc.bold(f.exportName)} ${pc.dim(f.file)}${f.targetReason && f.targetReason !== 'code changed' ? pc.dim(` (${f.targetReason})`) : ''}`,\n );\n for (const b of f.behaviors.filter((x) => x.realism !== 'edge')) out.push(...behaviorLines(f, b, width));\n const edge = f.behaviors.filter((x) => x.realism === 'edge');\n if (edge.length > 0) {\n out.push(\n ` ${pc.dim(\n `edge-case inputs only (${edge\n .map((b) => b.realismNote)\n .filter(Boolean)\n .join(', ')}):`,\n )}`,\n );\n for (const b of edge) out.push(...behaviorLines(f, b, width).map((l) => pc.dim(l)));\n }\n out.push('');\n }\n\n const unchanged = r.functions.filter((f) => f.status === 'unchanged');\n if (unchanged.length) {\n out.push(\n ` ${pc.green('\u2713 no behavior change:')} ${unchanged.map((f) => `${f.exportName} ${pc.dim(`(${n(f.inputsRun)})`)}`).join(', ')}`,\n );\n }\n const skipped = [\n ...r.functions\n .filter((f) => f.status === 'skipped' || f.status === 'nondeterministic')\n .map((f) => `${f.exportName}: ${f.reason ?? f.status}`),\n ...r.skipped.map((s) => `${s.exportName}: ${s.reason ?? s.kind}`),\n ];\n if (skipped.length) {\n out.push(` ${pc.dim('\u2013 not verified:')}`);\n for (const s of skipped) out.push(` ${pc.dim(clip(s, width - 6))}`);\n }\n if (r.added.length) out.push(` ${pc.dim('+ added:')} ${r.added.map((a) => a.exportName).join(', ')}`);\n if (r.removed.length)\n out.push(` ${pc.dim('- removed:')} ${r.removed.map((a) => a.exportName).join(', ')}`);\n if (r.identical.length)\n out.push(` ${pc.dim('\u00B7 formatting only:')} ${r.identical.map((a) => a.exportName).join(', ')}`);\n if (r.regressionTests?.files.length)\n out.push(` ${pc.dim('\uD83D\uDCCE regression tests:')} ${r.regressionTests.files.join(', ')}`);\n\n const s = r.summary;\n const verdict =\n s.functions === 0\n ? pc.dim('no changed exported functions to compare')\n : s.verdict === 'no-change'\n ? pc.green(pc.bold('no behavior change'))\n : s.verdict === 'unclaimed'\n ? pc.yellow(\n pc.bold(\n `${s.behaviors} behavior change${s.behaviors === 1 ? '' : 's'}, ${s.unclaimed} unclaimed`,\n ),\n )\n : pc.cyan(pc.bold(`${s.behaviors} behavior change${s.behaviors === 1 ? '' : 's'}`));\n const edgeNote =\n s.edgeCaseBehaviors > 0 ? pc.dim(` (+${s.edgeCaseBehaviors} on edge-case inputs only)`) : '';\n out.push('');\n out.push(\n ` ${verdict}${edgeNote} ${pc.dim(`${n(s.inputsRun)} inputs \u00B7 ${s.functions} function${s.functions === 1 ? '' : 's'} \u00B7 ${secs(s.durationMs)} \u00B7 seed ${r.settings.seed}`)}`,\n );\n out.push('');\n return out.join('\\n');\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { basename, dirname, extname, join, posix } from 'node:path';\nimport { DEFAULT_NOW, packageRootOf } from '../verify/session.js';\nimport type { Behavior, Example, FunctionReport, Report } from './model.js';\n\nexport type Framework = 'vitest' | 'jest';\n\nexport interface TestgenOptions {\n /** Root of the head version (the working copy): files are written here. */\n root: string;\n /** Output directory relative to `root` (default `tests/doppeldiff`). */\n outDir?: string;\n framework?: Framework | 'auto';\n /** Write files (default true). When false, only returns them. */\n write?: boolean;\n}\n\nexport interface GeneratedFile {\n path: string;\n content: string;\n cases: number;\n}\n\nconst BUILTIN_ERRORS = new Set([\n 'Error',\n 'TypeError',\n 'RangeError',\n 'SyntaxError',\n 'ReferenceError',\n 'EvalError',\n 'URIError',\n 'AggregateError',\n]);\nconst PRIMITIVE_CODE = /^(?:-?\\d|-?Infinity|undefined|null|true|false|\"|-?\\d+n$)/;\n\n/** Pick the test framework from the nearest package.json (vitest wins if both are present). */\nexport function detectFramework(root: string, file: string): Framework {\n for (const dir of [packageRootOf(root, join(root, file)), root]) {\n const pkgPath = join(dir, 'package.json');\n if (!existsSync(pkgPath)) continue;\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<\n string,\n Record<string, string> | undefined\n >;\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps.vitest) return 'vitest';\n if (deps.jest) return 'jest';\n } catch {\n /* ignore */\n }\n }\n return 'vitest';\n}\n\nfunction importPath(fromFile: string, sourceFile: string): string {\n let rel = posix.relative(posix.dirname(fromFile), sourceFile);\n if (!rel.startsWith('.')) rel = `./${rel}`;\n const ext = extname(rel);\n // TypeScript sources are imported without extension (resolved by the test runner); JS keeps its extension.\n if (['.ts', '.tsx', '.mts', '.cts'].includes(ext)) rel = rel.slice(0, -ext.length);\n return rel;\n}\n\nfunction comment(s: string): string {\n return s.replace(/\\*\\//g, '*\\\\/').replace(/\\r?\\n/g, ' ');\n}\n\nfunction title(s: string): string {\n return JSON.stringify(s.length > 120 ? `${s.slice(0, 119)}\u2026` : s);\n}\n\n/** Assertion source for one example, or a reason it cannot be pinned. */\nfunction assertion(local: string, ex: Example): { code: string } | { skip: string } {\n if (ex.argsCode === undefined) return { skip: 'arguments cannot be written as code' };\n const call = `${local}(${ex.argsCode})`;\n const out = ex.new;\n if (ex.mutation) {\n if (ex.mutation.newCode === undefined) return { skip: 'mutated argument cannot be written as code' };\n return {\n code: [\n `const args = [${ex.argsCode}] as const;`,\n out.kind === 'throw'\n ? `try { ${out.async ? 'await ' : ''}${local}(...(args as unknown as Parameters<typeof ${local}>)); } catch { /* expected to throw */ }`\n : `${out.async ? 'await ' : ''}${local}(...(args as unknown as Parameters<typeof ${local}>));`,\n `expect(args[${ex.mutation.argIndex}]).toEqual(${ex.mutation.newCode});`,\n ].join('\\n '),\n };\n }\n switch (out.kind) {\n case 'return': {\n if (out.code === undefined) return { skip: `return value cannot be written as code (${out.display})` };\n const matcher =\n out.code === 'NaN'\n ? 'toBeNaN()'\n : PRIMITIVE_CODE.test(out.code)\n ? `toBe(${out.code})`\n : `toEqual(${out.code})`;\n return {\n code: out.async ? `await expect(${call}).resolves.${matcher};` : `expect(${call}).${matcher};`,\n };\n }\n case 'throw': {\n const checks: string[] = [];\n if (out.errorClass && BUILTIN_ERRORS.has(out.errorClass)) checks.push(`toThrow(${out.errorClass})`);\n if (out.message !== undefined) checks.push(`toThrow(${JSON.stringify(out.message)})`);\n if (checks.length === 0) checks.push('toThrow()');\n return {\n code: checks\n .map((c) => (out.async ? `await expect(${call}).rejects.${c};` : `expect(() => ${call}).${c};`))\n .join('\\n '),\n };\n }\n default:\n return { skip: `new version ${out.display}` };\n }\n}\n\nfunction fileFor(f: FunctionReport, outDir: string, taken: Set<string>, ts: boolean): string {\n const ext = ts ? '.test.ts' : '.test.js';\n const safe = f.exportName === 'default' ? basename(f.file).replace(/\\.[^.]+$/, '') : f.exportName;\n let p = posix.join(outDir, `${safe}${ext}`);\n if (taken.has(p)) p = posix.join(outDir, `${basename(f.file).replace(/\\.[^.]+$/, '')}.${safe}${ext}`);\n taken.add(p);\n return p;\n}\n\nfunction renderFile(\n r: Report,\n f: FunctionReport,\n path: string,\n framework: Framework,\n): { content: string; cases: number } {\n const ts = path.endsWith('.ts');\n const local = f.exportName === 'default' ? 'subject' : f.exportName;\n const imp = importPath(path, f.file);\n const lines: string[] = [];\n lines.push(\n `// Generated by doppeldiff v${r.tool.version}: pins the current behavior of \\`${f.exportName}\\` (${f.file}).`,\n );\n lines.push(\n `// Observed differences against ${r.base.sha.slice(0, 7)}; review before committing. Regenerate with \\`npx doppeldiff --write-tests\\`.`,\n );\n if (r.settings.freeze) {\n lines.push(\n `// Values were observed with the clock frozen at ${new Date(DEFAULT_NOW).toISOString()} and TZ=UTC.`,\n );\n }\n if (framework === 'vitest')\n lines.push(`import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest';`);\n else lines.push(`import { afterAll, beforeAll, describe, expect, it, jest } from '@jest/globals';`);\n lines.push(\n f.exportName === 'default' ? `import ${local} from '${imp}';` : `import { ${local} } from '${imp}';`,\n );\n lines.push('');\n lines.push(`describe(${JSON.stringify(`${f.exportName} (doppeldiff)`)}, () => {`);\n if (r.settings.freeze) {\n if (framework === 'vitest') {\n lines.push(\n ` beforeAll(() => {`,\n ` vi.useFakeTimers({ now: ${DEFAULT_NOW}, toFake: ['Date'] });`,\n ` });`,\n );\n lines.push(` afterAll(() => {`, ` vi.useRealTimers();`, ` });`);\n } else {\n lines.push(\n ` beforeAll(() => {`,\n ` jest.useFakeTimers({ now: ${DEFAULT_NOW}, doNotFake: ['nextTick', 'setImmediate', 'clearImmediate', 'setTimeout', 'clearTimeout', 'setInterval', 'clearInterval', 'queueMicrotask', 'hrtime', 'performance'] });`,\n ` });`,\n ` afterAll(() => {`,\n ` jest.useRealTimers();`,\n ` });`,\n );\n }\n }\n let cases = 0;\n f.behaviors.forEach((b: Behavior) => {\n lines.push('');\n if (b.label === 'unclaimed' || b.label === 'suspicious') {\n lines.push(\n ` // \u26A0\uFE0F ${b.label === 'unclaimed' ? 'Unclaimed' : 'Suspicious'} behavior change: ${comment(b.title)}.`,\n );\n lines.push(` // These tests pin the NEW behavior. Delete them if the change is a bug.`);\n } else {\n lines.push(` // ${comment(b.title)}`);\n }\n for (const ex of b.examples) {\n const a = assertion(local, ex);\n if ('skip' in a) {\n lines.push(` // Not pinned: ${comment(ex.call)}: ${comment(a.skip)}`);\n continue;\n }\n const isAsync = a.code.includes('await ');\n lines.push(` it(${title(ex.call)}, ${isAsync ? 'async ' : ''}() => {`);\n lines.push(` // Before: ${comment(ex.old.display)}`);\n lines.push(\n ` ${ts ? a.code : a.code.replace(/ as const;/, ';').replace(/ as unknown as Parameters<typeof \\w+>/, '')}`,\n );\n lines.push(` });`);\n cases++;\n }\n });\n lines.push('});', '');\n return { content: lines.join('\\n'), cases };\n}\n\n/** Generate one regression test file per function with behavior changes. */\nexport function generateTests(\n r: Report,\n options: TestgenOptions,\n): { framework: Framework; files: GeneratedFile[] } {\n const outDir = (options.outDir ?? 'tests/doppeldiff').replace(/\\\\/g, '/').replace(/\\/$/, '');\n const changed = r.functions.filter((f) => f.behaviors.length > 0);\n const framework: Framework =\n options.framework && options.framework !== 'auto'\n ? options.framework\n : detectFramework(options.root, changed[0]?.file ?? '.');\n const taken = new Set<string>();\n const files: GeneratedFile[] = [];\n for (const f of changed) {\n const ts = /\\.(?:ts|tsx|mts|cts)$/.test(f.file);\n const path = fileFor(f, outDir, taken, ts);\n const { content, cases } = renderFile(r, f, path, framework);\n if (cases === 0) continue;\n files.push({ path, content, cases });\n if (options.write !== false) {\n const abs = join(options.root, path);\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(abs, content);\n }\n }\n return { framework, files };\n}\n", "import { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type fcType from 'fast-check';\nimport type { Arbitrary } from 'fast-check';\nimport type { CompareOptions } from './core/compare/compare.js';\n\nexport interface FunctionConfig {\n /** Custom argument generator: return an arbitrary of the full argument list. */\n args?: (fc: typeof fcType) => Arbitrary<unknown[]>;\n /** Extra inputs to always try first. */\n examples?: unknown[][];\n /**\n * Input domain: only inputs for which this returns true are generated and reported, e.g.\n * `where: ([a, b]) => typeof a !== 'number' || a >= 0`.\n */\n where?: (args: unknown[]) => boolean;\n /** Do not verify this function (true or a reason). */\n skip?: boolean | string;\n runs?: number;\n}\n\nexport interface DoppeldiffConfig {\n include?: string[];\n exclude?: string[];\n runs?: number;\n timeoutMs?: number;\n seed?: number;\n freeze?: boolean;\n failOn?: 'unclaimed' | 'any' | 'never';\n compare?: CompareOptions;\n /** Per-function settings, keyed by `path/to/file.ts#exportName` or just `exportName`. */\n functions?: Record<string, FunctionConfig>;\n /** Regression test output directory (default tests/doppeldiff). */\n testsDir?: string;\n}\n\n/** Identity helper for typed config files. */\nexport function defineConfig(config: DoppeldiffConfig): DoppeldiffConfig {\n return config;\n}\n\nexport const CONFIG_FILES = [\n 'doppeldiff.config.ts',\n 'doppeldiff.config.mts',\n 'doppeldiff.config.js',\n 'doppeldiff.config.mjs',\n];\n\n/**\n * Load `doppeldiff.config.*` from the repository root. The config runs in the main process (it builds\n * arbitraries), so it is treated like any other project build script: trusted code from the checkout.\n */\nexport async function loadConfig(\n root: string,\n explicit?: string,\n): Promise<{ config: DoppeldiffConfig; path: string | null }> {\n const path = explicit\n ? join(root, explicit)\n : CONFIG_FILES.map((f) => join(root, f)).find((p) => existsSync(p));\n if (!path) return { config: {}, path: null };\n if (!existsSync(path)) throw new Error(`config file not found: ${path}`);\n const esbuild = await import('esbuild');\n const result = await esbuild.build({\n entryPoints: [path],\n bundle: true,\n platform: 'node',\n format: 'esm',\n target: 'node22',\n write: false,\n logLevel: 'silent',\n banner: {\n js: \"import { createRequire as __ddRequire } from 'node:module'; const require = __ddRequire(import.meta.url);\",\n },\n // `import { defineConfig } from 'doppeldiff'` should work even when doppeldiff is not installed locally.\n plugins: [\n {\n name: 'doppeldiff-self',\n setup(build) {\n build.onResolve({ filter: /^doppeldiff$/ }, () => ({\n path: 'doppeldiff',\n namespace: 'doppeldiff-self',\n }));\n build.onLoad({ filter: /.*/, namespace: 'doppeldiff-self' }, () => ({\n contents: 'export const defineConfig = (c) => c;',\n loader: 'js',\n }));\n },\n },\n ],\n });\n const code = result.outputFiles[0]!.text;\n const hash = createHash('sha256').update(code).digest('hex').slice(0, 16);\n const dir = join(tmpdir(), 'doppeldiff-config');\n mkdirSync(dir, { recursive: true });\n const file = join(dir, `config-${hash}.mjs`);\n writeFileSync(file, code);\n const mod = (await import(pathToFileURL(file).href)) as { default?: DoppeldiffConfig };\n return { config: mod.default ?? {}, path };\n}\n\n/** Find the per-function config entry for a target. */\nexport function functionConfig(\n config: DoppeldiffConfig,\n id: string,\n exportName: string,\n): FunctionConfig | undefined {\n return config.functions?.[id] ?? config.functions?.[exportName];\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["existsSync", "realpathSync", "tmpdir", "dirname", "join", "relative", "sep", "build", "code", "createHash", "existsSync", "mkdirSync", "readFileSync", "realpathSync", "writeFileSync", "tmpdir", "join", "join", "existsSync", "esbuild", "code", "createHash", "tmpdir", "mkdirSync", "readFileSync", "writeFileSync", "realpathSync", "resolve", "join", "tmpdir", "existsSync", "realpathSync", "dirname", "relative", "sep", "key", "text", "n", "fc", "n", "key", "fc", "n", "size", "key", "leaves", "fc", "Node", "SyntaxKind", "Node", "SyntaxKind", "Node", "SyntaxKind", "n", "Node", "SyntaxKind", "ts", "n", "text", "isWithin", "fc", "n", "n", "ts", "key", "n", "round", "fc", "idx", "first", "n", "Node", "ts", "ts", "o", "key", "Node", "Node", "SyntaxKind", "compile", "n", "n", "leaves", "Node", "n", "Node", "existsSync", "realpathSync", "join", "fc", "clip", "key", "m", "v", "n", "text", "existsSync", "readFileSync", "realpathSync", "dirname", "join", "code", "realpathSync", "existsSync", "join", "text", "readFileSync", "n", "key", "dirname", "readFileSync", "basename", "join", "ts", "key", "n", "text", "execFileSync", "createHash", "existsSync", "mkdirSync", "readdirSync", "readFileSync", "realpathSync", "dirname", "join", "createHash", "existsSync", "mkdirSync", "rmSync", "tmpdir", "join", "createHash", "join", "tmpdir", "samePath", "existsSync", "mkdirSync", "rmSync", "require", "join", "existsSync", "realpathSync", "stem", "fc", "key", "text", "title", "IDENT", "key", "num", "n", "entries", "proto", "text", "code", "run", "n", "clip", "n", "clip", "s", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "basename", "dirname", "extname", "join", "join", "existsSync", "readFileSync", "extname", "ts", "basename", "mkdirSync", "dirname", "writeFileSync"]
7
7
  }