@xstate-devtools/adapter 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/logging.ts","../src/sanitize.ts","../src/serialize.ts","../src/core.ts"],"sourcesContent":["// Browser entrypoint — uses window.postMessage via the extension's injected bridge.\nimport type {\n ExtensionToPageMessage,\n PageToExtensionMessage,\n} from '../../extension/src/shared/types.js'\nimport { createInspector, type InspectorOptions, type Transport } from './core.js'\nimport { debugLog, infoLog, warnLog } from './logging.js'\n\ndeclare global {\n interface Window {\n __XSTATE_DEVTOOLS__?: {\n send: (message: unknown) => void\n }\n }\n}\n\nexport function createAdapter(options: InspectorOptions = {}) {\n if (typeof window === 'undefined') {\n // Non-browser env (SSR/SSG/server) — return a no-op so importing this module is safe.\n infoLog('web:adapter', 'createAdapter called without window; returning no-op adapter')\n return { inspect: () => {}, dispose: () => {} }\n }\n\n infoLog('web:adapter', 'creating browser adapter', {\n hookInstalled: Boolean(window.__XSTATE_DEVTOOLS__),\n })\n\n let warnedMissingHook = false\n\n const transport: Transport = {\n send(message: PageToExtensionMessage) {\n const payload = { ...message, __xstateDevtools: true as const }\n debugLog('web:adapter', 'sending message via page hook', {\n type: message.type,\n sessionId: 'sessionId' in message ? message.sessionId : undefined,\n })\n if (window.__XSTATE_DEVTOOLS__) {\n window.__XSTATE_DEVTOOLS__.send(payload)\n return\n }\n\n if (!warnedMissingHook) {\n warnedMissingHook = true\n warnLog('web:adapter', 'page hook missing; using direct window.postMessage fallback')\n }\n // Fallback keeps inspection working if MAIN-world injection is unavailable.\n window.postMessage(payload, '*')\n },\n subscribe(handler) {\n infoLog('web:adapter', 'subscribing to window messages')\n const onMessage = (evt: MessageEvent) => {\n if (evt.source !== window) return\n const data = evt.data\n if (!data?.__xstateDevtools) return\n debugLog('web:adapter', 'received message from window bridge', {\n type: (data as ExtensionToPageMessage).type,\n sessionId:\n 'sessionId' in (data as ExtensionToPageMessage)\n ? (data as ExtensionToPageMessage & { sessionId?: string }).sessionId\n : undefined,\n })\n handler(data as ExtensionToPageMessage)\n }\n window.addEventListener('message', onMessage)\n return () => {\n infoLog('web:adapter', 'unsubscribing from window messages')\n window.removeEventListener('message', onMessage)\n }\n },\n }\n\n return createInspector(transport, 'web', options)\n}\n","type LogLevel = 'debug' | 'info' | 'warn'\n\ndeclare global {\n var __XSTATE_DEVTOOLS_LOGGING__: boolean | undefined\n}\n\nfunction hasProcessEnv() {\n return typeof process !== 'undefined' && typeof process.env !== 'undefined'\n}\n\nexport function isLoggingEnabled() {\n if (globalThis.__XSTATE_DEVTOOLS_LOGGING__ === true) return true\n if (!hasProcessEnv()) return false\n\n const value = process.env.XSTATE_DEVTOOLS_LOGGING\n return value === '1' || value === 'true'\n}\n\nfunction log(level: LogLevel, scope: string, message: string, details?: unknown) {\n if (!isLoggingEnabled()) return\n\n if (details === undefined) {\n console[level](`[xstate-devtools:${scope}] ${message}`)\n return\n }\n\n console[level](`[xstate-devtools:${scope}] ${message}`, details)\n}\n\nexport function debugLog(scope: string, message: string, details?: unknown) {\n log('debug', scope, message, details)\n}\n\nexport function infoLog(scope: string, message: string, details?: unknown) {\n log('info', scope, message, details)\n}\n\nexport function warnLog(scope: string, message: string, details?: unknown) {\n log('warn', scope, message, details)\n}\n","// packages/adapter/src/sanitize.ts\n\nconst MAX_DEPTH = 10\nconst MAX_STRING_LENGTH = 500\nconst MAX_ARRAY_LENGTH = 100\n\nfunction sanitizeValue(value: unknown, depth: number, seen: WeakSet<object>): unknown {\n if (depth > MAX_DEPTH) return '[MaxDepth]'\n if (value === null || value === undefined) return value\n if (typeof value === 'boolean' || typeof value === 'number') return value\n if (typeof value === 'string') {\n return value.length > MAX_STRING_LENGTH ? `${value.slice(0, MAX_STRING_LENGTH)}…` : value\n }\n if (typeof value === 'function') return `[Function: ${value.name || '(anonymous)'}]`\n if (typeof value === 'symbol') return `[Symbol: ${value.description ?? ''}]`\n if (typeof value === 'bigint') return `[BigInt: ${value}]`\n if (value instanceof Error) return { __type: 'Error', name: value.name, message: value.message }\n if (value instanceof Date) return { __type: 'Date', iso: value.toISOString() }\n if (value instanceof RegExp) return { __type: 'RegExp', source: value.source, flags: value.flags }\n if (typeof value === 'object') {\n if (seen.has(value)) return '[Circular]'\n seen.add(value)\n }\n if (value instanceof Map) {\n const entries: [unknown, unknown][] = []\n for (const [k, v] of value as Map<unknown, unknown>) {\n if (entries.length >= MAX_ARRAY_LENGTH) break\n entries.push([sanitizeValue(k, depth + 1, seen), sanitizeValue(v, depth + 1, seen)])\n }\n return { __type: 'Map', entries }\n }\n if (value instanceof Set) {\n const values: unknown[] = []\n for (const v of value as Set<unknown>) {\n if (values.length >= MAX_ARRAY_LENGTH) break\n values.push(sanitizeValue(v, depth + 1, seen))\n }\n return { __type: 'Set', values }\n }\n if (value instanceof Promise) return '[Promise]'\n if (value instanceof WeakMap || value instanceof WeakSet) return '[WeakCollection]'\n if (ArrayBuffer.isView(value)) return `[TypedArray: ${(value as any).constructor.name}]`\n // Detect DOM nodes (works in browser and is safe to check)\n if (typeof Node !== 'undefined' && value instanceof Node) {\n return `[DOMNode: ${(value as Element).tagName ?? value.nodeName}]`\n }\n if (Array.isArray(value)) {\n const sliced = value.slice(0, MAX_ARRAY_LENGTH)\n const result = sliced.map((v) => sanitizeValue(v, depth + 1, seen))\n if (value.length > MAX_ARRAY_LENGTH) result.push(`[…${value.length - MAX_ARRAY_LENGTH} more]`)\n return result\n }\n if (typeof value === 'object') {\n const result: Record<string, unknown> = {}\n let count = 0\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (count++ >= MAX_ARRAY_LENGTH) {\n result['…'] = '[truncated]'\n break\n }\n result[k] = sanitizeValue(v, depth + 1, seen)\n }\n return result\n }\n return String(value)\n}\n\nexport function sanitize(value: unknown, depth = 0): unknown {\n return sanitizeValue(value, depth, new WeakSet<object>())\n}\n","// packages/adapter/src/serialize.ts\nimport type { AnyStateMachine } from 'xstate'\nimport type {\n SerializedInvoke,\n SerializedMachine,\n SerializedStateNode,\n SerializedTransition,\n} from '../../extension/src/shared/types.js'\n\nconst MAX_SERIALIZED_NODES = 500\nconst MAX_TRANSITIONS_PER_NODE = 100\nconst MAX_CHILD_STATES = 100\nconst MAX_ACTIONS_PER_TRANSITION = 20\nconst MAX_ENTRY_EXIT_ACTIONS = 20\nconst MAX_INVOKES_PER_NODE = 20\n\nfunction serializeGuard(guard: unknown): string | undefined {\n if (!guard) return undefined\n if (typeof guard === 'string') return guard\n if (typeof guard === 'function') return (guard as Function).name || '(inline)'\n if (typeof guard === 'object' && guard !== null) {\n const g = guard as any\n return g.type ?? g.name ?? '(inline)'\n }\n return '(inline)'\n}\n\nfunction serializeAction(action: unknown): string {\n if (typeof action === 'string') return action\n if (typeof action === 'function') return (action as Function).name || '(anonymous)'\n if (typeof action === 'object' && action !== null) {\n const a = action as any\n return a.type ?? a.name ?? String(action)\n }\n return String(action)\n}\n\nfunction serializeTransitionList(transitions: any[]): SerializedTransition[] {\n return transitions.slice(0, MAX_TRANSITIONS_PER_NODE).map((t: any) => ({\n eventType: t.eventType ?? '',\n targets: (t.target ?? []).map((n: any) => n?.id ?? String(n)).filter(Boolean),\n guard: serializeGuard(t.guard),\n actions: (t.actions ?? [])\n .slice(0, MAX_ACTIONS_PER_TRANSITION)\n .map(serializeAction)\n .filter(Boolean),\n }))\n}\n\nfunction serializeInvokes(node: any): SerializedInvoke[] {\n return (node.invoke as any[]).slice(0, MAX_INVOKES_PER_NODE).map((inv: any) => ({\n id: inv.id ?? '(unknown)',\n src: typeof inv.src === 'string' ? inv.src : (inv.src?.id ?? inv.src?.name ?? '(inline)'),\n }))\n}\n\ninterface SerializeState {\n seen: WeakSet<object>\n count: number\n}\n\nfunction serializeNode(node: any, state: SerializeState): SerializedStateNode {\n if (!node || typeof node !== 'object') {\n return {\n id: '(unknown)',\n key: '(unknown)',\n type: 'atomic',\n states: {},\n on: [],\n always: [],\n entry: [],\n exit: [],\n invoke: [],\n }\n }\n\n if (state.count >= MAX_SERIALIZED_NODES) {\n return {\n id: node.id ?? '(truncated)',\n key: node.key ?? '(truncated)',\n type: node.type ?? 'atomic',\n states: {},\n on: [],\n always: [],\n entry: [],\n exit: [],\n invoke: [],\n }\n }\n\n if (state.seen.has(node)) {\n return {\n id: node.id ?? '(circular)',\n key: node.key ?? '(circular)',\n type: node.type ?? 'atomic',\n states: {},\n on: [],\n always: [],\n entry: [],\n exit: [],\n invoke: [],\n }\n }\n\n state.seen.add(node)\n state.count += 1\n\n const allTransitions: SerializedTransition[] = []\n if (node.transitions instanceof Map) {\n for (const [, tList] of node.transitions) {\n if (allTransitions.length >= MAX_TRANSITIONS_PER_NODE) break\n allTransitions.push(...serializeTransitionList(tList))\n if (allTransitions.length >= MAX_TRANSITIONS_PER_NODE) {\n allTransitions.length = MAX_TRANSITIONS_PER_NODE\n break\n }\n }\n }\n\n const always = Array.isArray(node.always) ? serializeTransitionList(node.always) : []\n const childEntries = Object.entries(node.states ?? {}).slice(0, MAX_CHILD_STATES)\n\n return {\n id: node.id,\n key: node.key,\n type: node.type,\n initial: node.initial?.target?.[0]?.key,\n states: Object.fromEntries(childEntries.map(([k, v]) => [k, serializeNode(v, state)])),\n on: allTransitions,\n always,\n entry: (node.entry ?? []).slice(0, MAX_ENTRY_EXIT_ACTIONS).map(serializeAction).filter(Boolean),\n exit: (node.exit ?? []).slice(0, MAX_ENTRY_EXIT_ACTIONS).map(serializeAction).filter(Boolean),\n invoke: serializeInvokes(node),\n sourceLocation: node.config?.__xstateDevtoolsSource ?? undefined,\n description: node.config?.description ?? undefined,\n }\n}\n\nexport function serializeMachine(\n machine: AnyStateMachine,\n sourceLocation?: string,\n): SerializedMachine {\n return {\n id: machine.id,\n root: serializeNode(machine.root, { seen: new WeakSet<object>(), count: 0 }),\n sourceLocation,\n }\n}\n","// Transport-agnostic XState inspection core.\n// Browser and server entrypoints supply their own transports.\nimport type { AnyActorRef } from 'xstate'\nimport type {\n ExtensionToPageMessage,\n PageToExtensionMessage,\n SerializedEvent,\n SerializedMachine,\n SerializedSnapshot,\n} from '../../extension/src/shared/types.js'\nimport {\n debugLog as baseDebugLog,\n infoLog as baseInfoLog,\n warnLog as baseWarnLog,\n} from './logging.js'\nimport { sanitize } from './sanitize.js'\nimport { serializeMachine } from './serialize.js'\n\nexport type Source = 'web' | 'srv'\n\nexport interface InspectorOptions {\n /**\n * Absolute filesystem root for the web app. When provided, web stack frames\n * like http://localhost:5173/app/... are remapped to <webSourceRoot>/app/...\n * so VS Code source links can open local files.\n */\n webSourceRoot?: string\n}\n\nexport interface Transport {\n /** Send a protocol message outbound (toward the panel). */\n send: (message: PageToExtensionMessage) => void\n /** Subscribe to inbound dispatch messages from the panel. Returns a teardown. */\n subscribe: (handler: (message: ExtensionToPageMessage) => void) => () => void\n}\n\ntype StateValue = string | { [key: string]: StateValue }\n\ninterface StateNodeLike {\n id: string\n key: string\n type: 'atomic' | 'compound' | 'parallel' | 'final' | 'history' | string\n parent?: StateNodeLike\n states?: Record<string, StateNodeLike>\n initial?: string | { target?: StateNodeLike[] }\n}\n\ninterface MachineLike {\n root: StateNodeLike\n getStateNodeById: (id: string) => StateNodeLike\n resolveState: (snapshot: {\n value: unknown\n context?: unknown\n status?: string\n output?: unknown\n error?: unknown\n historyValue?: unknown\n }) => unknown\n}\n\ninterface MutableActorRef extends AnyActorRef {\n logic?: MachineLike\n update?: (snapshot: unknown, event: { type: string; stateNodeId: string }) => void\n}\n\nfunction summarizeMessage(message: ExtensionToPageMessage | PageToExtensionMessage) {\n const summary: Record<string, unknown> = { type: message.type }\n if ('sessionId' in message) summary.sessionId = message.sessionId\n if ('stateNodeId' in message) summary.stateNodeId = message.stateNodeId\n if ('parentSessionId' in message && message.parentSessionId) {\n summary.parentSessionId = message.parentSessionId\n }\n if ('globalSeq' in message) summary.globalSeq = message.globalSeq\n if ('timestamp' in message) summary.timestamp = message.timestamp\n if (\n 'event' in message &&\n message.event &&\n typeof message.event === 'object' &&\n 'type' in message.event\n ) {\n summary.eventType = message.event.type\n }\n return summary\n}\n\nfunction summarizeInspectionEvent(event: any) {\n return {\n type: event?.type,\n sessionId: event?.actorRef?.sessionId,\n eventType:\n event?.type === '@xstate.event' && event?.event && typeof event.event === 'object'\n ? event.event.type\n : undefined,\n }\n}\n\nfunction debugLog(source: Source, message: string, details?: unknown) {\n baseDebugLog(`${source}:adapter`, message, details)\n}\n\nfunction infoLog(source: Source, message: string, details?: unknown) {\n baseInfoLog(`${source}:adapter`, message, details)\n}\n\nfunction warnLog(source: Source, message: string, details?: unknown) {\n baseWarnLog(`${source}:adapter`, message, details)\n}\n\nfunction isLibraryStackFrame(line: string): boolean {\n const normalized = line.replace(/\\\\/g, '/').toLowerCase()\n return (\n normalized.includes('/node_modules/xstate/') ||\n normalized.includes('/node_modules/@xstate/') ||\n normalized.includes('/@xstate-devtools/adapter/') ||\n normalized.includes('/packages/adapter/')\n )\n}\n\nfunction normalizeStackFrame(line: string): string {\n return line.trim().replace(/^at\\s+/, '')\n}\n\nfunction extractStackFrameLocation(frame: string): string {\n return frame.match(/\\((.*)\\)$/)?.[1] ?? frame\n}\n\nfunction isAnonymousOrEvalLocation(location: string): boolean {\n const normalized = location\n .trim()\n .toLowerCase()\n .replace(/^[./\\\\]+/, '')\n\n return (\n normalized === '<anonymous>' ||\n normalized === 'anonymous' ||\n normalized === '(anonymous)' ||\n normalized === 'eval' ||\n normalized === '<eval>' ||\n normalized === '[native code]'\n )\n}\n\nfunction hasFilesystemBackedPath(location: string): boolean {\n const trimmed = location.trim()\n if (!trimmed) return false\n\n const match = trimmed.match(/^(.*?)(?::\\d+)?(?::\\d+)?$/)\n const rawPath = (match?.[1] ?? trimmed).trim()\n if (!rawPath || isAnonymousOrEvalLocation(rawPath)) return false\n\n if (/^[a-zA-Z]:[\\\\/]/.test(rawPath)) return true\n if (rawPath.startsWith('/') || rawPath.startsWith('./') || rawPath.startsWith('../')) return true\n\n if (/^[a-zA-Z][a-zA-Z\\d+.-]*:\\/\\//.test(rawPath)) {\n try {\n const url = new URL(rawPath)\n if (url.protocol === 'file:') return true\n return url.pathname.startsWith('/@fs/')\n } catch {\n return false\n }\n }\n\n return false\n}\n\nfunction remapWebUrlLocationToFsPath(\n location: string,\n source: Source,\n options?: InspectorOptions,\n): string {\n if (source !== 'web' || !options?.webSourceRoot) return location\n\n const match = location.trim().match(/^(.*?)(?::(\\d+))?(?::(\\d+))?$/)\n if (!match) return location\n\n const [, rawPath, line, column] = match\n if (!rawPath || !/^https?:\\/\\//.test(rawPath)) return location\n\n try {\n const url = new URL(rawPath)\n const pathname = decodeURIComponent(url.pathname)\n if (!pathname.startsWith('/app/')) return location\n\n const root = options.webSourceRoot.replace(/\\/+$/, '')\n const filePath = `${root}${pathname}`\n const suffix = line ? `:${line}${column ? `:${column}` : ''}` : ''\n return `${filePath}${suffix}`\n } catch {\n return location\n }\n}\n\nexport function getSourceLocationFromStack(\n stack?: string,\n source: Source = 'web',\n options?: InspectorOptions,\n): string | undefined {\n const lines = stack?.split('\\n') ?? []\n\n for (let i = 0; i < lines.length; i += 1) {\n if (i <= 2) continue\n\n const line = lines[i]\n if (isLibraryStackFrame(line)) continue\n\n const normalizedFrame = normalizeStackFrame(line)\n const location = remapWebUrlLocationToFsPath(\n extractStackFrameLocation(normalizedFrame),\n source,\n options,\n )\n\n if (!hasFilesystemBackedPath(location)) continue\n\n const wrapped = normalizedFrame.match(/\\((.*)\\)$/)\n if (wrapped) {\n return normalizedFrame.replace(wrapped[1], location)\n }\n\n return location\n }\n\n return undefined\n}\n\nfunction getSourceLocation(source: Source, options?: InspectorOptions): string | undefined {\n try {\n const oldLimit = Error.stackTraceLimit\n Error.stackTraceLimit = 50\n const stack = new Error().stack\n Error.stackTraceLimit = oldLimit\n return getSourceLocationFromStack(stack, source, options)\n } catch {\n return undefined\n }\n}\n\nfunction serializeSnapshot(snapshot: any): SerializedSnapshot {\n return {\n value: snapshot?.value ?? null,\n context: sanitize(snapshot?.context),\n status: snapshot?.status ?? 'active',\n error: snapshot?.error ? sanitize(snapshot.error) : undefined,\n }\n}\n\nfunction safeSerializeSnapshot(actorRef: AnyActorRef): SerializedSnapshot {\n try {\n return serializeSnapshot(actorRef.getSnapshot())\n } catch {\n return { value: null, context: undefined, status: 'active' }\n }\n}\n\nfunction getActorDisplayName(actorRef: AnyActorRef): string | undefined {\n const actor = actorRef as {\n logic?: { id?: string; src?: unknown; name?: string } | undefined\n src?: unknown\n }\n\n const src = actor.src ?? actor.logic?.src\n if (typeof src === 'string' && src.length > 0) return src\n if (typeof actor.logic?.id === 'string' && actor.logic.id.length > 0) return actor.logic.id\n if (typeof actor.logic?.name === 'string' && actor.logic.name.length > 0) return actor.logic.name\n if (src && typeof src === 'object') {\n const namedSrc = src as { id?: string; name?: string }\n if (typeof namedSrc.id === 'string' && namedSrc.id.length > 0) return namedSrc.id\n if (typeof namedSrc.name === 'string' && namedSrc.name.length > 0) return namedSrc.name\n }\n return undefined\n}\n\nfunction getNodeInitialChild(node: StateNodeLike): StateNodeLike | null {\n if (!node.states) return null\n if (typeof node.initial === 'string') {\n return node.states[node.initial] ?? null\n }\n\n const target = Array.isArray(node.initial?.target) ? node.initial.target[0] : null\n return target ?? null\n}\n\nfunction encodeChildValue(child: StateNodeLike, childValue: StateValue): StateValue {\n if (child.type === 'atomic' || child.type === 'final' || child.type === 'history') {\n return child.key\n }\n\n return { [child.key]: childValue }\n}\n\nfunction getDefaultStateValue(node: StateNodeLike): StateValue {\n if (node.type === 'parallel') {\n const value: Record<string, StateValue> = {}\n for (const child of Object.values(node.states ?? {})) {\n value[child.key] = getDefaultSelectionValue(child)\n }\n return value\n }\n\n const initialChild = getNodeInitialChild(node)\n if (!initialChild) return {}\n return encodeChildValue(initialChild, getDefaultStateValue(initialChild))\n}\n\nfunction getDefaultSelectionValue(node: StateNodeLike): StateValue {\n if (node.type === 'atomic' || node.type === 'final' || node.type === 'history') {\n return node.key\n }\n\n return getDefaultStateValue(node)\n}\n\nfunction getExistingChildValue(value: unknown, childKey: string): StateValue | undefined {\n if (!value || typeof value !== 'object') return undefined\n return (value as Record<string, StateValue>)[childKey]\n}\n\nfunction getPathToRoot(target: StateNodeLike, root: StateNodeLike): StateNodeLike[] {\n const path: StateNodeLike[] = []\n let current: StateNodeLike | undefined = target\n\n while (current) {\n path.unshift(current)\n if (current.id === root.id) return path\n current = current.parent\n }\n\n throw new Error(`State node '${target.id}' is not part of machine '${root.id}'`)\n}\n\nfunction buildTargetStateValue(\n node: StateNodeLike,\n path: StateNodeLike[],\n currentValue: unknown,\n): StateValue {\n const [, ...restPath] = path\n\n if (restPath.length === 0) {\n if (node.type === 'parallel') {\n const next: Record<string, StateValue> = {}\n for (const child of Object.values(node.states ?? {})) {\n next[child.key] =\n getExistingChildValue(currentValue, child.key) ?? getDefaultSelectionValue(child)\n }\n return next\n }\n\n if (node.type === 'compound') {\n return getDefaultStateValue(node)\n }\n\n return node.key\n }\n\n const child = restPath[0]\n if (node.type === 'parallel') {\n const next: Record<string, StateValue> = {}\n for (const sibling of Object.values(node.states ?? {})) {\n if (sibling.key === child.key) {\n next[sibling.key] = buildTargetStateValue(\n sibling,\n restPath,\n getExistingChildValue(currentValue, sibling.key),\n )\n } else {\n next[sibling.key] =\n getExistingChildValue(currentValue, sibling.key) ?? getDefaultSelectionValue(sibling)\n }\n }\n return next\n }\n\n const childValue = buildTargetStateValue(\n child,\n restPath,\n getExistingChildValue(currentValue, child.key),\n )\n return encodeChildValue(child, childValue)\n}\n\nfunction setActiveState(actorRef: AnyActorRef, stateNodeId: string): void {\n const mutableActorRef = actorRef as MutableActorRef\n const machine = mutableActorRef.logic\n if (\n !machine?.getStateNodeById ||\n !machine.resolveState ||\n typeof mutableActorRef.update !== 'function'\n ) {\n throw new Error('Actor does not expose machine state mutation internals')\n }\n\n const currentSnapshot = actorRef.getSnapshot() as {\n value: unknown\n context?: unknown\n status?: string\n output?: unknown\n error?: unknown\n historyValue?: unknown\n }\n const targetNode = machine.getStateNodeById(stateNodeId)\n const path = getPathToRoot(targetNode, machine.root)\n const targetValue = buildTargetStateValue(machine.root, path, currentSnapshot?.value)\n\n const nextSnapshot = machine.resolveState({\n value: targetValue,\n context: currentSnapshot?.context,\n status: currentSnapshot?.status,\n output: currentSnapshot?.output,\n error: currentSnapshot?.error,\n historyValue: currentSnapshot?.historyValue,\n })\n\n mutableActorRef.update(nextSnapshot, {\n type: 'xstate.devtools.set-active-state',\n stateNodeId,\n })\n}\n\n// Cached on globalThis so HMR re-evaluating this module doesn't reset the\n// monotonic seq counter mid-session. The panel re-numbers messages on ingest\n// to merge multiple sources, but keeping a stable per-process seq still helps\n// when the panel reconnects to an already-running adapter.\nconst SEQ_KEY = '__xstate_devtools_global_seq__'\nfunction nextSeq(): number {\n const g = globalThis as Record<string, unknown>\n const cur = (g[SEQ_KEY] as number | undefined) ?? 0\n const next = cur + 1\n g[SEQ_KEY] = next\n return next\n}\n\nexport function createInspector(\n transport: Transport,\n source: Source,\n options: InspectorOptions = {},\n) {\n const actorRefs = new Map<string, AnyActorRef>()\n const actorMachines = new Map<string, SerializedMachine | null>()\n const prefix = `${source}:`\n const tag = (sessionId: string) => prefix + sessionId\n const tagOptional = (id: string | undefined) => (id ? prefix + id : undefined)\n const stripIfMine = (id: string): string | null =>\n id.startsWith(prefix) ? id.slice(prefix.length) : null\n\n function checkAndNotifyStop(actorRef: AnyActorRef) {\n let snap: any\n try {\n snap = actorRef.getSnapshot()\n } catch {\n return\n }\n if (snap?.status !== 'active') {\n const message: PageToExtensionMessage = {\n type: 'XSTATE_ACTOR_STOPPED',\n sessionId: tag(actorRef.sessionId),\n }\n debugLog(source, 'actor stopped; notifying transport', summarizeMessage(message))\n transport.send(message)\n actorRefs.delete(actorRef.sessionId)\n actorMachines.delete(actorRef.sessionId)\n }\n }\n\n const unsubscribe = transport.subscribe((message) => {\n debugLog(source, 'received message from transport', summarizeMessage(message))\n if (message.type === 'XSTATE_PANEL_CONNECTED') {\n // The devtools panel just connected (or reconnected). Re-broadcast every\n // currently-active actor so the panel is never blank because the MV3\n // service worker was killed between page load and panel open.\n infoLog(source, 'panel connected; resyncing actors', { actorCount: actorRefs.size })\n actorRefs.forEach((actorRef, sessionId) => {\n const machine = actorMachines.get(sessionId) ?? null\n const resyncMessage: PageToExtensionMessage = {\n type: 'XSTATE_ACTOR_REGISTERED',\n sessionId: tag(sessionId),\n parentSessionId: tagOptional((actorRef as any)._parent?.sessionId),\n displayName: getActorDisplayName(actorRef),\n machine,\n snapshot: safeSerializeSnapshot(actorRef),\n globalSeq: nextSeq(),\n timestamp: Date.now(),\n }\n debugLog(source, 'resyncing actor', summarizeMessage(resyncMessage))\n transport.send(resyncMessage)\n })\n return\n }\n if (message.type === 'XSTATE_DISPATCH') {\n const local = stripIfMine(message.sessionId)\n if (local === null) {\n debugLog(source, 'ignoring dispatch for different source', summarizeMessage(message))\n return // not for this transport source\n }\n const ref = actorRefs.get(local)\n if (ref) {\n try {\n debugLog(source, 'dispatching event to actor', {\n sessionId: local,\n eventType:\n message.event && typeof message.event === 'object' && 'type' in message.event\n ? message.event.type\n : undefined,\n })\n ref.send(message.event)\n } catch (e) {\n warnLog(source, 'dispatch error', { error: e, sessionId: local })\n }\n } else {\n warnLog(source, 'received dispatch for unknown actor', {\n sessionId: local,\n knownActors: actorRefs.size,\n })\n }\n return\n }\n if (message.type === 'XSTATE_SET_ACTIVE_STATE') {\n const local = stripIfMine(message.sessionId)\n if (local === null) {\n debugLog(\n source,\n 'ignoring state activation for different source',\n summarizeMessage(message),\n )\n return\n }\n\n const ref = actorRefs.get(local)\n if (!ref) {\n warnLog(source, 'received state activation for unknown actor', {\n sessionId: local,\n knownActors: actorRefs.size,\n })\n return\n }\n\n try {\n debugLog(source, 'setting active state on actor', summarizeMessage(message))\n setActiveState(ref, message.stateNodeId)\n const snapshotMessage: PageToExtensionMessage = {\n type: 'XSTATE_SNAPSHOT',\n sessionId: tag(local),\n snapshot: safeSerializeSnapshot(ref),\n timestamp: Date.now(),\n globalSeq: nextSeq(),\n }\n debugLog(\n source,\n 'sending snapshot after state activation',\n summarizeMessage(snapshotMessage),\n )\n transport.send(snapshotMessage)\n } catch (error) {\n warnLog(source, 'failed to set active state', {\n error,\n sessionId: local,\n stateNodeId: message.stateNodeId,\n })\n }\n }\n })\n\n // Notify the extension that the adapter is ready\n transport.send({ type: 'XSTATE_ADAPTER_READY' })\n\n infoLog(source, 'inspector created')\n\n const inspect = (inspectionEvent: any) => {\n debugLog(source, 'inspect callback invoked', summarizeInspectionEvent(inspectionEvent))\n if (inspectionEvent.type === '@xstate.actor') {\n const actorRef: AnyActorRef = inspectionEvent.actorRef\n const sessionId: string = actorRef.sessionId\n\n // Serialize machine and populate both Maps BEFORE subscribing so that\n // the Maps are fully consistent if complete()/error() ever fire\n // synchronously during subscribe() (e.g. an actor that starts in a\n // final state). Populating after subscribe introduced a race where\n // actorMachines.delete() in the callback was a no-op and the subsequent\n // actorMachines.set() would leak the entry permanently.\n const actorLogic = (actorRef as { logic?: unknown }).logic as any\n const machine = actorLogic?.root\n ? serializeMachine(\n actorLogic,\n actorLogic.config?.__xstateDevtoolsSource ?? getSourceLocation(source, options),\n )\n : null\n actorRefs.set(sessionId, actorRef)\n actorMachines.set(sessionId, machine)\n\n // Eagerly remove the actor from both maps when it stops so we don't\n // accumulate strong references to every short-lived actor indefinitely.\n // Without this, actors that stop silently (no further snapshot/event) are\n // only removed by checkAndNotifyStop — which never fires for them.\n const notifyStop = () => {\n if (actorRefs.has(sessionId)) {\n actorRefs.delete(sessionId)\n actorMachines.delete(sessionId)\n const stopMsg: PageToExtensionMessage = {\n type: 'XSTATE_ACTOR_STOPPED',\n sessionId: tag(sessionId),\n }\n debugLog(source, 'actor stopped; notifying transport', summarizeMessage(stopMsg))\n transport.send(stopMsg)\n }\n }\n try {\n actorRef.subscribe({ complete: notifyStop, error: notifyStop })\n } catch {\n // subscribe is best-effort; older actor implementations may not support it\n }\n\n const message: PageToExtensionMessage = {\n type: 'XSTATE_ACTOR_REGISTERED',\n sessionId: tag(sessionId),\n parentSessionId: tagOptional((actorRef as any)._parent?.sessionId),\n displayName: getActorDisplayName(actorRef),\n machine,\n snapshot: safeSerializeSnapshot(actorRef),\n globalSeq: nextSeq(),\n timestamp: Date.now(),\n }\n infoLog(source, 'registering actor with transport', {\n message: summarizeMessage(message),\n actorCount: actorRefs.size,\n hasMachine: machine !== null,\n })\n transport.send(message)\n } else if (inspectionEvent.type === '@xstate.snapshot') {\n const message: PageToExtensionMessage = {\n type: 'XSTATE_SNAPSHOT',\n sessionId: tag(inspectionEvent.actorRef.sessionId),\n snapshot: serializeSnapshot(inspectionEvent.snapshot),\n timestamp: Date.now(),\n globalSeq: nextSeq(),\n }\n debugLog(source, 'sending snapshot to transport', summarizeMessage(message))\n transport.send(message)\n checkAndNotifyStop(inspectionEvent.actorRef)\n } else if (inspectionEvent.type === '@xstate.event') {\n const message: PageToExtensionMessage = {\n type: 'XSTATE_EVENT',\n sessionId: tag(inspectionEvent.actorRef.sessionId),\n // sanitize() returns unknown; the inspected event keeps its { type, ... }\n // shape, so it is a SerializedEvent after deep-sanitizing.\n event: sanitize(inspectionEvent.event) as SerializedEvent,\n snapshotAfter: safeSerializeSnapshot(inspectionEvent.actorRef),\n timestamp: Date.now(),\n globalSeq: nextSeq(),\n }\n debugLog(source, 'sending event to transport', summarizeMessage(message))\n transport.send(message)\n checkAndNotifyStop(inspectionEvent.actorRef)\n } else {\n debugLog(\n source,\n 'ignoring unsupported inspection event',\n summarizeInspectionEvent(inspectionEvent),\n )\n }\n }\n\n function dispose() {\n infoLog(source, 'disposing inspector', { actorCount: actorRefs.size })\n unsubscribe()\n actorRefs.clear()\n actorMachines.clear()\n }\n\n return { inspect, dispose }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACMA,SAAS,gBAAgB;AACvB,SAAO,OAAO,YAAY,eAAe,OAAO,QAAQ,QAAQ;AAClE;AAEO,SAAS,mBAAmB;AACjC,MAAI,WAAW,gCAAgC,KAAM,QAAO;AAC5D,MAAI,CAAC,cAAc,EAAG,QAAO;AAE7B,QAAM,QAAQ,QAAQ,IAAI;AAC1B,SAAO,UAAU,OAAO,UAAU;AACpC;AAEA,SAAS,IAAI,OAAiB,OAAe,SAAiB,SAAmB;AAC/E,MAAI,CAAC,iBAAiB,EAAG;AAEzB,MAAI,YAAY,QAAW;AACzB,YAAQ,KAAK,EAAE,oBAAoB,KAAK,KAAK,OAAO,EAAE;AACtD;AAAA,EACF;AAEA,UAAQ,KAAK,EAAE,oBAAoB,KAAK,KAAK,OAAO,IAAI,OAAO;AACjE;AAEO,SAAS,SAAS,OAAe,SAAiB,SAAmB;AAC1E,MAAI,SAAS,OAAO,SAAS,OAAO;AACtC;AAEO,SAAS,QAAQ,OAAe,SAAiB,SAAmB;AACzE,MAAI,QAAQ,OAAO,SAAS,OAAO;AACrC;AAEO,SAAS,QAAQ,OAAe,SAAiB,SAAmB;AACzE,MAAI,QAAQ,OAAO,SAAS,OAAO;AACrC;;;ACrCA,IAAM,YAAY;AAClB,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AAEzB,SAAS,cAAc,OAAgB,OAAe,MAAgC;AACpF,MAAI,QAAQ,UAAW,QAAO;AAC9B,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,MAAI,OAAO,UAAU,aAAa,OAAO,UAAU,SAAU,QAAO;AACpE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,SAAS,oBAAoB,GAAG,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAM;AAAA,EACtF;AACA,MAAI,OAAO,UAAU,WAAY,QAAO,cAAc,MAAM,QAAQ,aAAa;AACjF,MAAI,OAAO,UAAU,SAAU,QAAO,YAAY,MAAM,eAAe,EAAE;AACzE,MAAI,OAAO,UAAU,SAAU,QAAO,YAAY,KAAK;AACvD,MAAI,iBAAiB,MAAO,QAAO,EAAE,QAAQ,SAAS,MAAM,MAAM,MAAM,SAAS,MAAM,QAAQ;AAC/F,MAAI,iBAAiB,KAAM,QAAO,EAAE,QAAQ,QAAQ,KAAK,MAAM,YAAY,EAAE;AAC7E,MAAI,iBAAiB,OAAQ,QAAO,EAAE,QAAQ,UAAU,QAAQ,MAAM,QAAQ,OAAO,MAAM,MAAM;AACjG,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,KAAK,IAAI,KAAK,EAAG,QAAO;AAC5B,SAAK,IAAI,KAAK;AAAA,EAChB;AACA,MAAI,iBAAiB,KAAK;AACxB,UAAM,UAAgC,CAAC;AACvC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAgC;AACnD,UAAI,QAAQ,UAAU,iBAAkB;AACxC,cAAQ,KAAK,CAAC,cAAc,GAAG,QAAQ,GAAG,IAAI,GAAG,cAAc,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;AAAA,IACrF;AACA,WAAO,EAAE,QAAQ,OAAO,QAAQ;AAAA,EAClC;AACA,MAAI,iBAAiB,KAAK;AACxB,UAAM,SAAoB,CAAC;AAC3B,eAAW,KAAK,OAAuB;AACrC,UAAI,OAAO,UAAU,iBAAkB;AACvC,aAAO,KAAK,cAAc,GAAG,QAAQ,GAAG,IAAI,CAAC;AAAA,IAC/C;AACA,WAAO,EAAE,QAAQ,OAAO,OAAO;AAAA,EACjC;AACA,MAAI,iBAAiB,QAAS,QAAO;AACrC,MAAI,iBAAiB,WAAW,iBAAiB,QAAS,QAAO;AACjE,MAAI,YAAY,OAAO,KAAK,EAAG,QAAO,gBAAiB,MAAc,YAAY,IAAI;AAErF,MAAI,OAAO,SAAS,eAAe,iBAAiB,MAAM;AACxD,WAAO,aAAc,MAAkB,WAAW,MAAM,QAAQ;AAAA,EAClE;AACA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,SAAS,MAAM,MAAM,GAAG,gBAAgB;AAC9C,UAAM,SAAS,OAAO,IAAI,CAAC,MAAM,cAAc,GAAG,QAAQ,GAAG,IAAI,CAAC;AAClE,QAAI,MAAM,SAAS,iBAAkB,QAAO,KAAK,UAAK,MAAM,SAAS,gBAAgB,QAAQ;AAC7F,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,SAAkC,CAAC;AACzC,QAAI,QAAQ;AACZ,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAgC,GAAG;AACrE,UAAI,WAAW,kBAAkB;AAC/B,eAAO,QAAG,IAAI;AACd;AAAA,MACF;AACA,aAAO,CAAC,IAAI,cAAc,GAAG,QAAQ,GAAG,IAAI;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AACA,SAAO,OAAO,KAAK;AACrB;AAEO,SAAS,SAAS,OAAgB,QAAQ,GAAY;AAC3D,SAAO,cAAc,OAAO,OAAO,oBAAI,QAAgB,CAAC;AAC1D;;;AC5DA,IAAM,uBAAuB;AAC7B,IAAM,2BAA2B;AACjC,IAAM,mBAAmB;AACzB,IAAM,6BAA6B;AACnC,IAAM,yBAAyB;AAC/B,IAAM,uBAAuB;AAE7B,SAAS,eAAe,OAAoC;AAC1D,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,MAAI,OAAO,UAAU,WAAY,QAAQ,MAAmB,QAAQ;AACpE,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,UAAM,IAAI;AACV,WAAO,EAAE,QAAQ,EAAE,QAAQ;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAyB;AAChD,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,OAAO,WAAW,WAAY,QAAQ,OAAoB,QAAQ;AACtE,MAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,UAAM,IAAI;AACV,WAAO,EAAE,QAAQ,EAAE,QAAQ,OAAO,MAAM;AAAA,EAC1C;AACA,SAAO,OAAO,MAAM;AACtB;AAEA,SAAS,wBAAwB,aAA4C;AAC3E,SAAO,YAAY,MAAM,GAAG,wBAAwB,EAAE,IAAI,CAAC,OAAY;AAAA,IACrE,WAAW,EAAE,aAAa;AAAA,IAC1B,UAAU,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,MAAW,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE,OAAO,OAAO;AAAA,IAC5E,OAAO,eAAe,EAAE,KAAK;AAAA,IAC7B,UAAU,EAAE,WAAW,CAAC,GACrB,MAAM,GAAG,0BAA0B,EACnC,IAAI,eAAe,EACnB,OAAO,OAAO;AAAA,EACnB,EAAE;AACJ;AAEA,SAAS,iBAAiB,MAA+B;AACvD,SAAQ,KAAK,OAAiB,MAAM,GAAG,oBAAoB,EAAE,IAAI,CAAC,SAAc;AAAA,IAC9E,IAAI,IAAI,MAAM;AAAA,IACd,KAAK,OAAO,IAAI,QAAQ,WAAW,IAAI,MAAO,IAAI,KAAK,MAAM,IAAI,KAAK,QAAQ;AAAA,EAChF,EAAE;AACJ;AAOA,SAAS,cAAc,MAAW,OAA4C;AAC5E,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,CAAC;AAAA,MACT,IAAI,CAAC;AAAA,MACL,QAAQ,CAAC;AAAA,MACT,OAAO,CAAC;AAAA,MACR,MAAM,CAAC;AAAA,MACP,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,sBAAsB;AACvC,WAAO;AAAA,MACL,IAAI,KAAK,MAAM;AAAA,MACf,KAAK,KAAK,OAAO;AAAA,MACjB,MAAM,KAAK,QAAQ;AAAA,MACnB,QAAQ,CAAC;AAAA,MACT,IAAI,CAAC;AAAA,MACL,QAAQ,CAAC;AAAA,MACT,OAAO,CAAC;AAAA,MACR,MAAM,CAAC;AAAA,MACP,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAEA,MAAI,MAAM,KAAK,IAAI,IAAI,GAAG;AACxB,WAAO;AAAA,MACL,IAAI,KAAK,MAAM;AAAA,MACf,KAAK,KAAK,OAAO;AAAA,MACjB,MAAM,KAAK,QAAQ;AAAA,MACnB,QAAQ,CAAC;AAAA,MACT,IAAI,CAAC;AAAA,MACL,QAAQ,CAAC;AAAA,MACT,OAAO,CAAC;AAAA,MACR,MAAM,CAAC;AAAA,MACP,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAEA,QAAM,KAAK,IAAI,IAAI;AACnB,QAAM,SAAS;AAEf,QAAM,iBAAyC,CAAC;AAChD,MAAI,KAAK,uBAAuB,KAAK;AACnC,eAAW,CAAC,EAAE,KAAK,KAAK,KAAK,aAAa;AACxC,UAAI,eAAe,UAAU,yBAA0B;AACvD,qBAAe,KAAK,GAAG,wBAAwB,KAAK,CAAC;AACrD,UAAI,eAAe,UAAU,0BAA0B;AACrD,uBAAe,SAAS;AACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,IAAI,wBAAwB,KAAK,MAAM,IAAI,CAAC;AACpF,QAAM,eAAe,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,gBAAgB;AAEhF,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,KAAK,KAAK;AAAA,IACV,MAAM,KAAK;AAAA,IACX,SAAS,KAAK,SAAS,SAAS,CAAC,GAAG;AAAA,IACpC,QAAQ,OAAO,YAAY,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC;AAAA,IACrF,IAAI;AAAA,IACJ;AAAA,IACA,QAAQ,KAAK,SAAS,CAAC,GAAG,MAAM,GAAG,sBAAsB,EAAE,IAAI,eAAe,EAAE,OAAO,OAAO;AAAA,IAC9F,OAAO,KAAK,QAAQ,CAAC,GAAG,MAAM,GAAG,sBAAsB,EAAE,IAAI,eAAe,EAAE,OAAO,OAAO;AAAA,IAC5F,QAAQ,iBAAiB,IAAI;AAAA,IAC7B,gBAAgB,KAAK,QAAQ,0BAA0B;AAAA,IACvD,aAAa,KAAK,QAAQ,eAAe;AAAA,EAC3C;AACF;AAEO,SAAS,iBACd,SACA,gBACmB;AACnB,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,MAAM,cAAc,QAAQ,MAAM,EAAE,MAAM,oBAAI,QAAgB,GAAG,OAAO,EAAE,CAAC;AAAA,IAC3E;AAAA,EACF;AACF;;;AClFA,SAAS,iBAAiB,SAA0D;AAClF,QAAM,UAAmC,EAAE,MAAM,QAAQ,KAAK;AAC9D,MAAI,eAAe,QAAS,SAAQ,YAAY,QAAQ;AACxD,MAAI,iBAAiB,QAAS,SAAQ,cAAc,QAAQ;AAC5D,MAAI,qBAAqB,WAAW,QAAQ,iBAAiB;AAC3D,YAAQ,kBAAkB,QAAQ;AAAA,EACpC;AACA,MAAI,eAAe,QAAS,SAAQ,YAAY,QAAQ;AACxD,MAAI,eAAe,QAAS,SAAQ,YAAY,QAAQ;AACxD,MACE,WAAW,WACX,QAAQ,SACR,OAAO,QAAQ,UAAU,YACzB,UAAU,QAAQ,OAClB;AACA,YAAQ,YAAY,QAAQ,MAAM;AAAA,EACpC;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,OAAY;AAC5C,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IACb,WAAW,OAAO,UAAU;AAAA,IAC5B,WACE,OAAO,SAAS,mBAAmB,OAAO,SAAS,OAAO,MAAM,UAAU,WACtE,MAAM,MAAM,OACZ;AAAA,EACR;AACF;AAEA,SAASA,UAAS,QAAgB,SAAiB,SAAmB;AACpE,WAAa,GAAG,MAAM,YAAY,SAAS,OAAO;AACpD;AAEA,SAASC,SAAQ,QAAgB,SAAiB,SAAmB;AACnE,UAAY,GAAG,MAAM,YAAY,SAAS,OAAO;AACnD;AAEA,SAASC,SAAQ,QAAgB,SAAiB,SAAmB;AACnE,UAAY,GAAG,MAAM,YAAY,SAAS,OAAO;AACnD;AAEA,SAAS,oBAAoB,MAAuB;AAClD,QAAM,aAAa,KAAK,QAAQ,OAAO,GAAG,EAAE,YAAY;AACxD,SACE,WAAW,SAAS,uBAAuB,KAC3C,WAAW,SAAS,wBAAwB,KAC5C,WAAW,SAAS,4BAA4B,KAChD,WAAW,SAAS,oBAAoB;AAE5C;AAEA,SAAS,oBAAoB,MAAsB;AACjD,SAAO,KAAK,KAAK,EAAE,QAAQ,UAAU,EAAE;AACzC;AAEA,SAAS,0BAA0B,OAAuB;AACxD,SAAO,MAAM,MAAM,WAAW,IAAI,CAAC,KAAK;AAC1C;AAEA,SAAS,0BAA0B,UAA2B;AAC5D,QAAM,aAAa,SAChB,KAAK,EACL,YAAY,EACZ,QAAQ,YAAY,EAAE;AAEzB,SACE,eAAe,iBACf,eAAe,eACf,eAAe,iBACf,eAAe,UACf,eAAe,YACf,eAAe;AAEnB;AAEA,SAAS,wBAAwB,UAA2B;AAC1D,QAAM,UAAU,SAAS,KAAK;AAC9B,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,QAAQ,QAAQ,MAAM,2BAA2B;AACvD,QAAM,WAAW,QAAQ,CAAC,KAAK,SAAS,KAAK;AAC7C,MAAI,CAAC,WAAW,0BAA0B,OAAO,EAAG,QAAO;AAE3D,MAAI,kBAAkB,KAAK,OAAO,EAAG,QAAO;AAC5C,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,IAAI,KAAK,QAAQ,WAAW,KAAK,EAAG,QAAO;AAE7F,MAAI,+BAA+B,KAAK,OAAO,GAAG;AAChD,QAAI;AACF,YAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,UAAI,IAAI,aAAa,QAAS,QAAO;AACrC,aAAO,IAAI,SAAS,WAAW,OAAO;AAAA,IACxC,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,4BACP,UACA,QACA,SACQ;AACR,MAAI,WAAW,SAAS,CAAC,SAAS,cAAe,QAAO;AAExD,QAAM,QAAQ,SAAS,KAAK,EAAE,MAAM,+BAA+B;AACnE,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,CAAC,EAAE,SAAS,MAAM,MAAM,IAAI;AAClC,MAAI,CAAC,WAAW,CAAC,eAAe,KAAK,OAAO,EAAG,QAAO;AAEtD,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,OAAO;AAC3B,UAAM,WAAW,mBAAmB,IAAI,QAAQ;AAChD,QAAI,CAAC,SAAS,WAAW,OAAO,EAAG,QAAO;AAE1C,UAAM,OAAO,QAAQ,cAAc,QAAQ,QAAQ,EAAE;AACrD,UAAM,WAAW,GAAG,IAAI,GAAG,QAAQ;AACnC,UAAM,SAAS,OAAO,IAAI,IAAI,GAAG,SAAS,IAAI,MAAM,KAAK,EAAE,KAAK;AAChE,WAAO,GAAG,QAAQ,GAAG,MAAM;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,2BACd,OACA,SAAiB,OACjB,SACoB;AACpB,QAAM,QAAQ,OAAO,MAAM,IAAI,KAAK,CAAC;AAErC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,QAAI,KAAK,EAAG;AAEZ,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,oBAAoB,IAAI,EAAG;AAE/B,UAAM,kBAAkB,oBAAoB,IAAI;AAChD,UAAM,WAAW;AAAA,MACf,0BAA0B,eAAe;AAAA,MACzC;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,wBAAwB,QAAQ,EAAG;AAExC,UAAM,UAAU,gBAAgB,MAAM,WAAW;AACjD,QAAI,SAAS;AACX,aAAO,gBAAgB,QAAQ,QAAQ,CAAC,GAAG,QAAQ;AAAA,IACrD;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAgB,SAAgD;AACzF,MAAI;AACF,UAAM,WAAW,MAAM;AACvB,UAAM,kBAAkB;AACxB,UAAM,QAAQ,IAAI,MAAM,EAAE;AAC1B,UAAM,kBAAkB;AACxB,WAAO,2BAA2B,OAAO,QAAQ,OAAO;AAAA,EAC1D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,UAAmC;AAC5D,SAAO;AAAA,IACL,OAAO,UAAU,SAAS;AAAA,IAC1B,SAAS,SAAS,UAAU,OAAO;AAAA,IACnC,QAAQ,UAAU,UAAU;AAAA,IAC5B,OAAO,UAAU,QAAQ,SAAS,SAAS,KAAK,IAAI;AAAA,EACtD;AACF;AAEA,SAAS,sBAAsB,UAA2C;AACxE,MAAI;AACF,WAAO,kBAAkB,SAAS,YAAY,CAAC;AAAA,EACjD,QAAQ;AACN,WAAO,EAAE,OAAO,MAAM,SAAS,QAAW,QAAQ,SAAS;AAAA,EAC7D;AACF;AAEA,SAAS,oBAAoB,UAA2C;AACtE,QAAM,QAAQ;AAKd,QAAM,MAAM,MAAM,OAAO,MAAM,OAAO;AACtC,MAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,EAAG,QAAO;AACtD,MAAI,OAAO,MAAM,OAAO,OAAO,YAAY,MAAM,MAAM,GAAG,SAAS,EAAG,QAAO,MAAM,MAAM;AACzF,MAAI,OAAO,MAAM,OAAO,SAAS,YAAY,MAAM,MAAM,KAAK,SAAS,EAAG,QAAO,MAAM,MAAM;AAC7F,MAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,UAAM,WAAW;AACjB,QAAI,OAAO,SAAS,OAAO,YAAY,SAAS,GAAG,SAAS,EAAG,QAAO,SAAS;AAC/E,QAAI,OAAO,SAAS,SAAS,YAAY,SAAS,KAAK,SAAS,EAAG,QAAO,SAAS;AAAA,EACrF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAA2C;AACtE,MAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,MAAI,OAAO,KAAK,YAAY,UAAU;AACpC,WAAO,KAAK,OAAO,KAAK,OAAO,KAAK;AAAA,EACtC;AAEA,QAAM,SAAS,MAAM,QAAQ,KAAK,SAAS,MAAM,IAAI,KAAK,QAAQ,OAAO,CAAC,IAAI;AAC9E,SAAO,UAAU;AACnB;AAEA,SAAS,iBAAiB,OAAsB,YAAoC;AAClF,MAAI,MAAM,SAAS,YAAY,MAAM,SAAS,WAAW,MAAM,SAAS,WAAW;AACjF,WAAO,MAAM;AAAA,EACf;AAEA,SAAO,EAAE,CAAC,MAAM,GAAG,GAAG,WAAW;AACnC;AAEA,SAAS,qBAAqB,MAAiC;AAC7D,MAAI,KAAK,SAAS,YAAY;AAC5B,UAAM,QAAoC,CAAC;AAC3C,eAAW,SAAS,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,GAAG;AACpD,YAAM,MAAM,GAAG,IAAI,yBAAyB,KAAK;AAAA,IACnD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,oBAAoB,IAAI;AAC7C,MAAI,CAAC,aAAc,QAAO,CAAC;AAC3B,SAAO,iBAAiB,cAAc,qBAAqB,YAAY,CAAC;AAC1E;AAEA,SAAS,yBAAyB,MAAiC;AACjE,MAAI,KAAK,SAAS,YAAY,KAAK,SAAS,WAAW,KAAK,SAAS,WAAW;AAC9E,WAAO,KAAK;AAAA,EACd;AAEA,SAAO,qBAAqB,IAAI;AAClC;AAEA,SAAS,sBAAsB,OAAgB,UAA0C;AACvF,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,SAAQ,MAAqC,QAAQ;AACvD;AAEA,SAAS,cAAc,QAAuB,MAAsC;AAClF,QAAM,OAAwB,CAAC;AAC/B,MAAI,UAAqC;AAEzC,SAAO,SAAS;AACd,SAAK,QAAQ,OAAO;AACpB,QAAI,QAAQ,OAAO,KAAK,GAAI,QAAO;AACnC,cAAU,QAAQ;AAAA,EACpB;AAEA,QAAM,IAAI,MAAM,eAAe,OAAO,EAAE,6BAA6B,KAAK,EAAE,GAAG;AACjF;AAEA,SAAS,sBACP,MACA,MACA,cACY;AACZ,QAAM,CAAC,EAAE,GAAG,QAAQ,IAAI;AAExB,MAAI,SAAS,WAAW,GAAG;AACzB,QAAI,KAAK,SAAS,YAAY;AAC5B,YAAM,OAAmC,CAAC;AAC1C,iBAAWC,UAAS,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,GAAG;AACpD,aAAKA,OAAM,GAAG,IACZ,sBAAsB,cAAcA,OAAM,GAAG,KAAK,yBAAyBA,MAAK;AAAA,MACpF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,SAAS,YAAY;AAC5B,aAAO,qBAAqB,IAAI;AAAA,IAClC;AAEA,WAAO,KAAK;AAAA,EACd;AAEA,QAAM,QAAQ,SAAS,CAAC;AACxB,MAAI,KAAK,SAAS,YAAY;AAC5B,UAAM,OAAmC,CAAC;AAC1C,eAAW,WAAW,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,GAAG;AACtD,UAAI,QAAQ,QAAQ,MAAM,KAAK;AAC7B,aAAK,QAAQ,GAAG,IAAI;AAAA,UAClB;AAAA,UACA;AAAA,UACA,sBAAsB,cAAc,QAAQ,GAAG;AAAA,QACjD;AAAA,MACF,OAAO;AACL,aAAK,QAAQ,GAAG,IACd,sBAAsB,cAAc,QAAQ,GAAG,KAAK,yBAAyB,OAAO;AAAA,MACxF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA,sBAAsB,cAAc,MAAM,GAAG;AAAA,EAC/C;AACA,SAAO,iBAAiB,OAAO,UAAU;AAC3C;AAEA,SAAS,eAAe,UAAuB,aAA2B;AACxE,QAAM,kBAAkB;AACxB,QAAM,UAAU,gBAAgB;AAChC,MACE,CAAC,SAAS,oBACV,CAAC,QAAQ,gBACT,OAAO,gBAAgB,WAAW,YAClC;AACA,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,QAAM,kBAAkB,SAAS,YAAY;AAQ7C,QAAM,aAAa,QAAQ,iBAAiB,WAAW;AACvD,QAAM,OAAO,cAAc,YAAY,QAAQ,IAAI;AACnD,QAAM,cAAc,sBAAsB,QAAQ,MAAM,MAAM,iBAAiB,KAAK;AAEpF,QAAM,eAAe,QAAQ,aAAa;AAAA,IACxC,OAAO;AAAA,IACP,SAAS,iBAAiB;AAAA,IAC1B,QAAQ,iBAAiB;AAAA,IACzB,QAAQ,iBAAiB;AAAA,IACzB,OAAO,iBAAiB;AAAA,IACxB,cAAc,iBAAiB;AAAA,EACjC,CAAC;AAED,kBAAgB,OAAO,cAAc;AAAA,IACnC,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACH;AAMA,IAAM,UAAU;AAChB,SAAS,UAAkB;AACzB,QAAM,IAAI;AACV,QAAM,MAAO,EAAE,OAAO,KAA4B;AAClD,QAAM,OAAO,MAAM;AACnB,IAAE,OAAO,IAAI;AACb,SAAO;AACT;AAEO,SAAS,gBACd,WACA,QACA,UAA4B,CAAC,GAC7B;AACA,QAAM,YAAY,oBAAI,IAAyB;AAC/C,QAAM,gBAAgB,oBAAI,IAAsC;AAChE,QAAM,SAAS,GAAG,MAAM;AACxB,QAAM,MAAM,CAAC,cAAsB,SAAS;AAC5C,QAAM,cAAc,CAAC,OAA4B,KAAK,SAAS,KAAK;AACpE,QAAM,cAAc,CAAC,OACnB,GAAG,WAAW,MAAM,IAAI,GAAG,MAAM,OAAO,MAAM,IAAI;AAEpD,WAAS,mBAAmB,UAAuB;AACjD,QAAI;AACJ,QAAI;AACF,aAAO,SAAS,YAAY;AAAA,IAC9B,QAAQ;AACN;AAAA,IACF;AACA,QAAI,MAAM,WAAW,UAAU;AAC7B,YAAM,UAAkC;AAAA,QACtC,MAAM;AAAA,QACN,WAAW,IAAI,SAAS,SAAS;AAAA,MACnC;AACA,MAAAH,UAAS,QAAQ,sCAAsC,iBAAiB,OAAO,CAAC;AAChF,gBAAU,KAAK,OAAO;AACtB,gBAAU,OAAO,SAAS,SAAS;AACnC,oBAAc,OAAO,SAAS,SAAS;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,cAAc,UAAU,UAAU,CAAC,YAAY;AACnD,IAAAA,UAAS,QAAQ,mCAAmC,iBAAiB,OAAO,CAAC;AAC7E,QAAI,QAAQ,SAAS,0BAA0B;AAI7C,MAAAC,SAAQ,QAAQ,qCAAqC,EAAE,YAAY,UAAU,KAAK,CAAC;AACnF,gBAAU,QAAQ,CAAC,UAAU,cAAc;AACzC,cAAM,UAAU,cAAc,IAAI,SAAS,KAAK;AAChD,cAAM,gBAAwC;AAAA,UAC5C,MAAM;AAAA,UACN,WAAW,IAAI,SAAS;AAAA,UACxB,iBAAiB,YAAa,SAAiB,SAAS,SAAS;AAAA,UACjE,aAAa,oBAAoB,QAAQ;AAAA,UACzC;AAAA,UACA,UAAU,sBAAsB,QAAQ;AAAA,UACxC,WAAW,QAAQ;AAAA,UACnB,WAAW,KAAK,IAAI;AAAA,QACtB;AACA,QAAAD,UAAS,QAAQ,mBAAmB,iBAAiB,aAAa,CAAC;AACnE,kBAAU,KAAK,aAAa;AAAA,MAC9B,CAAC;AACD;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,mBAAmB;AACtC,YAAM,QAAQ,YAAY,QAAQ,SAAS;AAC3C,UAAI,UAAU,MAAM;AAClB,QAAAA,UAAS,QAAQ,0CAA0C,iBAAiB,OAAO,CAAC;AACpF;AAAA,MACF;AACA,YAAM,MAAM,UAAU,IAAI,KAAK;AAC/B,UAAI,KAAK;AACP,YAAI;AACF,UAAAA,UAAS,QAAQ,8BAA8B;AAAA,YAC7C,WAAW;AAAA,YACX,WACE,QAAQ,SAAS,OAAO,QAAQ,UAAU,YAAY,UAAU,QAAQ,QACpE,QAAQ,MAAM,OACd;AAAA,UACR,CAAC;AACD,cAAI,KAAK,QAAQ,KAAK;AAAA,QACxB,SAAS,GAAG;AACV,UAAAE,SAAQ,QAAQ,kBAAkB,EAAE,OAAO,GAAG,WAAW,MAAM,CAAC;AAAA,QAClE;AAAA,MACF,OAAO;AACL,QAAAA,SAAQ,QAAQ,uCAAuC;AAAA,UACrD,WAAW;AAAA,UACX,aAAa,UAAU;AAAA,QACzB,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,2BAA2B;AAC9C,YAAM,QAAQ,YAAY,QAAQ,SAAS;AAC3C,UAAI,UAAU,MAAM;AAClB,QAAAF;AAAA,UACE;AAAA,UACA;AAAA,UACA,iBAAiB,OAAO;AAAA,QAC1B;AACA;AAAA,MACF;AAEA,YAAM,MAAM,UAAU,IAAI,KAAK;AAC/B,UAAI,CAAC,KAAK;AACR,QAAAE,SAAQ,QAAQ,+CAA+C;AAAA,UAC7D,WAAW;AAAA,UACX,aAAa,UAAU;AAAA,QACzB,CAAC;AACD;AAAA,MACF;AAEA,UAAI;AACF,QAAAF,UAAS,QAAQ,iCAAiC,iBAAiB,OAAO,CAAC;AAC3E,uBAAe,KAAK,QAAQ,WAAW;AACvC,cAAM,kBAA0C;AAAA,UAC9C,MAAM;AAAA,UACN,WAAW,IAAI,KAAK;AAAA,UACpB,UAAU,sBAAsB,GAAG;AAAA,UACnC,WAAW,KAAK,IAAI;AAAA,UACpB,WAAW,QAAQ;AAAA,QACrB;AACA,QAAAA;AAAA,UACE;AAAA,UACA;AAAA,UACA,iBAAiB,eAAe;AAAA,QAClC;AACA,kBAAU,KAAK,eAAe;AAAA,MAChC,SAAS,OAAO;AACd,QAAAE,SAAQ,QAAQ,8BAA8B;AAAA,UAC5C;AAAA,UACA,WAAW;AAAA,UACX,aAAa,QAAQ;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAGD,YAAU,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE/C,EAAAD,SAAQ,QAAQ,mBAAmB;AAEnC,QAAM,UAAU,CAAC,oBAAyB;AACxC,IAAAD,UAAS,QAAQ,4BAA4B,yBAAyB,eAAe,CAAC;AACtF,QAAI,gBAAgB,SAAS,iBAAiB;AAC5C,YAAM,WAAwB,gBAAgB;AAC9C,YAAM,YAAoB,SAAS;AAQnC,YAAM,aAAc,SAAiC;AACrD,YAAM,UAAU,YAAY,OACxB;AAAA,QACE;AAAA,QACA,WAAW,QAAQ,0BAA0B,kBAAkB,QAAQ,OAAO;AAAA,MAChF,IACA;AACJ,gBAAU,IAAI,WAAW,QAAQ;AACjC,oBAAc,IAAI,WAAW,OAAO;AAMpC,YAAM,aAAa,MAAM;AACvB,YAAI,UAAU,IAAI,SAAS,GAAG;AAC5B,oBAAU,OAAO,SAAS;AAC1B,wBAAc,OAAO,SAAS;AAC9B,gBAAM,UAAkC;AAAA,YACtC,MAAM;AAAA,YACN,WAAW,IAAI,SAAS;AAAA,UAC1B;AACA,UAAAA,UAAS,QAAQ,sCAAsC,iBAAiB,OAAO,CAAC;AAChF,oBAAU,KAAK,OAAO;AAAA,QACxB;AAAA,MACF;AACA,UAAI;AACF,iBAAS,UAAU,EAAE,UAAU,YAAY,OAAO,WAAW,CAAC;AAAA,MAChE,QAAQ;AAAA,MAER;AAEA,YAAM,UAAkC;AAAA,QACtC,MAAM;AAAA,QACN,WAAW,IAAI,SAAS;AAAA,QACxB,iBAAiB,YAAa,SAAiB,SAAS,SAAS;AAAA,QACjE,aAAa,oBAAoB,QAAQ;AAAA,QACzC;AAAA,QACA,UAAU,sBAAsB,QAAQ;AAAA,QACxC,WAAW,QAAQ;AAAA,QACnB,WAAW,KAAK,IAAI;AAAA,MACtB;AACA,MAAAC,SAAQ,QAAQ,oCAAoC;AAAA,QAClD,SAAS,iBAAiB,OAAO;AAAA,QACjC,YAAY,UAAU;AAAA,QACtB,YAAY,YAAY;AAAA,MAC1B,CAAC;AACD,gBAAU,KAAK,OAAO;AAAA,IACxB,WAAW,gBAAgB,SAAS,oBAAoB;AACtD,YAAM,UAAkC;AAAA,QACtC,MAAM;AAAA,QACN,WAAW,IAAI,gBAAgB,SAAS,SAAS;AAAA,QACjD,UAAU,kBAAkB,gBAAgB,QAAQ;AAAA,QACpD,WAAW,KAAK,IAAI;AAAA,QACpB,WAAW,QAAQ;AAAA,MACrB;AACA,MAAAD,UAAS,QAAQ,iCAAiC,iBAAiB,OAAO,CAAC;AAC3E,gBAAU,KAAK,OAAO;AACtB,yBAAmB,gBAAgB,QAAQ;AAAA,IAC7C,WAAW,gBAAgB,SAAS,iBAAiB;AACnD,YAAM,UAAkC;AAAA,QACtC,MAAM;AAAA,QACN,WAAW,IAAI,gBAAgB,SAAS,SAAS;AAAA;AAAA;AAAA,QAGjD,OAAO,SAAS,gBAAgB,KAAK;AAAA,QACrC,eAAe,sBAAsB,gBAAgB,QAAQ;AAAA,QAC7D,WAAW,KAAK,IAAI;AAAA,QACpB,WAAW,QAAQ;AAAA,MACrB;AACA,MAAAA,UAAS,QAAQ,8BAA8B,iBAAiB,OAAO,CAAC;AACxE,gBAAU,KAAK,OAAO;AACtB,yBAAmB,gBAAgB,QAAQ;AAAA,IAC7C,OAAO;AACL,MAAAA;AAAA,QACE;AAAA,QACA;AAAA,QACA,yBAAyB,eAAe;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAEA,WAAS,UAAU;AACjB,IAAAC,SAAQ,QAAQ,uBAAuB,EAAE,YAAY,UAAU,KAAK,CAAC;AACrE,gBAAY;AACZ,cAAU,MAAM;AAChB,kBAAc,MAAM;AAAA,EACtB;AAEA,SAAO,EAAE,SAAS,QAAQ;AAC5B;;;AJ7oBO,SAAS,cAAc,UAA4B,CAAC,GAAG;AAC5D,MAAI,OAAO,WAAW,aAAa;AAEjC,YAAQ,eAAe,8DAA8D;AACrF,WAAO,EAAE,SAAS,MAAM;AAAA,IAAC,GAAG,SAAS,MAAM;AAAA,IAAC,EAAE;AAAA,EAChD;AAEA,UAAQ,eAAe,4BAA4B;AAAA,IACjD,eAAe,QAAQ,OAAO,mBAAmB;AAAA,EACnD,CAAC;AAED,MAAI,oBAAoB;AAExB,QAAM,YAAuB;AAAA,IAC3B,KAAK,SAAiC;AACpC,YAAM,UAAU,EAAE,GAAG,SAAS,kBAAkB,KAAc;AAC9D,eAAS,eAAe,iCAAiC;AAAA,QACvD,MAAM,QAAQ;AAAA,QACd,WAAW,eAAe,UAAU,QAAQ,YAAY;AAAA,MAC1D,CAAC;AACD,UAAI,OAAO,qBAAqB;AAC9B,eAAO,oBAAoB,KAAK,OAAO;AACvC;AAAA,MACF;AAEA,UAAI,CAAC,mBAAmB;AACtB,4BAAoB;AACpB,gBAAQ,eAAe,6DAA6D;AAAA,MACtF;AAEA,aAAO,YAAY,SAAS,GAAG;AAAA,IACjC;AAAA,IACA,UAAU,SAAS;AACjB,cAAQ,eAAe,gCAAgC;AACvD,YAAM,YAAY,CAAC,QAAsB;AACvC,YAAI,IAAI,WAAW,OAAQ;AAC3B,cAAM,OAAO,IAAI;AACjB,YAAI,CAAC,MAAM,iBAAkB;AAC7B,iBAAS,eAAe,uCAAuC;AAAA,UAC7D,MAAO,KAAgC;AAAA,UACvC,WACE,eAAgB,OACX,KAAyD,YAC1D;AAAA,QACR,CAAC;AACD,gBAAQ,IAA8B;AAAA,MACxC;AACA,aAAO,iBAAiB,WAAW,SAAS;AAC5C,aAAO,MAAM;AACX,gBAAQ,eAAe,oCAAoC;AAC3D,eAAO,oBAAoB,WAAW,SAAS;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AAEA,SAAO,gBAAgB,WAAW,OAAO,OAAO;AAClD;","names":["debugLog","infoLog","warnLog","child"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/serialize.ts","../src/sanitize.ts","../src/core.ts"],"sourcesContent":["// Browser entrypoint — uses window.postMessage via the extension's injected bridge.\nimport type { ExtensionToPageMessage, PageToExtensionMessage } from '@xstate-devtools/protocol'\nimport { createInspector, type Transport } from './core.js'\n\ndeclare global {\n interface Window {\n __XSTATE_DEVTOOLS__?: {\n send: (message: unknown) => void\n }\n }\n}\n\nexport function createAdapter() {\n if (typeof window === 'undefined') {\n // Non-browser env (SSR/SSG/server) — return a no-op so importing this module is safe.\n return { inspect: () => {}, dispose: () => {}, registerRestore: () => () => {} }\n }\n\n const transport: Transport = {\n send(message: PageToExtensionMessage) {\n window.__XSTATE_DEVTOOLS__?.send({ ...message, __xstateDevtools: true })\n },\n subscribe(handler) {\n const onMessage = (evt: MessageEvent) => {\n if (evt.source !== window) return\n const data = evt.data\n if (!data?.__xstateDevtools) return\n handler(data as ExtensionToPageMessage)\n }\n window.addEventListener('message', onMessage)\n return () => window.removeEventListener('message', onMessage)\n },\n }\n\n return createInspector(transport, 'web')\n}\n","// packages/adapter/src/serialize.ts\nimport type { AnyStateMachine } from 'xstate'\nimport type { SerializedMachine, SerializedStateNode, SerializedTransition, SerializedInvoke } from '@xstate-devtools/protocol'\n\nfunction serializeGuard(guard: unknown): string | undefined {\n if (!guard) return undefined\n if (typeof guard === 'string') return guard\n if (typeof guard === 'function') return (guard as Function).name || '(inline)'\n if (typeof guard === 'object' && guard !== null) {\n const g = guard as any\n return g.type ?? g.name ?? '(inline)'\n }\n return '(inline)'\n}\n\nfunction serializeAction(action: unknown): string {\n if (typeof action === 'string') return action\n if (typeof action === 'function') return (action as Function).name || '(anonymous)'\n if (typeof action === 'object' && action !== null) {\n const a = action as any\n return a.type ?? a.name ?? String(action)\n }\n return String(action)\n}\n\nfunction serializeTransitionList(transitions: any[]): SerializedTransition[] {\n return transitions.map((t: any) => ({\n eventType: t.eventType ?? '',\n targets: (t.target ?? []).map((n: any) => n?.id ?? String(n)).filter(Boolean),\n guard: serializeGuard(t.guard),\n actions: (t.actions ?? []).map(serializeAction).filter(Boolean),\n }))\n}\n\nfunction serializeInvokes(node: any): SerializedInvoke[] {\n return (node.invoke as any[]).map((inv: any) => ({\n id: inv.id ?? '(unknown)',\n src: typeof inv.src === 'string'\n ? inv.src\n : inv.src?.id ?? inv.src?.name ?? '(inline)',\n }))\n}\n\nfunction serializeNode(node: any): SerializedStateNode {\n const allTransitions: SerializedTransition[] = []\n if (node.transitions instanceof Map) {\n for (const [, tList] of node.transitions) {\n allTransitions.push(...serializeTransitionList(tList))\n }\n }\n\n const always = Array.isArray(node.always) ? serializeTransitionList(node.always) : []\n\n return {\n id: node.id,\n key: node.key,\n type: node.type,\n initial: node.initial?.target?.[0]?.key,\n states: Object.fromEntries(\n Object.entries(node.states ?? {}).map(([k, v]) => [k, serializeNode(v)])\n ),\n on: allTransitions,\n always,\n entry: (node.entry ?? []).map(serializeAction).filter(Boolean),\n exit: (node.exit ?? []).map(serializeAction).filter(Boolean),\n invoke: serializeInvokes(node),\n }\n}\n\nexport function serializeMachine(machine: AnyStateMachine, sourceLocation?: string): SerializedMachine {\n return {\n id: machine.id,\n root: serializeNode(machine.root),\n sourceLocation,\n }\n}\n","// packages/adapter/src/sanitize.ts\n\nconst MAX_DEPTH = 10\nconst MAX_STRING_LENGTH = 500\nconst MAX_ARRAY_LENGTH = 100\n// Hard ceiling on total nodes across the whole tree. The per-level caps above\n// still allow multiplicative blow-up (100^depth) on wide+deep or cross-linked\n// objects, which can produce a string too large for JSON.stringify to handle.\n// This bounds the output regardless of shape.\nconst MAX_NODES = 10000\n\ninterface Ctx {\n depth: number\n /** Shared mutable node counter — the global budget. */\n budget: { n: number }\n /** Objects/arrays seen on the current path + elsewhere, to break cycles and DAGs. */\n seen: WeakSet<object>\n}\n\nfunction sanitizeInner(value: unknown, ctx: Ctx): unknown {\n if (ctx.depth > MAX_DEPTH) return '[MaxDepth]'\n if (++ctx.budget.n > MAX_NODES) return '[Truncated]'\n if (value === null || value === undefined) return value\n if (typeof value === 'boolean' || typeof value === 'number') return value\n if (typeof value === 'string') {\n return value.length > MAX_STRING_LENGTH ? value.slice(0, MAX_STRING_LENGTH) + '…' : value\n }\n if (typeof value === 'function') return `[Function: ${value.name || '(anonymous)'}]`\n if (typeof value === 'symbol') return `[Symbol: ${value.description ?? ''}]`\n if (typeof value === 'bigint') return `[BigInt: ${value}]`\n if (value instanceof Error) return { __type: 'Error', name: value.name, message: value.message }\n if (value instanceof Date) return { __type: 'Date', iso: value.toISOString() }\n if (value instanceof RegExp) return { __type: 'RegExp', source: value.source, flags: value.flags }\n if (value instanceof Promise) return '[Promise]'\n if (value instanceof WeakMap || value instanceof WeakSet) return '[WeakCollection]'\n if (ArrayBuffer.isView(value)) return `[TypedArray: ${(value as any).constructor.name}]`\n // Detect DOM nodes (works in browser and is safe to check)\n if (typeof Node !== 'undefined' && value instanceof Node) {\n return `[DOMNode: ${(value as Element).tagName ?? value.nodeName}]`\n }\n\n // From here on we recurse into containers — guard against shared/circular refs.\n if (ctx.seen.has(value as object)) return '[Circular]'\n ctx.seen.add(value as object)\n const child = { ...ctx, depth: ctx.depth + 1 }\n\n if (value instanceof Map) {\n const entries: [unknown, unknown][] = []\n for (const [k, v] of value as Map<unknown, unknown>) {\n if (entries.length >= MAX_ARRAY_LENGTH) break\n entries.push([sanitizeInner(k, child), sanitizeInner(v, child)])\n }\n return { __type: 'Map', entries }\n }\n if (value instanceof Set) {\n const values: unknown[] = []\n for (const v of value as Set<unknown>) {\n if (values.length >= MAX_ARRAY_LENGTH) break\n values.push(sanitizeInner(v, child))\n }\n return { __type: 'Set', values }\n }\n if (Array.isArray(value)) {\n const sliced = value.slice(0, MAX_ARRAY_LENGTH)\n const result = sliced.map((v) => sanitizeInner(v, child))\n if (value.length > MAX_ARRAY_LENGTH) result.push(`[…${value.length - MAX_ARRAY_LENGTH} more]`)\n return result\n }\n if (typeof value === 'object') {\n const result: Record<string, unknown> = {}\n let count = 0\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (count++ >= MAX_ARRAY_LENGTH) { result['…'] = '[truncated]'; break }\n result[k] = sanitizeInner(v, child)\n }\n return result\n }\n return String(value)\n}\n\nexport function sanitize(value: unknown): unknown {\n return sanitizeInner(value, { depth: 0, budget: { n: 0 }, seen: new WeakSet() })\n}\n","// Transport-agnostic XState inspection core.\n// Browser and server entrypoints supply their own transports.\nimport type { AnyActorRef } from 'xstate'\nimport type {\n ExtensionToPageMessage, PageToExtensionMessage, SerializedSnapshot,\n} from '@xstate-devtools/protocol'\nimport { serializeMachine } from './serialize.js'\nimport { sanitize } from './sanitize.js'\n\nexport type Source = 'web' | 'srv'\n\nexport interface Transport {\n /** Send a protocol message outbound (toward the panel). */\n send: (message: PageToExtensionMessage) => void\n /** Subscribe to inbound dispatch messages from the panel. Returns a teardown. */\n subscribe: (handler: (message: ExtensionToPageMessage) => void) => () => void\n}\n\nfunction getSourceLocation(): string | undefined {\n try {\n const lines = new Error().stack?.split('\\n') ?? []\n const callerLine = lines.find(\n (l, i) => i > 3 && !l.includes('xstate') && !l.includes('adapter')\n )\n return callerLine?.trim().replace(/^at\\s+/, '')\n } catch {\n return undefined\n }\n}\n\nfunction serializeSnapshot(snapshot: any): SerializedSnapshot {\n return {\n value: sanitize(snapshot?.value ?? null) as SerializedSnapshot['value'],\n context: sanitize(snapshot?.context),\n status: snapshot?.status ?? 'active',\n error: snapshot?.error ? sanitize(snapshot.error) : undefined,\n }\n}\n\nfunction safeSerializeSnapshot(actorRef: AnyActorRef): SerializedSnapshot {\n try {\n return serializeSnapshot(actorRef.getSnapshot())\n } catch {\n return { value: null, context: undefined, status: 'active' }\n }\n}\n\n/**\n * Capture XState's persisted snapshot for an actor. Unlike the display snapshot,\n * this is meant to be restorable. We JSON round-trip it to guarantee it survives\n * the transport (and stays serializable); a throw here means the snapshot isn't\n * cleanly persistable, which we report as an error rather than silently dropping.\n */\nfunction safePersistedSnapshot(actorRef: AnyActorRef): { persisted?: unknown; error?: string } {\n const getPersisted = (actorRef as any).getPersistedSnapshot\n if (typeof getPersisted !== 'function') {\n return { error: 'Actor does not support getPersistedSnapshot.' }\n }\n try {\n const raw = getPersisted.call(actorRef)\n if (raw === undefined) return { error: 'No persisted snapshot available.' }\n return { persisted: JSON.parse(JSON.stringify(raw)) }\n } catch (e) {\n return { error: `Snapshot is not JSON-serializable: ${(e as Error).message}` }\n }\n}\n\n// Cached on globalThis so HMR re-evaluating this module doesn't reset the\n// monotonic seq counter mid-session. The panel re-numbers messages on ingest\n// to merge multiple sources, but keeping a stable per-process seq still helps\n// when the panel reconnects to an already-running adapter.\nconst SEQ_KEY = '__xstate_devtools_global_seq__'\nfunction nextSeq(): number {\n const g = globalThis as Record<string, unknown>\n const cur = (g[SEQ_KEY] as number | undefined) ?? 0\n const next = cur + 1\n g[SEQ_KEY] = next\n return next\n}\n\nexport function createInspector(transport: Transport, source: Source) {\n const actorRefs = new Map<string, AnyActorRef>()\n // Owner-registered restore handlers, keyed by local (un-prefixed) sessionId.\n // Populated by useRestorableInspectedMachine; an actor without a handler\n // simply can't be restored (live rewind is opt-in).\n const restoreHandlers = new Map<string, (persisted: unknown) => void>()\n const prefix = source + ':'\n const tag = (sessionId: string) => prefix + sessionId\n const tagOptional = (id: string | undefined) => (id ? prefix + id : undefined)\n const stripIfMine = (id: string): string | null =>\n id.startsWith(prefix) ? id.slice(prefix.length) : null\n\n function checkAndNotifyStop(actorRef: AnyActorRef) {\n let snap: any\n try { snap = actorRef.getSnapshot() } catch { return }\n if (snap?.status !== 'active') {\n transport.send({ type: 'XSTATE_ACTOR_STOPPED', sessionId: tag(actorRef.sessionId) })\n actorRefs.delete(actorRef.sessionId)\n }\n }\n\n const unsubscribe = transport.subscribe((message) => {\n if (message.type === 'XSTATE_DISPATCH') {\n const local = stripIfMine(message.sessionId)\n if (local === null) return // not for this transport source\n const ref = actorRefs.get(local)\n if (ref) {\n try { ref.send(message.event) } catch (e) {\n console.warn('[xstate-devtools] dispatch error:', e)\n }\n }\n } else if (message.type === 'XSTATE_REQUEST_PERSISTED') {\n const local = stripIfMine(message.sessionId)\n if (local === null) return // not for this transport source\n const ref = actorRefs.get(local)\n if (!ref) return\n const { persisted, error } = safePersistedSnapshot(ref)\n transport.send({\n type: 'XSTATE_PERSISTED_SNAPSHOT',\n sessionId: tag(local),\n persisted,\n error,\n timestamp: Date.now(),\n })\n } else if (message.type === 'XSTATE_RESTORE') {\n const local = stripIfMine(message.sessionId)\n if (local === null) return // not for this transport source\n const handler = restoreHandlers.get(local)\n if (handler) {\n try { handler(message.persisted) } catch (e) {\n console.warn('[xstate-devtools] restore error:', e)\n }\n }\n }\n })\n\n const inspect = (inspectionEvent: any) => {\n try {\n if (inspectionEvent.type === '@xstate.actor') {\n const actorRef: AnyActorRef = inspectionEvent.actorRef\n const sessionId: string = actorRef.sessionId\n actorRefs.set(sessionId, actorRef)\n\n // `logic` is internal and not on the public AnyActorRef type.\n const logic = (actorRef as any).logic\n const machine = logic?.root\n ? serializeMachine(logic, getSourceLocation())\n : null\n\n transport.send({\n type: 'XSTATE_ACTOR_REGISTERED',\n sessionId: tag(sessionId),\n parentSessionId: tagOptional((actorRef as any)._parent?.sessionId),\n // actorRef.id is the invoke `id` for invoked actors — lets the debugger\n // nest non-machine actors (promise/callback) under their state.\n actorId: (actorRef as any).id,\n machine,\n snapshot: safeSerializeSnapshot(actorRef),\n globalSeq: nextSeq(),\n timestamp: Date.now(),\n })\n } else if (inspectionEvent.type === '@xstate.snapshot') {\n transport.send({\n type: 'XSTATE_SNAPSHOT',\n sessionId: tag(inspectionEvent.actorRef.sessionId),\n snapshot: serializeSnapshot(inspectionEvent.snapshot),\n timestamp: Date.now(),\n globalSeq: nextSeq(),\n })\n checkAndNotifyStop(inspectionEvent.actorRef)\n } else if (inspectionEvent.type === '@xstate.event') {\n transport.send({\n type: 'XSTATE_EVENT',\n sessionId: tag(inspectionEvent.actorRef.sessionId),\n event: inspectionEvent.event,\n snapshotAfter: safeSerializeSnapshot(inspectionEvent.actorRef),\n timestamp: Date.now(),\n globalSeq: nextSeq(),\n })\n checkAndNotifyStop(inspectionEvent.actorRef)\n }\n } catch (e) {\n // Never let an inspection failure (e.g. an un-serializable snapshot too large\n // for JSON.stringify) propagate back into XState's synchronous inspection\n // callback — that would crash the host actor's start(). Drop the event.\n console.warn('[xstate-devtools] inspection failed, dropping event:', (e as Error).message)\n }\n }\n\n /**\n * Register an owner-side restore handler for an actor. Called by\n * useRestorableInspectedMachine. Returns an unregister function.\n */\n function registerRestore(sessionId: string, handler: (persisted: unknown) => void) {\n restoreHandlers.set(sessionId, handler)\n return () => {\n if (restoreHandlers.get(sessionId) === handler) restoreHandlers.delete(sessionId)\n }\n }\n\n function dispose() {\n unsubscribe()\n actorRefs.clear()\n restoreHandlers.clear()\n }\n\n return { inspect, dispose, registerRestore }\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,12 +1,3 @@
1
- interface InspectorOptions {
2
- /**
3
- * Absolute filesystem root for the web app. When provided, web stack frames
4
- * like http://localhost:5173/app/... are remapped to <webSourceRoot>/app/...
5
- * so VS Code source links can open local files.
6
- */
7
- webSourceRoot?: string;
8
- }
9
-
10
1
  declare global {
11
2
  interface Window {
12
3
  __XSTATE_DEVTOOLS__?: {
@@ -14,9 +5,10 @@ declare global {
14
5
  };
15
6
  }
16
7
  }
17
- declare function createAdapter(options?: InspectorOptions): {
8
+ declare function createAdapter(): {
18
9
  inspect: (inspectionEvent: any) => void;
19
10
  dispose: () => void;
11
+ registerRestore: (sessionId: string, handler: (persisted: unknown) => void) => () => void;
20
12
  };
21
13
 
22
14
  export { createAdapter };
package/dist/index.d.ts CHANGED
@@ -1,12 +1,3 @@
1
- interface InspectorOptions {
2
- /**
3
- * Absolute filesystem root for the web app. When provided, web stack frames
4
- * like http://localhost:5173/app/... are remapped to <webSourceRoot>/app/...
5
- * so VS Code source links can open local files.
6
- */
7
- webSourceRoot?: string;
8
- }
9
-
10
1
  declare global {
11
2
  interface Window {
12
3
  __XSTATE_DEVTOOLS__?: {
@@ -14,9 +5,10 @@ declare global {
14
5
  };
15
6
  }
16
7
  }
17
- declare function createAdapter(options?: InspectorOptions): {
8
+ declare function createAdapter(): {
18
9
  inspect: (inspectionEvent: any) => void;
19
10
  dispose: () => void;
11
+ registerRestore: (sessionId: string, handler: (persisted: unknown) => void) => () => void;
20
12
  };
21
13
 
22
14
  export { createAdapter };
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createAdapter
3
- } from "./chunk-MHHRMHW5.js";
4
- import "./chunk-3GM2SFT4.js";
3
+ } from "./chunk-SUDAY5H3.js";
4
+ import "./chunk-QLRTDBT5.js";
5
5
  export {
6
6
  createAdapter
7
7
  };