{"version":3,"sources":["../src/differ.ts","../src/math.ts","../src/synthesis.ts","../src/dissonance.ts","../src/scheduler.ts","../src/audio.ts","../src/env.ts","../src/adapter.ts","../src/middleware.ts","../src/version.ts"],"names":["isPlainObject","value","proto","getValueType","valueType","safeStringify","serialized","mapEqual","a","b","key","setEqual","shallowEqual","item","index","objA","objB","keysA","keysB","valuesEqual","currentValue","prevValue","serializedCurrent","serializedPrev","detectChanges","currentState","prevState","changes","currentRecord","prevRecord","allKeys","clamp01","lerp","midiToHz","midi","cacheByContext","quantizeBrightness","brightness","clamped","getContextCache","ctx","existing","created","createWave","numHarmonics","amplitudeForHarmonic","cache","cached","real","imag","n","wave","createTimbreWave","harmonics","safeBrightness","rolloffDbPerOct","octaves","attenuation","DSTAR","S1","S2","C1","C2","A1","A2","quantize","step","buildPartials","baseFrequency","partials","pairDissonance","f1","f2","a1","a2","fmin","s","fdif","staticConsonanceRanking","rankingCache","MAX_RANKING_CACHE_ENTRIES","setRankingCache","ranking","oldestKey","intervalDissonance","semitones","p1","p2","sum","j","rankChromaticIntervals","params","brightnessQ","scored","mapPleasantnessToIntervalContinuous","pleasantness","position","t","schedulers","getState","pump","state","horizon","error","scheduleAudioTask","time","run","id","items","inserted","i","fn","stopAudioScheduler","audioContext","activeAttachmentCount","retainAudioEngine","releaseAudioEngine","cleanupAudio","getAudioContext","ctor","defaultAesthetics","change","baseMidi","arousal","valence","simultaneity","h","c","duration","oldNum","delta","magnitude","oldLen","newLen","sizeRatio","goingTrue","mergeAesthetics","base","overrides","merged","override","applySoundMapping","aesthetics","mapping","numHarmonicsOverride","next","durationOverride","volumeMultiplier","scheduleAdsr","attack","decay","release","sustainLevel","sustainTime","t0","t1","t2","t3","t4","playSound","volumeOrOptions","globalVolume","options","fromOptions","fromHook","soundOverride","mapped","intervalSemitones","durationSeconds","offsetSeconds","startTime","spreadSeconds","baseStart","startA","startB","envelopeGain","peak","oscA","oscB","gainA","gainB","stopAt","ended","safeDisconnect","node","cleanup","onended","isLocalDevelopmentHost","hostname","readNodeEnv","resolveDefaultEnabled","nodeEnv","maybeDev","deduplicateByPath","latestByPath","emitChanges","volume","soundMapping","mapChangeToAesthetics","performanceMode","onError","isPlaybackActive","isZusoundOptions","optionKeys","mergeOptions","baseOptions","overrideOptions","isMiddlewareCall","arg1","arg2","argCount","attachZusound","adapter","enabled","debounceMs","debounceTimer","pendingChanges","cleanedUp","unsubscribe","flushed","cleanupWithAudio","createZusound","retainedSubscriberAudio","instance","args","initializer","storeArgs","get","api","handle","attachedCleanup","zusound","version"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Change detection system.\n *\n * Performs shallow-first comparison for performance, falling back to\n * JSON serialization only when the shallow check cannot determine\n * equality. Returns `Change` objects with path, operation, and value\n * type metadata for each top-level key that differs between states.\n */\n\nimport type { Change } from './types'\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n  if (typeof value !== 'object' || value === null || Array.isArray(value)) return false\n  const proto = Object.getPrototypeOf(value)\n  return proto === Object.prototype || proto === null\n}\n\n/** Determine the type of a value */\nfunction getValueType(value: unknown): Change['valueType'] {\n  if (value === null || value === undefined) return 'object'\n  if (Array.isArray(value)) return 'array'\n  const valueType = typeof value\n  if (valueType === 'string') return 'string'\n  if (valueType === 'number') return 'number'\n  if (valueType === 'boolean') return 'boolean'\n  return 'object'\n}\n\n/** Safely stringify values for comparison (fallback for complex cases) */\nfunction safeStringify(value: unknown): { ok: true; value: string } | { ok: false } {\n  try {\n    if (value === null) return { ok: true, value: 'null' }\n    if (value === undefined) return { ok: true, value: 'undefined' }\n    if (typeof value === 'function') return { ok: true, value: '[Function]' }\n    const serialized = JSON.stringify(value)\n    if (serialized === undefined) return { ok: false }\n    return { ok: true, value: serialized }\n  } catch {\n    return { ok: false }\n  }\n}\n\nfunction mapEqual(a: Map<unknown, unknown>, b: Map<unknown, unknown>): boolean {\n  if (a.size !== b.size) return false\n  for (const [key, value] of a) {\n    if (!b.has(key) || !Object.is(value, b.get(key))) return false\n  }\n  return true\n}\n\nfunction setEqual(a: Set<unknown>, b: Set<unknown>): boolean {\n  if (a.size !== b.size) return false\n  for (const value of a) {\n    if (!b.has(value)) return false\n  }\n  return true\n}\n\n/**\n * Shallow equality check for objects and arrays\n * Much faster than JSON.stringify for most use cases\n */\nfunction shallowEqual(a: unknown, b: unknown): boolean {\n  if (a === b) return true\n  if (!a || !b) return false\n\n  // Handle arrays\n  if (Array.isArray(a) && Array.isArray(b)) {\n    if (a.length !== b.length) return false\n    return a.every((item, index) => item === b[index])\n  }\n\n  // Handle objects\n  if (isPlainObject(a) && isPlainObject(b)) {\n    const objA = a\n    const objB = b\n    const keysA = Object.keys(objA)\n    const keysB = Object.keys(objB)\n    if (keysA.length !== keysB.length) return false\n    return keysA.every((key) => objA[key] === objB[key])\n  }\n\n  return false\n}\n\n/**\n * Two-tier equality check:\n * 1. Fast path — reference equality and shallow property comparison.\n * 2. Slow path — JSON serialization (only when shallow check cannot determine equality).\n *\n * The fast path handles the vast majority of Zustand state updates\n * (single-property changes with primitive values), keeping the overhead\n * near zero for typical usage.\n */\nfunction valuesEqual(currentValue: unknown, prevValue: unknown): boolean {\n  // Fast path for primitives and same reference\n  if (currentValue === prevValue) return true\n\n  // Handle null/undefined cases\n  if (\n    currentValue === null ||\n    currentValue === undefined ||\n    prevValue === null ||\n    prevValue === undefined\n  ) {\n    return currentValue === prevValue\n  }\n\n  // For objects and arrays, try shallow comparison first\n  if (typeof currentValue === 'object' && typeof prevValue === 'object') {\n    if (currentValue instanceof Date && prevValue instanceof Date) {\n      return currentValue.getTime() === prevValue.getTime()\n    }\n\n    if (currentValue instanceof Map && prevValue instanceof Map) {\n      return mapEqual(currentValue, prevValue)\n    }\n\n    if (currentValue instanceof Set && prevValue instanceof Set) {\n      return setEqual(currentValue, prevValue)\n    }\n\n    if (\n      !Array.isArray(currentValue) &&\n      !Array.isArray(prevValue) &&\n      (!isPlainObject(currentValue) || !isPlainObject(prevValue))\n    ) {\n      return false\n    }\n\n    // Try shallow comparison first (much faster)\n    if (shallowEqual(currentValue, prevValue)) return true\n\n    // Fall back to string comparison for deeply nested changes\n    // This is the expensive operation we're trying to minimize\n    const serializedCurrent = safeStringify(currentValue)\n    const serializedPrev = safeStringify(prevValue)\n    if (!serializedCurrent.ok || !serializedPrev.ok) return false\n    return serializedCurrent.value === serializedPrev.value\n  }\n\n  // For primitives that aren't equal\n  return false\n}\n\n/**\n * Simple change detection - compares two state objects\n * Returns array of changes found with optimized comparison\n */\nexport function detectChanges(currentState: unknown, prevState: unknown): Change[] {\n  const changes: Change[] = []\n\n  // Handle non-object states\n  if (\n    typeof currentState !== 'object' ||\n    currentState === null ||\n    typeof prevState !== 'object' ||\n    prevState === null\n  ) {\n    if (currentState !== prevState) {\n      changes.push({\n        path: 'root',\n        operation: 'update',\n        valueType: getValueType(currentState),\n        newValue: currentState,\n        oldValue: prevState,\n      })\n    }\n    return changes\n  }\n\n  const currentRecord = currentState as Record<string, unknown>\n  const prevRecord = prevState as Record<string, unknown>\n\n  // Get all unique keys from both states\n  const allKeys = new Set([...Object.keys(currentRecord), ...Object.keys(prevRecord)])\n\n  for (const key of allKeys) {\n    const currentValue = currentRecord[key]\n    const prevValue = prevRecord[key]\n\n    // Key was added\n    if (!(key in prevRecord) && key in currentRecord) {\n      changes.push({\n        path: key,\n        operation: 'add',\n        valueType: getValueType(currentValue),\n        newValue: currentValue,\n        oldValue: undefined,\n      })\n      continue\n    }\n\n    // Key was removed\n    if (key in prevRecord && !(key in currentRecord)) {\n      changes.push({\n        path: key,\n        operation: 'remove',\n        valueType: getValueType(prevValue),\n        newValue: undefined,\n        oldValue: prevValue,\n      })\n      continue\n    }\n\n    // Key was updated - use optimized comparison\n    if (key in prevRecord && key in currentRecord) {\n      if (!valuesEqual(currentValue, prevValue)) {\n        changes.push({\n          path: key,\n          operation: 'update',\n          valueType: getValueType(currentValue),\n          newValue: currentValue,\n          oldValue: prevValue,\n        })\n      }\n    }\n  }\n\n  return changes\n}\n","/**\n * Shared math utilities used across synthesis, dissonance, and audio modules.\n */\n\n/** Clamp a value to the [0, 1] interval. */\nexport function clamp01(value: number): number {\n  if (value < 0) return 0\n  if (value > 1) return 1\n  return value\n}\n\n/** Linear interpolation between two values. */\nexport function lerp(a: number, b: number, t: number): number {\n  return a + (b - a) * t\n}\n\n/** Convert a MIDI note number to frequency in Hz (A4 = 69 = 440 Hz). */\nexport function midiToHz(midi: number): number {\n  return 440 * Math.pow(2, (midi - 69) / 12)\n}\n","/**\n * PeriodicWave synthesis with per-AudioContext caching.\n *\n * Builds custom waveforms using harmonic series with brightness-controlled\n * spectral rolloff. Waves are cached by (brightness, numHarmonics) key\n * per AudioContext to avoid redundant FFT computation. The WeakMap keying\n * ensures cache entries are garbage-collected when the context is closed.\n */\n\nimport { MAX_HARMONICS } from './constants'\nimport { clamp01 } from './math'\n\n/** Per-context wave cache. Keyed by AudioContext (weak) → cache-key string → PeriodicWave. */\nconst cacheByContext = new WeakMap<AudioContext, Map<string, PeriodicWave>>()\n\n/** Quantize brightness to 3 decimal places for stable cache keys. */\nfunction quantizeBrightness(brightness: number): number {\n  const clamped = clamp01(brightness)\n  return Math.round(clamped * 1000) / 1000\n}\n\n/** Get or create the wave cache for a given AudioContext. */\nfunction getContextCache(ctx: AudioContext): Map<string, PeriodicWave> {\n  const existing = cacheByContext.get(ctx)\n  if (existing) return existing\n  const created = new Map<string, PeriodicWave>()\n  cacheByContext.set(ctx, created)\n  return created\n}\n\n/**\n * Build a PeriodicWave from a harmonic amplitude function, returning\n * a cached instance if one already exists for the given key.\n */\nfunction createWave(\n  ctx: AudioContext,\n  key: string,\n  numHarmonics: number,\n  amplitudeForHarmonic: (n: number) => number\n): PeriodicWave {\n  const cache = getContextCache(ctx)\n  const cached = cache.get(key)\n  if (cached) return cached\n\n  const real = new Float32Array(numHarmonics + 1)\n  const imag = new Float32Array(numHarmonics + 1)\n\n  for (let n = 1; n <= numHarmonics; n++) {\n    imag[n] = amplitudeForHarmonic(n)\n  }\n\n  const wave = ctx.createPeriodicWave(real, imag, { disableNormalization: false })\n  cache.set(key, wave)\n  return wave\n}\n\n/**\n * Create a PeriodicWave with brightness-controlled harmonic rolloff.\n *\n * Each harmonic's amplitude is `(1/n²) × attenuation`, where attenuation\n * decreases with `(1 − brightness) × 24 dB/octave` rolloff. Higher\n * brightness retains more upper harmonics, producing a brighter timbre.\n */\nexport function createTimbreWave(\n  ctx: AudioContext,\n  brightness: number,\n  numHarmonics: number = 10\n): PeriodicWave {\n  const harmonics = Math.min(MAX_HARMONICS, Math.max(1, Math.floor(numHarmonics)))\n  const safeBrightness = quantizeBrightness(brightness)\n  const key = `timbre:${safeBrightness.toFixed(3)}:${harmonics}`\n  const rolloffDbPerOct = (1 - safeBrightness) * 24\n\n  return createWave(ctx, key, harmonics, (n) => {\n    const octaves = Math.log2(n)\n    const attenuation = Math.pow(10, -(rolloffDbPerOct * octaves) / 20)\n    return (1 / (n * n)) * attenuation\n  })\n}\n","/**\n * Interval ranking and roughness model.\n *\n * Uses a Sethares/Plomp-Levelt-inspired dyad roughness scoring system\n * to rank chromatic intervals by sensory dissonance. The ranking drives\n * the `pleasantness` aesthetic: high pleasantness selects consonant\n * intervals, low pleasantness selects dissonant ones.\n *\n * @see Sethares, W.A. (1993). \"Local consonance and the relationship\n *      between timbre and scale.\" JASA 94(3).\n * @see Plomp, R. & Levelt, W.J.M. (1965). \"Tonal consonance and\n *      critical bandwidth.\" JASA 38(4).\n */\n\nimport { MAX_HARMONICS } from './constants'\nimport { clamp01 } from './math'\n\n/** A single harmonic partial with frequency and amplitude. */\ntype HarmonicPartial = {\n  frequency: number\n  amplitude: number\n}\n\n/*\n * Plomp-Levelt roughness model constants.\n *\n * DSTAR - Critical bandwidth scaling factor\n * S1, S2 - Frequency-dependent bandwidth regression coefficients\n * C1, C2 - Amplitude weighting constants (sum to zero for baseline normalization)\n * A1, A2 - Exponential decay rates for the roughness curve\n */\nconst DSTAR = 0.24\nconst S1 = 0.0207\nconst S2 = 18.96\nconst C1 = 5\nconst C2 = -5\nconst A1 = -3.51\nconst A2 = -5.75\n\n/** Round a value to the nearest step for cache key stability. */\nfunction quantize(value: number, step: number): number {\n  if (step <= 0) return value\n  return Math.round(value / step) * step\n}\n\n/**\n * Build the harmonic series for a given base frequency and brightness.\n * Each partial's amplitude decays with an inverse-square law, further\n * attenuated by a brightness-controlled rolloff in dB per octave.\n */\nfunction buildPartials(\n  baseFrequency: number,\n  brightness: number,\n  numHarmonics: number\n): HarmonicPartial[] {\n  const safeBrightness = clamp01(brightness)\n  const harmonics = Math.min(MAX_HARMONICS, Math.max(1, Math.floor(numHarmonics)))\n  const rolloffDbPerOct = (1 - safeBrightness) * 24\n\n  const partials: HarmonicPartial[] = []\n  for (let n = 1; n <= harmonics; n++) {\n    const octaves = Math.log2(n)\n    const attenuation = Math.pow(10, -(rolloffDbPerOct * octaves) / 20)\n    partials.push({\n      frequency: baseFrequency * n,\n      amplitude: (1 / (n * n)) * attenuation,\n    })\n  }\n\n  return partials\n}\n\n/** Compute sensory roughness between two frequency/amplitude pairs. */\nexport function pairDissonance(f1: number, f2: number, a1: number, a2: number): number {\n  const fmin = Math.min(f1, f2)\n  const s = DSTAR / (S1 * fmin + S2)\n  const fdif = Math.abs(f2 - f1)\n  return Math.min(a1, a2) * (C1 * Math.exp(A1 * s * fdif) + C2 * Math.exp(A2 * s * fdif))\n}\n\n/** Parameters for interval ranking computation. */\nexport type IntervalRankingParams = {\n  baseFrequency?: number\n  brightness: number\n  numHarmonics: number\n  performanceMode?: boolean\n}\n\n/**\n * Pre-computed consonance ranking (unison through tritone) for\n * `performanceMode`, ordered from most consonant to most dissonant.\n */\nconst staticConsonanceRanking: number[] = [0, 7, 5, 4, 3, 9, 8, 2, 10, 11, 1, 6]\n\nconst rankingCache = new Map<string, number[]>()\nconst MAX_RANKING_CACHE_ENTRIES = 256\n\n/** Insert a ranking into the cache, evicting the oldest entry if full. */\nfunction setRankingCache(key: string, ranking: number[]): void {\n  if (rankingCache.has(key)) {\n    rankingCache.set(key, ranking)\n    return\n  }\n\n  if (rankingCache.size >= MAX_RANKING_CACHE_ENTRIES) {\n    const oldestKey = rankingCache.keys().next().value\n    if (oldestKey) rankingCache.delete(oldestKey)\n  }\n\n  rankingCache.set(key, ranking)\n}\n\n/**\n * Compute total sensory dissonance for a chromatic interval.\n * Sums pairwise roughness across all harmonic partials of both tones.\n */\nexport function intervalDissonance(\n  baseFrequency: number,\n  semitones: number,\n  brightness: number,\n  numHarmonics: number\n): number {\n  const f1 = baseFrequency\n  const f2 = baseFrequency * Math.pow(2, semitones / 12)\n  const p1 = buildPartials(f1, brightness, numHarmonics)\n  const p2 = buildPartials(f2, brightness, numHarmonics)\n\n  let sum = 0\n  for (let i = 0; i < p1.length; i++) {\n    for (let j = 0; j < p2.length; j++) {\n      sum += pairDissonance(p1[i].frequency, p2[j].frequency, p1[i].amplitude, p2[j].amplitude)\n    }\n  }\n\n  return sum\n}\n\n/**\n * Rank the 12 chromatic intervals by dissonance for the given timbre.\n * Returns interval semitones ordered from most consonant to most dissonant.\n * Results are cached by quantized (baseFrequency, brightness, numHarmonics).\n */\nexport function rankChromaticIntervals(params: IntervalRankingParams): number[] {\n  const baseFrequency = params.baseFrequency ?? 220\n  if (params.performanceMode) return staticConsonanceRanking.slice()\n\n  const brightnessQ = quantize(clamp01(params.brightness), 0.001)\n  const harmonics = Math.min(MAX_HARMONICS, Math.max(1, Math.floor(params.numHarmonics)))\n  const baseQ = quantize(baseFrequency, 0.1)\n  const key = `${baseQ.toFixed(1)}:${brightnessQ.toFixed(3)}:${harmonics}`\n\n  const cached = rankingCache.get(key)\n  if (cached) return cached.slice()\n\n  const scored: Array<{ interval: number; dissonance: number }> = []\n  for (let semitones = 0; semitones < 12; semitones++) {\n    scored.push({\n      interval: semitones,\n      dissonance: intervalDissonance(baseFrequency, semitones, brightnessQ, harmonics),\n    })\n  }\n\n  scored.sort((a, b) => a.dissonance - b.dissonance)\n  const ranking = scored.map((s) => s.interval)\n  setRankingCache(key, ranking)\n  return ranking.slice()\n}\n\n/** Map a pleasantness value to a discrete interval (nearest semitone). */\nexport function mapPleasantnessToInterval(\n  params: IntervalRankingParams & { pleasantness: number }\n): number {\n  const pleasantness = clamp01(params.pleasantness)\n  const ranking = rankChromaticIntervals(params)\n  const index = Math.round((1 - pleasantness) * (ranking.length - 1))\n  return ranking[index]\n}\n\n/** Map a pleasantness value to a continuous interval (fractional semitones). */\nexport function mapPleasantnessToIntervalContinuous(\n  params: IntervalRankingParams & { pleasantness: number }\n): number {\n  const pleasantness = clamp01(params.pleasantness)\n  const ranking = rankChromaticIntervals(params)\n  const position = (1 - pleasantness) * (ranking.length - 1)\n  const index = Math.floor(position)\n  const t = position - index\n\n  if (index >= ranking.length - 1) return ranking[ranking.length - 1]\n\n  const a = ranking[index]\n  const b = ranking[index + 1]\n  return a + (b - a) * t\n}\n\n/** Clear the interval ranking cache. Intended for testing. */\nexport function clearIntervalRankingCache(): void {\n  rankingCache.clear()\n}\n\n/** Return the current size of the interval ranking cache. Intended for testing. */\nexport function getIntervalRankingCacheSize(): number {\n  return rankingCache.size\n}\n","/**\n * Lookahead audio task scheduler.\n *\n * Uses a polling loop to dispatch audio tasks slightly ahead of their\n * scheduled time, preventing Web Audio API timing jitter caused by\n * JavaScript event loop latency. Inspired by Chris Wilson's \"A Tale of\n * Two Clocks\" scheduling pattern.\n */\n\ntype ScheduledItem = {\n  time: number\n  id: number\n  run: () => void\n}\n\ntype SchedulerState = {\n  items: ScheduledItem[]\n  timer: ReturnType<typeof setTimeout> | null\n  microtaskScheduled: boolean\n  nextId: number\n  /** Polling interval for the scheduler pump (ms). */\n  lookaheadMs: number\n  /** How far ahead of the current time to dispatch queued tasks (seconds). */\n  scheduleAheadSeconds: number\n}\n\nconst schedulers = new WeakMap<AudioContext, SchedulerState>()\n\nfunction getState(ctx: AudioContext): SchedulerState {\n  const existing = schedulers.get(ctx)\n  if (existing) return existing\n\n  const created: SchedulerState = {\n    items: [],\n    timer: null,\n    microtaskScheduled: false,\n    nextId: 1,\n    lookaheadMs: 25,\n    scheduleAheadSeconds: 0.1,\n  }\n  schedulers.set(ctx, created)\n  return created\n}\n\n/**\n * Dispatch all queued items whose scheduled time falls within the\n * look-ahead horizon, then re-arm the timer if items remain.\n */\nfunction pump(ctx: AudioContext): void {\n  const state = getState(ctx)\n  state.timer = null\n  state.microtaskScheduled = false\n\n  const horizon = ctx.currentTime + state.scheduleAheadSeconds\n  while (state.items.length > 0 && state.items[0].time <= horizon) {\n    const item = state.items.shift()\n    if (!item) break\n    try {\n      item.run()\n    } catch (error) {\n      console.debug('Zusound: Scheduled audio task failed', error)\n    }\n  }\n\n  if (state.items.length > 0) {\n    state.timer = setTimeout(() => pump(ctx), state.lookaheadMs)\n  }\n}\n\n/**\n * Schedule an audio task to run at the given AudioContext time.\n * Returns an ID for the scheduled task, or -1 if the time is invalid.\n */\nexport function scheduleAudioTask(ctx: AudioContext, time: number, run: () => void): number {\n  if (!Number.isFinite(time) || time < 0) {\n    console.debug('Zusound: Ignoring invalid scheduled time', time)\n    return -1\n  }\n\n  const state = getState(ctx)\n  const id = state.nextId++\n\n  const item: ScheduledItem = { time, id, run }\n  const items = state.items\n  let inserted = false\n  for (let i = 0; i < items.length; i++) {\n    if (time < items[i].time) {\n      items.splice(i, 0, item)\n      inserted = true\n      break\n    }\n  }\n  if (!inserted) items.push(item)\n\n  if (!state.timer && !state.microtaskScheduled) {\n    state.microtaskScheduled = true\n    // Use queueMicrotask where available for prompt first dispatch;\n    // fall back to Promise.resolve() for older environments.\n    const enqueue =\n      typeof queueMicrotask === 'function'\n        ? queueMicrotask\n        : (fn: () => void) => Promise.resolve().then(fn)\n    enqueue(() => pump(ctx))\n  }\n\n  return id\n}\n\n/** Cancel all pending tasks and stop the scheduler for the given context. */\nexport function stopAudioScheduler(ctx: AudioContext): void {\n  const state = getState(ctx)\n  state.items = []\n  if (state.timer) {\n    clearTimeout(state.timer)\n    state.timer = null\n  }\n}\n","/**\n * Web Audio runtime.\n *\n * Lazy-initializes and reuses a single AudioContext, exposes `playSound()`\n * with ADSR envelope scheduling, and maps aesthetic controls into pitch,\n * interval, timbre, and timing. All playback failures are non-fatal.\n */\n\nimport type { AestheticParams, Change, SoundParams, ZusoundOptions } from './types'\nimport { MAX_HARMONICS } from './constants'\nimport { clamp01, lerp, midiToHz } from './math'\nimport { createTimbreWave } from './synthesis'\nimport { mapPleasantnessToIntervalContinuous } from './dissonance'\nimport { scheduleAudioTask, stopAudioScheduler } from './scheduler'\n\n/** Shared AudioContext instance, lazily created on first playback. */\nlet audioContext: AudioContext | null = null\n\n/** Reference count of active attachments (middleware + subscriber instances). */\nlet activeAttachmentCount = 0\n\n/** Increment the audio engine reference count. */\nexport function retainAudioEngine(): void {\n  activeAttachmentCount += 1\n}\n\n/** Decrement the reference count; close the AudioContext when it reaches zero. */\nexport function releaseAudioEngine(): void {\n  if (activeAttachmentCount > 0) {\n    activeAttachmentCount -= 1\n  }\n\n  if (activeAttachmentCount === 0) {\n    cleanupAudio()\n  }\n}\n\n/** Return the shared AudioContext, creating it lazily. Returns null in non-browser environments. */\nfunction getAudioContext(): AudioContext | null {\n  if (typeof window === 'undefined') return null\n\n  if (!audioContext) {\n    try {\n      const ctor =\n        window.AudioContext ||\n        (window as Window & { webkitAudioContext?: typeof AudioContext }).webkitAudioContext\n      if (!ctor) return null\n      audioContext = new ctor()\n    } catch (error) {\n      console.debug('Zusound: Failed to create AudioContext', error)\n      return null\n    }\n  }\n\n  return audioContext\n}\n\n/** Stop the scheduler, close the AudioContext, and reset the reference count. */\nexport function cleanupAudio(): void {\n  activeAttachmentCount = 0\n  if (audioContext) {\n    stopAudioScheduler(audioContext)\n    if (audioContext.state !== 'closed') {\n      audioContext.close()\n    }\n    audioContext = null\n  }\n}\n\ntype PlaySoundOptions = {\n  globalVolume?: number\n  aesthetics?: ZusoundOptions['aesthetics']\n  mapChangeToAesthetics?: ZusoundOptions['mapChangeToAesthetics']\n  soundMapping?: ZusoundOptions['soundMapping']\n  performanceMode?: boolean\n  onError?: ZusoundOptions['onError']\n  startOffset?: number\n  isPlaybackActive?: () => boolean\n}\n\n/**\n * Generate baseline aesthetic parameters from a state change.\n *\n * Maps value types to pitch ranges and timbres, operation types to\n * pleasantness/valence shifts, and applies an FNV-1a hash of the change\n * path for a stable pitch offset (same path always produces the same\n * relative pitch, making repeated updates on the same key recognizable).\n */\nfunction defaultAesthetics(change: Change): AestheticParams {\n  let baseMidi = 57\n  let brightness = 0.6\n  let pleasantness = 0.7\n  let arousal = 0.6\n  let valence = 0.6\n  let simultaneity = 1\n\n  switch (change.valueType) {\n    case 'boolean':\n      baseMidi = 64\n      brightness = 0.35\n      arousal = 0.8\n      break\n    case 'number':\n      baseMidi = 69\n      brightness = 0.55\n      break\n    case 'string':\n      baseMidi = 72\n      brightness = 0.85\n      valence = 0.7\n      break\n    case 'object':\n    case 'array':\n      baseMidi = 76\n      brightness = 0.65\n      simultaneity = 0.85\n      break\n  }\n\n  switch (change.operation) {\n    case 'add':\n      baseMidi += 3\n      pleasantness = 0.9\n      valence = 0.8\n      break\n    case 'remove':\n      baseMidi -= 3\n      pleasantness = 0.35\n      valence = 0.35\n      arousal = 0.7\n      break\n    case 'update':\n      break\n  }\n\n  // FNV-1a hash of the path string for a stable ±3 semitone pitch offset.\n  // This gives each state key a recognizable pitch identity.\n  const h = [...change.path].reduce((a, c) => ((a ^ c.charCodeAt(0)) * 16777619) >>> 0, 2166136261)\n  baseMidi += (h % 7) - 3\n\n  // Value-aware modulation: delta-driven pitch, arousal, and duration\n  let duration: number | undefined = undefined\n\n  if (change.valueType === 'number' && change.operation === 'update') {\n    const oldNum = typeof change.oldValue === 'number' ? change.oldValue : 0\n    const newNum = typeof change.newValue === 'number' ? change.newValue : 0\n    const delta = newNum - oldNum\n    const magnitude = clamp01(Math.abs(delta) / (Math.abs(oldNum) + 1))\n\n    baseMidi += delta > 0 ? magnitude * 4 : -magnitude * 4\n    arousal = lerp(0.4, 0.85, magnitude)\n    duration = lerp(0.1, 0.28, magnitude)\n  }\n\n  if (change.valueType === 'array' && change.operation === 'update') {\n    const oldLen = Array.isArray(change.oldValue) ? change.oldValue.length : 0\n    const newLen = Array.isArray(change.newValue) ? change.newValue.length : 0\n    const sizeRatio = clamp01(Math.abs(newLen - oldLen) / (oldLen + 1))\n\n    arousal = lerp(0.5, 0.85, sizeRatio)\n    duration = lerp(0.12, 0.22, sizeRatio)\n  }\n\n  if (change.valueType === 'boolean') {\n    const goingTrue = change.newValue === true\n    baseMidi += goingTrue ? 2 : -2\n    duration = 0.09\n  }\n\n  return {\n    pleasantness,\n    brightness,\n    arousal,\n    valence,\n    simultaneity,\n    baseMidi,\n    duration,\n  }\n}\n\n/**\n * Merge aesthetic overrides onto a base set, applying each in order.\n * Only defined numeric fields are overridden; [0, 1] fields are clamped.\n */\nfunction mergeAesthetics(\n  base: AestheticParams,\n  overrides: Array<Partial<AestheticParams> | undefined>\n): AestheticParams {\n  const merged: AestheticParams = { ...base }\n  for (const override of overrides) {\n    if (!override) continue\n    if (typeof override.pleasantness === 'number') merged.pleasantness = override.pleasantness\n    if (typeof override.brightness === 'number') merged.brightness = override.brightness\n    if (typeof override.arousal === 'number') merged.arousal = override.arousal\n    if (typeof override.valence === 'number') merged.valence = override.valence\n    if (typeof override.simultaneity === 'number') merged.simultaneity = override.simultaneity\n    if (typeof override.baseMidi === 'number') merged.baseMidi = override.baseMidi\n    if (typeof override.duration === 'number') merged.duration = override.duration\n  }\n\n  merged.pleasantness = clamp01(merged.pleasantness)\n  merged.brightness = clamp01(merged.brightness)\n  merged.arousal = clamp01(merged.arousal)\n  merged.valence = clamp01(merged.valence)\n  merged.simultaneity = clamp01(merged.simultaneity)\n\n  return merged\n}\n\n/**\n * Translate a `SoundParams` path override into aesthetic adjustments.\n * Waveform names are mapped to equivalent brightness and harmonic counts.\n * Duration is converted from milliseconds (SoundParams) to seconds.\n */\nfunction applySoundMapping(\n  aesthetics: AestheticParams,\n  mapping: Partial<SoundParams> | undefined\n): {\n  aesthetics: AestheticParams\n  baseFrequencyOverride?: number\n  numHarmonicsOverride?: number\n  durationOverride?: number\n  volumeMultiplier?: number\n} {\n  if (!mapping) return { aesthetics }\n\n  let numHarmonicsOverride: number | undefined\n  const next: AestheticParams = { ...aesthetics }\n\n  if (mapping.timbre) {\n    next.brightness = mapping.timbre.brightness\n    if (typeof mapping.timbre.numHarmonics === 'number')\n      numHarmonicsOverride = mapping.timbre.numHarmonics\n  } else if (mapping.waveform) {\n    switch (mapping.waveform) {\n      case 'sine':\n        numHarmonicsOverride = 1\n        break\n      case 'triangle':\n        next.brightness = 0.35\n        numHarmonicsOverride = 9\n        break\n      case 'square':\n        next.brightness = 0.5\n        numHarmonicsOverride = 11\n        break\n      case 'sawtooth':\n        next.brightness = 0.85\n        numHarmonicsOverride = 13\n        break\n    }\n  }\n\n  next.brightness = clamp01(next.brightness)\n\n  const durationOverride =\n    typeof mapping.duration === 'number' ? mapping.duration / 1000 : undefined\n  const volumeMultiplier =\n    typeof mapping.volume === 'number' && Number.isFinite(mapping.volume)\n      ? clamp01(mapping.volume)\n      : undefined\n\n  return {\n    aesthetics: next,\n    baseFrequencyOverride: typeof mapping.frequency === 'number' ? mapping.frequency : undefined,\n    numHarmonicsOverride,\n    durationOverride,\n    volumeMultiplier,\n  }\n}\n\n/**\n * Schedule an ADSR (Attack-Decay-Sustain-Release) gain envelope.\n * Arousal controls envelope speed; valence controls sustain level.\n */\nfunction scheduleAdsr(params: {\n  gain: AudioParam\n  now: number\n  durationSeconds: number\n  peak: number\n  arousal: number\n  valence: number\n}): void {\n  const attack = lerp(0.03, 0.005, params.arousal)\n  const decay = lerp(0.04, 0.01, params.arousal)\n  const release = lerp(0.06, 0.015, params.arousal)\n  const sustainLevel = lerp(0.35, 0.85, params.valence)\n\n  const sustainTime = Math.max(0, params.durationSeconds - attack - decay - release)\n  const t0 = params.now\n  const t1 = t0 + attack\n  const t2 = t1 + decay\n  const t3 = t2 + sustainTime\n  const t4 = t0 + params.durationSeconds\n\n  params.gain.setValueAtTime(0, t0)\n  params.gain.linearRampToValueAtTime(params.peak, t1)\n  params.gain.linearRampToValueAtTime(params.peak * sustainLevel, t2)\n  params.gain.setValueAtTime(params.peak * sustainLevel, t3)\n  params.gain.linearRampToValueAtTime(0, t4)\n}\n\n/**\n * Render a short audio cue for a state change.\n *\n * Builds aesthetic parameters from the change, applies user overrides\n * and sound-mapping, computes dissonance-ranked interval, then schedules\n * a two-oscillator dyad with ADSR envelope through the shared AudioContext.\n */\nexport async function playSound(change: Change, globalVolume: number): Promise<void>\nexport async function playSound(change: Change, options?: PlaySoundOptions): Promise<void>\nexport async function playSound(\n  change: Change,\n  volumeOrOptions: number | PlaySoundOptions = 0.3\n): Promise<void> {\n  const globalVolume =\n    typeof volumeOrOptions === 'number' ? volumeOrOptions : (volumeOrOptions.globalVolume ?? 0.3)\n  const options = typeof volumeOrOptions === 'number' ? undefined : volumeOrOptions\n\n  if (options?.isPlaybackActive && !options.isPlaybackActive()) return\n\n  const ctx = getAudioContext()\n  if (!ctx) return\n\n  // Resume context if needed (for autoplay policies)\n  if (ctx.state === 'suspended') {\n    try {\n      await ctx.resume()\n    } catch (error) {\n      options?.onError?.(error, { stage: 'audio-resume', change })\n      return\n    }\n  }\n\n  if (options?.isPlaybackActive && !options.isPlaybackActive()) return\n  if (ctx.state !== 'running') return\n\n  const base = defaultAesthetics(change)\n  const fromOptions = options?.aesthetics\n  const fromHook = options?.mapChangeToAesthetics?.(change) ?? undefined\n  const merged = mergeAesthetics(base, [fromOptions, fromHook])\n\n  const soundOverride = options?.soundMapping?.[change.path]\n  const mapped = applySoundMapping(merged, soundOverride)\n\n  const numHarmonics = Math.min(\n    MAX_HARMONICS,\n    Math.max(1, Math.floor(mapped.numHarmonicsOverride ?? 10))\n  )\n  const baseFrequency =\n    mapped.baseFrequencyOverride ?? midiToHz(mapped.aesthetics.baseMidi ?? base.baseMidi ?? 57)\n\n  const intervalSemitones = mapPleasantnessToIntervalContinuous({\n    pleasantness: mapped.aesthetics.pleasantness,\n    brightness: mapped.aesthetics.brightness,\n    numHarmonics,\n    baseFrequency,\n    performanceMode: options?.performanceMode,\n  })\n\n  const durationSeconds = Math.max(0.02, mapped.durationOverride ?? merged.duration ?? 0.15)\n  const offsetSeconds =\n    typeof volumeOrOptions === 'number' ? 0 : (volumeOrOptions?.startOffset ?? 0)\n  const startTime = ctx.currentTime + 0.01 + offsetSeconds\n  const spreadSeconds = (1 - mapped.aesthetics.simultaneity) * durationSeconds * 0.8\n\n  scheduleAudioTask(ctx, startTime, () => {\n    if (options?.isPlaybackActive && !options.isPlaybackActive()) return\n\n    const baseStart = Math.max(startTime, ctx.currentTime + 0.001)\n    const startA = baseStart\n    const startB = baseStart + Math.max(0, spreadSeconds)\n\n    const envelopeGain = ctx.createGain()\n    envelopeGain.connect(ctx.destination)\n\n    const peak = globalVolume * (mapped.volumeMultiplier ?? 1)\n\n    scheduleAdsr({\n      gain: envelopeGain.gain,\n      now: baseStart,\n      durationSeconds,\n      peak,\n      arousal: mapped.aesthetics.arousal,\n      valence: mapped.aesthetics.valence,\n    })\n\n    const oscA = ctx.createOscillator()\n    const oscB = ctx.createOscillator()\n    const gainA = ctx.createGain()\n    const gainB = ctx.createGain()\n\n    gainA.gain.setValueAtTime(0.5, baseStart)\n    gainB.gain.setValueAtTime(0.5, baseStart)\n\n    const wave = createTimbreWave(ctx, mapped.aesthetics.brightness, numHarmonics)\n    oscA.setPeriodicWave(wave)\n    oscB.setPeriodicWave(wave)\n\n    oscA.frequency.setValueAtTime(baseFrequency, baseStart)\n    oscB.frequency.setValueAtTime(baseFrequency * Math.pow(2, intervalSemitones / 12), baseStart)\n\n    oscA.connect(gainA)\n    oscB.connect(gainB)\n    gainA.connect(envelopeGain)\n    gainB.connect(envelopeGain)\n\n    const stopAt = baseStart + durationSeconds\n    oscA.start(startA)\n    oscB.start(startB)\n    oscA.stop(stopAt)\n    oscB.stop(stopAt)\n\n    let ended = 0\n    const safeDisconnect = (node: AudioNode) => {\n      try {\n        node.disconnect()\n      } catch {\n        // Disconnecting already-disconnected nodes is expected during cleanup\n      }\n    }\n\n    const cleanup = () => {\n      safeDisconnect(oscA)\n      safeDisconnect(oscB)\n      safeDisconnect(gainA)\n      safeDisconnect(gainB)\n      safeDisconnect(envelopeGain)\n    }\n\n    const onended = () => {\n      ended += 1\n      if (ended === 2) cleanup()\n    }\n\n    oscA.onended = onended\n    oscB.onended = onended\n  })\n}\n","/**\n * Runtime environment detection for safe defaults.\n *\n * Determines whether audio should be enabled by default using a\n * progressive detection strategy:\n * 1. NODE_ENV check (production -> off, development/test -> on)\n * 2. __DEV__ global flag (React Native convention)\n * 3. Hostname heuristics (localhost, 127.0.0.1, .local -> on)\n * 4. Unknown environment -> off (safe default)\n */\n\nfunction isLocalDevelopmentHost(hostname: string): boolean {\n  return (\n    hostname === 'localhost' ||\n    hostname === '127.0.0.1' ||\n    hostname === '::1' ||\n    hostname === '[::1]' ||\n    hostname.endsWith('.local')\n  )\n}\n\nfunction readNodeEnv(): string | undefined {\n  if (typeof process === 'undefined') return undefined\n  return process.env?.NODE_ENV\n}\n\n/** Resolve whether audio feedback should be enabled by default. */\nexport function resolveDefaultEnabled(): boolean {\n  const nodeEnv = readNodeEnv()\n  if (nodeEnv === 'production') return false\n  if (nodeEnv === 'development' || nodeEnv === 'test') return true\n\n  const maybeDev = (globalThis as { __DEV__?: unknown }).__DEV__\n  if (typeof maybeDev === 'boolean') return maybeDev\n\n  if (typeof window !== 'undefined') {\n    const hostname = window.location?.hostname\n    if (typeof hostname === 'string' && hostname.length > 0) {\n      return isLocalDevelopmentHost(hostname)\n    }\n  }\n\n  return false\n}\n","/**\n * Core orchestration.\n *\n * Exposes `createZusound()` for stateful middleware/subscriber usage and\n * `attachZusound()` for low-level adapter wiring. Handles debounce timing,\n * shared state-change emission, and audio engine retain/release lifecycle.\n */\n\nimport type {\n  Change,\n  ZusoundAdapter,\n  ZusoundHandle,\n  ZusoundInstance,\n  ZusoundOptions,\n} from './types'\nimport { MAX_STAGGER_SECONDS, STAGGER_SECONDS } from './constants'\nimport { detectChanges } from './differ'\nimport { playSound, releaseAudioEngine, retainAudioEngine } from './audio'\nimport { resolveDefaultEnabled } from './env'\nimport type { StateCreator } from 'zustand/vanilla'\n\ntype EmitChangesOptions = Pick<\n  ZusoundOptions,\n  'volume' | 'soundMapping' | 'aesthetics' | 'mapChangeToAesthetics' | 'performanceMode' | 'onError'\n> & {\n  isPlaybackActive?: () => boolean\n}\n\n/** Deduplicate pending changes by path, keeping only the latest per path. */\nfunction deduplicateByPath(changes: Change[]): Change[] {\n  const latestByPath = new Map<string, Change>()\n  for (let i = changes.length - 1; i >= 0; i--) {\n    const change = changes[i]\n    if (latestByPath.has(change.path)) continue\n    latestByPath.set(change.path, change)\n  }\n  return [...latestByPath.values()].reverse()\n}\n\n/** Play sounds for a batch of changes, staggering onset times. */\nfunction emitChanges(changes: Change[], options: EmitChangesOptions): void {\n  if (changes.length === 0) return\n\n  const {\n    volume = 0.3,\n    soundMapping,\n    aesthetics,\n    mapChangeToAesthetics,\n    performanceMode,\n    onError,\n    isPlaybackActive,\n  } = options\n\n  for (let i = 0; i < changes.length; i++) {\n    const change = changes[i]\n    playSound(change, {\n      globalVolume: volume,\n      soundMapping,\n      aesthetics,\n      mapChangeToAesthetics,\n      performanceMode,\n      onError,\n      startOffset: Math.min(i * STAGGER_SECONDS, MAX_STAGGER_SECONDS),\n      isPlaybackActive,\n    }).catch((error) => {\n      onError?.(error, { stage: 'playback', change })\n      console.debug('Zusound: Audio playback failed', error)\n    })\n  }\n}\n\n/** Type guard: returns true if the value looks like a ZusoundOptions object (or is undefined). */\nfunction isZusoundOptions(value: unknown): value is ZusoundOptions {\n  if (value === undefined) return true\n  if (value === null || typeof value !== 'object' || Array.isArray(value)) return false\n\n  const optionKeys: ReadonlySet<string> = new Set([\n    'enabled',\n    'volume',\n    'debounceMs',\n    'soundMapping',\n    'aesthetics',\n    'mapChangeToAesthetics',\n    'performanceMode',\n    'onError',\n  ])\n\n  const keys = Object.keys(value as Record<string, unknown>)\n  return keys.every((key) => optionKeys.has(key))\n}\n\n/** Merge base and per-call options, resolving `enabled` from the environment if unset. */\nfunction mergeOptions(\n  baseOptions: ZusoundOptions,\n  overrideOptions?: ZusoundOptions\n): ZusoundOptions {\n  return {\n    ...baseOptions,\n    ...overrideOptions,\n    enabled: overrideOptions?.enabled ?? baseOptions.enabled ?? resolveDefaultEnabled(),\n  }\n}\n\n/**\n * Discriminate between middleware mode `(initializer, options?)` and\n * subscriber mode `(currentState, prevState)` based on argument types.\n */\nfunction isMiddlewareCall<T extends object>(\n  arg1: unknown,\n  arg2: unknown,\n  argCount: number\n): arg1 is StateCreator<T, [], []> {\n  if (typeof arg1 !== 'function') return false\n  if (argCount === 1) return true\n  if (arg2 === undefined) return true\n  return isZusoundOptions(arg2)\n}\n\n/**\n * Wire audio feedback to a store adapter.\n *\n * Subscribes to state changes, runs the differ, and emits sounds.\n * Returns a handle whose `cleanup()` unsubscribes and releases audio resources.\n */\nexport function attachZusound<TState>(\n  adapter: ZusoundAdapter<TState>,\n  options: ZusoundOptions = {}\n): ZusoundHandle {\n  const {\n    enabled = resolveDefaultEnabled(),\n    volume = 0.3,\n    debounceMs = 0,\n    soundMapping,\n    aesthetics,\n    mapChangeToAesthetics,\n    performanceMode,\n    onError,\n  } = options\n\n  const cleanup = () => {}\n\n  if (!enabled) {\n    adapter.attachCleanup?.(cleanup)\n    return { cleanup }\n  }\n\n  retainAudioEngine()\n\n  let debounceTimer: ReturnType<typeof setTimeout> | null = null\n  let pendingChanges: Change[] = []\n  let cleanedUp = false\n\n  let unsubscribe: ZusoundHandle['cleanup']\n  try {\n    unsubscribe = adapter.subscribe((currentState, prevState) => {\n      if (cleanedUp) return\n\n      try {\n        const changes = detectChanges(currentState, prevState)\n\n        if (debounceMs > 0) {\n          pendingChanges.push(...changes)\n\n          if (debounceTimer) clearTimeout(debounceTimer)\n          debounceTimer = setTimeout(() => {\n            if (cleanedUp) return\n            const flushed = deduplicateByPath(pendingChanges)\n            pendingChanges = []\n            debounceTimer = null\n            emitChanges(flushed, {\n              volume,\n              soundMapping,\n              aesthetics,\n              mapChangeToAesthetics,\n              performanceMode,\n              onError,\n              isPlaybackActive: () => !cleanedUp,\n            })\n          }, debounceMs)\n        } else {\n          emitChanges(changes, {\n            volume,\n            soundMapping,\n            aesthetics,\n            mapChangeToAesthetics,\n            performanceMode,\n            onError,\n            isPlaybackActive: () => !cleanedUp,\n          })\n        }\n      } catch (error) {\n        onError?.(error, { stage: 'state-change-processing' })\n        console.warn('Zusound: Error processing state change', error)\n      }\n    })\n  } catch (error) {\n    releaseAudioEngine()\n    onError?.(error, { stage: 'state-change-processing' })\n    console.warn('Zusound: Failed to attach subscription', error)\n    adapter.attachCleanup?.(cleanup)\n    return { cleanup }\n  }\n\n  const cleanupWithAudio = () => {\n    if (cleanedUp) return\n    cleanedUp = true\n\n    if (debounceTimer) {\n      clearTimeout(debounceTimer)\n      debounceTimer = null\n    }\n    pendingChanges = []\n    try {\n      unsubscribe()\n    } finally {\n      releaseAudioEngine()\n    }\n  }\n\n  adapter.attachCleanup?.(cleanupWithAudio)\n\n  return { cleanup: cleanupWithAudio }\n}\n\n/**\n * Create a stateful zusound instance that works in both middleware and subscriber mode.\n *\n * **Middleware mode**: `create(instance(initializer, options))`\n * **Subscriber mode**: `store.subscribe(instance)`\n *\n * Call `instance.cleanup()` to release audio resources.\n */\nexport function createZusound(baseOptions: ZusoundOptions = {}): ZusoundInstance {\n  let debounceTimer: ReturnType<typeof setTimeout> | null = null\n  let pendingChanges: Change[] = []\n  let cleanedUp = false\n  let retainedSubscriberAudio = false\n\n  const cleanup = () => {\n    if (cleanedUp) return\n    cleanedUp = true\n\n    if (debounceTimer) {\n      clearTimeout(debounceTimer)\n      debounceTimer = null\n    }\n    pendingChanges = []\n\n    if (retainedSubscriberAudio) {\n      releaseAudioEngine()\n      retainedSubscriberAudio = false\n    }\n  }\n\n  function instance<T extends object>(\n    initializer: StateCreator<T, [], []>,\n    options?: ZusoundOptions\n  ): StateCreator<T, [], []>\n  function instance<T extends object>(currentState: T, prevState: T): void\n  function instance<T extends object>(\n    ...args: [StateCreator<T, [], []>, ZusoundOptions?] | [T, T]\n  ): StateCreator<T, [], []> | undefined {\n    const arg1 = args[0]\n    const arg2 = args[1]\n\n    if (isMiddlewareCall<T>(arg1, arg2, args.length)) {\n      const initializer = arg1\n      const options = mergeOptions(baseOptions, arg2 as ZusoundOptions | undefined)\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      return (...storeArgs: any[]) => {\n        const [, get, api] = storeArgs\n        const handle = attachZusound(\n          {\n            getState: get,\n            subscribe: api.subscribe,\n            attachCleanup: (attachedCleanup) => {\n              Reflect.set(api, 'zusoundCleanup', attachedCleanup)\n            },\n          },\n          options\n        )\n\n        try {\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          return (initializer as any)(...storeArgs)\n        } catch (error) {\n          handle.cleanup()\n          throw error\n        }\n      }\n    }\n\n    const currentState = arg1 as T\n    const prevState = arg2 as T\n    const options = mergeOptions(baseOptions)\n\n    if (cleanedUp || !options.enabled) return\n\n    if (!retainedSubscriberAudio) {\n      retainAudioEngine()\n      retainedSubscriberAudio = true\n    }\n\n    try {\n      const changes = detectChanges(currentState, prevState)\n\n      if ((options.debounceMs ?? 0) > 0) {\n        pendingChanges.push(...changes)\n\n        if (debounceTimer) clearTimeout(debounceTimer)\n        debounceTimer = setTimeout(() => {\n          if (cleanedUp) return\n          const flushed = deduplicateByPath(pendingChanges)\n          pendingChanges = []\n          debounceTimer = null\n          emitChanges(flushed, {\n            ...options,\n            isPlaybackActive: () => !cleanedUp,\n          })\n        }, options.debounceMs)\n      } else {\n        emitChanges(changes, {\n          ...options,\n          isPlaybackActive: () => !cleanedUp,\n        })\n      }\n    } catch (error) {\n      options.onError?.(error, { stage: 'state-change-processing' })\n      console.warn('Zusound: Error processing state change', error)\n    }\n\n    return undefined\n  }\n\n  instance.cleanup = cleanup\n\n  return instance\n}\n","import { createZusound } from './adapter'\nexport const zusound = createZusound()\n\nexport default zusound\n","/**\n * Build-time version injection.\n *\n * `__ZUSOUND_VERSION__` is replaced by tsup's `define` config during build\n * with the package.json version string. In development (unbundled), falls\n * back to '0.0.0-dev'.\n */\n\ndeclare const __ZUSOUND_VERSION__: string | undefined\n\nconst fallbackVersion = '0.0.0-dev'\n\nexport const version: string =\n  typeof __ZUSOUND_VERSION__ === 'string' && __ZUSOUND_VERSION__.length > 0\n    ? __ZUSOUND_VERSION__\n    : fallbackVersion\n"]}