@vedmalex/statemachine 1.0.0-beta.1 → 1.0.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +139 -4
- package/dist/index.cjs +539 -90
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +538 -90
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
- package/types/config_validator.d.ts +32 -0
- package/types/index.d.ts +33 -0
- package/types/scheduler.d.ts +31 -1
- package/types/state_machine.d.ts +103 -0
- package/types/types.d.ts +24 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/scheduler.ts","../src/logger.ts","../src/security.ts","../src/monitoring.ts","../src/types.ts","../src/error_handling.ts","../src/state_machine.ts","../src/lite.ts","../src/config_validator.ts"],"sourcesContent":["/**\n * @packageDocumentation\n *\n * @vedmalex/statemachine — hierarchical state machine for TypeScript.\n *\n * @unstable — full surface defaults to @unstable per the package's STABILITY policy.\n * Per-symbol @stable tags below mark firm exports for the 1.0.0-beta.x consumer contract.\n *\n * @see README.md for usage and stability policy.\n */\n\n// === Stable public surface (5 firm symbols) ===\n\n/**\n * @stable — primary factory; the canonical consumer entry point.\n * @category Stable\n */\nexport { createMachine } from './lite'\n\n/**\n * @stable — class form for advanced consumers needing direct instance access.\n * @category Stable\n */\nexport { StateMachine } from './state_machine'\n\n// === Stable type re-exports ===\n\n/**\n * @stable — top-level machine configuration interface.\n * @category Stable\n */\nexport type { StateMachineConfig } from './types'\n\n/**\n * @stable — transition descriptor used in events.\n * @category Stable\n */\nexport type { Transition } from './types'\n\n/**\n * @stable — state node shape; consumed by States<T> map.\n * @category Stable\n */\nexport type { State } from './types'\n\n// === @unstable type re-exports (inherit package-level @unstable default) ===\n\n/**\n * @category Unstable\n */\nexport type {\n States,\n Events,\n Event,\n Adapter,\n StateMachineOptions,\n RegionsConfig,\n StateInvocation,\n StateName,\n EventName,\n RegionName,\n EventAction,\n ErrorHandler,\n ActionOrString,\n ErrorHandlerOrString,\n RegionStateName,\n NestedStateName,\n DeepNestedStateName,\n StatePaths,\n SimpleStateName,\n MethodsOf,\n PropertiesOf,\n KeysOf,\n ExtractAdaptee,\n ErrorContext,\n} from './types'\n\n// === Public adapter classes (live in types.ts) ===\n\nexport {\n MemoryAdapter,\n LocalStorageAdapter,\n SessionStorageAdapter,\n ServerAdapter,\n StateMachineError,\n isAdapter,\n} from './types'\n\n// === Curated error types (preserved from TASK-002) ===\n\nexport {\n createEnhancedError,\n EnhancedStateMachineError,\n ErrorAnalytics,\n ErrorCategory,\n type ErrorCategory as ErrorCategoryType,\n ErrorHandler as EnhancedErrorHandler,\n type ErrorRecoveryStrategy,\n ErrorSeverity,\n type ErrorSeverity as ErrorSeverityType,\n type ExtendedErrorContext,\n FallbackStateRecoveryStrategy,\n isRecoverableError,\n RetryRecoveryStrategy,\n} from './error_handling'\n\n// globalErrorHandler removed in TASK-004 (singleton elimination per ISS-007/ISS-008).\n\n// === Public config validator entry points ===\n\nexport {\n validateConfig,\n validateConfigStrict,\n isValidConfig,\n type ValidationResult,\n type ValidationError,\n type ValidationWarning,\n} from './config_validator'\n\n// === Extension-point interfaces (per TASK-006 EP catalog) — @unstable ===\n\n/**\n * @category Unstable\n * @unstable — observability injection contract; implement to collect per-machine metrics.\n */\nexport type { IMonitor } from './types'\n\n/**\n * @category Unstable\n * @unstable — timer scheduling injection contract; implement for WASM/host portability.\n */\nexport type { ITimerScheduler } from './types'\n\n/**\n * @category Unstable\n * @unstable — error-handler injection contract; implement to replace built-in recovery.\n */\nexport type { IErrorHandler } from './types'\n\n/**\n * @category Unstable\n * @unstable — logging injection contract; implement to route logs to host logging stack.\n */\nexport type { ILogger } from './types'\n\n/**\n * @category Unstable\n * @unstable — persistence adapter contract; implement to save/restore machine state.\n */\nexport type { StatePersistenceAdapter } from './types'\n\n/**\n * @category Unstable\n * @unstable — transition observability context passed to IMonitor.recordTransition.\n */\nexport type { TransitionContext } from './types'\n\n/**\n * @category Unstable\n * @unstable — aggregate observability snapshot returned by IMonitor.getMetrics.\n */\nexport type { MonitorMetricsSnapshot } from './types'\n","import type { ITimerScheduler } from './types'\n\n/**\n * Тип для идентификатора таймера\n */\ntype TimerToken = object\n\ninterface TimerTask {\n token: TimerToken\n executeAt: number\n callback: () => void\n}\n\n/**\n * Планировщик таймеров на базе Min-Heap (Двоичная куча).\n * Позволяет эффективно управлять тысячами таймеров, используя единый цикл проверки.\n */\nexport class TimerScheduler {\n // Min-Heap: элемент с наименьшим executeAt всегда в index 0\n private heap: TimerTask[] = []\n\n // Set для быстрой проверки отмененных задач (Lazy Cancellation)\n // Это позволяет удалять задачи за O(1) без поиска в куче O(n)\n private activeTokens: WeakSet<TimerToken> = new WeakSet()\n\n private intervalId: any = null\n private pollingInterval = 100 // ms\n\n constructor() {}\n\n /**\n * Настройка режима опроса\n * @param interval Интервал проверки в мс. Если 0 или null - авто-тик выключается (ручной режим)\n */\n public setPollingInterval(interval: number | null) {\n this.stop()\n if (interval !== null && interval > 0) {\n this.pollingInterval = interval\n this.start()\n }\n }\n\n /**\n * Проверка активности планировщика\n */\n public isActive(): boolean {\n return this.intervalId !== null\n }\n\n /**\n * Запуск единого таймера\n */\n public start() {\n if (this.intervalId) return\n this.intervalId = setInterval(() => this.process(), this.pollingInterval)\n }\n\n /**\n * Остановка единого таймера\n */\n public stop() {\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = null\n }\n }\n\n /**\n * Добавить задачу\n * @param delay задержка в мс\n * @param callback функция для выполнения\n * @returns токен для отмены\n */\n public schedule(delay: number, callback: () => void): TimerToken {\n const token = {}\n const executeAt = Date.now() + delay\n\n const task: TimerTask = { token, executeAt, callback }\n\n this.activeTokens.add(token)\n this.insert(task)\n\n return token\n }\n\n /**\n * Отменить задачу\n * @param token токен задачи\n */\n public cancel(token: TimerToken) {\n // Просто удаляем из активных токенов.\n // Задача останется в куче, но будет пропущена при обработке (Lazy Delete).\n this.activeTokens.delete(token)\n }\n\n /**\n * Обработать очередь (вызывается таймером или вручную)\n */\n public process(now: number = Date.now()) {\n while (this.heap.length > 0) {\n // Смотрим на самый ранний таймер\n const task = this.heap[0]\n /* c8 ignore next */ if (task === undefined) break\n\n // Если его время еще не пришло - останавливаемся\n if (task.executeAt > now) {\n break\n }\n\n // Извлекаем задачу\n this.extractMin()\n\n // Если задача не была отменена - выполняем\n if (this.activeTokens.has(task.token)) {\n this.activeTokens.delete(task.token)\n try {\n task.callback()\n } catch (e) {\n console.error('Error in scheduled task', e)\n }\n }\n }\n }\n\n /**\n * Очистить все задачи\n */\n public clear() {\n this.heap = []\n // WeakSet нельзя очистить явно, но это и не нужно,\n // так как без ссылок из heap токены будут собраны GC\n this.activeTokens = new WeakSet()\n }\n\n // === Min-Heap Implementation ===\n\n private insert(task: TimerTask) {\n this.heap.push(task)\n this.bubbleUp(this.heap.length - 1)\n }\n\n private extractMin(): TimerTask | undefined {\n /* c8 ignore next */ if (this.heap.length === 0) return undefined\n\n const min = this.heap[0]\n /* c8 ignore next */ if (min === undefined) return undefined\n const last = this.heap.pop()\n\n if (this.heap.length > 0 && last !== undefined) {\n this.heap[0] = last\n this.sinkDown(0)\n }\n\n return min\n }\n\n private bubbleUp(index: number) {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2)\n const parent = this.heap[parentIndex]\n const current = this.heap[index]\n /* c8 ignore next */ if (parent === undefined || current === undefined) break\n if (parent.executeAt <= current.executeAt) break\n\n this.swap(index, parentIndex)\n index = parentIndex\n }\n }\n\n private sinkDown(index: number) {\n const length = this.heap.length\n const element = this.heap[index]\n /* c8 ignore next */ if (element === undefined) return\n\n while (true) {\n const leftChildIdx = 2 * index + 1\n const rightChildIdx = 2 * index + 2\n let swapIdx: number | null = null\n\n if (leftChildIdx < length) {\n const leftChild = this.heap[leftChildIdx]\n if (leftChild !== undefined && leftChild.executeAt < element.executeAt) {\n swapIdx = leftChildIdx\n }\n }\n\n if (rightChildIdx < length) {\n const rightChild = this.heap[rightChildIdx]\n /* c8 ignore next */\n if (rightChild !== undefined) {\n if (\n (swapIdx === null && rightChild.executeAt < element.executeAt) ||\n /* c8 ignore next */\n (swapIdx !== null && this.heap[swapIdx] !== undefined &&\n rightChild.executeAt < this.heap[swapIdx]!.executeAt)\n ) {\n swapIdx = rightChildIdx\n }\n }\n }\n\n if (swapIdx === null) break\n\n this.swap(index, swapIdx)\n index = swapIdx\n }\n }\n\n private swap(a: number, b: number) {\n const temp = this.heap[a]\n const other = this.heap[b]\n /* c8 ignore next */ if (temp === undefined || other === undefined) return\n this.heap[a] = other\n this.heap[b] = temp\n }\n}\n\n/**\n * @internal — default factory for StateMachine.scheduler injection slot.\n * Returns a new TimerScheduler instance (NOT a singleton).\n * Same-module placement required: TimerScheduler constructor is public within module.\n */\nexport function createDefaultScheduler(): ITimerScheduler {\n return new TimerScheduler()\n}\n","/**\n * Professional logging system for StateMachine library\n * Replaces console.log/console.error with configurable, structured logging\n */\n\n// Log levels in order of severity\nexport const LogLevel = {\n DEBUG: 0,\n INFO: 1,\n WARN: 2,\n ERROR: 3,\n FATAL: 4,\n OFF: 5,\n} as const\n\nexport type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]\n\n// Log level names for display\nconst LogLevelNames: Record<LogLevel, string> = {\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.ERROR]: 'ERROR',\n [LogLevel.FATAL]: 'FATAL',\n [LogLevel.OFF]: 'OFF',\n}\n\n// Log entry structure\ninterface LogEntry {\n timestamp: number\n level: LogLevel\n message: string\n context?: Record<string, any>\n error?: Error\n source: string\n}\n\n// Logger configuration\ninterface LoggerConfig {\n level: LogLevel\n enableConsole: boolean\n enableStructuredLogging: boolean\n timestampFormat: 'iso' | 'unix' | 'relative'\n includeStackTrace: boolean\n}\n\n// Default logger configuration\nexport const DEFAULT_LOGGER_CONFIG: LoggerConfig = {\n level: LogLevel.WARN, // Only warnings and above in production\n enableConsole: true,\n enableStructuredLogging: false,\n timestampFormat: 'iso',\n includeStackTrace: false,\n}\n\n// Log appender interface for extensibility\ninterface LogAppender {\n append(entry: LogEntry): void\n}\n\n// Console appender implementation\nexport class ConsoleAppender implements LogAppender {\n private config: LoggerConfig\n\n constructor(config: LoggerConfig) {\n this.config = config\n }\n\n append(entry: LogEntry): void {\n if (!this.config.enableConsole) return\n\n const timestamp = this.formatTimestamp(entry.timestamp)\n const levelName = LogLevelNames[entry.level]\n const prefix = `[${timestamp}] [${levelName}] [${entry.source}]`\n\n if (this.config.enableStructuredLogging) {\n const structuredEntry = {\n timestamp: entry.timestamp,\n level: levelName,\n source: entry.source,\n message: entry.message,\n context: entry.context,\n error: entry.error?.message,\n }\n console.log(JSON.stringify(structuredEntry))\n } else {\n const message = `${prefix} ${entry.message}`\n\n switch (entry.level) {\n case LogLevel.DEBUG:\n case LogLevel.INFO:\n console.log(message, entry.context || '')\n break\n case LogLevel.WARN:\n console.warn(message, entry.context || '')\n break\n case LogLevel.ERROR:\n case LogLevel.FATAL:\n console.error(message, entry.context || '', entry.error || '')\n if (this.config.includeStackTrace && entry.error) {\n console.error(entry.error.stack)\n }\n break\n }\n }\n }\n\n private formatTimestamp(timestamp: number): string {\n switch (this.config.timestampFormat) {\n case 'unix':\n return timestamp.toString()\n case 'relative':\n return `+${timestamp - Date.now()}ms`\n case 'iso':\n default:\n return new Date(timestamp).toISOString()\n }\n }\n}\n\n// Memory appender for testing\nexport class MemoryAppender implements LogAppender {\n private entries: LogEntry[] = []\n\n append(entry: LogEntry): void {\n this.entries.push(entry)\n }\n\n getEntries(): LogEntry[] {\n return [...this.entries]\n }\n\n clear(): void {\n this.entries = []\n }\n\n getEntriesByLevel(level: LogLevel): LogEntry[] {\n return this.entries.filter((entry) => entry.level === level)\n }\n}\n\n// Main logger class\nexport class Logger {\n private config: LoggerConfig\n private appenders: LogAppender[] = []\n private source: string\n\n constructor(source: string, config: Partial<LoggerConfig> = {}) {\n this.source = source\n this.config = { ...DEFAULT_LOGGER_CONFIG, ...config }\n\n // Add default console appender\n this.appenders.push(new ConsoleAppender(this.config))\n }\n\n // Add custom appender\n addAppender(appender: LogAppender): void {\n this.appenders.push(appender)\n }\n\n // Remove appender\n removeAppender(appender: LogAppender): void {\n const index = this.appenders.indexOf(appender)\n if (index > -1) {\n this.appenders.splice(index, 1)\n }\n }\n\n // Update configuration\n updateConfig(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config }\n }\n\n // Check if level is enabled\n isLevelEnabled(level: LogLevel): boolean {\n return level >= this.config.level && this.config.level !== LogLevel.OFF\n }\n\n // Core logging method\n private log(\n level: LogLevel,\n message: string,\n context?: Record<string, any>,\n error?: Error,\n ): void {\n if (!this.isLevelEnabled(level)) return\n\n const entry: LogEntry = {\n timestamp: Date.now(),\n level,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(error !== undefined ? { error } : {}),\n source: this.source,\n }\n\n this.appenders.forEach((appender) => {\n try {\n appender.append(entry)\n } catch (e) {\n // Fallback to console if appender fails\n console.error('Logger appender failed:', e)\n }\n })\n }\n\n // Convenience methods\n debug(message: string, context?: Record<string, any>): void {\n this.log(LogLevel.DEBUG, message, context)\n }\n\n info(message: string, context?: Record<string, any>): void {\n this.log(LogLevel.INFO, message, context)\n }\n\n warn(message: string, context?: Record<string, any>): void {\n this.log(LogLevel.WARN, message, context)\n }\n\n error(message: string, context?: Record<string, any>, error?: Error): void {\n this.log(LogLevel.ERROR, message, context, error)\n }\n\n fatal(message: string, context?: Record<string, any>, error?: Error): void {\n this.log(LogLevel.FATAL, message, context, error)\n }\n\n // Create child logger with additional context\n child(childSource: string, _additionalContext?: Record<string, any>): Logger {\n const childLogger = new Logger(`${this.source}.${childSource}`, this.config)\n childLogger.appenders = this.appenders\n return childLogger\n }\n}\n\n// Global logger factory\nexport class LoggerFactory {\n private static defaultConfig: LoggerConfig = DEFAULT_LOGGER_CONFIG\n private static loggers: Map<string, Logger> = new Map()\n\n static setDefaultConfig(config: Partial<LoggerConfig>): void {\n LoggerFactory.defaultConfig = { ...DEFAULT_LOGGER_CONFIG, ...config }\n }\n\n static getLogger(source: string, config?: Partial<LoggerConfig>): Logger {\n const key = source\n if (!LoggerFactory.loggers.has(key)) {\n const loggerConfig = config\n ? { ...LoggerFactory.defaultConfig, ...config }\n : LoggerFactory.defaultConfig\n LoggerFactory.loggers.set(key, new Logger(source, loggerConfig))\n }\n return LoggerFactory.loggers.get(key)!\n }\n\n static clearLoggers(): void {\n LoggerFactory.loggers.clear()\n }\n}\n\n// Convenience exports\nexport const getLogger = LoggerFactory.getLogger\nexport const setDefaultLogLevel = (level: LogLevel) => {\n LoggerFactory.setDefaultConfig({ level })\n}\n\n// Pre-configured loggers for common use cases\nexport const stateMachineLogger = getLogger('StateMachine')\nexport const securityLogger = getLogger('Security')\n","/**\n * @deprecated Will be removed in a follow-up task. Security policy enforcement should\n * happen at the host-application layer; this module is a source-tree marker.\n *\n * Post TD-T3-4 pruning, symbols from this module are not reachable from `dist/index.js` —\n * the deprecation has no public deprecation cycle, only source-tree intent.\n *\n * Governance treatments (multi-treatment file, per TASK-003 CODE_REVIEW F-CR3-8):\n * - tsconfig.json `include: [\"src/**\\/*\"]` — typechecked under strict TS for now\n * - vitest.config.ts `coverage.exclude` — excluded from coverage instrumentation\n * - knip.json `ignore` — excluded from unused-export warnings\n * - package.json `files: [\"dist\", \"types\", ...]` — NOT shipped to npm (since TASK-003 CODE_REVIEW F-CR3-1)\n *\n * Removal trigger: when no in-tree code references the file (currently `src/tests/security.test.ts`\n * does), delete the file plus its test plus all four governance-list entries above.\n *\n * Security module for safe function serialization and validation\n * Replaces unsafe `new Function()` usage with secure alternatives\n */\n\nimport { securityLogger } from './logger'\nimport type {\n ActionOrString,\n ErrorHandler,\n ErrorHandlerOrString,\n EventAction,\n KeysOf,\n} from './types'\n\n// Configuration for function security\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport interface FunctionSecurityConfig {\n allowedFunctionNames: Set<string>\n maxFunctionLength: number\n enableValidation: boolean\n customPatterns?: DangerousPattern[]\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport type FunctionRiskLevel = 'low' | 'medium' | 'high' | 'critical'\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport interface DangerousPattern {\n pattern: RegExp\n risk: FunctionRiskLevel\n description: string\n category?: string\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport interface FunctionValidationResult {\n isValid: boolean\n errors: string[]\n riskLevel: FunctionRiskLevel\n detectedPatterns: string[]\n}\n\nconst BUILTIN_PATTERNS: DangerousPattern[] = [\n {\n pattern: /\\beval\\s*\\(/gi,\n risk: 'critical',\n description: 'Direct eval() usage',\n category: 'eval',\n },\n {\n pattern: /\\bFunction\\s*\\(/gi,\n risk: 'high',\n description: 'Dynamic Function constructor call',\n category: 'eval',\n },\n {\n pattern: /new\\s+Function\\s*\\(/gi,\n risk: 'high',\n description: 'Dynamic function creation',\n category: 'eval',\n },\n {\n pattern: /setTimeout\\s*\\(\\s*['\"`][^'\"`]*['\"`]/gi,\n risk: 'high',\n description: 'setTimeout with string code',\n category: 'eval',\n },\n {\n pattern: /setInterval\\s*\\(\\s*['\"`][^'\"`]*['\"`]/gi,\n risk: 'high',\n description: 'setInterval with string code',\n category: 'eval',\n },\n {\n pattern: /\\bfetch\\s*\\(/gi,\n risk: 'medium',\n description: 'Network request via fetch',\n category: 'network',\n },\n {\n pattern: /XMLHttpRequest/gi,\n risk: 'medium',\n description: 'XMLHttpRequest usage',\n category: 'network',\n },\n {\n pattern: /WebSocket/gi,\n risk: 'medium',\n description: 'WebSocket connection',\n category: 'network',\n },\n {\n pattern: /require\\s*\\(\\s*['\"`]fs['\"`]\\s*\\)/gi,\n risk: 'high',\n description: 'File system access via require(\"fs\")',\n category: 'filesystem',\n },\n {\n pattern: /import.*from\\s*['\"`]fs['\"`]/gi,\n risk: 'high',\n description: 'File system access via import',\n category: 'filesystem',\n },\n {\n pattern: /document\\./gi,\n risk: 'medium',\n description: 'DOM access',\n category: 'dom',\n },\n {\n pattern: /window\\./gi,\n risk: 'medium',\n description: 'Window object access',\n category: 'dom',\n },\n {\n pattern: /innerHTML/gi,\n risk: 'high',\n description: 'innerHTML manipulation (XSS risk)',\n category: 'dom',\n },\n {\n pattern: /global\\./gi,\n risk: 'high',\n description: 'Global scope access',\n category: 'global',\n },\n {\n pattern: /process\\./gi,\n risk: 'high',\n description: 'Process object access',\n category: 'process',\n },\n {\n pattern: /child_process/gi,\n risk: 'critical',\n description: 'Child process execution',\n category: 'process',\n },\n {\n pattern: /exec\\s*\\(/gi,\n risk: 'critical',\n description: 'Command execution',\n category: 'process',\n },\n {\n pattern: /require\\s*\\(/gi,\n risk: 'critical',\n description: 'CommonJS require',\n category: 'module',\n },\n {\n pattern: /import\\s*\\(/gi,\n risk: 'critical',\n description: 'Dynamic import',\n category: 'module',\n },\n {\n pattern: /__proto__/gi,\n risk: 'critical',\n description: 'Prototype pollution',\n category: 'prototype',\n },\n {\n pattern: /constructor/gi,\n risk: 'critical',\n description: 'Constructor access',\n category: 'prototype',\n },\n {\n pattern: /prototype/gi,\n risk: 'critical',\n description: 'Prototype access',\n category: 'prototype',\n },\n {\n pattern: /\\[['\"]__proto__['\"]\\]/gi,\n risk: 'critical',\n description: 'Prototype pollution via bracket notation',\n category: 'prototype',\n },\n {\n pattern: /constructor\\s*\\[/gi,\n risk: 'critical',\n description: 'Constructor access via bracket notation',\n category: 'prototype',\n },\n]\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport const DEFAULT_SECURITY_CONFIG: FunctionSecurityConfig = {\n allowedFunctionNames: new Set([\n // Common safe function patterns\n 'onEnter',\n 'onExit',\n 'onBeforeEnter',\n 'onAfterEnter',\n 'onBeforeExit',\n 'onAfterExit',\n 'onTransition',\n 'onError',\n 'guard',\n 'onBefore',\n 'onAfter',\n 'onSuccess',\n\n // Internal serializer function names (used as metadata)\n 'config_onError',\n 'state_onError',\n 'event_onBefore',\n 'event_onAfter',\n 'event_onSuccess',\n 'event_onError',\n 'transition_guard',\n 'transition_onTransition',\n 'transition_onError',\n 'invoke_cond',\n 'invoke_action',\n\n // Legacy deserialization marker\n 'legacy_deserialization',\n ]),\n maxFunctionLength: 10000, // 10KB limit\n enableValidation: true,\n customPatterns: [],\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport type SafeSerializedAction =\n | {\n type: 'string'\n name: string\n }\n | {\n type: 'function'\n body: string\n hash: string // Security hash for validation\n metadata: {\n length: number\n createdAt: number\n functionName?: string\n }\n }\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport class FunctionValidator {\n private config: FunctionSecurityConfig\n private allPatterns: DangerousPattern[]\n\n constructor(config: Partial<FunctionSecurityConfig> = {}) {\n this.config = { ...DEFAULT_SECURITY_CONFIG, ...config }\n this.allPatterns = [\n ...BUILTIN_PATTERNS,\n ...(this.config.customPatterns ?? []),\n ]\n }\n\n public addCustomPattern(pattern: DangerousPattern): void {\n this.allPatterns.push(pattern)\n }\n\n /**\n * Validates function body for security threats.\n *\n * Never throws: returns a structured result.\n */\n validate(body: string, functionName?: string): FunctionValidationResult {\n if (!this.config.enableValidation) {\n return {\n isValid: true,\n errors: [],\n riskLevel: 'low',\n detectedPatterns: [],\n }\n }\n\n const errors: string[] = []\n const detectedPatterns: string[] = []\n let riskLevel: FunctionRiskLevel = 'low'\n\n // Check length limit\n if (body.length > this.config.maxFunctionLength) {\n errors.push(\n `Function body exceeds maximum length of ${this.config.maxFunctionLength} characters`,\n )\n riskLevel = 'high'\n }\n\n const riskPriority: Record<FunctionRiskLevel, number> = {\n low: 0,\n medium: 1,\n high: 2,\n critical: 3,\n }\n\n for (const { pattern, risk, description } of this.allPatterns) {\n if (pattern.global || pattern.sticky) {\n pattern.lastIndex = 0\n }\n if (pattern.test(body)) {\n errors.push(`Function contains dangerous pattern: ${description}`)\n detectedPatterns.push(description)\n if (riskPriority[risk] > riskPriority[riskLevel]) {\n riskLevel = risk\n }\n }\n }\n\n // Validate function name if provided\n if (functionName && !this.config.allowedFunctionNames.has(functionName)) {\n errors.push(`Function name '${functionName}' is not in allowed list`)\n if (riskLevel === 'low') riskLevel = 'medium'\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n riskLevel,\n detectedPatterns,\n }\n }\n\n /**\n * Validates function body for security threats\n */\n validateFunctionBody(body: string, functionName?: string): boolean {\n const result = this.validate(body, functionName)\n if (!result.isValid) {\n throw new Error(result.errors.join('; '))\n }\n return result.isValid\n }\n\n /**\n * Creates a security hash for function validation\n */\n async createSecurityHash(body: string, metadata: any): Promise<string> {\n // Use Web Crypto API for secure hashing\n const encoder = new TextEncoder()\n const data = encoder.encode(body + JSON.stringify(metadata))\n\n // Check if crypto is available (Browser/Node/Bun)\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n return Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n\n // Fallback for environments without crypto.subtle (should be rare in modern envs)\n // Using a slightly better non-crypto hash (FNV-1a inspired) than the previous simple shift\n const str = body + JSON.stringify(metadata)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n return (hash >>> 0).toString(16)\n }\n\n /**\n * Validates security hash\n */\n async validateSecurityHash(\n body: string,\n metadata: any,\n expectedHash: string,\n ): Promise<boolean> {\n const actualHash = await this.createSecurityHash(body, metadata)\n return actualHash === expectedHash\n }\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport class SafeFunctionSerializer {\n public validator: FunctionValidator\n\n constructor(config?: Partial<FunctionSecurityConfig>) {\n this.validator = new FunctionValidator(config)\n }\n\n /**\n * Safely serializes an action with security validation (Async)\n */\n async serializeActionAsync<TOwner extends object, R = void>(\n action: ActionOrString<TOwner, R> | ErrorHandlerOrString<TOwner>,\n functionName?: string,\n ): Promise<SafeSerializedAction | undefined> {\n if (typeof action === 'string') {\n return { type: 'string', name: action }\n } else if (typeof action === 'function') {\n const body = action.toString()\n\n // Validate function body\n this.validator.validateFunctionBody(body, functionName)\n\n const metadata = {\n length: body.length,\n createdAt: Date.now(),\n ...(functionName !== undefined ? { functionName } : {}),\n }\n\n const hash = await this.validator.createSecurityHash(body, metadata)\n\n return {\n type: 'function',\n body,\n hash,\n metadata,\n }\n }\n return undefined\n }\n\n /**\n * Legacy synchronous serialization (Uses weak hash, kept for backward compatibility)\n * @deprecated Use serializeActionAsync instead for better security\n */\n serializeAction<TOwner extends object, R = void>(\n action: ActionOrString<TOwner, R> | ErrorHandlerOrString<TOwner>,\n functionName?: string,\n ): SafeSerializedAction | undefined {\n if (typeof action === 'string') {\n return { type: 'string', name: action }\n } else if (typeof action === 'function') {\n const body = action.toString()\n this.validator.validateFunctionBody(body, functionName)\n\n const metadata = {\n length: body.length,\n createdAt: Date.now(),\n ...(functionName !== undefined ? { functionName } : {}),\n }\n\n // Sync version uses the weak fallback hash logic implicitly or needs a sync version of createHash\n // We'll implement a sync weak hash here inline to preserve sync behavior\n const str = body + JSON.stringify(metadata)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n\n return {\n type: 'function',\n body,\n hash: (hash >>> 0).toString(16),\n metadata,\n }\n }\n return undefined\n }\n\n /**\n * Safely deserializes an action with security validation (Async)\n */\n async deserializeActionAsync<TOwner extends object, R = void>(\n serializedAction: SafeSerializedAction | undefined,\n ): Promise<\n ActionOrString<TOwner, R> | ErrorHandlerOrString<TOwner> | undefined\n > {\n if (!serializedAction) {\n return undefined\n }\n\n if (serializedAction.type === 'string') {\n return serializedAction.name as KeysOf<TOwner, EventAction<TOwner, R>>\n } else if (serializedAction.type === 'function') {\n try {\n // Validate security hash\n const isValid = await this.validator.validateSecurityHash(\n serializedAction.body,\n serializedAction.metadata,\n serializedAction.hash,\n )\n\n if (!isValid) {\n // Fallback check for legacy weak hash if crypto hash failed\n // This allows reading old backups/configs\n const str =\n serializedAction.body + JSON.stringify(serializedAction.metadata)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n const legacyHash = (hash >>> 0).toString(16)\n\n if (legacyHash !== serializedAction.hash) {\n throw new Error('Function security hash validation failed')\n }\n }\n\n // Re-validate function body\n this.validator.validateFunctionBody(\n serializedAction.body,\n serializedAction.metadata.functionName,\n )\n\n // Create function using safe method\n return this.createSafeFunction(serializedAction.body)\n } catch (e) {\n securityLogger.error(\n 'Error deserializing function',\n {\n functionName: serializedAction.metadata.functionName,\n bodyLength: serializedAction.body.length,\n hash: serializedAction.hash,\n },\n e instanceof Error ? e : new Error(String(e)),\n )\n return undefined\n }\n }\n return undefined\n }\n\n /**\n * Safely deserializes an action (Synchronous - Legacy/Weak)\n */\n deserializeAction<TOwner extends object, R = void>(\n serializedAction: SafeSerializedAction | undefined,\n ): ActionOrString<TOwner, R> | ErrorHandlerOrString<TOwner> | undefined {\n if (!serializedAction) {\n return undefined\n }\n\n if (serializedAction.type === 'string') {\n return serializedAction.name as KeysOf<TOwner, EventAction<TOwner, R>>\n } else if (serializedAction.type === 'function') {\n try {\n // Sync validation only checks weak hash\n const str =\n serializedAction.body + JSON.stringify(serializedAction.metadata)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n const calculatedHash = (hash >>> 0).toString(16)\n\n if (calculatedHash !== serializedAction.hash) {\n // We cannot verify crypto hashes synchronously, so we must fail or skip verification\n // for crypto hashes. If the hash looks like a weak hash (short hex), we check it.\n // If it looks like SHA-256 (64 chars), we can't verify it sync.\n if (serializedAction.hash.length === 64) {\n console.warn(\n 'Warning: Skipping verification of SHA-256 hash in synchronous deserializeAction. Use deserializeActionAsync for security.',\n )\n } else {\n throw new Error('Function security hash validation failed (Legacy)')\n }\n }\n\n this.validator.validateFunctionBody(\n serializedAction.body,\n serializedAction.metadata.functionName,\n )\n\n return this.createSafeFunction(serializedAction.body)\n } catch (e) {\n securityLogger.error(\n 'Error deserializing function',\n {\n functionName: serializedAction.metadata.functionName,\n bodyLength: serializedAction.body.length,\n hash: serializedAction.hash,\n },\n e instanceof Error ? e : new Error(String(e)),\n )\n return undefined\n }\n }\n return undefined\n }\n\n /**\n * Safely deserializes legacy function strings (without security metadata)\n * This method provides backward compatibility for old string-based function serialization\n * while maintaining security through validation and sandboxing.\n */\n deserializeLegacyString(\n action: string,\n ): EventAction<any> | ErrorHandler<any> | undefined {\n if (!action || typeof action !== 'string') {\n return undefined\n }\n\n try {\n // Validate function body for security threats\n this.validator.validateFunctionBody(action, 'legacy_deserialization')\n\n // Create function using the same safe method as modern serialization\n return this.createSafeFunction(action)\n } catch (e) {\n securityLogger.error(\n 'Blocked unsafe legacy function string',\n { actionLength: action.length },\n e instanceof Error ? e : new Error(String(e)),\n )\n return undefined\n }\n }\n\n /**\n * Creates a function safely without using new Function()\n * Uses a whitelist approach with predefined function templates\n */\n private createSafeFunction(\n body: string,\n ): EventAction<any> | ErrorHandler<any> {\n // For now, we'll use a safer approach with Function constructor\n // but with additional validation and sandboxing.\n //\n // Important: we must preserve the original function *signature* (parameter names),\n // because state machine code calls hooks/conditions with specific arguments\n // (e.g. invoke.cond(adaptee)). Stripping the wrapper breaks that contract.\n try {\n const source = body.trim()\n\n // Executor runs in a restricted scope and evaluates the provided function source\n // as an expression, then calls it with (adaptee, ...args).\n const executor = new Function(\n 'adaptee',\n 'args',\n `\n // Block dangerous globals by creating local variables that shadow them\n var eval = undefined;\n var Function = undefined;\n var setTimeout = undefined;\n var setInterval = undefined;\n var document = undefined;\n var window = undefined;\n var global = undefined;\n var process = undefined;\n var require = undefined;\n\n const __fn = (${source});\n if (typeof __fn !== 'function') {\n throw new Error('Deserialized source is not a function');\n }\n return __fn(adaptee, ...(Array.isArray(args) ? args : []));\n `,\n ) as (adaptee: any, args: any[]) => any\n\n // Preserve varargs call style used across the codebase.\n return ((adaptee: any, ...args: any[]) => executor(adaptee, args)) as\n | EventAction<any>\n | ErrorHandler<any>\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e)\n throw new Error(`Failed to create safe function: ${message}`)\n }\n }\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\n// Global instance for convenience\nexport const safeFunctionSerializer = new SafeFunctionSerializer()\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport const serializeAction = safeFunctionSerializer.serializeAction.bind(\n safeFunctionSerializer,\n)\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport const deserializeAction = safeFunctionSerializer.deserializeAction.bind(\n safeFunctionSerializer,\n)\n","// Monitoring and metrics module for StateMachine\n// Provides essential monitoring for state machine transitions and errors\n\nimport { stateMachineLogger } from './logger'\nimport type { ErrorContext, IMonitor, MonitorMetricsSnapshot, TransitionContext } from './types'\n\n/**\n * Performance metrics interface\n */\ninterface PerformanceMetrics {\n transitionTime: number\n stateChangeCount: number\n errorCount: number\n timestamp: number\n}\n\n/**\n * Health check status\n */\nexport const HealthStatus = {\n HEALTHY: 'healthy',\n WARNING: 'warning',\n CRITICAL: 'critical',\n UNKNOWN: 'unknown',\n} as const\n\nexport type HealthStatus = (typeof HealthStatus)[keyof typeof HealthStatus]\n\n/**\n * Health check result\n */\ninterface HealthCheckResult {\n status: HealthStatus\n message: string\n timestamp: number\n metrics?: Record<string, any>\n}\n\n/**\n * Monitoring configuration\n */\nexport interface MonitoringConfig {\n enabled: boolean\n metricsInterval: number // milliseconds\n healthCheckInterval: number // milliseconds\n maxMetricsHistory: number\n thresholds: {\n transitionTimeWarning: number // milliseconds\n transitionTimeCritical: number // milliseconds\n errorRateWarning: number // percentage\n errorRateCritical: number // percentage\n }\n}\n\n/**\n * Default monitoring configuration\n */\nexport const DEFAULT_MONITORING_CONFIG: MonitoringConfig = {\n enabled: true,\n metricsInterval: 5000, // 5 seconds\n healthCheckInterval: 30000, // 30 seconds\n maxMetricsHistory: 1000,\n thresholds: {\n transitionTimeWarning: 100, // 100ms\n transitionTimeCritical: 500, // 500ms\n errorRateWarning: 5, // 5%\n errorRateCritical: 15, // 15%\n },\n}\n\n/**\n * Metrics collector for StateMachine performance monitoring\n */\nexport class MetricsCollector {\n private metrics: PerformanceMetrics[] = []\n private config: MonitoringConfig\n private startTime: number = Date.now()\n private transitionCount = 0\n private errorCount = 0\n\n constructor(config: Partial<MonitoringConfig> = {}) {\n this.config = { ...DEFAULT_MONITORING_CONFIG, ...config }\n }\n\n /**\n * Record a state transition\n */\n recordTransition(transitionTime: number): void {\n if (!this.config.enabled) return\n\n this.transitionCount++\n\n const metrics: PerformanceMetrics = {\n transitionTime,\n stateChangeCount: this.transitionCount,\n errorCount: this.errorCount,\n timestamp: Date.now(),\n }\n\n this.addMetrics(metrics)\n this.logMetrics(metrics)\n }\n\n /**\n * Record an error\n */\n recordError(): void {\n if (!this.config.enabled) return\n this.errorCount++\n }\n\n /**\n * Get current metrics summary\n */\n getMetricsSummary(): {\n totalTransitions: number\n totalErrors: number\n averageTransitionTime: number\n errorRate: number\n uptime: number\n } {\n const now = Date.now()\n const uptime = now - this.startTime\n const recentMetrics = this.getRecentMetrics(60000) // Last minute\n\n const averageTransitionTime =\n recentMetrics.length > 0\n ? recentMetrics.reduce((sum, m) => sum + m.transitionTime, 0) /\n recentMetrics.length\n : 0\n\n const errorRate =\n this.transitionCount > 0\n ? (this.errorCount / this.transitionCount) * 100\n : 0\n\n return {\n totalTransitions: this.transitionCount,\n totalErrors: this.errorCount,\n averageTransitionTime,\n errorRate,\n uptime,\n }\n }\n\n /**\n * Get metrics history\n */\n getMetricsHistory(timeRange?: number): PerformanceMetrics[] {\n if (timeRange) {\n return this.getRecentMetrics(timeRange)\n }\n return [...this.metrics]\n }\n\n /**\n * Clear metrics history\n */\n clearMetrics(): void {\n this.metrics = []\n this.transitionCount = 0\n this.errorCount = 0\n this.startTime = Date.now()\n }\n\n /**\n * Get recent metrics within time range\n */\n private getRecentMetrics(timeRange: number): PerformanceMetrics[] {\n const cutoff = Date.now() - timeRange\n return this.metrics.filter((m) => m.timestamp >= cutoff)\n }\n\n /**\n * Add metrics to history with size limit\n */\n private addMetrics(metrics: PerformanceMetrics): void {\n this.metrics.push(metrics)\n\n // Maintain size limit\n if (this.metrics.length > this.config.maxMetricsHistory) {\n this.metrics = this.metrics.slice(-this.config.maxMetricsHistory)\n }\n }\n\n /**\n * Log metrics if significant\n */\n private logMetrics(metrics: PerformanceMetrics): void {\n const { thresholds } = this.config\n\n if (metrics.transitionTime > thresholds.transitionTimeCritical) {\n stateMachineLogger.error('Critical transition time detected', {\n transitionTime: metrics.transitionTime,\n threshold: thresholds.transitionTimeCritical,\n })\n } else if (metrics.transitionTime > thresholds.transitionTimeWarning) {\n stateMachineLogger.warn('Slow transition detected', {\n transitionTime: metrics.transitionTime,\n threshold: thresholds.transitionTimeWarning,\n })\n }\n }\n}\n\n/**\n * Performance monitor for real-time tracking\n */\nexport class PerformanceMonitor {\n private metricsCollector: MetricsCollector\n private config: MonitoringConfig\n private intervalId: NodeJS.Timeout | undefined\n private isRunning = false\n\n constructor(\n metricsCollector: MetricsCollector,\n config: Partial<MonitoringConfig> = {},\n ) {\n this.metricsCollector = metricsCollector\n this.config = { ...DEFAULT_MONITORING_CONFIG, ...config }\n }\n\n /**\n * Start performance monitoring\n */\n start(): void {\n if (this.isRunning || !this.config.enabled) return\n\n this.isRunning = true\n this.intervalId = setInterval(() => {\n this.collectMetrics()\n }, this.config.metricsInterval)\n\n stateMachineLogger.info('Performance monitoring started', {\n interval: this.config.metricsInterval,\n })\n }\n\n /**\n * Stop performance monitoring\n */\n stop(): void {\n if (!this.isRunning) return\n\n this.isRunning = false\n /* c8 ignore next 4 */\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = undefined\n }\n\n stateMachineLogger.info('Performance monitoring stopped')\n }\n\n /**\n * Get current performance status\n */\n getPerformanceStatus(): {\n status: HealthStatus\n summary: ReturnType<MetricsCollector['getMetricsSummary']>\n issues: string[]\n } {\n const summary = this.metricsCollector.getMetricsSummary()\n const issues: string[] = []\n let status: HealthStatus = HealthStatus.HEALTHY\n\n // Check error rate\n if (summary.errorRate >= this.config.thresholds.errorRateCritical) {\n status = HealthStatus.CRITICAL\n issues.push(`Critical error rate: ${summary.errorRate.toFixed(2)}%`)\n } else if (summary.errorRate >= this.config.thresholds.errorRateWarning) {\n status = HealthStatus.WARNING\n issues.push(`High error rate: ${summary.errorRate.toFixed(2)}%`)\n }\n\n // Check transition time\n if (\n summary.averageTransitionTime >=\n this.config.thresholds.transitionTimeCritical\n ) {\n status = HealthStatus.CRITICAL\n issues.push(\n `Critical transition time: ${summary.averageTransitionTime.toFixed(2)}ms`,\n )\n } else if (\n summary.averageTransitionTime >=\n this.config.thresholds.transitionTimeWarning\n ) {\n if (status === HealthStatus.HEALTHY) status = HealthStatus.WARNING\n issues.push(\n `Slow transitions: ${summary.averageTransitionTime.toFixed(2)}ms`,\n )\n }\n\n return { status, summary, issues }\n }\n\n /**\n * Collect current metrics\n */\n private collectMetrics(): void {\n const summary = this.metricsCollector.getMetricsSummary()\n\n stateMachineLogger.debug('Performance metrics collected', {\n totalTransitions: summary.totalTransitions,\n errorRate: summary.errorRate,\n averageTransitionTime: summary.averageTransitionTime,\n })\n }\n}\n\n/**\n * Health checker for StateMachine instances\n */\nexport class HealthChecker {\n private performanceMonitor: PerformanceMonitor\n private config: MonitoringConfig\n private intervalId: NodeJS.Timeout | undefined\n private isRunning = false\n private lastHealthCheck: HealthCheckResult | undefined\n\n constructor(\n performanceMonitor: PerformanceMonitor,\n config: Partial<MonitoringConfig> = {},\n ) {\n this.performanceMonitor = performanceMonitor\n this.config = { ...DEFAULT_MONITORING_CONFIG, ...config }\n }\n\n /**\n * Start health checking\n */\n start(): void {\n if (this.isRunning || !this.config.enabled) return\n\n this.isRunning = true\n this.intervalId = setInterval(() => {\n this.performHealthCheck()\n }, this.config.healthCheckInterval)\n\n stateMachineLogger.info('Health checking started', {\n interval: this.config.healthCheckInterval,\n })\n }\n\n /**\n * Stop health checking\n */\n stop(): void {\n if (!this.isRunning) return\n\n this.isRunning = false\n /* c8 ignore next 4 */\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = undefined\n }\n\n stateMachineLogger.info('Health checking stopped')\n }\n\n /**\n * Perform immediate health check\n */\n performHealthCheck(): HealthCheckResult {\n const performanceStatus = this.performanceMonitor.getPerformanceStatus()\n\n const result: HealthCheckResult = {\n status: performanceStatus.status,\n message: this.generateHealthMessage(performanceStatus),\n timestamp: Date.now(),\n metrics: performanceStatus.summary,\n }\n\n this.lastHealthCheck = result\n this.logHealthCheck(result)\n\n return result\n }\n\n /**\n * Get last health check result\n */\n getLastHealthCheck(): HealthCheckResult | undefined {\n return this.lastHealthCheck\n }\n\n /**\n * Generate health message based on status\n */\n private generateHealthMessage(\n performanceStatus: ReturnType<PerformanceMonitor['getPerformanceStatus']>,\n ): string {\n const { status, issues, summary } = performanceStatus\n\n if (status === HealthStatus.HEALTHY) {\n return `StateMachine is healthy. ${summary.totalTransitions} transitions, ${summary.errorRate.toFixed(2)}% error rate`\n }\n\n if (status === HealthStatus.WARNING) {\n return `StateMachine has warnings: ${issues.join(', ')}`\n }\n\n /* c8 ignore next */\n if (status === HealthStatus.CRITICAL) {\n /* c8 ignore next */\n return `StateMachine is in critical state: ${issues.join(', ')}`\n }\n\n /* c8 ignore next */\n return 'StateMachine health status unknown'\n }\n\n /**\n * Log health check results\n */\n private logHealthCheck(result: HealthCheckResult): void {\n const logData = {\n status: result.status,\n message: result.message,\n metrics: result.metrics,\n }\n\n switch (result.status) {\n case HealthStatus.HEALTHY:\n stateMachineLogger.debug('Health check passed', logData)\n break\n case HealthStatus.WARNING:\n stateMachineLogger.warn('Health check warning', logData)\n break\n case HealthStatus.CRITICAL:\n stateMachineLogger.error('Health check critical', logData)\n break\n /* c8 ignore next 2 */\n default:\n stateMachineLogger.info('Health check completed', logData)\n }\n }\n}\n\n/**\n * Comprehensive monitoring system\n */\nexport class StateMachineMonitor {\n private metricsCollector: MetricsCollector\n private performanceMonitor: PerformanceMonitor\n private healthChecker: HealthChecker\n private config: MonitoringConfig\n\n constructor(config: Partial<MonitoringConfig> = {}) {\n this.config = { ...DEFAULT_MONITORING_CONFIG, ...config }\n this.metricsCollector = new MetricsCollector(this.config)\n this.performanceMonitor = new PerformanceMonitor(\n this.metricsCollector,\n this.config,\n )\n this.healthChecker = new HealthChecker(this.performanceMonitor, this.config)\n }\n\n /**\n * Start all monitoring components\n */\n start(): void {\n this.performanceMonitor.start()\n this.healthChecker.start()\n\n stateMachineLogger.info('StateMachine monitoring started', {\n config: this.config,\n })\n }\n\n /**\n * Stop all monitoring components\n */\n stop(): void {\n this.performanceMonitor.stop()\n this.healthChecker.stop()\n\n stateMachineLogger.info('StateMachine monitoring stopped')\n }\n\n /**\n * Record a transition for monitoring (F-T4-TS-5 widening: added success + context params)\n */\n recordTransition(transitionTime: number, success: boolean = true, _context?: TransitionContext): void {\n this.metricsCollector.recordTransition(transitionTime)\n if (!success) this.metricsCollector.recordError()\n // _context kept for future enrichment\n }\n\n /**\n * Record an error for monitoring (F-T4-TS-5 widening: added error + context params)\n */\n recordError(_error?: Error, _context?: ErrorContext): void {\n this.metricsCollector.recordError()\n }\n\n /**\n * Record an event for monitoring (optional IMonitor extension)\n */\n recordEvent(_eventName: string, _duration: number): void {\n // optional implementation; metrics enrichment deferred to follow-up\n }\n\n /**\n * Get aggregate metrics snapshot (optional IMonitor extension)\n */\n getMetrics(): MonitorMetricsSnapshot {\n const summary = this.metricsCollector.getMetricsSummary()\n return {\n totalTransitions: summary.totalTransitions,\n successCount: summary.totalTransitions - summary.totalErrors,\n errorCount: summary.totalErrors,\n averageDuration: summary.averageTransitionTime,\n }\n }\n\n /**\n * Get comprehensive monitoring report\n */\n getMonitoringReport(): {\n health: HealthCheckResult\n performance: ReturnType<PerformanceMonitor['getPerformanceStatus']>\n metrics: ReturnType<MetricsCollector['getMetricsSummary']>\n config: MonitoringConfig\n } {\n const health = this.healthChecker.performHealthCheck()\n const performance = this.performanceMonitor.getPerformanceStatus()\n const metrics = this.metricsCollector.getMetricsSummary()\n\n return {\n health,\n performance,\n metrics,\n config: this.config,\n }\n }\n\n /**\n * Export metrics for external monitoring systems\n */\n exportMetrics(): {\n prometheus?: string\n json: any\n } {\n const metrics = this.metricsCollector.getMetricsSummary()\n const health = this.healthChecker.getLastHealthCheck()\n\n const jsonExport = {\n timestamp: Date.now(),\n metrics,\n health,\n config: this.config,\n }\n\n // Prometheus format\n const prometheusExport = this.generatePrometheusMetrics(metrics, health)\n\n return {\n prometheus: prometheusExport,\n json: jsonExport,\n }\n }\n\n /**\n * Generate Prometheus-compatible metrics (without memory metrics)\n */\n private generatePrometheusMetrics(\n metrics: ReturnType<MetricsCollector['getMetricsSummary']>,\n health?: HealthCheckResult,\n ): string {\n const lines: string[] = []\n\n // Transitions counter\n lines.push(\n '# HELP statemachine_transitions_total Total number of state transitions',\n )\n lines.push('# TYPE statemachine_transitions_total counter')\n lines.push(`statemachine_transitions_total ${metrics.totalTransitions}`)\n\n // Errors counter\n lines.push('# HELP statemachine_errors_total Total number of errors')\n lines.push('# TYPE statemachine_errors_total counter')\n lines.push(`statemachine_errors_total ${metrics.totalErrors}`)\n\n // Average transition time\n lines.push(\n '# HELP statemachine_transition_time_avg Average transition time in milliseconds',\n )\n lines.push('# TYPE statemachine_transition_time_avg gauge')\n lines.push(\n `statemachine_transition_time_avg ${metrics.averageTransitionTime}`,\n )\n\n // Error rate\n lines.push('# HELP statemachine_error_rate Error rate percentage')\n lines.push('# TYPE statemachine_error_rate gauge')\n lines.push(`statemachine_error_rate ${metrics.errorRate}`)\n\n // Uptime\n lines.push('# HELP statemachine_uptime Uptime in milliseconds')\n lines.push('# TYPE statemachine_uptime gauge')\n lines.push(`statemachine_uptime ${metrics.uptime}`)\n\n // Health status\n if (health) {\n const healthValue =\n health.status === HealthStatus.HEALTHY\n ? 1\n : health.status === HealthStatus.WARNING\n ? 0.5\n : 0\n lines.push(\n '# HELP statemachine_health Health status (1=healthy, 0.5=warning, 0=critical)',\n )\n lines.push('# TYPE statemachine_health gauge')\n lines.push(`statemachine_health ${healthValue}`)\n }\n\n return lines.join('\\n')\n }\n}\n\n/**\n * @internal — default factory for StateMachine.monitor injection slot.\n * Returns a new StateMachineMonitor instance (NOT a singleton).\n */\nexport function createDefaultMonitor(): IMonitor {\n return new StateMachineMonitor()\n}\n\n/**\n * Utility functions for monitoring integration\n */\nexport const MonitoringUtils = {\n /**\n * Create monitoring decorator for StateMachine methods\n */\n withMonitoring<T extends (...args: any[]) => any>(\n fn: T,\n monitor: StateMachineMonitor,\n _operationName: string,\n ): T {\n return ((...args: any[]) => {\n const startTime = Date.now()\n\n try {\n const result = fn(...args)\n\n if (result instanceof Promise) {\n return result\n .then((value) => {\n monitor.recordTransition(Date.now() - startTime)\n return value\n })\n .catch((error) => {\n monitor.recordError()\n throw error\n })\n } else {\n monitor.recordTransition(Date.now() - startTime)\n return result\n }\n } catch (error) {\n monitor.recordError()\n throw error\n }\n }) as T\n },\n\n /**\n * Create monitoring middleware\n */\n createMonitoringMiddleware(monitor: StateMachineMonitor) {\n return {\n beforeTransition: (context: any) => {\n context._monitoringStartTime = Date.now()\n },\n afterTransition: (context: any) => {\n if (context._monitoringStartTime) {\n monitor.recordTransition(Date.now() - context._monitoringStartTime)\n }\n },\n onError: (_context: any, _error: any) => {\n monitor.recordError()\n },\n }\n },\n}\n","export type StateName = string\nexport type EventName = string\nexport type EventAction<T, R = void> = (adaptee: T, ...args: unknown[]) => R\nexport type ErrorHandler<T> = EventAction<T, void>\n\n// Helper type to extract only methods from a type T\nexport type MethodsOf<T> = {\n [K in keyof T as T[K] extends (...args: any[]) => any ? K : never]: T[K]\n}\n\n// Helper type to extract only properties (non-functions) from a type T\nexport type PropertiesOf<T> = {\n [K in keyof T as T[K] extends (...args: any[]) => any ? never : K]: T[K]\n}\n\nexport type KeysOf<T, R> = {\n [K in keyof T]: T[K] extends R ? K : never\n}[keyof T]\n\nexport type ErrorContext = {\n state?: StateName\n event?: EventName\n action?: string\n transition?: string\n phase?: 'guard' | 'action' | 'transition' | 'enter' | 'exit'\n}\n\nexport class StateMachineError extends Error {\n readonly context: ErrorContext\n\n constructor(message: string, context: ErrorContext, cause?: Error) {\n super(message)\n this.name = 'StateMachineError'\n this.context = context\n this.cause = cause\n /* c8 ignore next 3 */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, StateMachineError)\n }\n }\n\n override toString(): string {\n const { state, event, action, transition, phase } = this.context\n const details = []\n if (state) details.push(`state: ${state}`)\n if (event) details.push(`event: ${event}`)\n if (action) details.push(`action: ${action}`)\n if (transition) details.push(`transition: ${transition}`)\n if (phase) details.push(`phase: ${phase}`)\n\n return `${this.name}: ${this.message}${details.length ? ` (${details.join(', ')})` : ''}`\n }\n}\n\n// ✅ НОВОЕ: Абстракция логгера\nexport interface ILogger {\n debug(message: string, context?: any): void\n info(message: string, context?: any): void\n warn(message: string, context?: any, error?: Error): void\n error(message: string, context?: any, error?: Error): void\n}\n\n// === WASM-friendly injection contracts (per TD-T4-2a, TD-T4-2, TD-T4-2b) ===\n\n/** @unstable — timer scheduling injection contract; consumed by StateMachine. */\nexport interface ITimerScheduler {\n isActive(): boolean\n schedule(delay: number, callback: () => void): object\n cancel(token: object): void\n}\n\n/** @unstable — transition observability context (additive on IMonitor). */\nexport interface TransitionContext {\n fromState: string\n toState: string\n eventName?: string\n}\n\n/** @unstable — minimal aggregate observability snapshot for tests. */\nexport interface MonitorMetricsSnapshot {\n totalTransitions: number\n successCount: number\n errorCount: number\n averageDuration: number\n}\n\n/**\n * @unstable — observability injection contract.\n * EXPANDED additively in TASK-004 per TD-T4-2: third param of `recordTransition`\n * is parameter-optional; `recordEvent?` and `getMetrics?` are interface-optional.\n * Existing 2-arg call site at state_machine.ts:1665 remains valid.\n */\nexport interface IMonitor {\n recordTransition(duration: number, success: boolean, context?: TransitionContext): void\n recordError(error: Error, context?: ErrorContext): void\n recordEvent?(eventName: string, duration: number): void\n getMetrics?(): MonitorMetricsSnapshot\n}\n\n/** @unstable — error-handler injection contract; surfaces methods consumed by host integrations. */\nexport interface IErrorHandler {\n isEnabled(): boolean\n enable(): void\n disable(): void\n addRecoveryStrategy(strategy: import('./error_handling').ErrorRecoveryStrategy): void\n removeRecoveryStrategy(strategyName: string): void\n getAnalytics(): import('./error_handling').ErrorAnalytics\n}\n\n// ✅ НОВОЕ: Опции инъекции для StateMachine\nexport interface StateMachineOptions {\n logger?: ILogger\n monitor?: IMonitor // EXISTING; element type evolves additively per TD-T4-2\n scheduler?: ITimerScheduler // NEW per TD-T4-2a\n errorHandler?: IErrorHandler // NEW per TD-T4-2b\n /**\n * Maximum time (ms) to wait for async entry/exit actions.\n * If exceeded, the transition aborts with an error.\n */\n transitionTimeout?: number\n /**\n * State to transition to if an error occurs during a transition (Zombie State Prevention).\n */\n errorState?: string\n /**\n * If true, aborts the transition if onExit fails, keeping the state machine in the source state.\n */\n abortOnExitError?: boolean\n /**\n * Maximum depth of the event queue before rejecting new events.\n * Default: 1000\n */\n maxQueueDepth?: number\n}\n\n// Simplified and composable StatePaths types for better TypeScript performance\ntype StringKey = string & {}\n\n// Base type for simple state names (no regions)\nexport type SimpleStateName<S> = StringKey & keyof S\n\n// Type for region-based state names (parent.region)\nexport type RegionStateName<S> = {\n [K in keyof S & string]: S[K] extends { regions?: infer R }\n ? R extends Record<string, any>\n ? `${K}.${StringKey & keyof R}`\n : never\n : never\n}[keyof S & string]\n\n// Type for nested state names (parent.region.child)\nexport type NestedStateName<S> = {\n [K in keyof S & string]: S[K] extends { regions?: infer R }\n ? R extends Record<string, any>\n ? {\n [RegKey in keyof R & string]: R[RegKey] extends Record<string, any>\n ? `${K}.${RegKey}.${StringKey & keyof R[RegKey]}`\n : never\n }[keyof R & string]\n : never\n : never\n}[keyof S & string]\n\n// Type for deeply nested state names (parent.region.child.subregion)\nexport type DeepNestedStateName<S> = {\n [K in keyof S & string]: S[K] extends { regions?: infer R }\n ? R extends Record<string, any>\n ? {\n [RegKey in keyof R & string]: R[RegKey] extends Record<string, any>\n ? {\n [ChildKey in keyof R[RegKey] &\n string]: R[RegKey][ChildKey] extends {\n regions?: infer CR\n }\n ? CR extends Record<string, any>\n ? `${K}.${RegKey}.${ChildKey}.${StringKey & keyof CR}`\n : never\n : never\n }[keyof R[RegKey] & string]\n : never\n }[keyof R & string]\n : never\n : never\n}[keyof S & string]\n\n// Composable StatePaths type - union of all possible path types\nexport type StatePaths<S> =\n | SimpleStateName<S>\n | RegionStateName<S>\n | NestedStateName<S>\n | DeepNestedStateName<S>\n\nexport type ActionOrString<T extends object, R = void> =\n | KeysOf<T, EventAction<T, R>>\n | EventAction<Adapter<T>, R>\nexport type ErrorHandlerOrString<T extends object> =\n | KeysOf<T, ErrorHandler<T>>\n | ErrorHandler<T>\n\n// Тип для имени региона\nexport type RegionName = string\n// Конфигурация регионов\nexport type RegionsConfig<T extends object> = Record<\n RegionName,\n StateMachineConfig<T>['states']\n>\n\nexport type State<T extends object> = {\n name: StateName\n display?: string\n comment?: string\n iconCls?: string\n onBeforeEnter?: ActionOrString<T>\n onEnter?: ActionOrString<T>\n onAfterEnter?: ActionOrString<T>\n onBeforeExit?: ActionOrString<T>\n onExit?: ActionOrString<T>\n onAfterExit?: ActionOrString<T>\n onError?: ErrorHandlerOrString<T>\n regions?: RegionsConfig<T> // Заменяем `states` на `regions`\n initial?: StateName // Добавляем initial для регионов и иерархических состояний\n history?: 'deep' | 'shallow' // Добавляем свойство для истории состояний\n invoke?: StateInvocation<T>[] // Поручения (выполняются при входе в состояние)\n}\n\nexport interface StateInvocation<T extends object> {\n /** Время задержки в миллисекундах */\n delay: number\n /** Событие, которое будет вызвано после задержки */\n event: EventName\n /** Условие запуска поручения */\n cond?: (adaptee: T) => boolean\n /** Действие, выполняемое перед событием */\n action?: ActionOrString<T>\n}\n\n// Использовать для полей from, to в Transition\nexport type Transition<T extends object, S extends States<T>> = {\n from: StatePaths<S>\n to: StatePaths<S>\n priority?: number\n guard?: ActionOrString<T, boolean>\n /**\n * Action executed during the transition (after leaving `from`, before entering `to`).\n * Receives the current owner context. Use for side-effects scoped to this edge.\n */\n onTransition?: ActionOrString<T>\n onError?: ErrorHandlerOrString<T>\n}\n\nexport type Event<T extends object, S extends States<T>> = {\n name: EventName\n display?: string\n comment?: string\n transitions: Array<Transition<T, S>>\n onBefore?: ActionOrString<T>\n onAfter?: ActionOrString<T>\n onSuccess?: ActionOrString<T>\n onError?: ErrorHandlerOrString<T>\n}\n\n///Record<StateName, Omit<State<T>, 'name'>>\nexport type States<T extends object> = Record<StateName, Omit<State<T>, 'name'>>\nexport type Events<T extends object, S extends States<T>> = Record<\n EventName,\n Omit<Event<T, S>, 'name'>\n>\n\nexport interface Adapter<T extends object> {\n get adaptee(): T\n set(property: keyof T, value: T[keyof T]): void\n get(property: keyof T): T[keyof T]\n}\n\nexport type ExtractAdaptee<T> = T extends MemoryAdapter<infer R> ? R : T\n\nexport function isAdapter<T extends object>(inp: unknown): inp is Adapter<T> {\n return !!inp && typeof inp === 'object' && 'set' in inp && 'get' in inp\n}\n\nexport interface StateMachineConfig<T extends object = object> {\n name: string\n description?: string\n stateAttribute: KeysOf<PropertiesOf<T>, string>\n // initialState: StateName; // initialState теперь просто StateName, может быть в регионе\n initialState: keyof StateMachineConfig<T>['states']\n events: Record<\n EventName,\n Omit<Event<T, StateMachineConfig<T>['states']>, 'name'>\n >\n states: States<T> // Корневые состояния машины\n // states: Record<StateName, Omit<State<T>, 'name'>>\n onError?: KeysOf<T, ErrorHandler<T>>\n}\n\n// `Adaptee<T>`, `Configuree<T>`, and `Config<T>` type-utilities were removed in TASK-003 CODE_REVIEW.\n// They had zero internal usage and were not exported from the curated public surface (TD-T3-4).\n// If a downstream consumer use case emerges, re-introduce as `export type` and add to `src/index.ts`.\n\n// New interface for state persistence\nexport interface StatePersistenceAdapter {\n save(state?: {\n currentState: string\n history: any\n stateEntryTimes: any\n }): Promise<void>\n restore(): Promise<{\n currentState: string\n history: any\n stateEntryTimes: any\n }>\n}\n\n// Memory Adapter (renamed from AdapterJSON)\nexport class MemoryAdapter<T extends object>\n implements Adapter<T>, StatePersistenceAdapter {\n adaptee: T\n private _savedState: unknown\n\n constructor(data: T) {\n this.adaptee = data\n }\n\n set(property: keyof T, value: T[keyof T]) {\n this.adaptee[property] = value\n }\n\n get(property: keyof T): T[keyof T] {\n return this.adaptee[property]\n }\n\n // StatePersistenceAdapter implementation\n async save(state?: { currentState: string; history: unknown; stateEntryTimes: unknown }) {\n this._savedState = state\n }\n\n async restore(): Promise<{ currentState: string; history: unknown; stateEntryTimes: unknown }> {\n return this._savedState as { currentState: string; history: unknown; stateEntryTimes: unknown }\n }\n}\n\n// LocalStorage Adapter\nexport class LocalStorageAdapter<T extends object>\n implements Adapter<T>, StatePersistenceAdapter {\n adaptee: T\n private key: string\n\n constructor(data: T, storageKey = 'state_machine') {\n this.adaptee = data\n this.key = storageKey\n }\n\n set(property: keyof T, value: T[keyof T]) {\n this.adaptee[property] = value\n }\n\n get(property: keyof T): T[keyof T] {\n return this.adaptee[property]\n }\n\n // StatePersistenceAdapter implementation\n async save(state?: any) {\n const data = { ...this.adaptee, state }\n globalThis.localStorage.setItem(this.key, JSON.stringify(data))\n }\n\n async restore() {\n const stored = globalThis.localStorage.getItem(this.key)\n /* c8 ignore next */\n return stored ? JSON.parse(stored).state : { currentState: '', history: {} }\n }\n}\n\n// SessionStorage Adapter\nexport class SessionStorageAdapter<T extends object>\n implements Adapter<T>, StatePersistenceAdapter {\n adaptee: T\n private key: string\n\n constructor(data: T, storageKey = 'state_machine') {\n this.adaptee = data\n this.key = storageKey\n }\n\n set(property: keyof T, value: T[keyof T]) {\n this.adaptee[property] = value\n }\n\n get(property: keyof T): T[keyof T] {\n return this.adaptee[property]\n }\n\n // StatePersistenceAdapter implementation\n async save(state?: any) {\n const data = { ...this.adaptee, state }\n globalThis.sessionStorage.setItem(this.key, JSON.stringify(data))\n }\n\n async restore() {\n const stored = globalThis.sessionStorage.getItem(this.key)\n /* c8 ignore next */\n return stored ? JSON.parse(stored).state : undefined\n }\n}\n\n// Server Adapter (async example)\nexport class ServerAdapter<T extends object>\n implements Adapter<T>, StatePersistenceAdapter {\n adaptee: T\n static data: Record<string, unknown> = {}\n private endpoint: string\n\n constructor(data: T, endpoint = '/api/state') {\n this.adaptee = data\n this.endpoint = endpoint\n }\n\n set(property: keyof T, value: T[keyof T]) {\n this.adaptee[property] = value\n }\n\n get(property: keyof T): T[keyof T] {\n return this.adaptee[property]\n }\n\n // StatePersistenceAdapter implementation (simulated async)\n async save(state?: any): Promise<void> {\n if (state) {\n // Simulate server call\n await new Promise((resolve) => setTimeout(resolve, 100))\n ServerAdapter.data[this.endpoint] = state\n }\n }\n\n async restore(): Promise<any> {\n // Simulate server fetch\n await new Promise((resolve) => setTimeout(resolve, 100))\n return (\n ServerAdapter.data[this.endpoint] || { currentState: '', history: {} }\n )\n }\n}\n","/**\n * Enhanced error handling module for StateMachine library\n * Provides comprehensive error context, recovery strategies, and error analytics\n */\n\nimport { stateMachineLogger } from './logger'\nimport { type ErrorContext, StateMachineError } from './types'\n\n// Extended error context with more detailed information\nexport interface ExtendedErrorContext extends ErrorContext {\n timestamp: number\n machineId?: string\n currentStateHistory?: string[]\n attemptedTransition?: {\n from: string\n to: string\n event: string\n }\n stackTrace?: string | undefined\n userAgent?: string | undefined\n sessionId?: string | undefined\n additionalData?: Record<string, any> | undefined\n}\n\n// Error severity levels\nexport const ErrorSeverity = {\n LOW: 'low',\n MEDIUM: 'medium',\n HIGH: 'high',\n CRITICAL: 'critical',\n} as const\n\nexport type ErrorSeverity = (typeof ErrorSeverity)[keyof typeof ErrorSeverity]\n\n// Error categories for better classification\nexport const ErrorCategory = {\n VALIDATION: 'validation',\n TRANSITION: 'transition',\n ACTION: 'action',\n SERIALIZATION: 'serialization',\n CONFIGURATION: 'configuration',\n SECURITY: 'security',\n PERFORMANCE: 'performance',\n NETWORK: 'network',\n UNKNOWN: 'unknown',\n} as const\n\nexport type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]\n\n// Enhanced error class with additional metadata\nexport class EnhancedStateMachineError extends StateMachineError {\n readonly severity: ErrorSeverity\n readonly category: ErrorCategory\n readonly extendedContext: ExtendedErrorContext\n readonly recoverable: boolean\n readonly errorCode: string\n\n constructor(\n message: string,\n context: ErrorContext,\n options: {\n severity?: ErrorSeverity\n category?: ErrorCategory\n recoverable?: boolean\n errorCode?: string\n additionalData?: Record<string, any>\n cause?: Error\n } = {},\n ) {\n super(message, context, options.cause)\n\n this.severity = options.severity || ErrorSeverity.MEDIUM\n this.category = options.category || ErrorCategory.UNKNOWN\n this.recoverable = options.recoverable ?? true\n this.errorCode = options.errorCode || this.generateErrorCode()\n\n this.extendedContext = {\n ...context,\n timestamp: Date.now(),\n stackTrace: this.stack,\n additionalData: options.additionalData,\n }\n }\n\n private generateErrorCode(): string {\n const categoryCode = this.category.toUpperCase().substring(0, 3)\n const severityCode = this.severity.toUpperCase().substring(0, 1)\n const timestamp = Date.now().toString().slice(-6)\n return `SM_${categoryCode}_${severityCode}_${timestamp}`\n }\n\n toJSON(): Record<string, any> {\n return {\n name: this.name,\n message: this.message,\n errorCode: this.errorCode,\n severity: this.severity,\n category: this.category,\n recoverable: this.recoverable,\n context: this.extendedContext,\n stack: this.stack,\n }\n }\n}\n\n// Error recovery strategies\nexport interface ErrorRecoveryStrategy {\n name: string\n canRecover(error: EnhancedStateMachineError): boolean\n recover(error: EnhancedStateMachineError, context: any): Promise<boolean>\n}\n\n// Default recovery strategies\nexport class RetryRecoveryStrategy implements ErrorRecoveryStrategy {\n name = 'retry'\n private maxRetries: number\n private retryDelay: number\n\n constructor(maxRetries = 3, retryDelay = 1000) {\n this.maxRetries = maxRetries\n this.retryDelay = retryDelay\n }\n\n canRecover(error: EnhancedStateMachineError): boolean {\n return (\n error.recoverable &&\n error.category !== ErrorCategory.SECURITY &&\n error.severity !== ErrorSeverity.CRITICAL\n )\n }\n\n async recover(\n error: EnhancedStateMachineError,\n context: any,\n ): Promise<boolean> {\n const retryCount = context.retryCount || 0\n\n if (retryCount >= this.maxRetries) {\n stateMachineLogger.warn('Max retries exceeded', {\n errorCode: error.errorCode,\n retryCount,\n maxRetries: this.maxRetries,\n })\n return false\n }\n\n stateMachineLogger.info('Attempting error recovery', {\n errorCode: error.errorCode,\n strategy: this.name,\n attempt: retryCount + 1,\n })\n\n // Wait before retry\n await new Promise((resolve) => setTimeout(resolve, this.retryDelay))\n\n context.retryCount = retryCount + 1\n return true\n }\n}\n\nexport class FallbackStateRecoveryStrategy implements ErrorRecoveryStrategy {\n name = 'fallback_state'\n private fallbackState: string\n\n constructor(fallbackState = 'error_state') {\n this.fallbackState = fallbackState\n }\n\n canRecover(error: EnhancedStateMachineError): boolean {\n return (\n error.category === ErrorCategory.TRANSITION ||\n error.category === ErrorCategory.ACTION\n )\n }\n\n async recover(\n error: EnhancedStateMachineError,\n context: any,\n ): Promise<boolean> {\n try {\n if (\n context.stateMachine &&\n typeof context.stateMachine.setCurrentState === 'function'\n ) {\n stateMachineLogger.info('Recovering to fallback state', {\n errorCode: error.errorCode,\n fallbackState: this.fallbackState,\n originalState: error.context.state,\n })\n\n context.stateMachine.setCurrentState(this.fallbackState)\n return true\n }\n } catch (recoveryError) {\n stateMachineLogger.error(\n 'Fallback recovery failed',\n {\n errorCode: error.errorCode,\n fallbackState: this.fallbackState,\n },\n /* c8 ignore next */\n recoveryError instanceof Error\n ? recoveryError\n : new Error(String(recoveryError)),\n )\n }\n\n return false\n }\n}\n\n// Error analytics and reporting\nexport class ErrorAnalytics {\n private errors: EnhancedStateMachineError[] = []\n private maxStoredErrors: number\n\n constructor(maxStoredErrors = 1000) {\n this.maxStoredErrors = maxStoredErrors\n }\n\n recordError(error: EnhancedStateMachineError): void {\n this.errors.push(error)\n\n // Keep only recent errors\n if (this.errors.length > this.maxStoredErrors) {\n this.errors = this.errors.slice(-this.maxStoredErrors)\n }\n\n // Log error for immediate attention\n stateMachineLogger.error(\n 'StateMachine error recorded',\n {\n errorCode: error.errorCode,\n severity: error.severity,\n category: error.category,\n recoverable: error.recoverable,\n },\n error,\n )\n }\n\n getErrorStats(): {\n total: number\n bySeverity: Record<ErrorSeverity, number>\n byCategory: Record<ErrorCategory, number>\n recentErrors: number\n errorRate: number\n } {\n const now = Date.now()\n const oneHourAgo = now - 60 * 60 * 1000\n\n const recentErrors = this.errors.filter(\n (e) => e.extendedContext.timestamp > oneHourAgo,\n )\n\n const bySeverity = Object.values(ErrorSeverity).reduce(\n (acc, severity) => {\n acc[severity] = this.errors.filter(\n (e) => e.severity === severity,\n ).length\n return acc\n },\n {} as Record<ErrorSeverity, number>,\n )\n\n const byCategory = Object.values(ErrorCategory).reduce(\n (acc, category) => {\n acc[category] = this.errors.filter(\n (e) => e.category === category,\n ).length\n return acc\n },\n {} as Record<ErrorCategory, number>,\n )\n\n return {\n total: this.errors.length,\n bySeverity,\n byCategory,\n recentErrors: recentErrors.length,\n errorRate: recentErrors.length / 60, // errors per minute\n }\n }\n\n getTopErrors(limit = 10): Array<{\n errorCode: string\n message: string\n count: number\n lastOccurrence: number\n severity: ErrorSeverity\n category: ErrorCategory\n }> {\n const errorGroups = new Map<\n string,\n {\n errorCode: string\n message: string\n count: number\n lastOccurrence: number\n severity: ErrorSeverity\n category: ErrorCategory\n }\n >()\n\n this.errors.forEach((error) => {\n const key = `${error.message}_${error.category}`\n const existing = errorGroups.get(key)\n\n if (existing) {\n existing.count++\n existing.lastOccurrence = Math.max(\n existing.lastOccurrence,\n error.extendedContext.timestamp,\n )\n } else {\n errorGroups.set(key, {\n errorCode: error.errorCode,\n message: error.message,\n count: 1,\n lastOccurrence: error.extendedContext.timestamp,\n severity: error.severity,\n category: error.category,\n })\n }\n })\n\n return Array.from(errorGroups.values())\n .sort((a, b) => b.count - a.count)\n .slice(0, limit)\n }\n\n clearErrors(): void {\n this.errors = []\n }\n}\n\n// Main error handler class\nexport class ErrorHandler {\n private recoveryStrategies: ErrorRecoveryStrategy[] = []\n private analytics: ErrorAnalytics\n private enabled = true\n\n constructor() {\n this.analytics = new ErrorAnalytics()\n\n // Add default recovery strategies\n this.addRecoveryStrategy(new RetryRecoveryStrategy())\n this.addRecoveryStrategy(new FallbackStateRecoveryStrategy())\n }\n\n addRecoveryStrategy(strategy: ErrorRecoveryStrategy): void {\n this.recoveryStrategies.push(strategy)\n }\n\n removeRecoveryStrategy(strategyName: string): void {\n this.recoveryStrategies = this.recoveryStrategies.filter(\n (s) => s.name !== strategyName,\n )\n }\n\n async handleError(\n error: Error | EnhancedStateMachineError,\n context: any = {},\n ): Promise<boolean> {\n if (!this.enabled) {\n return false\n }\n\n // Convert to enhanced error if needed\n const enhancedError =\n error instanceof EnhancedStateMachineError\n ? error\n : this.convertToEnhancedError(error, context)\n\n // Record error for analytics\n this.analytics.recordError(enhancedError)\n\n // Attempt recovery\n for (const strategy of this.recoveryStrategies) {\n if (strategy.canRecover(enhancedError)) {\n try {\n const recovered = await strategy.recover(enhancedError, context)\n if (recovered) {\n stateMachineLogger.info('Error recovery successful', {\n errorCode: enhancedError.errorCode,\n strategy: strategy.name,\n })\n return true\n }\n } catch (recoveryError) {\n stateMachineLogger.error(\n 'Recovery strategy failed',\n {\n errorCode: enhancedError.errorCode,\n strategy: strategy.name,\n },\n /* c8 ignore next */\n recoveryError instanceof Error\n ? recoveryError\n : new Error(String(recoveryError)),\n )\n }\n }\n }\n\n stateMachineLogger.error('All recovery strategies failed', {\n errorCode: enhancedError.errorCode,\n severity: enhancedError.severity,\n category: enhancedError.category,\n })\n\n return false\n }\n\n private convertToEnhancedError(\n error: Error,\n context: any,\n ): EnhancedStateMachineError {\n // Determine category based on error message and context\n let category: ErrorCategory = ErrorCategory.UNKNOWN\n let severity: ErrorSeverity = ErrorSeverity.MEDIUM\n\n if (\n error.message.includes('transition') ||\n error.message.includes('state')\n ) {\n category = ErrorCategory.TRANSITION\n } else if (error.message.includes('action')) {\n category = ErrorCategory.ACTION\n } else if (error.message.includes('validation')) {\n category = ErrorCategory.VALIDATION\n severity = ErrorSeverity.HIGH\n } else if (\n error.message.includes('security') ||\n error.message.includes('injection')\n ) {\n category = ErrorCategory.SECURITY\n severity = ErrorSeverity.CRITICAL\n }\n\n return new EnhancedStateMachineError(\n error.message,\n context.errorContext || {},\n {\n category,\n severity,\n cause: error,\n additionalData: context,\n },\n )\n }\n\n getAnalytics(): ErrorAnalytics {\n return this.analytics\n }\n\n enable(): void {\n this.enabled = true\n }\n\n disable(): void {\n this.enabled = false\n }\n\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n/**\n * @internal — default factory for StateMachine.errorHandler injection slot.\n * Returns a new ErrorHandler instance (NOT a singleton).\n * Constructor at line 343 is public (verified).\n */\nexport function createDefaultErrorHandler(): import('./types').IErrorHandler {\n return new ErrorHandler()\n}\n\n// Utility functions\nexport function createEnhancedError(\n message: string,\n context: ErrorContext,\n options?: {\n severity?: ErrorSeverity\n category?: ErrorCategory\n recoverable?: boolean\n additionalData?: Record<string, any>\n },\n): EnhancedStateMachineError {\n return new EnhancedStateMachineError(message, context, options)\n}\n\nexport function isRecoverableError(error: Error): boolean {\n if (error instanceof EnhancedStateMachineError) {\n return error.recoverable\n }\n return true // Assume recoverable by default\n}\n","import { createDefaultScheduler } from './scheduler'\nimport { type SafeSerializedAction, safeFunctionSerializer } from './security'\nimport { createDefaultMonitor } from './monitoring'\nimport { createDefaultErrorHandler } from './error_handling'\nimport {\n type ActionOrString,\n type Adapter,\n type ErrorContext,\n type ErrorHandler,\n type ErrorHandlerOrString,\n type Event,\n type EventAction,\n type Events,\n type IErrorHandler,\n type ILogger,\n type IMonitor,\n type ITimerScheduler,\n isAdapter,\n type KeysOf,\n MemoryAdapter,\n type MethodsOf,\n type PropertiesOf,\n type RegionsConfig,\n type State,\n type StateMachineConfig,\n StateMachineError,\n type StateMachineOptions,\n type StateName,\n type StatePersistenceAdapter,\n type States,\n type Transition,\n} from './types'\n\n// Removed unused helper functions serializeAction and deserializeAction\n// These functions are available through safeFunctionSerializer directly when needed\n\n// ✅ НОВОЕ: Default implementation для Lite режима (No-Op или Console)\nconst ConsoleLogger: ILogger = {\n debug: () => { }, // По умолчанию выключено для Lite\n info: () => { },\n warn: (msg, ctx) => console.warn(msg, ctx),\n error: (msg, ctx, err) => console.error(msg, ctx, err),\n}\n\ninterface StateInfo {\n name: string\n display?: string\n isComposite: boolean\n regions?: string[]\n parent?: string\n children?: string[]\n}\n\ninterface QueuedEvent<TOwner extends object = object> {\n id: string\n eventName: string\n obj: Adapter<PropertiesOf<TOwner>>\n args: any[]\n resolve?: (value: boolean) => void\n reject?: (error: any) => void\n timestamp: number\n type: 'internal' | 'external'\n}\n\ninterface QueuedEventInfo {\n id: string\n event: string\n age: number\n type: 'internal' | 'external'\n}\n\nexport class StateMachine<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n> {\n // Приватные поля для зависимостей\n private logger: ILogger\n private monitor: IMonitor\n private scheduler: ITimerScheduler\n private errorHandler: IErrorHandler\n\n // Свойства\n private states: Map<keyof SMConfig['states'], State<TOwner>>\n private events: Map<\n keyof SMConfig['events'],\n Event<TOwner, SMConfig['states']>\n >\n private stateAttribute: KeysOf<PropertiesOf<TOwner>, string>\n private onError?: ErrorHandlerOrString<TOwner>\n private adaptee?: Adapter<PropertiesOf<TOwner>>\n private context?: MethodsOf<TOwner>\n private historyMap: Map<StateName, string> = new Map()\n private initialState: keyof SMConfig['states']\n private persistenceAdapter?: StatePersistenceAdapter\n private activeTimers: Map<string, any[]> = new Map()\n private stateEntryTimes: Map<string, number> = new Map()\n\n // Event Queue Infrastructure (SCXML Run-to-Completion)\n private externalQueue: QueuedEvent<TOwner>[] = []\n private internalQueue: QueuedEvent<TOwner>[] = []\n private isProcessing = false\n private eventIdCounter = 0\n private transitionDepth = 0\n private readonly MAX_TRANSITION_DEPTH = 100\n\n // Optional configuration\n private transitionTimeout?: number\n private errorState?: string\n private abortOnExitError?: boolean\n private maxQueueDepth = 1000\n\n // Transition state visibility\n private _isTransitioning = false\n private _targetState: string | undefined\n\n public get isTransitioning() {\n return this._isTransitioning\n }\n\n public get targetState() {\n return this._targetState\n }\n\n // Геттеры и сеттеры\n public set currentState(state: StateName) {\n if (!this.adaptee) throw new StateMachineError('no adaptee', { state })\n this.setCurrentState(state, this.adaptee)\n }\n\n public get currentState(): string {\n if (!this.adaptee) {\n const s = this.getCurrentState()\n /* c8 ignore next */\n throw new StateMachineError('no adaptee', s !== undefined ? { state: s } : {})\n }\n /* c8 ignore next */\n return this.getCurrentState(this.adaptee) ?? ''\n }\n\n // Конструктор\n constructor(\n config: SMConfig,\n adaptee?: Adapter<PropertiesOf<TOwner>> | PropertiesOf<TOwner>,\n options?: StateMachineOptions, // ⬅️ Внедрение через опции\n ) {\n this.initialState = config.initialState\n\n // ✅ Внедрение зависимостей (Dependency Injection)\n // Если передали - используем, если нет - fallback на легковесные версии\n this.logger = options?.logger ?? ConsoleLogger\n this.monitor = options?.monitor ?? createDefaultMonitor()\n this.scheduler = options?.scheduler ?? createDefaultScheduler()\n this.errorHandler = options?.errorHandler ?? createDefaultErrorHandler()\n\n if (adaptee) {\n if (!isAdapter<TOwner>(adaptee)) {\n this.adaptee = new MemoryAdapter(adaptee) as Adapter<\n PropertiesOf<TOwner>\n >\n } else {\n this.adaptee = adaptee as Adapter<PropertiesOf<TOwner>>\n }\n }\n\n // Apply options\n if (options?.transitionTimeout !== undefined) {\n this.transitionTimeout = options.transitionTimeout\n }\n if (options?.errorState !== undefined) {\n this.errorState = options.errorState\n }\n if (options?.abortOnExitError !== undefined) {\n this.abortOnExitError = options.abortOnExitError\n }\n if (options?.maxQueueDepth !== undefined) {\n this.maxQueueDepth = options.maxQueueDepth\n }\n if (config.onError !== undefined) {\n this.onError = config.onError\n }\n this.stateAttribute = config.stateAttribute\n this.states = new Map()\n this.events = new Map(\n Object.entries(config.events).map(([name, value]) => [\n name,\n {\n name,\n ...value,\n transitions: value.transitions.map((t) => ({\n ...t,\n // Support 'action' alias for 'onTransition'\n onTransition: t.onTransition || (t as any).action,\n })),\n },\n ]),\n )\n this.processStates(config.states)\n if (adaptee) {\n this.persistenceAdapter = adaptee as unknown as StatePersistenceAdapter\n this.setInitialState(config.initialState as string)\n }\n\n // Логируем инициализацию\n this.logger.info('StateMachine initialized', { name: config.name })\n }\n\n // Основные публичные методы\n public setContext(context: MethodsOf<TOwner>): void {\n this.context = context\n }\n\n private enqueueEvent(\n eventName: string,\n obj: Adapter<PropertiesOf<TOwner>>,\n args: any[],\n type: 'internal' | 'external',\n ): Promise<boolean> {\n if (\n this.externalQueue.length + this.internalQueue.length >=\n this.maxQueueDepth\n ) {\n const _s0 = this.getCurrentState(obj)\n return Promise.reject(\n new StateMachineError('Event queue overflow — possible infinite loop', {\n /* c8 ignore next */\n ...(_s0 !== undefined ? { state: _s0 } : {}),\n event: eventName,\n }),\n )\n }\n\n if (type === 'external') {\n return new Promise<boolean>((resolve, reject) => {\n this.externalQueue.push({\n id: `ext_${++this.eventIdCounter}`,\n eventName,\n obj,\n args,\n resolve,\n reject,\n timestamp: Date.now(),\n type: 'external',\n })\n this.scheduleProcessing()\n })\n }\n\n /* c8 ignore next 7 */\n this.internalQueue.push({\n id: `int_${++this.eventIdCounter}`,\n eventName,\n obj,\n args,\n timestamp: Date.now(),\n type: 'internal',\n })\n /* c8 ignore next */\n return Promise.resolve(true)\n }\n\n private raiseEvent(\n eventName: string,\n obj: Adapter<PropertiesOf<TOwner>>,\n ...args: any[]\n ): void {\n this.internalQueue.push({\n id: `int_${++this.eventIdCounter}`,\n eventName,\n obj,\n args,\n timestamp: Date.now(),\n type: 'internal',\n })\n }\n\n private scheduleProcessing(): void {\n /* c8 ignore next */\n if (this.isProcessing) return\n queueMicrotask(() => this.processQueues())\n }\n\n private async processQueues(): Promise<void> {\n /* c8 ignore next */\n if (this.isProcessing) return\n this.isProcessing = true\n\n try {\n while (this.internalQueue.length > 0 || this.externalQueue.length > 0) {\n if (this.transitionDepth >= this.MAX_TRANSITION_DEPTH) {\n const _s1 = this.getCurrentState()\n /* c8 ignore next */\n const error = new StateMachineError(\n 'Max transition depth exceeded — possible infinite loop',\n /* c8 ignore next */\n { ...(_s1 !== undefined ? { state: _s1 } : {}), event: 'processQueues' },\n )\n while (this.externalQueue.length > 0) {\n const evt = this.externalQueue.shift()!\n evt.reject?.(error)\n }\n this.internalQueue.length = 0\n throw error\n }\n\n if (this.internalQueue.length > 0) {\n const evt = this.internalQueue.shift()!\n this.transitionDepth++\n try {\n await this.executeQueuedTransition(evt)\n } finally {\n this.transitionDepth--\n }\n } else {\n const evt = this.externalQueue.shift()!\n this.transitionDepth++\n try {\n const result = await this.executeQueuedTransition(evt)\n evt.resolve?.(result)\n } catch (error) {\n evt.reject?.(error)\n } finally {\n this.transitionDepth--\n }\n }\n }\n } finally {\n this.isProcessing = false\n this.transitionDepth = 0\n }\n }\n\n private async executeQueuedTransition(\n queuedEvent: QueuedEvent<TOwner>,\n ): Promise<boolean> {\n const { eventName, obj, args } = queuedEvent\n const targetObj = obj\n\n let currentStateRaw = this.getCurrentState(targetObj)\n if (!currentStateRaw) {\n this.setInitialState(this.initialState as string, targetObj)\n currentStateRaw = this.getCurrentState(targetObj)\n }\n /* c8 ignore next */\n const currentState: string = currentStateRaw ?? ''\n\n let event = this.events.get(eventName as keyof SMConfig['events'])\n let transitions = event\n ? event.transitions.filter((t) =>\n this.isTransitionPossible(t, currentState),\n )\n : []\n\n if (!transitions.length) {\n const wildcardEvent = this.events.get('*' as keyof SMConfig['events'])\n if (wildcardEvent) {\n const wildcardTransitions = wildcardEvent.transitions.filter((t) =>\n this.isTransitionPossible(t, currentState),\n )\n if (wildcardTransitions.length > 0) {\n event = wildcardEvent\n transitions = wildcardTransitions\n }\n }\n }\n\n if (!event || !transitions.length) {\n throw new StateMachineError(\n `Invalid event: ${eventName} for state: ${currentState}`,\n { state: currentState, event: eventName },\n )\n }\n\n const allowedTransition = await this.getAllowedTransitions(\n targetObj,\n transitions,\n ...args,\n ).catch((error) => {\n this.logger.error(\n 'Error determining allowed transition',\n { event: eventName, state: currentState },\n /* c8 ignore next */\n error instanceof Error ? error : new Error(String(error)),\n )\n return undefined\n })\n\n if (!allowedTransition) {\n return false\n }\n\n const toState = await this.applyTransition(\n targetObj as any,\n currentState,\n allowedTransition,\n args,\n eventName as keyof SMConfig['events'],\n event,\n ).catch((error) => {\n this.logger.error(\n 'Error applying transition',\n {\n event: eventName,\n state: currentState,\n transition: `${allowedTransition.from} -> ${allowedTransition.to}`,\n },\n /* c8 ignore next */\n error instanceof Error ? error : new Error(String(error)),\n )\n if (this.errorHandler.isEnabled()) {\n this.monitor.recordError(\n error instanceof Error ? error : new Error(String(error)),\n { state: currentState, event: eventName },\n )\n }\n throw error // Propagate error to caller (e.g. fireEvent rejection)\n })\n\n if (!toState) {\n return false\n }\n\n this.setCurrentState(toState.name, targetObj)\n return true\n }\n\n /**\n * Fires an event to trigger a state transition.\n *\n * @param eventName - The name of the event to fire. Use '*' for wildcard events.\n * @param args - Additional arguments to pass to guards, actions, and callbacks.\n * @returns Promise<boolean> - True if a transition occurred, false otherwise.\n *\n * @throws StateMachineError if the event is invalid or no transition is possible (unless configured otherwise).\n *\n * @example\n * const success = await sm.fireEvent('submit', payload);\n */\n public async fireEvent(\n eventName: keyof SMConfig['events'] | '*',\n ...args: any[]\n ): Promise<boolean>\n public async fireEvent(\n eventName: keyof SMConfig['events'] | '*',\n obj?: Adapter<PropertiesOf<TOwner>>,\n ...args: unknown[]\n ): Promise<boolean> {\n let targetObj: Adapter<PropertiesOf<TOwner>>\n if (!obj) {\n if (this.adaptee) targetObj = this.adaptee\n else\n throw new StateMachineError('no adaptee or object passed', {\n event: String(eventName),\n })\n } else if (!isAdapter(obj)) {\n args.unshift(obj)\n if (this.adaptee) targetObj = this.adaptee\n else\n throw new StateMachineError('no adaptee or object passed', {\n event: String(eventName),\n })\n } else {\n targetObj = obj\n }\n\n return this.enqueueEvent(String(eventName), targetObj, args, 'external')\n }\n\n public getQueueDepth(): {\n internal: number\n external: number\n total: number\n } {\n return {\n internal: this.internalQueue.length,\n external: this.externalQueue.length,\n total: this.internalQueue.length + this.externalQueue.length,\n }\n }\n\n public getQueuedEvents(): QueuedEventInfo[] {\n const now = Date.now()\n const mapEvent = (evt: QueuedEvent<TOwner>): QueuedEventInfo => ({\n id: evt.id,\n event: evt.eventName,\n age: now - evt.timestamp,\n type: evt.type,\n })\n return [\n ...this.internalQueue.map(mapEvent),\n ...this.externalQueue.map(mapEvent),\n ]\n }\n\n public isProcessingEvents(): boolean {\n return this.isProcessing\n }\n\n /**\n * Checks if an event can be fired in the current state.\n *\n * @param eventName - The name of the event to check.\n * @param adaptee - Optional adapter/object to check against (defaults to internal adaptee).\n * @returns boolean - True if the event has a valid transition from the current state (guards are not executed).\n */\n public canFireEvent(\n eventName: keyof SMConfig['events'] | '*',\n adaptee?: Adapter<PropertiesOf<TOwner>>,\n ): boolean {\n const targetAdaptee = adaptee || this.adaptee\n if (!targetAdaptee) return false\n\n const currentState = this.getCurrentState(targetAdaptee)\n const effectiveState =\n currentState === ''\n ? this.getInitialCompositeState(this.initialState as string)\n : currentState\n /* c8 ignore next */ if (effectiveState === undefined) return false\n\n const event = this.events.get(String(eventName))\n if (\n !event ||\n !event.transitions.some((t) =>\n this.isTransitionPossible(t, effectiveState),\n )\n ) {\n const wildcardEvent = this.events.get('*')\n if (wildcardEvent) {\n return wildcardEvent.transitions.some((t) =>\n this.isTransitionPossible(t, effectiveState),\n )\n }\n return false\n }\n\n return true\n }\n\n public getAvailableEvents(adaptee?: Adapter<PropertiesOf<TOwner>>): string[] {\n const available: string[] = []\n for (const [name] of this.events) {\n if (this.canFireEvent(name, adaptee)) {\n available.push(String(name))\n }\n }\n return available\n }\n\n public async reset(adaptee?: Adapter<PropertiesOf<TOwner>>): Promise<void> {\n const targetAdaptee = adaptee || this.adaptee\n if (!targetAdaptee) {\n const _s2 = this.getCurrentState()\n throw new StateMachineError('no adaptee', _s2 !== undefined ? { state: _s2 } : {})\n }\n\n this.historyMap.clear()\n\n // Clear all active timers\n for (const timers of this.activeTimers.values()) {\n for (const id of timers) {\n this.clearTimer(id)\n }\n }\n this.activeTimers.clear()\n this.stateEntryTimes.clear()\n\n this.setInitialState(this.initialState as string, targetAdaptee)\n }\n\n public getStateHistory(): Record<string, string> {\n return Object.fromEntries(this.historyMap)\n }\n\n public getCurrentStateInfo(): StateInfo | undefined {\n const currentState = this.getCurrentState()\n if (currentState === undefined) return undefined\n\n const isComposite = currentState.includes('|')\n if (isComposite) {\n const activeStates = currentState.split('|').filter(Boolean)\n const regions = activeStates.map((s) => this.getRegionKey(s))\n return {\n name: currentState,\n isComposite: true,\n regions,\n children: activeStates,\n }\n }\n\n const state = this.states.get(currentState)\n /* c8 ignore next */ if (!state) return undefined\n\n const parent = currentState.includes('.')\n ? currentState.split('.').slice(0, -1).join('.')\n : undefined\n\n const children = this.getDirectChildren(currentState)\n const regions = state.regions ? Object.keys(state.regions) : undefined\n\n return {\n name: currentState,\n ...(state.display !== undefined ? { display: state.display } : {}),\n isComposite: Boolean(state.regions),\n ...(regions !== undefined ? { regions } : {}),\n ...(parent !== undefined ? { parent } : {}),\n ...(children.length ? { children } : {}),\n }\n }\n\n /**\n * Checks if the machine is in a specific state.\n * Supports hierarchical states (e.g. 'parent' matches 'parent.child').\n *\n * @param expectedState - The state name to check.\n * @param adaptee - Optional adapter to check against.\n * @returns boolean - True if the current state matches or is a substate of the expected state.\n */\n public isInState(\n expectedState: StateName,\n adaptee?: Adapter<PropertiesOf<TOwner>>,\n ): boolean {\n const currentState = this.getCurrentState(adaptee)\n if (!currentState) return expectedState === ''\n\n const currentParts = currentState.split('|').sort()\n const expectedParts = expectedState.split('|').sort()\n\n if (currentParts.length !== expectedParts.length) return false\n\n return currentParts.every((part, index) => part === expectedParts[index])\n }\n\n public attachToObject(\n object: any,\n eventMap: { [key: string]: string },\n ): void {\n for (const objectEventName in eventMap) {\n if (eventMap.hasOwnProperty(objectEventName)) {\n const stateMachineEventName = eventMap[objectEventName]\n /* c8 ignore next */ if (stateMachineEventName === undefined) continue\n if (typeof object.addEventListener === 'function') {\n object.addEventListener(objectEventName, (...args: any[]) => {\n this.fireEvent(stateMachineEventName, object, ...args).catch((e) =>\n this.logger.error(\n 'Error firing event',\n {\n objectEventName,\n stateMachineEventName,\n },\n /* c8 ignore next */\n e instanceof Error ? e : new Error(String(e)),\n ),\n )\n })\n } else if (typeof object.on === 'function') {\n object.on(objectEventName, (...args: any[]) => {\n this.fireEvent(stateMachineEventName, object, ...args).catch((e) =>\n this.logger.error(\n 'Error firing event',\n {\n objectEventName,\n stateMachineEventName,\n },\n /* c8 ignore next */\n e instanceof Error ? e : new Error(String(e)),\n ),\n )\n })\n } else {\n object[`on${objectEventName}`] = async (...args: any[]) => {\n return this.fireEvent(stateMachineEventName, object, ...args).catch(\n (e) =>\n this.logger.error(\n 'Error firing event',\n {\n objectEventName,\n stateMachineEventName,\n },\n /* c8 ignore next */\n e instanceof Error ? e : new Error(String(e)),\n ),\n )\n }\n }\n }\n }\n }\n\n // Методы для работы с состоянием\n public async saveState(adapter?: StatePersistenceAdapter) {\n const targetAdapter = adapter || this.persistenceAdapter\n if (!targetAdapter) {\n return\n }\n\n const currentState = this.getCurrentState() ?? ''\n const history = Object.fromEntries(this.historyMap)\n const stateData = {\n currentState,\n history,\n stateEntryTimes: Object.fromEntries(this.stateEntryTimes),\n }\n\n await targetAdapter.save(stateData)\n }\n\n public async restoreState(adapter?: StatePersistenceAdapter): Promise<void> {\n const targetAdapter = adapter || this.persistenceAdapter\n if (!targetAdapter) {\n return\n }\n\n const result = await targetAdapter.restore()\n this.validateCompositeState(result.currentState)\n this.historyMap = new Map(Object.entries(result.history))\n if (result.stateEntryTimes) {\n this.stateEntryTimes = new Map(Object.entries(result.stateEntryTimes))\n }\n this.setCurrentState(result.currentState)\n this.resumeTimers()\n }\n\n // Статические методы\n public static fromData<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n >(\n config: SMConfig,\n initialState?: string,\n context?: TOwner,\n options?: StateMachineOptions, // ⬅️ Добавляем опции\n ): StateMachine<TOwner, SMConfig> {\n const sm = new StateMachine<TOwner, SMConfig>(config, context, options)\n\n if (sm.adaptee) {\n sm.setCurrentState(initialState || (config.initialState as string))\n }\n\n return sm\n }\n\n public static fromJSON<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n >(\n jsonData: string,\n obj?: TOwner | Adapter<TOwner>,\n options?: StateMachineOptions,\n ): StateMachine<TOwner, SMConfig> {\n const parsedData = JSON.parse(jsonData)\n const { config, currentState, historyMap, stateEntryTimes } = parsedData\n\n const deserializedStates = StateMachine.deserializeStates<TOwner>(\n config.states,\n )\n const deserializedEvents = StateMachine.deserializeEvents<TOwner>(\n config.events,\n )\n\n const smConfig: StateMachineConfig<TOwner> = {\n name: 'DeserializedStateMachine',\n initialState: config.initialState,\n stateAttribute: config.stateAttribute,\n states: deserializedStates,\n events: deserializedEvents,\n onError: StateMachine.deserializeAction(config.onError) as KeysOf<\n TOwner,\n ErrorHandler<TOwner>\n >,\n }\n\n const sm = new StateMachine<TOwner, StateMachineConfig<TOwner>>(\n smConfig as SMConfig,\n obj as any,\n options,\n )\n\n sm.historyMap = new Map(historyMap)\n if (stateEntryTimes) {\n sm.stateEntryTimes = new Map(stateEntryTimes)\n }\n if (sm.adaptee && currentState) {\n sm.setCurrentState(currentState)\n sm.resumeTimers()\n }\n\n return sm\n }\n\n /**\n * Securely deserializes a StateMachine from JSON string (Async).\n * Verifies cryptographic hashes of serialized functions.\n */\n public static async fromSecureJSON<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n >(\n jsonData: string,\n obj?: TOwner | Adapter<TOwner>,\n options?: StateMachineOptions,\n ): Promise<StateMachine<TOwner, SMConfig>> {\n const parsedData = JSON.parse(jsonData)\n const { config, currentState, historyMap, stateEntryTimes } = parsedData\n\n // Async deserialization of states and events\n const deserializedStates =\n await StateMachine.deserializeStatesAsync<TOwner>(config.states)\n const deserializedEvents =\n await StateMachine.deserializeEventsAsync<TOwner>(config.events)\n\n const smConfig: StateMachineConfig<TOwner> = {\n name: 'DeserializedStateMachine',\n initialState: config.initialState,\n stateAttribute: config.stateAttribute,\n states: deserializedStates,\n events: deserializedEvents,\n onError: (await StateMachine.deserializeActionAsync(\n config.onError,\n )) as KeysOf<TOwner, ErrorHandler<TOwner>>,\n }\n\n const sm = new StateMachine<TOwner, StateMachineConfig<TOwner>>(\n smConfig as SMConfig,\n obj as any,\n options,\n )\n\n sm.historyMap = new Map(historyMap)\n if (stateEntryTimes) {\n sm.stateEntryTimes = new Map(stateEntryTimes)\n }\n if (sm.adaptee && currentState) {\n sm.setCurrentState(currentState)\n sm.resumeTimers()\n }\n\n return sm\n }\n\n /**\n * Deserialize states configuration (Async)\n */\n private static async deserializeStatesAsync<TOwner extends object>(\n statesConfig: any,\n ): Promise<States<TOwner>> {\n const result: States<TOwner> = {}\n for (const [name, stateData] of Object.entries(statesConfig) as [\n string,\n any,\n ][]) {\n const deserializedState = {\n ...stateData,\n onBeforeEnter: await StateMachine.deserializeActionAsync(\n stateData.onBeforeEnter,\n ),\n onEnter: await StateMachine.deserializeActionAsync(stateData.onEnter),\n onAfterEnter: await StateMachine.deserializeActionAsync(\n stateData.onAfterEnter,\n ),\n onBeforeExit: await StateMachine.deserializeActionAsync(\n stateData.onBeforeExit,\n ),\n onExit: await StateMachine.deserializeActionAsync(stateData.onExit),\n onAfterExit: await StateMachine.deserializeActionAsync(\n stateData.onAfterExit,\n ),\n onError: await StateMachine.deserializeActionAsync(stateData.onError),\n }\n\n if (stateData.invoke && Array.isArray(stateData.invoke)) {\n deserializedState.invoke = await Promise.all(\n stateData.invoke.map(async (inv: any) => ({\n ...inv,\n cond: await StateMachine.deserializeActionAsync(inv.cond),\n action: await StateMachine.deserializeActionAsync(inv.action),\n })),\n )\n }\n\n result[name] = deserializedState\n }\n return result\n }\n\n /**\n * Deserialize states configuration\n */\n private static deserializeStates<TOwner extends object>(\n statesConfig: any,\n ): States<TOwner> {\n return Object.entries(statesConfig).reduce(\n (acc, [name, stateData]: [string, any]) => {\n const deserializedState = {\n ...stateData,\n onBeforeEnter: StateMachine.deserializeAction(\n stateData.onBeforeEnter,\n ),\n onEnter: StateMachine.deserializeAction(stateData.onEnter),\n onAfterEnter: StateMachine.deserializeAction(stateData.onAfterEnter),\n onBeforeExit: StateMachine.deserializeAction(stateData.onBeforeExit),\n onExit: StateMachine.deserializeAction(stateData.onExit),\n onAfterExit: StateMachine.deserializeAction(stateData.onAfterExit),\n onError: StateMachine.deserializeAction(stateData.onError),\n }\n\n if (stateData.invoke && Array.isArray(stateData.invoke)) {\n deserializedState.invoke = stateData.invoke.map((inv: any) => ({\n ...inv,\n cond: StateMachine.deserializeAction(inv.cond),\n action: StateMachine.deserializeAction(inv.action),\n }))\n }\n\n acc[name] = deserializedState\n return acc\n },\n {} as States<TOwner>,\n )\n }\n\n /**\n * Deserialize events configuration (Async)\n */\n private static async deserializeEventsAsync<TOwner extends object>(\n eventsConfig: any,\n ): Promise<Events<TOwner, States<TOwner>>> {\n const result: Events<TOwner, States<TOwner>> = {}\n for (const [name, eventData] of Object.entries(eventsConfig) as [\n string,\n any,\n ][]) {\n result[name] = {\n ...eventData,\n onBefore: await StateMachine.deserializeActionAsync(eventData.onBefore),\n onAfter: await StateMachine.deserializeActionAsync(eventData.onAfter),\n onSuccess: await StateMachine.deserializeActionAsync(\n eventData.onSuccess,\n ),\n onError: await StateMachine.deserializeActionAsync(eventData.onError),\n transitions: await Promise.all(\n eventData.transitions.map((transitionData: any) =>\n StateMachine.deserializeTransitionAsync(transitionData),\n ),\n ),\n }\n }\n return result\n }\n\n /**\n * Deserialize events configuration\n */\n private static deserializeEvents<TOwner extends object>(\n eventsConfig: any,\n ): Events<TOwner, States<TOwner>> {\n return Object.entries(eventsConfig).reduce(\n (acc, [name, eventData]: [string, any]) => {\n acc[name] = {\n ...eventData,\n onBefore: StateMachine.deserializeAction(eventData.onBefore),\n onAfter: StateMachine.deserializeAction(eventData.onAfter),\n onSuccess: StateMachine.deserializeAction(eventData.onSuccess),\n onError: StateMachine.deserializeAction(eventData.onError),\n transitions: eventData.transitions.map((transitionData: any) =>\n StateMachine.deserializeTransition(transitionData),\n ),\n }\n return acc\n },\n {} as Events<TOwner, States<TOwner>>,\n )\n }\n\n /**\n * Deserialize transition configuration (Async)\n */\n private static async deserializeTransitionAsync(\n transitionData: any,\n ): Promise<any> {\n return {\n ...transitionData,\n guard: await StateMachine.deserializeActionAsync(transitionData.guard),\n // Support 'action' alias for 'onTransition'\n onTransition: await StateMachine.deserializeActionAsync(\n transitionData.onTransition || transitionData.action,\n ),\n onError: await StateMachine.deserializeActionAsync(\n transitionData.onError,\n ),\n }\n }\n\n /**\n * Deserialize transition configuration\n */\n private static deserializeTransition(transitionData: any): any {\n return {\n ...transitionData,\n guard: StateMachine.deserializeAction(transitionData.guard),\n // Support 'action' alias for 'onTransition' for compatibility\n onTransition: StateMachine.deserializeAction(\n transitionData.onTransition || transitionData.action\n ),\n onError: StateMachine.deserializeAction(transitionData.onError),\n }\n }\n\n /**\n * Static method for deserializing actions (Async)\n */\n private static async deserializeActionAsync(action: any): Promise<any> {\n if (!action) return action\n\n if (typeof action === 'object' && action.type === 'function') {\n return safeFunctionSerializer.deserializeActionAsync(action)\n }\n\n return StateMachine.deserializeAction(action)\n }\n\n /**\n * Static method for deserializing actions (now using safe deserializer)\n */\n private static deserializeAction(action: any): any {\n if (!action) return action\n\n // 1. Modern secure format with type and hash validation\n if (typeof action === 'object' && action.type === 'function') {\n return safeFunctionSerializer.deserializeAction(action)\n }\n\n // 2. Legacy string format (function or arrow function)\n if (typeof action === 'string') {\n const trimmed = action.trim()\n\n // Check if it looks like function code (not just a function name)\n if (\n trimmed.startsWith('function') ||\n trimmed.startsWith('(') ||\n trimmed.includes('=>')\n ) {\n // Use secure deserializer for legacy strings\n const safeFn = safeFunctionSerializer.deserializeLegacyString(action)\n if (safeFn) {\n return safeFn\n }\n // If validation failed, return undefined to prevent execution\n return undefined\n }\n }\n\n // 3. Action name reference (regular string like 'onEnter')\n return action\n }\n\n public static fromJSONWithContext<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n >(\n jsonData: string,\n context?: MethodsOf<TOwner>,\n options?: StateMachineOptions, // ⬅️ Добавляем опции\n ): StateMachine<TOwner, SMConfig> {\n const sm = StateMachine.fromJSON<TOwner, SMConfig>(\n jsonData,\n undefined,\n options,\n )\n if (context !== undefined) {\n sm.setContext(context)\n }\n return sm\n }\n\n // Приватные методы\n private setCurrentState(\n state: StateName,\n obj?: Adapter<PropertiesOf<TOwner>>,\n ) {\n const adaptee = obj || this.adaptee\n const stateConfig = this.states.get(state)\n\n if (\n stateConfig?.history &&\n stateConfig.history !== 'deep' &&\n stateConfig.regions\n ) {\n const historyState = this.historyMap.get(state)\n if (historyState && adaptee) {\n const currentState = this.getCurrentState(adaptee) ?? ''\n const newCompositeState = this.updatePartialState(\n currentState,\n state,\n historyState,\n )\n adaptee.set(\n this.stateAttribute,\n newCompositeState as TOwner[KeysOf<PropertiesOf<TOwner>, string>],\n )\n return\n }\n }\n if (stateConfig?.history === 'deep' && stateConfig.regions) {\n const historyState = this.historyMap.get(state)\n if (historyState && adaptee) {\n adaptee.set(\n this.stateAttribute,\n historyState as TOwner[KeysOf<PropertiesOf<TOwner>, string>],\n )\n return\n }\n }\n\n if (adaptee) {\n this.setCurrentStateInternal(state, adaptee)\n }\n }\n\n private setCurrentStateInternal(\n state: StateName,\n adaptee: Adapter<PropertiesOf<TOwner>>,\n ) {\n const currentState = this.getCurrentState(adaptee) || ''\n const currentStateMap = this.parseCompositeState(currentState)\n\n const newStateParts = state.split('|')\n const isRootState = newStateParts.length === 1 && !state.includes('.')\n if (isRootState) {\n currentStateMap.clear()\n currentStateMap.set(state, state)\n } else {\n for (const newStatePart of newStateParts) {\n if (!this.states.has(newStatePart)) {\n throw new StateMachineError(\n `Invalid state path: ${newStatePart} in composite state: ${state} states: ${Array.from(this.states.keys()).join(',')}`,\n { state: newStatePart },\n )\n }\n\n const regionKey = this.getRegionKey(newStatePart)\n const stateConfig = this.states.get(newStatePart)\n\n for (const [existingRegionKey] of currentStateMap.entries()) {\n if (\n existingRegionKey === regionKey ||\n existingRegionKey.startsWith(regionKey + '.') ||\n regionKey.startsWith(existingRegionKey + '.')\n ) {\n currentStateMap.delete(existingRegionKey)\n }\n }\n\n if (stateConfig?.regions) {\n const initialStatesForRegions = this.getInitialStatesForRegions(\n stateConfig.regions,\n newStatePart,\n )\n const regionStates = initialStatesForRegions.split('|')\n for (const regionState of regionStates) {\n const regionKeyNested = this.getRegionKey(regionState)\n currentStateMap.set(regionKeyNested, regionState)\n }\n } else {\n currentStateMap.set(regionKey, newStatePart)\n }\n }\n\n for (const [key, value] of currentStateMap.entries()) {\n if (!value.includes('.')) {\n currentStateMap.delete(key)\n }\n }\n }\n\n const newCompositeState = Array.from(currentStateMap.values()).join('|')\n this.validateCompositeState(newCompositeState)\n adaptee.set(\n this.stateAttribute,\n newCompositeState as TOwner[KeysOf<PropertiesOf<TOwner>, string>],\n )\n }\n\n public getCurrentState(adaptee?: Adapter<PropertiesOf<TOwner>>) {\n const targetAdaptee = adaptee || this.adaptee\n if (!targetAdaptee) return\n\n const currentState = targetAdaptee.get(this.stateAttribute) as string\n if (!currentState) return ''\n\n const stateParts = currentState.split('|')\n for (const statePart of stateParts) {\n if (!this.states.has(statePart)) {\n throw new StateMachineError(\n `Invalid state path in current state: ${statePart}`,\n { state: currentState },\n )\n }\n }\n return currentState\n }\n\n private setInitialState(\n initialState: string,\n obj?: Adapter<PropertiesOf<TOwner>>,\n ) {\n const targetAdaptee = obj || this.adaptee\n if (!targetAdaptee) return\n\n const stateConfig = this.states.get(initialState)\n let initialStates: string\n if (stateConfig?.regions) {\n initialStates = this.getInitialStatesForRegions(\n stateConfig.regions,\n initialState,\n )\n } else {\n initialStates = initialState\n }\n\n this.setCurrentState(initialStates, targetAdaptee)\n\n // Trigger enter actions for initial state(s) to start timers and other logic\n const stateParts = initialStates.split('|')\n const context: ErrorContext = {\n state: initialStates,\n phase: 'enter',\n }\n\n for (const statePart of stateParts) {\n this.executeEnterActions(\n targetAdaptee as unknown as Adapter<TOwner>,\n statePart,\n [],\n context,\n ).catch((err) => {\n this.logger.error(\n 'Error in initial state enter actions',\n { state: statePart },\n err,\n )\n })\n }\n }\n\n private getInitialCompositeState(initialState: string): string {\n const stateConfig = this.states.get(initialState)\n if (stateConfig?.regions) {\n return this.getInitialStatesForRegions(stateConfig.regions, initialState)\n }\n return initialState\n }\n\n private getDirectChildren(stateName: string): string[] {\n const prefix = `${stateName}.`\n const depth = stateName.split('.').length + 1\n\n const children: string[] = []\n for (const name of this.states.keys()) {\n const nameStr = String(name)\n if (!nameStr.startsWith(prefix)) continue\n if (nameStr.split('.').length !== depth) continue\n children.push(nameStr)\n }\n return children\n }\n\n private getInitialStatesForRegions(\n regions: RegionsConfig<TOwner>,\n parentPath: string,\n ): string {\n const regionStates: string[] = []\n for (const [regionName, regionStatesConfig] of Object.entries(regions)) {\n const regionPath = `${parentPath}.${regionName}`\n const initialState =\n regionStatesConfig.initial || Object.keys(regionStatesConfig)[0]\n const fullPath = `${regionPath}.${initialState}`\n\n const stateConfig = this.states.get(fullPath)\n if (stateConfig?.regions) {\n const nestedInitialStates = this.getInitialStatesForRegions(\n stateConfig.regions,\n fullPath,\n )\n regionStates.push(...nestedInitialStates.split('|'))\n } else {\n regionStates.push(fullPath)\n }\n }\n return regionStates.join('|')\n }\n\n private validateCompositeState(compositeState: string): void {\n const stateParts = compositeState.split('|')\n const regionKeys = new Set<string>()\n for (const statePart of stateParts) {\n const regionKey = this.getRegionKey(statePart)\n if (regionKeys.has(regionKey)) {\n throw new StateMachineError(\n `Contradictory state detected: multiple states for region ${regionKey} in composite state ${compositeState}`,\n { state: compositeState },\n )\n }\n regionKeys.add(regionKey)\n }\n }\n\n private processStates(\n statesConfig: States<TOwner>,\n parentStateName?: StateName,\n ) {\n for (const [name, value] of Object.entries(statesConfig)) {\n if (name === 'initial') continue\n\n const stateName = parentStateName ? `${parentStateName}.${name}` : name\n const state: State<TOwner> = { name: stateName, ...value }\n this.states.set(stateName, state)\n\n if (value.regions) {\n this.processRegions(value.regions, stateName)\n }\n }\n }\n\n private processRegions(\n regionsConfig: RegionsConfig<TOwner>,\n parentStateName: StateName,\n ) {\n for (const [regionName, regionStatesConfig] of Object.entries(\n regionsConfig,\n )) {\n this.processStates(regionStatesConfig, `${parentStateName}.${regionName}`)\n }\n }\n\n private processError(\n adaptee: Adapter<TOwner>,\n context: ErrorContext,\n ...fallback: Array<ErrorHandlerOrString<TOwner> | undefined>\n ) {\n let handler: ErrorHandler<TOwner> = (adaptee, err) => {\n // Safely get current state, fallback to context.state if adaptee is invalid\n let currentState: string\n try {\n if (adaptee && typeof (adaptee as any).get === 'function') {\n currentState = this.getCurrentState(\n adaptee as unknown as Adapter<PropertiesOf<TOwner>>,\n ) ?? ''\n } else {\n /* c8 ignore next */\n currentState = context.state || ''\n }\n } catch {\n /* c8 ignore next */\n currentState = context.state || ''\n }\n\n const _phase = err instanceof StateMachineError\n ? (err.context.phase ?? context.phase)\n : context.phase\n const _event = err instanceof StateMachineError\n ? (err.context.event ?? context.event)\n : context.event\n const _action = err instanceof StateMachineError\n ? (err.context.action ?? context.action)\n : context.action\n const _transition = err instanceof StateMachineError\n ? (err.context.transition ?? context.transition)\n : context.transition\n const errorContext: ErrorContext = {\n state: currentState,\n ...(_phase !== undefined ? { phase: _phase } : {}),\n ...(_event !== undefined ? { event: _event } : {}),\n ...(_action !== undefined ? { action: _action } : {}),\n ...(_transition !== undefined ? { transition: _transition } : {}),\n }\n\n throw new StateMachineError(\n `Error in state machine: ${err ? (err instanceof Error ? err.message : String(err)) : 'Unknown error'}`,\n errorContext,\n (err instanceof StateMachineError\n ? err.cause\n : err instanceof Error\n ? err\n : undefined) as Error | undefined,\n )\n }\n const handlers = (fallback ?? [this.onError]).filter(Boolean)\n if (handlers.length > 0) {\n const r = handlers\n .map((action) =>\n action\n ? typeof action === 'function'\n ? action\n : (this.context &&\n ((this.context as Record<string, unknown>)[action as string] as ErrorHandler<TOwner>)) ||\n (adaptee.get(action) as ErrorHandler<TOwner>)\n : undefined,\n )\n .filter(Boolean)\n .find((t) => t)\n if (r) handler = r\n }\n return (...args: any[]) => {\n const targetAdaptee = args.length >= 2 ? args[0] : adaptee\n const error = args.length >= 2 ? args[1] : args[0]\n return handler(targetAdaptee, error)\n }\n }\n\n private async callAction<CallResult>(\n obj: Adapter<TOwner>,\n actionName: ActionOrString<TOwner, CallResult>,\n ...args: any[]\n ): Promise<CallResult | void> {\n const _callActionState = this.getCurrentState(\n obj as unknown as Adapter<PropertiesOf<TOwner>>,\n )\n const context: ErrorContext = {\n /* c8 ignore next */\n ...(_callActionState !== undefined ? { state: _callActionState } : {}),\n phase: 'action',\n action: typeof actionName === 'string' ? actionName : 'anonymous',\n }\n\n const executeAction = async (): Promise<CallResult | void> => {\n try {\n // 1. Check in Context (Dependency Injection)\n if (this.context && (this.context as Record<string, unknown>)[actionName as string]) {\n const action = (this.context as Record<string, unknown>)[actionName as string] as EventAction<\n TOwner,\n CallResult\n >\n /* c8 ignore next */\n if (typeof action === 'function') {\n const result = action(this.context as any, ...args)\n return result instanceof Promise ? await result : result\n }\n }\n\n // 2. Check if it's an inline function (Compatibility mode)\n else if (typeof actionName === 'function') {\n const result = actionName(obj, ...args)\n return result instanceof Promise ? await result : result\n }\n\n // 3. Check in Object/Adaptee (Data Context)\n else if (obj.get(actionName as any)) {\n const action = obj.get(actionName as any)\n /* c8 ignore next */\n if (typeof action === 'function') {\n const result = action(obj, ...args)\n /* c8 ignore next */\n return result instanceof Promise ? await result : result\n }\n }\n throw new StateMachineError('No action found', context)\n } catch (error) {\n if (error instanceof StateMachineError) throw error\n throw new StateMachineError(\n `Error executing action: ${error instanceof Error ? error.message : String(error)}`,\n context,\n /* c8 ignore next */\n error instanceof Error ? error : undefined,\n )\n }\n }\n\n // Apply timeout if configured\n if (this.transitionTimeout && this.transitionTimeout > 0) {\n return Promise.race([\n executeAction(),\n new Promise<never>((_, reject) =>\n setTimeout(\n () => reject(new StateMachineError('Transition timeout', {\n /* c8 ignore next */\n action: typeof actionName === 'string' ? actionName : 'anonymous',\n phase: 'action'\n })),\n this.transitionTimeout\n )\n )\n ])\n }\n\n return executeAction()\n }\n\n private async getAllowedTransitions(\n obj: Adapter<PropertiesOf<TOwner>>,\n transitions: Array<Transition<TOwner, SMConfig['states']>>,\n ...args: unknown[]\n ) {\n let highestPriority = Number.NEGATIVE_INFINITY\n let selectedTransition: Transition<TOwner, SMConfig['states']> | undefined\n\n for (const transition of transitions) {\n if ((transition.priority ?? Number.NEGATIVE_INFINITY) < highestPriority) {\n continue\n }\n\n const _guardState = this.getCurrentState(obj)\n const context: ErrorContext = {\n /* c8 ignore next */\n ...(_guardState !== undefined ? { state: _guardState } : {}),\n phase: 'guard',\n transition: `${transition.from} -> ${transition.to}`,\n }\n\n const guardResult = transition.guard\n ? await this.callAction(obj as any, transition.guard, ...args).catch(\n this.processError(\n obj as any,\n context,\n transition.onError,\n this.onError,\n ),\n )\n : true\n if (!guardResult) {\n continue\n }\n\n highestPriority = transition.priority ?? Number.NEGATIVE_INFINITY\n selectedTransition = transition\n }\n\n return selectedTransition\n }\n\n private isTransitionPossible(\n transition: Transition<TOwner, SMConfig['states']>,\n currentState: string,\n ): boolean {\n const currentStates = this.parseCompositeState(currentState)\n\n // Handle wildcard transition\n if (transition.from === '*') {\n return true\n }\n\n const fromStates = transition.from.split('|')\n\n return fromStates.every((fromState) => {\n // Handle wildcard in parallel state part (e.g. \"lobby|*\")\n if (fromState === '*') return true\n\n const regionKey = this.getRegionKey(fromState)\n const currentStateForRegion = currentStates.get(regionKey)\n if (!currentStateForRegion) return false\n\n return (\n currentStateForRegion === fromState ||\n this.isParentState(currentStateForRegion, fromState)\n )\n })\n }\n\n private isParentState(parentState: string, childState: string): boolean {\n return (\n childState.startsWith(parentState + '.') || childState === parentState\n )\n }\n\n private async applyTransition(\n obj: Adapter<TOwner>,\n currentState: string,\n transition: Transition<TOwner, SMConfig['states']>,\n args: any[],\n eventName: keyof SMConfig['events'],\n event: Event<TOwner, SMConfig['states']>,\n ): Promise<State<TOwner> | undefined> {\n const context: ErrorContext = {\n state: currentState,\n event: String(eventName),\n transition: `${transition.from} -> ${transition.to}`,\n phase: 'transition',\n }\n\n const targetState = transition.to === '*' ? currentState : transition.to\n this._isTransitioning = true\n this._targetState = targetState as string\n\n try {\n // Phase 1: Guard validation\n if (transition.guard) {\n const allow = await this.callAction(obj, transition.guard, ...args).catch(\n this.processError(\n obj,\n { ...context, phase: 'guard' },\n transition.onError,\n this.onError,\n ),\n )\n /* c8 ignore next */\n if (!allow) {\n /* c8 ignore next */\n return undefined\n }\n }\n\n // Phase 2: Before event action\n if (event.onBefore) {\n await this.callAction(obj, event.onBefore, ...args).catch(\n this.processError(\n obj,\n { ...context },\n transition.onError,\n this.onError,\n ),\n )\n }\n\n // Phase 3: Exit actions\n try {\n await this.executeExitActions(obj, transition.from, args, context)\n } catch (error) {\n if (this.abortOnExitError) {\n this.logger.warn('Transition aborted due to onExit error', { state: currentState, error })\n return undefined // Stay in source state\n }\n throw error // Propagate error (likely stopping transition but potentially leaving inconsistent state if not handled by caller)\n }\n\n // Phase 4: History management\n this.manageStateHistory(transition.from, currentState, obj)\n\n // Phase 5: Transition action\n if (transition.onTransition) {\n await this.callAction(obj, transition.onTransition, ...args).catch(\n this.processError(\n obj,\n { ...context },\n transition.onError,\n this.onError,\n ),\n )\n }\n\n // Phase 6: Enter actions\n try {\n await this.executeEnterActions(obj, transition.to, args, context)\n } catch (error) {\n // ZOMBIE STATE PREVENTION\n if (this.errorState) {\n this.logger.error(`Failed to enter state '${targetState}'. Fallback to error state '${this.errorState}'`, { error })\n const newState = this.updateState(currentState, this.errorState)\n this.setCurrentState(newState, obj as any)\n return this.states.get(this.errorState)\n }\n throw error\n }\n\n // Phase 7: After event action\n if (event.onAfter) {\n try {\n await this.callAction(obj, event.onAfter, ...args)\n } catch (error) {\n const errorHandler = this.processError(\n obj,\n { ...context },\n event.onError,\n this.onError,\n )\n errorHandler(obj as any, error)\n }\n }\n\n // Phase 8: State update\n const transitionStartTime = Date.now()\n const newState = this.updateState(currentState, targetState)\n this.setCurrentState(newState, obj as any)\n\n // Record successful transition\n const transitionTime = Date.now() - transitionStartTime\n this.monitor.recordTransition(transitionTime, true)\n\n return this.states.get(targetState)\n } finally {\n this._isTransitioning = false\n this._targetState = undefined\n }\n }\n\n /**\n * Execute exit actions for a state\n */\n private async executeExitActions(\n obj: Adapter<TOwner>,\n fromStateName: string,\n args: any[],\n context: ErrorContext,\n ): Promise<void> {\n const fromState = this.states.get(fromStateName)\n\n // Clear timers when exiting the state\n if (this.activeTimers.has(fromStateName)) {\n const timers = this.activeTimers.get(fromStateName) || []\n for (const timerId of timers) {\n this.clearTimer(timerId)\n }\n this.activeTimers.delete(fromStateName)\n }\n\n // Clear entry time\n this.stateEntryTimes.delete(fromStateName)\n\n if (!fromState) return\n\n const exitContext = { ...context, phase: 'exit' as const }\n\n // Execute exit actions in sequence\n const exitActions = [\n fromState.onBeforeExit,\n fromState.onExit,\n fromState.onAfterExit,\n ]\n\n for (const action of exitActions) {\n if (action) {\n await this.callAction(obj, action, ...args).catch(\n this.processError(obj, exitContext, fromState.onError, this.onError),\n )\n }\n }\n }\n\n /**\n * Execute enter actions for a state\n */\n private async executeEnterActions(\n obj: Adapter<TOwner>,\n toStateName: string,\n args: any[],\n context: ErrorContext,\n ): Promise<void> {\n const toState = this.states.get(toStateName)\n if (!toState) return\n\n const enterContext = { ...context, phase: 'enter' as const }\n\n // Execute enter actions in sequence\n const enterActions = [\n toState.onBeforeEnter,\n toState.onEnter,\n toState.onAfterEnter,\n ]\n\n for (const action of enterActions) {\n if (action) {\n await this.callAction(obj, action, ...args).catch(\n this.processError(obj, enterContext, toState.onError, this.onError),\n )\n }\n }\n\n // Handle time-based transitions (invoke)\n if (toState.invoke && toState.invoke.length > 0) {\n // Record entry time if not already recorded (e.g. from resumeTimers)\n if (!this.stateEntryTimes.has(toStateName)) {\n this.stateEntryTimes.set(toStateName, Date.now())\n }\n\n const timers: any[] = []\n for (const invocation of toState.invoke) {\n // Check condition (cond) before starting the timer\n if (invocation.cond) {\n try {\n const shouldInvoke = invocation.cond(obj.adaptee)\n if (!shouldInvoke) continue\n } catch (e) {\n this.logger.error(\n 'Error in invoke condition',\n { state: toStateName },\n e as Error,\n )\n continue\n }\n }\n\n const callback = async () => {\n const currentState = this.getCurrentState(obj as any)\n if (currentState?.split('|').includes(toStateName)) {\n try {\n if (invocation.action) {\n await this.callAction(obj, invocation.action)\n }\n this.raiseEvent(invocation.event as string, obj as any)\n this.scheduleProcessing()\n } catch (err) {\n this.logger.error(\n 'Invocation error',\n { state: toStateName, event: invocation.event },\n err as Error,\n )\n }\n }\n }\n\n const timerId = this.setTimer(callback, invocation.delay)\n timers.push(timerId)\n }\n this.activeTimers.set(toStateName, timers)\n }\n }\n\n /**\n * Helper to set timer (native or scheduled)\n */\n private setTimer(callback: () => void, delay: number): any {\n // If scheduler is running (lazy mode enabled), use it.\n // Otherwise fallback to native setTimeout for standard behavior.\n const scheduler = this.scheduler\n if (scheduler.isActive()) {\n return scheduler.schedule(delay, callback)\n }\n return setTimeout(callback, delay)\n }\n\n /**\n * Helper to clear timer\n */\n private clearTimer(timerId: any): void {\n const scheduler = this.scheduler\n // We can try to cancel in scheduler even if inactive (it handles untracked tokens gracefully)\n // But to be safe and correct with types:\n // Note: TimerToken is object, setTimeout returns Timeout (Node) or number (Browser).\n // We check if it looks like our token (simple object) or native handle.\n if (\n scheduler.isActive() &&\n typeof timerId === 'object' &&\n timerId !== null &&\n !('ref' in timerId)\n ) {\n scheduler.cancel(timerId)\n } else {\n clearTimeout(timerId)\n }\n }\n\n /**\n * Manage state history for transitions\n */\n private manageStateHistory(\n fromStateName: string,\n currentState: string,\n obj: Adapter<TOwner>,\n ): void {\n const fromState = this.states.get(fromStateName)\n\n // Handle state history\n if (fromState?.history) {\n if (fromState.history === 'deep') {\n this.historyMap.set(fromState.name, currentState)\n } else if (fromState.history === 'shallow' && fromState.regions) {\n this.historyMap.set(fromState.name, this.getCurrentState(obj as any) ?? '')\n }\n }\n\n // Handle parent state history\n const fromStateParent = this.findParentStateWithHistory(fromStateName)\n if (fromStateParent?.history) {\n this.historyMap.set(fromStateParent.name, currentState)\n }\n }\n\n private findParentStateWithHistory(\n stateName: string,\n ): State<TOwner> | undefined {\n let current = stateName\n while (current.includes('.')) {\n current = current.split('.').slice(0, -1).join('.')\n const state = this.states.get(current)\n if (state?.history) return state\n }\n return undefined\n }\n\n private updatePartialState(\n currentState: string,\n parentState: StateName,\n newSubstate: string,\n ): string {\n if (!currentState) return newSubstate\n\n const currentParts = currentState.split('|')\n const regionKey = parentState.split('.').slice(0, -1).join('.')\n\n let updatedParts = currentParts\n .map((part) => {\n const partRegionKey = this.getRegionKey(part)\n if (partRegionKey === regionKey) {\n return newSubstate\n }\n if (partRegionKey.startsWith(`${regionKey}.`)) {\n return null\n }\n return part\n })\n .filter((m): m is string => m !== null && m !== undefined)\n\n if (!updatedParts.some((part) => this.getRegionKey(part) === regionKey)) {\n const regionState = this.states.get(newSubstate)\n if (regionState?.regions) {\n return currentState\n } else {\n updatedParts.push(newSubstate)\n }\n }\n\n updatedParts = updatedParts.filter((part) => part !== null) as string[]\n\n const newCompositeState = updatedParts.join('|')\n this.validateCompositeState(newCompositeState)\n\n return newCompositeState\n }\n\n private updateState(currentState: string, toState: string): string {\n const currentStateMap = this.parseCompositeState(currentState)\n const toStateParts = toState.split('|')\n\n // Handle simple root state transition\n if (toStateParts.length === 1 && !toState.includes('.')) {\n currentStateMap.clear()\n currentStateMap.set(toState, toState)\n return toState\n }\n\n // Handle complex state transitions with regions\n for (const toStatePart of toStateParts) {\n const regionKey = this.getRegionKey(toStatePart)\n const stateConfig = this.states.get(toStatePart)\n\n // Remove conflicting states efficiently\n this.removeConflictingStates(currentStateMap, regionKey)\n\n // Add new state or region states\n if (stateConfig?.regions) {\n this.addRegionStates(currentStateMap, stateConfig, toStatePart)\n } else {\n currentStateMap.set(regionKey, toStatePart)\n }\n }\n\n // Clean up root states\n this.cleanupRootStates(currentStateMap)\n\n const newCompositeState = Array.from(currentStateMap.values()).join('|')\n this.validateCompositeState(newCompositeState)\n return newCompositeState\n }\n\n /**\n * Remove conflicting states from the state map\n */\n private removeConflictingStates(\n currentStateMap: Map<string, string>,\n regionKey: string,\n ): void {\n const keysToDelete: string[] = []\n\n for (const [key, value] of currentStateMap.entries()) {\n const existingRegionKey = this.getRegionKey(value)\n if (\n existingRegionKey === regionKey ||\n existingRegionKey.startsWith(`${regionKey}.`)\n ) {\n keysToDelete.push(key)\n }\n }\n\n // Batch delete for better performance\n for (const key of keysToDelete) {\n currentStateMap.delete(key)\n }\n }\n\n /**\n * Add region states to the state map\n */\n private addRegionStates(\n currentStateMap: Map<string, string>,\n stateConfig: State<TOwner>,\n toStatePart: string,\n ): void {\n const initialStatesForRegions = this.getInitialStatesForRegions(\n stateConfig.regions!,\n toStatePart,\n )\n const regionStates = initialStatesForRegions.split('|')\n\n for (const regionState of regionStates) {\n const regionKeyNested = this.getRegionKey(regionState)\n currentStateMap.set(regionKeyNested, regionState)\n }\n }\n\n /**\n * Clean up root states from the state map\n */\n private cleanupRootStates(currentStateMap: Map<string, string>): void {\n const keysToDelete: string[] = []\n\n for (const [key, value] of currentStateMap.entries()) {\n if (!value.includes('.')) {\n keysToDelete.push(key)\n }\n }\n\n // Batch delete for better performance\n for (const key of keysToDelete) {\n currentStateMap.delete(key)\n }\n }\n\n private parseCompositeState(compositeState: string): Map<string, string> {\n const stateMap = new Map<string, string>()\n if (!compositeState) return stateMap\n\n // Optimized parsing with single split operation\n const stateParts = compositeState.split('|')\n for (let i = 0; i < stateParts.length; i++) {\n const statePart = stateParts[i]\n /* c8 ignore next */ if (statePart === undefined) continue\n const regionKey = this.getRegionKey(statePart)\n stateMap.set(regionKey, statePart)\n }\n return stateMap\n }\n\n private getRegionKey(statePath: string): string {\n // Optimized with lastIndexOf for better performance\n const lastDotIndex = statePath.lastIndexOf('.')\n return lastDotIndex === -1\n ? statePath\n : statePath.substring(0, lastDotIndex)\n }\n\n private resumeTimers() {\n // Clear any existing active timers first\n for (const timers of this.activeTimers.values()) {\n for (const id of timers) {\n this.clearTimer(id)\n }\n }\n this.activeTimers.clear()\n\n const currentState = this.getCurrentState()\n if (!currentState) return\n\n const activeStates = currentState.split('|')\n const activeStatesSet = new Set(activeStates)\n\n // GC: Remove times for inactive states to prevent memory leaks in stateEntryTimes\n for (const stateName of this.stateEntryTimes.keys()) {\n if (!activeStatesSet.has(stateName)) {\n this.stateEntryTimes.delete(stateName)\n }\n }\n\n const now = Date.now()\n\n for (const stateName of activeStates) {\n const state = this.states.get(stateName)\n if (!state || !state.invoke || state.invoke.length === 0) continue\n\n const entryTime = this.stateEntryTimes.get(stateName)\n // If no entry time recorded, assume just entered (fallback for old data)\n const startTime = entryTime || now\n if (!entryTime) {\n this.stateEntryTimes.set(stateName, startTime)\n }\n\n const elapsed = now - startTime\n const timers: any[] = []\n\n for (const invocation of state.invoke) {\n const remaining = Math.max(0, invocation.delay - elapsed)\n\n // If time already passed, fire immediately (in next tick)\n const callback = async () => {\n // Verify we are still in this state\n const current = this.getCurrentState(this.adaptee)\n if (current?.split('|').includes(stateName)) {\n try {\n // Check condition (cond) at execution time, not at setup time\n if (invocation.cond && this.adaptee) {\n try {\n if (!invocation.cond(this.adaptee.adaptee as any)) return\n } catch (_e) {\n return\n }\n }\n\n if (invocation.action && this.adaptee) {\n await this.callAction(this.adaptee as any, invocation.action)\n }\n await this.fireEvent(invocation.event as any).catch((err) => {\n this.logger.error(\n 'Resumed timer transition error',\n { state: stateName, event: invocation.event },\n err,\n )\n })\n } catch (_err) {\n /* log */\n }\n }\n }\n\n const timerId = this.setTimer(callback, remaining)\n timers.push(timerId)\n }\n this.activeTimers.set(stateName, timers)\n }\n }\n\n // Методы сериализации\n public toJSON(): string {\n // Pre-allocate objects for better performance\n const serializedStates: Record<string, any> = {}\n const serializedEvents: Record<string, any> = {}\n\n // Serialize states with optimized approach\n for (const [name, state] of this.states) {\n serializedStates[name as string] = this.serializeState(state)\n }\n\n // Serialize events with optimized approach\n for (const [name, event] of this.events) {\n serializedEvents[name as string] = this.serializeEvent(event)\n }\n\n const config = {\n initialState: this.initialState,\n stateAttribute: this.stateAttribute,\n states: serializedStates,\n events: serializedEvents,\n onError: this.serializeAction(this.onError, 'config_onError'),\n }\n\n return JSON.stringify({\n config,\n currentState: this.getCurrentState(),\n historyMap: Array.from(this.historyMap.entries()),\n stateEntryTimes: Array.from(this.stateEntryTimes.entries()),\n })\n }\n\n /**\n * Securely serializes the StateMachine to JSON (Async).\n * Generates cryptographic hashes for all functions.\n */\n public async toSecureJSON(): Promise<string> {\n const serializedStates: Record<string, any> = {}\n const serializedEvents: Record<string, any> = {}\n\n for (const [name, state] of this.states) {\n serializedStates[name as string] = await this.serializeStateAsync(state)\n }\n\n for (const [name, event] of this.events) {\n serializedEvents[name as string] = await this.serializeEventAsync(event)\n }\n\n const config = {\n initialState: this.initialState,\n stateAttribute: this.stateAttribute,\n states: serializedStates,\n events: serializedEvents,\n onError: await this.serializeActionAsync(this.onError, 'config_onError'),\n }\n\n return JSON.stringify({\n config,\n currentState: this.getCurrentState(),\n historyMap: Array.from(this.historyMap.entries()),\n stateEntryTimes: Array.from(this.stateEntryTimes.entries()),\n })\n }\n\n /**\n * Serialize state with optimized performance (Async)\n */\n private async serializeStateAsync(state: State<TOwner>): Promise<any> {\n const { name: _name, ...stateWithoutName } = state\n\n const serializedState: any = {\n ...stateWithoutName,\n onBeforeEnter: await this.serializeActionAsync(\n state.onBeforeEnter,\n 'onBeforeEnter',\n ),\n onEnter: await this.serializeActionAsync(state.onEnter, 'onEnter'),\n onAfterEnter: await this.serializeActionAsync(\n state.onAfterEnter,\n 'onAfterEnter',\n ),\n onBeforeExit: await this.serializeActionAsync(\n state.onBeforeExit,\n 'onBeforeExit',\n ),\n onExit: await this.serializeActionAsync(state.onExit, 'onExit'),\n onAfterExit: await this.serializeActionAsync(\n state.onAfterExit,\n 'onAfterExit',\n ),\n onError: await this.serializeActionAsync(state.onError, 'state_onError'),\n }\n\n if (state.invoke) {\n serializedState.invoke = await Promise.all(\n state.invoke.map(async (inv) => ({\n ...inv,\n cond: inv.cond != null\n ? await safeFunctionSerializer.serializeActionAsync(\n inv.cond,\n 'invoke_cond',\n )\n : undefined,\n action: inv.action != null\n ? await safeFunctionSerializer.serializeActionAsync(\n inv.action,\n 'invoke_action',\n )\n : undefined,\n })),\n )\n }\n\n return serializedState\n }\n\n /**\n * Serialize state with optimized performance\n */\n private serializeState(state: State<TOwner>): any {\n const { name: _name, ...stateWithoutName } = state\n\n const serializedState: any = {\n ...stateWithoutName,\n onBeforeEnter: this.serializeAction(state.onBeforeEnter, 'onBeforeEnter'),\n onEnter: this.serializeAction(state.onEnter, 'onEnter'),\n onAfterEnter: this.serializeAction(state.onAfterEnter, 'onAfterEnter'),\n onBeforeExit: this.serializeAction(state.onBeforeExit, 'onBeforeExit'),\n onExit: this.serializeAction(state.onExit, 'onExit'),\n onAfterExit: this.serializeAction(state.onAfterExit, 'onAfterExit'),\n onError: this.serializeAction(state.onError, 'state_onError'),\n }\n\n if (state.invoke) {\n serializedState.invoke = state.invoke.map((inv) => ({\n ...inv,\n cond: inv.cond != null\n ? safeFunctionSerializer.serializeAction(inv.cond, 'invoke_cond')\n : undefined,\n action: inv.action != null\n ? safeFunctionSerializer.serializeAction(inv.action, 'invoke_action')\n : undefined,\n }))\n }\n\n return serializedState\n }\n\n /**\n * Serialize event with optimized performance (Async)\n */\n private async serializeEventAsync(event: Event<TOwner, any>): Promise<any> {\n const { name: _name, ...eventWithoutName } = event\n\n return {\n ...eventWithoutName,\n onBefore: await this.serializeActionAsync(\n event.onBefore,\n 'event_onBefore',\n ),\n onAfter: await this.serializeActionAsync(event.onAfter, 'event_onAfter'),\n onSuccess: await this.serializeActionAsync(\n event.onSuccess,\n 'event_onSuccess',\n ),\n onError: await this.serializeActionAsync(event.onError, 'event_onError'),\n transitions: await Promise.all(\n event.transitions.map((t) => this.serializeTransitionAsync(t)),\n ),\n }\n }\n\n /**\n * Serialize transition (Async)\n */\n private async serializeTransitionAsync(\n transition: Transition<TOwner, any>,\n ): Promise<any> {\n return {\n ...transition,\n guard: await this.serializeActionAsync(\n transition.guard,\n 'transition_guard',\n ),\n onTransition: await this.serializeActionAsync(\n transition.onTransition,\n 'transition_onTransition',\n ),\n onError: await this.serializeActionAsync(\n transition.onError,\n 'transition_onError',\n ),\n }\n }\n\n /**\n * Serialize event with optimized performance\n */\n private serializeEvent(event: Event<TOwner, any>): any {\n const { name: _name, ...eventWithoutName } = event\n\n return {\n ...eventWithoutName,\n onBefore: this.serializeAction(event.onBefore, 'event_onBefore'),\n onAfter: this.serializeAction(event.onAfter, 'event_onAfter'),\n onSuccess: this.serializeAction(event.onSuccess, 'event_onSuccess'),\n onError: this.serializeAction(event.onError, 'event_onError'),\n transitions: event.transitions.map((transition) => ({\n ...transition,\n guard: this.serializeAction(transition.guard, 'transition_guard'),\n onTransition: this.serializeAction(\n transition.onTransition,\n 'transition_onTransition',\n ),\n onError: this.serializeAction(transition.onError, 'transition_onError'),\n })),\n }\n }\n\n private async serializeActionAsync(\n action: any,\n name: string,\n ): Promise<SafeSerializedAction | undefined> {\n if (!action) return undefined\n return safeFunctionSerializer.serializeActionAsync(action, name)\n }\n\n /**\n * Optimized action serialization using safe serializer\n */\n private serializeAction(action: any, functionName?: string): any {\n if (typeof action === 'function') {\n return safeFunctionSerializer.serializeAction(action, functionName)\n }\n return action\n }\n}\n","// src/lite.ts (INTERNAL module; the public API is exposed via src/index.ts)\n// This file holds the createMachine factory. Do NOT add subsystem re-exports here—\n// they belong in src/index.ts. Adding them here creates duplicate exports under\n// node16 moduleResolution.\n\nimport { StateMachine } from './state_machine'\nimport {\n type Adapter,\n MemoryAdapter,\n type StateMachineConfig,\n type StateMachineOptions,\n} from './types'\n\n/**\n * Public factory for @vedmalex/statemachine. DI-free; the only factory in this package.\n */\nexport function createMachine<T extends object>(\n config: StateMachineConfig<T>,\n owner?: T | Adapter<T>,\n options?: StateMachineOptions,\n): StateMachine<T, any> {\n if (owner && 'get' in owner) {\n return new StateMachine(config, owner as any, options)\n } else if (owner) {\n const adapter = new MemoryAdapter(owner)\n return new StateMachine(config, adapter as any, options)\n } else {\n return new StateMachine(config, undefined, options)\n }\n}\n","/**\n * Configuration validation module for StateMachine library\n * Validates StateMachine configurations to prevent runtime errors\n */\n\n// Removed unused imports from error_handling\nimport { stateMachineLogger } from './logger'\nimport type { Event, Events, State, StateMachineConfig, States } from './types'\n\n// Validation result types\nexport interface ValidationResult {\n isValid: boolean\n errors: ValidationError[]\n warnings: ValidationWarning[]\n}\n\nexport interface ValidationError {\n code: string\n message: string\n severity: 'error' | 'warning'\n path: string\n details?: Record<string, any>\n // ✅ НОВЫЕ ПОЛЯ\n suggestion?: string // Текстовая подсказка \"Как исправить\"\n documentationUrl?: string // Ссылка на раздел документации\n}\n\nexport interface ValidationWarning extends ValidationError {\n severity: 'warning'\n}\n\n// ✅ НОВЫЕ ИНТЕРФЕЙСЫ ДЛЯ КАСТОМНЫХ ПРАВИЛ\ninterface ValidationContext {\n addError(\n code: string,\n message: string,\n path: string,\n suggestion?: string,\n ): void\n addWarning(\n code: string,\n message: string,\n path: string,\n suggestion?: string,\n ): void\n}\n\ntype CustomRule<T extends object = any> = {\n id: string\n validate: (config: StateMachineConfig<T>, context: ValidationContext) => void\n}\n\n// Validation rules configuration\nexport interface ValidationConfig {\n strictMode: boolean\n allowEmptyStates: boolean\n allowEmptyEvents: boolean\n maxStateDepth: number\n maxStatesCount: number\n maxEventsCount: number\n requireInitialState: boolean\n validateTransitionPaths: boolean\n validateActionReferences: boolean\n customRules?: CustomRule[] // ✅ Добавлено\n}\n\nexport const DEFAULT_VALIDATION_CONFIG: ValidationConfig = {\n strictMode: false,\n allowEmptyStates: false,\n allowEmptyEvents: false,\n maxStateDepth: 10,\n maxStatesCount: 1000,\n maxEventsCount: 1000,\n requireInitialState: true,\n validateTransitionPaths: true,\n validateActionReferences: false, // Disabled by default as actions might be dynamic\n}\n\n// Configuration validator class\nexport class ConfigValidator {\n private config: ValidationConfig\n private errors: ValidationError[] = []\n private warnings: ValidationWarning[] = []\n\n constructor(config: Partial<ValidationConfig> = {}) {\n this.config = { ...DEFAULT_VALIDATION_CONFIG, ...config }\n }\n\n /**\n * Validates a complete StateMachine configuration\n */\n validate<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): ValidationResult {\n this.errors = []\n this.warnings = []\n\n try {\n // Basic structure validation\n this.validateBasicStructure(smConfig)\n\n // States validation\n this.validateStates(smConfig.states, 'states')\n\n // Events validation\n this.validateEvents(smConfig.events, smConfig.states, 'events')\n\n // Initial state validation\n this.validateInitialState(smConfig)\n\n // Cross-references validation\n this.validateCrossReferences(smConfig)\n\n // Performance validation\n this.validatePerformanceConstraints(smConfig)\n\n // ✅ Запуск кастомных правил\n this.runCustomRules(smConfig)\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error)\n this.addError(\n 'VALIDATION_FAILED',\n `Validation process failed: ${msg}`,\n 'validation',\n )\n }\n\n const result: ValidationResult = {\n isValid: this.errors.length === 0,\n errors: this.errors,\n warnings: this.warnings,\n }\n\n // Log validation results\n if (!result.isValid) {\n stateMachineLogger.error('StateMachine configuration validation failed', {\n errorCount: this.errors.length,\n warningCount: this.warnings.length,\n configName: smConfig.name,\n })\n } else if (this.warnings.length > 0) {\n stateMachineLogger.warn('StateMachine configuration has warnings', {\n warningCount: this.warnings.length,\n configName: smConfig.name,\n })\n }\n\n return result\n }\n\n /**\n * Runs custom validation rules\n */\n private runCustomRules<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n if (!this.config.customRules || this.config.customRules.length === 0) return\n\n const context: ValidationContext = {\n addError: (code, msg, path, sugg) =>\n this.addError(code, msg, path, undefined, sugg),\n addWarning: (code, msg, path, sugg) =>\n this.addWarning(code, msg, path, undefined, sugg),\n }\n\n for (const rule of this.config.customRules) {\n try {\n rule.validate(smConfig, context)\n } catch (e) {\n this.addError(\n 'CUSTOM_RULE_ERROR',\n `Rule ${rule.id} failed: ${e instanceof Error ? e.message : String(e)}`,\n 'root',\n )\n }\n }\n }\n\n private validateBasicStructure<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n // Required fields\n if (!smConfig.name || typeof smConfig.name !== 'string') {\n this.addError(\n 'MISSING_NAME',\n 'StateMachine must have a valid name',\n 'name',\n )\n }\n\n if (\n !smConfig.stateAttribute ||\n typeof smConfig.stateAttribute !== 'string'\n ) {\n this.addError(\n 'MISSING_STATE_ATTRIBUTE',\n 'StateMachine must have a valid stateAttribute',\n 'stateAttribute',\n )\n }\n\n if (!smConfig.states || typeof smConfig.states !== 'object') {\n this.addError(\n 'MISSING_STATES',\n 'StateMachine must have states configuration',\n 'states',\n )\n return\n }\n\n if (!smConfig.events || typeof smConfig.events !== 'object') {\n this.addError(\n 'MISSING_EVENTS',\n 'StateMachine must have events configuration',\n 'events',\n )\n return\n }\n\n // Empty collections check\n if (\n !this.config.allowEmptyStates &&\n Object.keys(smConfig.states).length === 0\n ) {\n this.addError(\n 'EMPTY_STATES',\n 'StateMachine cannot have empty states collection',\n 'states',\n )\n }\n\n if (\n !this.config.allowEmptyEvents &&\n Object.keys(smConfig.events).length === 0\n ) {\n this.addError(\n 'EMPTY_EVENTS',\n 'StateMachine cannot have empty events collection',\n 'events',\n )\n }\n }\n\n private validateStates<T extends object>(\n states: States<T>,\n basePath: string,\n depth = 0,\n ): void {\n if (depth > this.config.maxStateDepth) {\n this.addError(\n 'MAX_DEPTH_EXCEEDED',\n `State nesting depth exceeds maximum of ${this.config.maxStateDepth}`,\n basePath,\n )\n return\n }\n\n for (const [stateName, stateConfig] of Object.entries(states)) {\n const statePath = `${basePath}.${stateName}`\n this.validateState(stateConfig, statePath, depth)\n }\n }\n\n private validateState<T extends object>(\n state: Omit<State<T>, 'name'>,\n path: string,\n depth: number,\n ): void {\n // State name validation\n if (!path.split('.').pop()) {\n this.addError('INVALID_STATE_NAME', 'State name cannot be empty', path)\n }\n\n // Display name validation\n if (state.display && typeof state.display !== 'string') {\n this.addWarning(\n 'INVALID_DISPLAY',\n 'State display should be a string',\n `${path}.display`,\n )\n }\n\n // Regions validation\n if (state.regions) {\n if (typeof state.regions !== 'object') {\n this.addError(\n 'INVALID_REGIONS',\n 'State regions must be an object',\n `${path}.regions`,\n )\n } else {\n for (const [regionName, regionStates] of Object.entries(\n state.regions,\n )) {\n if (!regionName) {\n this.addError(\n 'EMPTY_REGION_NAME',\n 'Region name cannot be empty',\n `${path}.regions`,\n )\n continue\n }\n\n this.validateStates(\n regionStates,\n `${path}.regions.${regionName}`,\n depth + 1,\n )\n }\n }\n }\n\n // History validation\n if (state.history && !['deep', 'shallow'].includes(state.history)) {\n this.addError(\n 'INVALID_HISTORY',\n 'State history must be \"deep\" or \"shallow\"',\n `${path}.history`,\n )\n }\n\n // Initial state validation for regions\n if (state.regions && state.initial) {\n const hasInitialState = Object.values(state.regions).some(\n (regionStates) => Object.keys(regionStates).includes(state.initial!),\n )\n if (!hasInitialState) {\n this.addError(\n 'INVALID_INITIAL_STATE',\n `Initial state \"${state.initial}\" not found in any region`,\n `${path}.initial`,\n )\n }\n }\n\n // Invoke (StateInvocation) validation\n if (state.invoke) {\n if (!Array.isArray(state.invoke)) {\n this.addError(\n 'INVALID_INVOKE',\n 'State \"invoke\" must be an array of StateInvocation',\n `${path}.invoke`,\n )\n } else {\n state.invoke.forEach((inv, index) => {\n const invPath = `${path}.invoke[${index}]`\n if (typeof inv.delay !== 'number' || inv.delay < 0) {\n this.addError(\n 'INVALID_DELAY',\n 'Delay must be a positive number',\n `${invPath}.delay`,\n )\n }\n if (!inv.event || typeof inv.event !== 'string') {\n this.addError(\n 'INVALID_EVENT_NAME',\n 'Event name must be a string',\n `${invPath}.event`,\n )\n }\n if (inv.cond && typeof inv.cond !== 'function') {\n this.addError(\n 'INVALID_COND',\n 'Condition must be a function',\n `${invPath}.cond`,\n )\n }\n })\n }\n }\n }\n\n private validateEvents<T extends object>(\n events: Events<T, States<T>>,\n states: States<T>,\n basePath: string,\n ): void {\n for (const [eventName, eventConfig] of Object.entries(events)) {\n const eventPath = `${basePath}.${eventName}`\n this.validateEvent(eventConfig, eventPath, states)\n }\n }\n\n private validateEvent<T extends object>(\n event: Omit<Event<T, States<T>>, 'name'>,\n path: string,\n states: States<T>,\n ): void {\n // Transitions validation\n if (!event.transitions || !Array.isArray(event.transitions)) {\n this.addError(\n 'MISSING_TRANSITIONS',\n 'Event must have transitions array',\n `${path}.transitions`,\n )\n return\n }\n\n if (event.transitions.length === 0) {\n this.addWarning(\n 'EMPTY_TRANSITIONS',\n 'Event has no transitions',\n `${path}.transitions`,\n )\n }\n\n // Validate each transition\n event.transitions.forEach((transition, index) => {\n this.validateTransition(\n transition,\n `${path}.transitions[${index}]`,\n states,\n )\n })\n\n // Priority validation\n const priorities = event.transitions\n .map((t) => t.priority)\n .filter((p) => p !== undefined) as number[]\n\n if (\n priorities.length > 0 &&\n priorities.length !== event.transitions.length\n ) {\n this.addWarning(\n 'MIXED_PRIORITIES',\n 'Some transitions have priority while others do not',\n `${path}.transitions`,\n )\n }\n }\n\n private validateTransition<T extends object>(\n transition: any,\n path: string,\n states: States<T>,\n ): void {\n // From state validation\n if (!transition.from || typeof transition.from !== 'string') {\n this.addError(\n 'INVALID_FROM_STATE',\n 'Transition must have a valid from state',\n `${path}.from`,\n )\n } else if (this.config.validateTransitionPaths) {\n this.validateStatePath(transition.from, states, `${path}.from`)\n }\n\n // To state validation\n if (!transition.to || typeof transition.to !== 'string') {\n this.addError(\n 'INVALID_TO_STATE',\n 'Transition must have a valid to state',\n `${path}.to`,\n )\n } else if (this.config.validateTransitionPaths) {\n this.validateStatePath(transition.to, states, `${path}.to`)\n }\n\n // Priority validation\n if (\n transition.priority !== undefined &&\n typeof transition.priority !== 'number'\n ) {\n this.addError(\n 'INVALID_PRIORITY',\n 'Transition priority must be a number',\n `${path}.priority`,\n )\n }\n\n // Self-transition warning\n if (transition.from === transition.to) {\n this.addWarning(\n 'SELF_TRANSITION',\n 'Transition from and to states are the same',\n path,\n )\n }\n }\n\n private validateStatePath<T extends object>(\n statePath: string,\n states: States<T>,\n path: string,\n ): void {\n // Handle composite states (separated by |)\n const stateParts = statePath.split('|')\n\n for (const part of stateParts) {\n if (!this.isValidStatePath(part, states)) {\n this.addError(\n 'INVALID_STATE_PATH',\n `State path \"${part}\" does not exist`,\n path,\n )\n }\n }\n }\n\n private isValidStatePath<T extends object>(\n statePath: string,\n states: States<T>,\n ): boolean {\n const parts = statePath.split('.')\n let currentStates = states\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (part === undefined) return false\n\n if (i === 0) {\n // Root state\n if (!currentStates[part]) {\n return false\n }\n const state = currentStates[part]\n if (parts.length === 1) {\n return true // Simple state path\n }\n if (!state.regions) {\n return false // No regions but path continues\n }\n // Continue with regions\n } else if (i === 1) {\n // Region name\n const rootStatePart = parts[0]\n if (rootStatePart === undefined) return false\n const rootState = currentStates[rootStatePart]\n if (!rootState || !rootState.regions || !rootState.regions[part]) {\n return false\n }\n currentStates = rootState.regions[part]\n } else {\n // Nested state in region\n if (!currentStates[part]) {\n return false\n }\n const state = currentStates[part]\n if (i === parts.length - 1) {\n return true // Last part\n }\n if (!state.regions) {\n return false\n }\n // Continue deeper...\n }\n }\n\n return true\n }\n\n private validateInitialState<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n if (this.config.requireInitialState) {\n if (!smConfig.initialState) {\n this.addError(\n 'MISSING_INITIAL_STATE',\n 'StateMachine must have an initial state',\n 'initialState',\n )\n return\n }\n\n if (!smConfig.states[smConfig.initialState as string]) {\n this.addError(\n 'INVALID_INITIAL_STATE',\n `Initial state \"${smConfig.initialState}\" does not exist`,\n 'initialState',\n undefined,\n `Check the 'states' object. Ensure that '${smConfig.initialState}' is defined as a root state.`,\n )\n }\n }\n }\n\n private validateCrossReferences<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n // Collect all state names (including nested)\n const allStateNames = new Set<string>()\n this.collectStateNames(smConfig.states, '', allStateNames)\n\n // Event names are available through Object.keys(smConfig.events)\n\n // Check for unreachable states\n const reachableStates = new Set<string>()\n if (smConfig.initialState) {\n reachableStates.add(smConfig.initialState as string)\n }\n\n // Add states reachable through transitions\n for (const event of Object.values(smConfig.events)) {\n for (const transition of event.transitions) {\n if (transition.to) {\n const toParts = transition.to.split('|')\n toParts.forEach((part) => reachableStates.add(part))\n }\n }\n }\n\n // Report unreachable states\n for (const stateName of allStateNames) {\n if (!reachableStates.has(stateName)) {\n this.addWarning(\n 'UNREACHABLE_STATE',\n `State \"${stateName}\" is not reachable`,\n `states.${stateName}`,\n )\n }\n }\n\n // Check for unused events (events with no valid transitions)\n for (const [eventName, event] of Object.entries(smConfig.events)) {\n const hasValidTransitions = event.transitions.some(\n (t) => allStateNames.has(t.from) && allStateNames.has(t.to),\n )\n if (!hasValidTransitions) {\n this.addWarning(\n 'UNUSED_EVENT',\n `Event \"${eventName}\" has no valid transitions`,\n `events.${eventName}`,\n )\n }\n }\n }\n\n private collectStateNames<T extends object>(\n states: States<T>,\n prefix: string,\n collector: Set<string>,\n ): void {\n for (const [stateName, state] of Object.entries(states)) {\n const fullName = prefix ? `${prefix}.${stateName}` : stateName\n collector.add(fullName)\n\n if (state.regions) {\n for (const [regionName, regionStates] of Object.entries(\n state.regions,\n )) {\n this.collectStateNames(\n regionStates,\n `${fullName}.${regionName}`,\n collector,\n )\n }\n }\n }\n }\n\n private validatePerformanceConstraints<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n const stateCount = this.countStates(smConfig.states)\n const eventCount = Object.keys(smConfig.events).length\n\n if (stateCount > this.config.maxStatesCount) {\n this.addWarning(\n 'TOO_MANY_STATES',\n `State count (${stateCount}) exceeds recommended maximum (${this.config.maxStatesCount})`,\n 'states',\n )\n }\n\n if (eventCount > this.config.maxEventsCount) {\n this.addWarning(\n 'TOO_MANY_EVENTS',\n `Event count (${eventCount}) exceeds recommended maximum (${this.config.maxEventsCount})`,\n 'events',\n )\n }\n\n // Check for complex transition patterns\n let totalTransitions = 0\n for (const event of Object.values(smConfig.events)) {\n totalTransitions += event.transitions.length\n }\n\n if (totalTransitions > stateCount * 3) {\n this.addWarning(\n 'COMPLEX_TRANSITIONS',\n 'High transition-to-state ratio may impact performance',\n 'events',\n )\n }\n }\n\n private countStates<T extends object>(states: States<T>): number {\n let count = Object.keys(states).length\n\n for (const state of Object.values(states)) {\n if (state.regions) {\n for (const regionStates of Object.values(state.regions)) {\n count += this.countStates(regionStates)\n }\n }\n }\n\n return count\n }\n\n private addError(\n code: string,\n message: string,\n path: string,\n details?: Record<string, any>,\n suggestion?: string,\n ): void {\n this.errors.push({\n code,\n message,\n severity: 'error',\n path,\n ...(details !== undefined ? { details } : {}),\n ...(suggestion !== undefined ? { suggestion } : {}),\n })\n }\n\n private addWarning(\n code: string,\n message: string,\n path: string,\n details?: Record<string, any>,\n suggestion?: string,\n ): void {\n this.warnings.push({\n code,\n message,\n severity: 'warning',\n path,\n ...(details !== undefined ? { details } : {}),\n ...(suggestion !== undefined ? { suggestion } : {}),\n })\n }\n}\n\n// Utility functions\nexport function validateConfig<T extends object>(\n config: StateMachineConfig<T>,\n validationConfig?: Partial<ValidationConfig>,\n): ValidationResult {\n const validator = new ConfigValidator(validationConfig)\n return validator.validate(config)\n}\n\nexport function validateConfigStrict<T extends object>(\n config: StateMachineConfig<T>,\n): ValidationResult {\n return validateConfig(config, { strictMode: true })\n}\n\nexport function isValidConfig<T extends object>(\n config: StateMachineConfig<T>,\n): boolean {\n return validateConfig(config).isValid\n}\n"],"mappings":"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","names":["regions","adaptee","newState"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/scheduler.ts","../src/logger.ts","../src/security.ts","../src/monitoring.ts","../src/types.ts","../src/error_handling.ts","../src/state_machine.ts","../src/lite.ts","../src/config_validator.ts"],"sourcesContent":["/**\n * @packageDocumentation\n *\n * @vedmalex/statemachine — hierarchical state machine for TypeScript.\n *\n * @unstable — full surface defaults to @unstable per the package's STABILITY policy.\n * Per-symbol @stable tags below mark firm exports for the 1.0.0-beta.x consumer contract.\n *\n * @see README.md for usage and stability policy.\n */\n\n// === Stable public surface (5 firm symbols) ===\n\n/**\n * @stable — primary factory; the canonical consumer entry point.\n * @category Stable\n */\nexport { createMachine } from './lite'\n\n/**\n * @stable — class form for advanced consumers needing direct instance access.\n * @category Stable\n */\nexport { StateMachine } from './state_machine'\n\n// === Stable type re-exports ===\n\n/**\n * @stable — top-level machine configuration interface.\n * @category Stable\n */\nexport type { StateMachineConfig } from './types'\n\n/**\n * @stable — transition descriptor used in events.\n * @category Stable\n */\nexport type { Transition } from './types'\n\n/**\n * @stable — state node shape; consumed by States<T> map.\n * @category Stable\n */\nexport type { State } from './types'\n\n// === @unstable type re-exports (inherit package-level @unstable default) ===\n\n/**\n * @category Unstable\n */\nexport type {\n States,\n Events,\n Event,\n Adapter,\n StateMachineOptions,\n RegionsConfig,\n StateInvocation,\n StateName,\n EventName,\n RegionName,\n EventAction,\n ErrorHandler,\n ActionOrString,\n ErrorHandlerOrString,\n RegionStateName,\n NestedStateName,\n DeepNestedStateName,\n StatePaths,\n SimpleStateName,\n MethodsOf,\n PropertiesOf,\n KeysOf,\n ExtractAdaptee,\n ErrorContext,\n} from './types'\n\n/**\n * @category Unstable\n * @unstable — validation preset/config shape used by validation helpers and presets.\n */\nexport type { ValidationConfig } from './config_validator'\n\n/**\n * @category Unstable\n * @unstable — monitoring preset/config shape used by monitoring helpers and presets.\n */\nexport type { MonitoringConfig } from './monitoring'\n\n// === Public adapter classes (live in types.ts) ===\n\nexport {\n MemoryAdapter,\n LocalStorageAdapter,\n SessionStorageAdapter,\n ServerAdapter,\n StateMachineError,\n isAdapter,\n} from './types'\n\n// === Curated error types (preserved from TASK-002) ===\n\nexport {\n createEnhancedError,\n EnhancedStateMachineError,\n ErrorAnalytics,\n ErrorCategory,\n type ErrorCategory as ErrorCategoryType,\n ErrorHandler as EnhancedErrorHandler,\n type ErrorRecoveryStrategy,\n ErrorSeverity,\n type ErrorSeverity as ErrorSeverityType,\n type ExtendedErrorContext,\n FallbackStateRecoveryStrategy,\n isRecoverableError,\n RetryRecoveryStrategy,\n} from './error_handling'\n\n// globalErrorHandler removed in TASK-004 (singleton elimination per ISS-007/ISS-008).\n\n// === Public config validator entry points ===\n\nexport {\n validateConfig,\n validateConfigStrict,\n isValidConfig,\n type ValidationResult,\n type ValidationError,\n type ValidationWarning,\n} from './config_validator'\n\n// === Extension-point interfaces (per TASK-006 EP catalog) — @unstable ===\n\n/**\n * @category Unstable\n * @unstable — observability injection contract; implement to collect per-machine metrics.\n */\nexport type { IMonitor } from './types'\n\n/**\n * @category Unstable\n * @unstable — timer scheduling injection contract; implement for WASM/host portability.\n */\nexport type { ITimerScheduler } from './types'\n\n/**\n * @category Unstable\n * @unstable — virtual-clock type alias; matches the `clock` option in StateMachineOptions.\n */\nexport type { Clock } from './scheduler'\n\n/**\n * @category Unstable\n * @unstable — factory for a deterministic, non-real-time scheduler. Pass the\n * returned scheduler together with the same `clock` function in StateMachine\n * options to enable virtual-time (DST) testing without real setTimeout.\n *\n * @example\n * ```ts\n * let t = 0\n * const clock = () => t\n * const scheduler = createVirtualScheduler(clock)\n * const sm = new StateMachine(config, adapter, { clock, scheduler })\n * await Promise.resolve() // flush microtasks: enter initial state + arm invoke timers\n * t = 1000\n * scheduler.process() // advance virtual time to 1000 ms\n * ```\n */\nexport { createVirtualScheduler } from './scheduler'\n\n/**\n * @category Unstable\n * @unstable — error-handler injection contract; implement to replace built-in recovery.\n */\nexport type { IErrorHandler } from './types'\n\n/**\n * @category Unstable\n * @unstable — logging injection contract; implement to route logs to host logging stack.\n */\nexport type { ILogger } from './types'\n\n/**\n * @category Unstable\n * @unstable — persistence adapter contract; implement to save/restore machine state.\n */\nexport type { StatePersistenceAdapter } from './types'\n\n/**\n * @category Unstable\n * @unstable — transition observability context passed to IMonitor.recordTransition.\n */\nexport type { TransitionContext } from './types'\n\n/**\n * @category Unstable\n * @unstable — aggregate observability snapshot returned by IMonitor.getMetrics.\n */\nexport type { MonitorMetricsSnapshot } from './types'\n","import type { ITimerScheduler } from './types'\n\n/**\n * Clock function type: returns the current virtual or real time in ms.\n * Matches the signature of `Date.now`.\n */\nexport type Clock = () => number\n\n/**\n * Тип для идентификатора таймера\n */\ntype TimerToken = object\n\ninterface TimerTask {\n token: TimerToken\n executeAt: number\n callback: () => void\n}\n\n/**\n * Планировщик таймеров на базе Min-Heap (Двоичная куча).\n * Позволяет эффективно управлять тысячами таймеров, используя единый цикл проверки.\n */\nexport class TimerScheduler {\n // Min-Heap: элемент с наименьшим executeAt всегда в index 0\n private heap: TimerTask[] = []\n\n // Set для быстрой проверки отмененных задач (Lazy Cancellation)\n // Это позволяет удалять задачи за O(1) без поиска в куче O(n)\n private activeTokens: WeakSet<TimerToken> = new WeakSet()\n\n private intervalId: any = null\n private pollingInterval = 100 // ms\n private readonly clock: Clock\n\n constructor(clock: Clock = Date.now) {\n this.clock = clock\n }\n\n /**\n * Настройка режима опроса\n * @param interval Интервал проверки в мс. Если 0 или null - авто-тик выключается (ручной режим)\n */\n public setPollingInterval(interval: number | null) {\n this.stop()\n if (interval !== null && interval > 0) {\n this.pollingInterval = interval\n this.start()\n }\n }\n\n /**\n * Проверка активности планировщика\n */\n public isActive(): boolean {\n return this.intervalId !== null\n }\n\n /**\n * Запуск единого таймера\n */\n public start() {\n if (this.intervalId) return\n this.intervalId = setInterval(() => this.process(this.clock()), this.pollingInterval)\n }\n\n /**\n * Остановка единого таймера\n */\n public stop() {\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = null\n }\n }\n\n /**\n * Добавить задачу\n * @param delay задержка в мс\n * @param callback функция для выполнения\n * @returns токен для отмены\n */\n public schedule(delay: number, callback: () => void): TimerToken {\n const token = {}\n const executeAt = this.clock() + delay\n\n const task: TimerTask = { token, executeAt, callback }\n\n this.activeTokens.add(token)\n this.insert(task)\n\n return token\n }\n\n /**\n * Отменить задачу\n * @param token токен задачи\n */\n public cancel(token: TimerToken) {\n // Просто удаляем из активных токенов.\n // Задача останется в куче, но будет пропущена при обработке (Lazy Delete).\n this.activeTokens.delete(token)\n }\n\n /**\n * Обработать очередь (вызывается таймером или вручную)\n */\n public process(now: number = this.clock()) {\n while (this.heap.length > 0) {\n // Смотрим на самый ранний таймер\n const task = this.heap[0]\n /* c8 ignore next */ if (task === undefined) break\n\n // Если его время еще не пришло - останавливаемся\n if (task.executeAt > now) {\n break\n }\n\n // Извлекаем задачу\n this.extractMin()\n\n // Если задача не была отменена - выполняем\n if (this.activeTokens.has(task.token)) {\n this.activeTokens.delete(task.token)\n try {\n task.callback()\n } catch (e) {\n console.error('Error in scheduled task', e)\n }\n }\n }\n }\n\n /**\n * Очистить все задачи\n */\n public clear() {\n this.heap = []\n // WeakSet нельзя очистить явно, но это и не нужно,\n // так как без ссылок из heap токены будут собраны GC\n this.activeTokens = new WeakSet()\n }\n\n // === Min-Heap Implementation ===\n\n private insert(task: TimerTask) {\n this.heap.push(task)\n this.bubbleUp(this.heap.length - 1)\n }\n\n private extractMin(): TimerTask | undefined {\n /* c8 ignore next */ if (this.heap.length === 0) return undefined\n\n const min = this.heap[0]\n /* c8 ignore next */ if (min === undefined) return undefined\n const last = this.heap.pop()\n\n if (this.heap.length > 0 && last !== undefined) {\n this.heap[0] = last\n this.sinkDown(0)\n }\n\n return min\n }\n\n private bubbleUp(index: number) {\n while (index > 0) {\n const parentIndex = Math.floor((index - 1) / 2)\n const parent = this.heap[parentIndex]\n const current = this.heap[index]\n /* c8 ignore next */ if (parent === undefined || current === undefined) break\n if (parent.executeAt <= current.executeAt) break\n\n this.swap(index, parentIndex)\n index = parentIndex\n }\n }\n\n private sinkDown(index: number) {\n const length = this.heap.length\n const element = this.heap[index]\n /* c8 ignore next */ if (element === undefined) return\n\n while (true) {\n const leftChildIdx = 2 * index + 1\n const rightChildIdx = 2 * index + 2\n let swapIdx: number | null = null\n\n if (leftChildIdx < length) {\n const leftChild = this.heap[leftChildIdx]\n if (leftChild !== undefined && leftChild.executeAt < element.executeAt) {\n swapIdx = leftChildIdx\n }\n }\n\n if (rightChildIdx < length) {\n const rightChild = this.heap[rightChildIdx]\n /* c8 ignore next */\n if (rightChild !== undefined) {\n if (\n (swapIdx === null && rightChild.executeAt < element.executeAt) ||\n /* c8 ignore next */\n (swapIdx !== null && this.heap[swapIdx] !== undefined &&\n rightChild.executeAt < this.heap[swapIdx]!.executeAt)\n ) {\n swapIdx = rightChildIdx\n }\n }\n }\n\n if (swapIdx === null) break\n\n this.swap(index, swapIdx)\n index = swapIdx\n }\n }\n\n private swap(a: number, b: number) {\n const temp = this.heap[a]\n const other = this.heap[b]\n /* c8 ignore next */ if (temp === undefined || other === undefined) return\n this.heap[a] = other\n this.heap[b] = temp\n }\n}\n\n/**\n * @internal — default factory for StateMachine.scheduler injection slot.\n * Returns a new TimerScheduler instance (NOT a singleton).\n * Same-module placement required: TimerScheduler constructor is public within module.\n */\nexport function createDefaultScheduler(): ITimerScheduler {\n return new TimerScheduler()\n}\n\n/**\n * Returns a deterministic virtual-time scheduler driven entirely by the\n * supplied `clock` function. Intended for tests, simulation, and DST.\n *\n * Guarantees:\n * - `isActive()` always returns `true` — StateMachine routes all timers\n * through it and never touches real `setTimeout`/`setInterval`.\n * - No real timer is ever created.\n * - `schedule(delay, cb)` queues a task at `clock() + delay`.\n * - `process(now?)` drains every task whose `executeAt <= now`\n * (default `now` is `clock()`).\n *\n * @example\n * ```ts\n * let t = 0\n * const clock = () => t\n * const scheduler = createVirtualScheduler(clock)\n * const sm = new StateMachine(config, adaptee, { clock, scheduler })\n * await Promise.resolve() // flush microtasks: enter initial state + arm invoke timers\n * t = 1000\n * scheduler.process() // fires all tasks due by t=1000\n * ```\n */\nexport function createVirtualScheduler(clock: Clock): ITimerScheduler {\n // Reuse TimerScheduler's heap + lazy-cancel logic; the inner instance is\n // constructed with the same clock, so schedule()/process() use virtual time.\n const inner = new TimerScheduler(clock)\n\n return {\n isActive(): boolean {\n return true\n },\n schedule(delay: number, callback: () => void): object {\n return inner.schedule(delay, callback)\n },\n cancel(token: object): void {\n inner.cancel(token)\n },\n process(now?: number): void {\n inner.process(now ?? clock())\n },\n }\n}\n","/**\n * Professional logging system for StateMachine library\n * Replaces console.log/console.error with configurable, structured logging\n */\n\n// Log levels in order of severity\nexport const LogLevel = {\n DEBUG: 0,\n INFO: 1,\n WARN: 2,\n ERROR: 3,\n FATAL: 4,\n OFF: 5,\n} as const\n\nexport type LogLevel = (typeof LogLevel)[keyof typeof LogLevel]\n\n// Log level names for display\nconst LogLevelNames: Record<LogLevel, string> = {\n [LogLevel.DEBUG]: 'DEBUG',\n [LogLevel.INFO]: 'INFO',\n [LogLevel.WARN]: 'WARN',\n [LogLevel.ERROR]: 'ERROR',\n [LogLevel.FATAL]: 'FATAL',\n [LogLevel.OFF]: 'OFF',\n}\n\n// Log entry structure\ninterface LogEntry {\n timestamp: number\n level: LogLevel\n message: string\n context?: Record<string, any>\n error?: Error\n source: string\n}\n\n// Logger configuration\ninterface LoggerConfig {\n level: LogLevel\n enableConsole: boolean\n enableStructuredLogging: boolean\n timestampFormat: 'iso' | 'unix' | 'relative'\n includeStackTrace: boolean\n}\n\n// Default logger configuration\nexport const DEFAULT_LOGGER_CONFIG: LoggerConfig = {\n level: LogLevel.WARN, // Only warnings and above in production\n enableConsole: true,\n enableStructuredLogging: false,\n timestampFormat: 'iso',\n includeStackTrace: false,\n}\n\n// Log appender interface for extensibility\ninterface LogAppender {\n append(entry: LogEntry): void\n}\n\n// Console appender implementation\nexport class ConsoleAppender implements LogAppender {\n private config: LoggerConfig\n\n constructor(config: LoggerConfig) {\n this.config = config\n }\n\n append(entry: LogEntry): void {\n if (!this.config.enableConsole) return\n\n const timestamp = this.formatTimestamp(entry.timestamp)\n const levelName = LogLevelNames[entry.level]\n const prefix = `[${timestamp}] [${levelName}] [${entry.source}]`\n\n if (this.config.enableStructuredLogging) {\n const structuredEntry = {\n timestamp: entry.timestamp,\n level: levelName,\n source: entry.source,\n message: entry.message,\n context: entry.context,\n error: entry.error?.message,\n }\n console.log(JSON.stringify(structuredEntry))\n } else {\n const message = `${prefix} ${entry.message}`\n\n switch (entry.level) {\n case LogLevel.DEBUG:\n case LogLevel.INFO:\n console.log(message, entry.context || '')\n break\n case LogLevel.WARN:\n console.warn(message, entry.context || '')\n break\n case LogLevel.ERROR:\n case LogLevel.FATAL:\n console.error(message, entry.context || '', entry.error || '')\n if (this.config.includeStackTrace && entry.error) {\n console.error(entry.error.stack)\n }\n break\n }\n }\n }\n\n private formatTimestamp(timestamp: number): string {\n switch (this.config.timestampFormat) {\n case 'unix':\n return timestamp.toString()\n case 'relative':\n return `+${timestamp - Date.now()}ms`\n case 'iso':\n default:\n return new Date(timestamp).toISOString()\n }\n }\n}\n\n// Memory appender for testing\nexport class MemoryAppender implements LogAppender {\n private entries: LogEntry[] = []\n\n append(entry: LogEntry): void {\n this.entries.push(entry)\n }\n\n getEntries(): LogEntry[] {\n return [...this.entries]\n }\n\n clear(): void {\n this.entries = []\n }\n\n getEntriesByLevel(level: LogLevel): LogEntry[] {\n return this.entries.filter((entry) => entry.level === level)\n }\n}\n\n// Main logger class\nexport class Logger {\n private config: LoggerConfig\n private appenders: LogAppender[] = []\n private source: string\n\n constructor(source: string, config: Partial<LoggerConfig> = {}) {\n this.source = source\n this.config = { ...DEFAULT_LOGGER_CONFIG, ...config }\n\n // Add default console appender\n this.appenders.push(new ConsoleAppender(this.config))\n }\n\n // Add custom appender\n addAppender(appender: LogAppender): void {\n this.appenders.push(appender)\n }\n\n // Remove appender\n removeAppender(appender: LogAppender): void {\n const index = this.appenders.indexOf(appender)\n if (index > -1) {\n this.appenders.splice(index, 1)\n }\n }\n\n // Update configuration\n updateConfig(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config }\n }\n\n // Check if level is enabled\n isLevelEnabled(level: LogLevel): boolean {\n return level >= this.config.level && this.config.level !== LogLevel.OFF\n }\n\n // Core logging method\n private log(\n level: LogLevel,\n message: string,\n context?: Record<string, any>,\n error?: Error,\n ): void {\n if (!this.isLevelEnabled(level)) return\n\n const entry: LogEntry = {\n timestamp: Date.now(),\n level,\n message,\n ...(context !== undefined ? { context } : {}),\n ...(error !== undefined ? { error } : {}),\n source: this.source,\n }\n\n this.appenders.forEach((appender) => {\n try {\n appender.append(entry)\n } catch (e) {\n // Fallback to console if appender fails\n console.error('Logger appender failed:', e)\n }\n })\n }\n\n // Convenience methods\n debug(message: string, context?: Record<string, any>): void {\n this.log(LogLevel.DEBUG, message, context)\n }\n\n info(message: string, context?: Record<string, any>): void {\n this.log(LogLevel.INFO, message, context)\n }\n\n warn(message: string, context?: Record<string, any>): void {\n this.log(LogLevel.WARN, message, context)\n }\n\n error(message: string, context?: Record<string, any>, error?: Error): void {\n this.log(LogLevel.ERROR, message, context, error)\n }\n\n fatal(message: string, context?: Record<string, any>, error?: Error): void {\n this.log(LogLevel.FATAL, message, context, error)\n }\n\n // Create child logger with additional context\n child(childSource: string, _additionalContext?: Record<string, any>): Logger {\n const childLogger = new Logger(`${this.source}.${childSource}`, this.config)\n childLogger.appenders = this.appenders\n return childLogger\n }\n}\n\n// Global logger factory\nexport class LoggerFactory {\n private static defaultConfig: LoggerConfig = DEFAULT_LOGGER_CONFIG\n private static loggers: Map<string, Logger> = new Map()\n\n static setDefaultConfig(config: Partial<LoggerConfig>): void {\n LoggerFactory.defaultConfig = { ...DEFAULT_LOGGER_CONFIG, ...config }\n }\n\n static getLogger(source: string, config?: Partial<LoggerConfig>): Logger {\n const key = source\n if (!LoggerFactory.loggers.has(key)) {\n const loggerConfig = config\n ? { ...LoggerFactory.defaultConfig, ...config }\n : LoggerFactory.defaultConfig\n LoggerFactory.loggers.set(key, new Logger(source, loggerConfig))\n }\n return LoggerFactory.loggers.get(key)!\n }\n\n static clearLoggers(): void {\n LoggerFactory.loggers.clear()\n }\n}\n\n// Convenience exports\nexport const getLogger = LoggerFactory.getLogger\nexport const setDefaultLogLevel = (level: LogLevel) => {\n LoggerFactory.setDefaultConfig({ level })\n}\n\n// Pre-configured loggers for common use cases\nexport const stateMachineLogger = getLogger('StateMachine')\nexport const securityLogger = getLogger('Security')\n","/**\n * @deprecated Will be removed in a follow-up task. Security policy enforcement should\n * happen at the host-application layer; this module is a source-tree marker.\n *\n * Post TD-T3-4 pruning, symbols from this module are not reachable from `dist/index.js` —\n * the deprecation has no public deprecation cycle, only source-tree intent.\n *\n * Governance treatments (multi-treatment file, per TASK-003 CODE_REVIEW F-CR3-8):\n * - tsconfig.json `include: [\"src/**\\/*\"]` — typechecked under strict TS for now\n * - vitest.config.ts `coverage.exclude` — excluded from coverage instrumentation\n * - knip.json `ignore` — excluded from unused-export warnings\n * - package.json `files: [\"dist\", \"types\", ...]` — NOT shipped to npm (since TASK-003 CODE_REVIEW F-CR3-1)\n *\n * Removal trigger: when no in-tree code references the file (currently `src/tests/security.test.ts`\n * does), delete the file plus its test plus all four governance-list entries above.\n *\n * Security module for safe function serialization and validation\n * Replaces unsafe `new Function()` usage with secure alternatives\n */\n\nimport { securityLogger } from './logger'\nimport type {\n ActionOrString,\n ErrorHandler,\n ErrorHandlerOrString,\n EventAction,\n KeysOf,\n} from './types'\n\n// Configuration for function security\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport interface FunctionSecurityConfig {\n allowedFunctionNames: Set<string>\n maxFunctionLength: number\n enableValidation: boolean\n customPatterns?: DangerousPattern[]\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport type FunctionRiskLevel = 'low' | 'medium' | 'high' | 'critical'\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport interface DangerousPattern {\n pattern: RegExp\n risk: FunctionRiskLevel\n description: string\n category?: string\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport interface FunctionValidationResult {\n isValid: boolean\n errors: string[]\n riskLevel: FunctionRiskLevel\n detectedPatterns: string[]\n}\n\nconst BUILTIN_PATTERNS: DangerousPattern[] = [\n {\n pattern: /\\beval\\s*\\(/gi,\n risk: 'critical',\n description: 'Direct eval() usage',\n category: 'eval',\n },\n {\n pattern: /\\bFunction\\s*\\(/gi,\n risk: 'high',\n description: 'Dynamic Function constructor call',\n category: 'eval',\n },\n {\n pattern: /new\\s+Function\\s*\\(/gi,\n risk: 'high',\n description: 'Dynamic function creation',\n category: 'eval',\n },\n {\n pattern: /setTimeout\\s*\\(\\s*['\"`][^'\"`]*['\"`]/gi,\n risk: 'high',\n description: 'setTimeout with string code',\n category: 'eval',\n },\n {\n pattern: /setInterval\\s*\\(\\s*['\"`][^'\"`]*['\"`]/gi,\n risk: 'high',\n description: 'setInterval with string code',\n category: 'eval',\n },\n {\n pattern: /\\bfetch\\s*\\(/gi,\n risk: 'medium',\n description: 'Network request via fetch',\n category: 'network',\n },\n {\n pattern: /XMLHttpRequest/gi,\n risk: 'medium',\n description: 'XMLHttpRequest usage',\n category: 'network',\n },\n {\n pattern: /WebSocket/gi,\n risk: 'medium',\n description: 'WebSocket connection',\n category: 'network',\n },\n {\n pattern: /require\\s*\\(\\s*['\"`]fs['\"`]\\s*\\)/gi,\n risk: 'high',\n description: 'File system access via require(\"fs\")',\n category: 'filesystem',\n },\n {\n pattern: /import.*from\\s*['\"`]fs['\"`]/gi,\n risk: 'high',\n description: 'File system access via import',\n category: 'filesystem',\n },\n {\n pattern: /document\\./gi,\n risk: 'medium',\n description: 'DOM access',\n category: 'dom',\n },\n {\n pattern: /window\\./gi,\n risk: 'medium',\n description: 'Window object access',\n category: 'dom',\n },\n {\n pattern: /innerHTML/gi,\n risk: 'high',\n description: 'innerHTML manipulation (XSS risk)',\n category: 'dom',\n },\n {\n pattern: /global\\./gi,\n risk: 'high',\n description: 'Global scope access',\n category: 'global',\n },\n {\n pattern: /process\\./gi,\n risk: 'high',\n description: 'Process object access',\n category: 'process',\n },\n {\n pattern: /child_process/gi,\n risk: 'critical',\n description: 'Child process execution',\n category: 'process',\n },\n {\n pattern: /exec\\s*\\(/gi,\n risk: 'critical',\n description: 'Command execution',\n category: 'process',\n },\n {\n pattern: /require\\s*\\(/gi,\n risk: 'critical',\n description: 'CommonJS require',\n category: 'module',\n },\n {\n pattern: /import\\s*\\(/gi,\n risk: 'critical',\n description: 'Dynamic import',\n category: 'module',\n },\n {\n pattern: /__proto__/gi,\n risk: 'critical',\n description: 'Prototype pollution',\n category: 'prototype',\n },\n {\n pattern: /constructor/gi,\n risk: 'critical',\n description: 'Constructor access',\n category: 'prototype',\n },\n {\n pattern: /prototype/gi,\n risk: 'critical',\n description: 'Prototype access',\n category: 'prototype',\n },\n {\n pattern: /\\[['\"]__proto__['\"]\\]/gi,\n risk: 'critical',\n description: 'Prototype pollution via bracket notation',\n category: 'prototype',\n },\n {\n pattern: /constructor\\s*\\[/gi,\n risk: 'critical',\n description: 'Constructor access via bracket notation',\n category: 'prototype',\n },\n]\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport const DEFAULT_SECURITY_CONFIG: FunctionSecurityConfig = {\n allowedFunctionNames: new Set([\n // Common safe function patterns\n 'onEnter',\n 'onExit',\n 'onBeforeEnter',\n 'onAfterEnter',\n 'onBeforeExit',\n 'onAfterExit',\n 'onTransition',\n 'onError',\n 'guard',\n 'onBefore',\n 'onAfter',\n 'onSuccess',\n\n // Internal serializer function names (used as metadata)\n 'config_onError',\n 'state_onError',\n 'event_onBefore',\n 'event_onAfter',\n 'event_onSuccess',\n 'event_onError',\n 'transition_guard',\n 'transition_onTransition',\n 'transition_onError',\n 'invoke_cond',\n 'invoke_action',\n\n // Legacy deserialization marker\n 'legacy_deserialization',\n ]),\n maxFunctionLength: 10000, // 10KB limit\n enableValidation: true,\n customPatterns: [],\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport type SafeSerializedAction =\n | {\n type: 'string'\n name: string\n }\n | {\n type: 'function'\n body: string\n hash: string // Security hash for validation\n metadata: {\n length: number\n createdAt: number\n functionName?: string\n }\n }\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport class FunctionValidator {\n private config: FunctionSecurityConfig\n private allPatterns: DangerousPattern[]\n\n constructor(config: Partial<FunctionSecurityConfig> = {}) {\n this.config = { ...DEFAULT_SECURITY_CONFIG, ...config }\n this.allPatterns = [\n ...BUILTIN_PATTERNS,\n ...(this.config.customPatterns ?? []),\n ]\n }\n\n public addCustomPattern(pattern: DangerousPattern): void {\n this.allPatterns.push(pattern)\n }\n\n /**\n * Validates function body for security threats.\n *\n * Never throws: returns a structured result.\n */\n validate(body: string, functionName?: string): FunctionValidationResult {\n if (!this.config.enableValidation) {\n return {\n isValid: true,\n errors: [],\n riskLevel: 'low',\n detectedPatterns: [],\n }\n }\n\n const errors: string[] = []\n const detectedPatterns: string[] = []\n let riskLevel: FunctionRiskLevel = 'low'\n\n // Check length limit\n if (body.length > this.config.maxFunctionLength) {\n errors.push(\n `Function body exceeds maximum length of ${this.config.maxFunctionLength} characters`,\n )\n riskLevel = 'high'\n }\n\n const riskPriority: Record<FunctionRiskLevel, number> = {\n low: 0,\n medium: 1,\n high: 2,\n critical: 3,\n }\n\n for (const { pattern, risk, description } of this.allPatterns) {\n if (pattern.global || pattern.sticky) {\n pattern.lastIndex = 0\n }\n if (pattern.test(body)) {\n errors.push(`Function contains dangerous pattern: ${description}`)\n detectedPatterns.push(description)\n if (riskPriority[risk] > riskPriority[riskLevel]) {\n riskLevel = risk\n }\n }\n }\n\n // Validate function name if provided\n if (functionName && !this.config.allowedFunctionNames.has(functionName)) {\n errors.push(`Function name '${functionName}' is not in allowed list`)\n if (riskLevel === 'low') riskLevel = 'medium'\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n riskLevel,\n detectedPatterns,\n }\n }\n\n /**\n * Validates function body for security threats\n */\n validateFunctionBody(body: string, functionName?: string): boolean {\n const result = this.validate(body, functionName)\n if (!result.isValid) {\n throw new Error(result.errors.join('; '))\n }\n return result.isValid\n }\n\n /**\n * Creates a security hash for function validation\n */\n async createSecurityHash(body: string, metadata: any): Promise<string> {\n // Use Web Crypto API for secure hashing\n const encoder = new TextEncoder()\n const data = encoder.encode(body + JSON.stringify(metadata))\n\n // Check if crypto is available (Browser/Node/Bun)\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const hashBuffer = await crypto.subtle.digest('SHA-256', data)\n return Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('')\n }\n\n // Fallback for environments without crypto.subtle (should be rare in modern envs)\n // Using a slightly better non-crypto hash (FNV-1a inspired) than the previous simple shift\n const str = body + JSON.stringify(metadata)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n return (hash >>> 0).toString(16)\n }\n\n /**\n * Validates security hash\n */\n async validateSecurityHash(\n body: string,\n metadata: any,\n expectedHash: string,\n ): Promise<boolean> {\n const actualHash = await this.createSecurityHash(body, metadata)\n return actualHash === expectedHash\n }\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport class SafeFunctionSerializer {\n public validator: FunctionValidator\n\n constructor(config?: Partial<FunctionSecurityConfig>) {\n this.validator = new FunctionValidator(config)\n }\n\n /**\n * Safely serializes an action with security validation (Async)\n */\n async serializeActionAsync<TOwner extends object, R = void>(\n action: ActionOrString<TOwner, R> | ErrorHandlerOrString<TOwner>,\n functionName?: string,\n ): Promise<SafeSerializedAction | undefined> {\n if (typeof action === 'string') {\n return { type: 'string', name: action }\n } else if (typeof action === 'function') {\n const body = action.toString()\n\n // Validate function body\n this.validator.validateFunctionBody(body, functionName)\n\n const metadata = {\n length: body.length,\n createdAt: Date.now(),\n ...(functionName !== undefined ? { functionName } : {}),\n }\n\n const hash = await this.validator.createSecurityHash(body, metadata)\n\n return {\n type: 'function',\n body,\n hash,\n metadata,\n }\n }\n return undefined\n }\n\n /**\n * Legacy synchronous serialization (Uses weak hash, kept for backward compatibility)\n * @deprecated Use serializeActionAsync instead for better security\n */\n serializeAction<TOwner extends object, R = void>(\n action: ActionOrString<TOwner, R> | ErrorHandlerOrString<TOwner>,\n functionName?: string,\n ): SafeSerializedAction | undefined {\n if (typeof action === 'string') {\n return { type: 'string', name: action }\n } else if (typeof action === 'function') {\n const body = action.toString()\n this.validator.validateFunctionBody(body, functionName)\n\n const metadata = {\n length: body.length,\n createdAt: Date.now(),\n ...(functionName !== undefined ? { functionName } : {}),\n }\n\n // Sync version uses the weak fallback hash logic implicitly or needs a sync version of createHash\n // We'll implement a sync weak hash here inline to preserve sync behavior\n const str = body + JSON.stringify(metadata)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n\n return {\n type: 'function',\n body,\n hash: (hash >>> 0).toString(16),\n metadata,\n }\n }\n return undefined\n }\n\n /**\n * Safely deserializes an action with security validation (Async)\n */\n async deserializeActionAsync<TOwner extends object, R = void>(\n serializedAction: SafeSerializedAction | undefined,\n ): Promise<\n ActionOrString<TOwner, R> | ErrorHandlerOrString<TOwner> | undefined\n > {\n if (!serializedAction) {\n return undefined\n }\n\n if (serializedAction.type === 'string') {\n return serializedAction.name as KeysOf<TOwner, EventAction<TOwner, R>>\n } else if (serializedAction.type === 'function') {\n try {\n // Validate security hash\n const isValid = await this.validator.validateSecurityHash(\n serializedAction.body,\n serializedAction.metadata,\n serializedAction.hash,\n )\n\n if (!isValid) {\n // Fallback check for legacy weak hash if crypto hash failed\n // This allows reading old backups/configs\n const str =\n serializedAction.body + JSON.stringify(serializedAction.metadata)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n const legacyHash = (hash >>> 0).toString(16)\n\n if (legacyHash !== serializedAction.hash) {\n throw new Error('Function security hash validation failed')\n }\n }\n\n // Re-validate function body\n this.validator.validateFunctionBody(\n serializedAction.body,\n serializedAction.metadata.functionName,\n )\n\n // Create function using safe method\n return this.createSafeFunction(serializedAction.body)\n } catch (e) {\n securityLogger.error(\n 'Error deserializing function',\n {\n functionName: serializedAction.metadata.functionName,\n bodyLength: serializedAction.body.length,\n hash: serializedAction.hash,\n },\n e instanceof Error ? e : new Error(String(e)),\n )\n return undefined\n }\n }\n return undefined\n }\n\n /**\n * Safely deserializes an action (Synchronous - Legacy/Weak)\n */\n deserializeAction<TOwner extends object, R = void>(\n serializedAction: SafeSerializedAction | undefined,\n ): ActionOrString<TOwner, R> | ErrorHandlerOrString<TOwner> | undefined {\n if (!serializedAction) {\n return undefined\n }\n\n if (serializedAction.type === 'string') {\n return serializedAction.name as KeysOf<TOwner, EventAction<TOwner, R>>\n } else if (serializedAction.type === 'function') {\n try {\n // Sync validation only checks weak hash\n const str =\n serializedAction.body + JSON.stringify(serializedAction.metadata)\n let hash = 0x811c9dc5\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n const calculatedHash = (hash >>> 0).toString(16)\n\n if (calculatedHash !== serializedAction.hash) {\n // We cannot verify crypto hashes synchronously, so we must fail or skip verification\n // for crypto hashes. If the hash looks like a weak hash (short hex), we check it.\n // If it looks like SHA-256 (64 chars), we can't verify it sync.\n if (serializedAction.hash.length === 64) {\n console.warn(\n 'Warning: Skipping verification of SHA-256 hash in synchronous deserializeAction. Use deserializeActionAsync for security.',\n )\n } else {\n throw new Error('Function security hash validation failed (Legacy)')\n }\n }\n\n this.validator.validateFunctionBody(\n serializedAction.body,\n serializedAction.metadata.functionName,\n )\n\n return this.createSafeFunction(serializedAction.body)\n } catch (e) {\n securityLogger.error(\n 'Error deserializing function',\n {\n functionName: serializedAction.metadata.functionName,\n bodyLength: serializedAction.body.length,\n hash: serializedAction.hash,\n },\n e instanceof Error ? e : new Error(String(e)),\n )\n return undefined\n }\n }\n return undefined\n }\n\n /**\n * Safely deserializes legacy function strings (without security metadata)\n * This method provides backward compatibility for old string-based function serialization\n * while maintaining security through validation and sandboxing.\n */\n deserializeLegacyString(\n action: string,\n ): EventAction<any> | ErrorHandler<any> | undefined {\n if (!action || typeof action !== 'string') {\n return undefined\n }\n\n try {\n // Validate function body for security threats\n this.validator.validateFunctionBody(action, 'legacy_deserialization')\n\n // Create function using the same safe method as modern serialization\n return this.createSafeFunction(action)\n } catch (e) {\n securityLogger.error(\n 'Blocked unsafe legacy function string',\n { actionLength: action.length },\n e instanceof Error ? e : new Error(String(e)),\n )\n return undefined\n }\n }\n\n /**\n * Creates a function safely without using new Function()\n * Uses a whitelist approach with predefined function templates\n */\n private createSafeFunction(\n body: string,\n ): EventAction<any> | ErrorHandler<any> {\n // For now, we'll use a safer approach with Function constructor\n // but with additional validation and sandboxing.\n //\n // Important: we must preserve the original function *signature* (parameter names),\n // because state machine code calls hooks/conditions with specific arguments\n // (e.g. invoke.cond(adaptee)). Stripping the wrapper breaks that contract.\n try {\n const source = body.trim()\n\n // Executor runs in a restricted scope and evaluates the provided function source\n // as an expression, then calls it with (adaptee, ...args).\n const executor = new Function(\n 'adaptee',\n 'args',\n `\n // Block dangerous globals by creating local variables that shadow them\n var eval = undefined;\n var Function = undefined;\n var setTimeout = undefined;\n var setInterval = undefined;\n var document = undefined;\n var window = undefined;\n var global = undefined;\n var process = undefined;\n var require = undefined;\n\n const __fn = (${source});\n if (typeof __fn !== 'function') {\n throw new Error('Deserialized source is not a function');\n }\n return __fn(adaptee, ...(Array.isArray(args) ? args : []));\n `,\n ) as (adaptee: any, args: any[]) => any\n\n // Preserve varargs call style used across the codebase.\n return ((adaptee: any, ...args: any[]) => executor(adaptee, args)) as\n | EventAction<any>\n | ErrorHandler<any>\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e)\n throw new Error(`Failed to create safe function: ${message}`)\n }\n }\n}\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\n// Global instance for convenience\nexport const safeFunctionSerializer = new SafeFunctionSerializer()\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport const serializeAction = safeFunctionSerializer.serializeAction.bind(\n safeFunctionSerializer,\n)\n\n/**\n * @deprecated host-application-level enforcement; this module will be removed in a follow-up task.\n */\nexport const deserializeAction = safeFunctionSerializer.deserializeAction.bind(\n safeFunctionSerializer,\n)\n","// Monitoring and metrics module for StateMachine\n// Provides essential monitoring for state machine transitions and errors\n\nimport { stateMachineLogger } from './logger'\nimport type { ErrorContext, IMonitor, MonitorMetricsSnapshot, TransitionContext } from './types'\n\n/**\n * Performance metrics interface\n */\ninterface PerformanceMetrics {\n transitionTime: number\n stateChangeCount: number\n errorCount: number\n timestamp: number\n}\n\n/**\n * Health check status\n */\nexport const HealthStatus = {\n HEALTHY: 'healthy',\n WARNING: 'warning',\n CRITICAL: 'critical',\n UNKNOWN: 'unknown',\n} as const\n\nexport type HealthStatus = (typeof HealthStatus)[keyof typeof HealthStatus]\n\n/**\n * Health check result\n */\ninterface HealthCheckResult {\n status: HealthStatus\n message: string\n timestamp: number\n metrics?: Record<string, any>\n}\n\n/**\n * Monitoring configuration\n */\nexport interface MonitoringConfig {\n enabled: boolean\n metricsInterval: number // milliseconds\n healthCheckInterval: number // milliseconds\n maxMetricsHistory: number\n thresholds: {\n transitionTimeWarning: number // milliseconds\n transitionTimeCritical: number // milliseconds\n errorRateWarning: number // percentage\n errorRateCritical: number // percentage\n }\n}\n\n/**\n * Default monitoring configuration\n */\nexport const DEFAULT_MONITORING_CONFIG: MonitoringConfig = {\n enabled: true,\n metricsInterval: 5000, // 5 seconds\n healthCheckInterval: 30000, // 30 seconds\n maxMetricsHistory: 1000,\n thresholds: {\n transitionTimeWarning: 100, // 100ms\n transitionTimeCritical: 500, // 500ms\n errorRateWarning: 5, // 5%\n errorRateCritical: 15, // 15%\n },\n}\n\n/**\n * Metrics collector for StateMachine performance monitoring\n */\nexport class MetricsCollector {\n private metrics: PerformanceMetrics[] = []\n private config: MonitoringConfig\n private startTime: number = Date.now()\n private transitionCount = 0\n private errorCount = 0\n\n constructor(config: Partial<MonitoringConfig> = {}) {\n this.config = { ...DEFAULT_MONITORING_CONFIG, ...config }\n }\n\n /**\n * Record a state transition\n */\n recordTransition(transitionTime: number): void {\n if (!this.config.enabled) return\n\n this.transitionCount++\n\n const metrics: PerformanceMetrics = {\n transitionTime,\n stateChangeCount: this.transitionCount,\n errorCount: this.errorCount,\n timestamp: Date.now(),\n }\n\n this.addMetrics(metrics)\n this.logMetrics(metrics)\n }\n\n /**\n * Record an error\n */\n recordError(): void {\n if (!this.config.enabled) return\n this.errorCount++\n }\n\n /**\n * Get current metrics summary\n */\n getMetricsSummary(): {\n totalTransitions: number\n totalErrors: number\n averageTransitionTime: number\n errorRate: number\n uptime: number\n } {\n const now = Date.now()\n const uptime = now - this.startTime\n const recentMetrics = this.getRecentMetrics(60000) // Last minute\n\n const averageTransitionTime =\n recentMetrics.length > 0\n ? recentMetrics.reduce((sum, m) => sum + m.transitionTime, 0) /\n recentMetrics.length\n : 0\n\n const errorRate =\n this.transitionCount > 0\n ? (this.errorCount / this.transitionCount) * 100\n : 0\n\n return {\n totalTransitions: this.transitionCount,\n totalErrors: this.errorCount,\n averageTransitionTime,\n errorRate,\n uptime,\n }\n }\n\n /**\n * Get metrics history\n */\n getMetricsHistory(timeRange?: number): PerformanceMetrics[] {\n if (timeRange) {\n return this.getRecentMetrics(timeRange)\n }\n return [...this.metrics]\n }\n\n /**\n * Clear metrics history\n */\n clearMetrics(): void {\n this.metrics = []\n this.transitionCount = 0\n this.errorCount = 0\n this.startTime = Date.now()\n }\n\n /**\n * Get recent metrics within time range\n */\n private getRecentMetrics(timeRange: number): PerformanceMetrics[] {\n const cutoff = Date.now() - timeRange\n return this.metrics.filter((m) => m.timestamp >= cutoff)\n }\n\n /**\n * Add metrics to history with size limit\n */\n private addMetrics(metrics: PerformanceMetrics): void {\n this.metrics.push(metrics)\n\n // Maintain size limit\n if (this.metrics.length > this.config.maxMetricsHistory) {\n this.metrics = this.metrics.slice(-this.config.maxMetricsHistory)\n }\n }\n\n /**\n * Log metrics if significant\n */\n private logMetrics(metrics: PerformanceMetrics): void {\n const { thresholds } = this.config\n\n if (metrics.transitionTime > thresholds.transitionTimeCritical) {\n stateMachineLogger.error('Critical transition time detected', {\n transitionTime: metrics.transitionTime,\n threshold: thresholds.transitionTimeCritical,\n })\n } else if (metrics.transitionTime > thresholds.transitionTimeWarning) {\n stateMachineLogger.warn('Slow transition detected', {\n transitionTime: metrics.transitionTime,\n threshold: thresholds.transitionTimeWarning,\n })\n }\n }\n}\n\n/**\n * Performance monitor for real-time tracking\n */\nexport class PerformanceMonitor {\n private metricsCollector: MetricsCollector\n private config: MonitoringConfig\n private intervalId: NodeJS.Timeout | undefined\n private isRunning = false\n\n constructor(\n metricsCollector: MetricsCollector,\n config: Partial<MonitoringConfig> = {},\n ) {\n this.metricsCollector = metricsCollector\n this.config = { ...DEFAULT_MONITORING_CONFIG, ...config }\n }\n\n /**\n * Start performance monitoring\n */\n start(): void {\n if (this.isRunning || !this.config.enabled) return\n\n this.isRunning = true\n this.intervalId = setInterval(() => {\n this.collectMetrics()\n }, this.config.metricsInterval)\n\n stateMachineLogger.info('Performance monitoring started', {\n interval: this.config.metricsInterval,\n })\n }\n\n /**\n * Stop performance monitoring\n */\n stop(): void {\n if (!this.isRunning) return\n\n this.isRunning = false\n /* c8 ignore next 4 */\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = undefined\n }\n\n stateMachineLogger.info('Performance monitoring stopped')\n }\n\n /**\n * Get current performance status\n */\n getPerformanceStatus(): {\n status: HealthStatus\n summary: ReturnType<MetricsCollector['getMetricsSummary']>\n issues: string[]\n } {\n const summary = this.metricsCollector.getMetricsSummary()\n const issues: string[] = []\n let status: HealthStatus = HealthStatus.HEALTHY\n\n // Check error rate\n if (summary.errorRate >= this.config.thresholds.errorRateCritical) {\n status = HealthStatus.CRITICAL\n issues.push(`Critical error rate: ${summary.errorRate.toFixed(2)}%`)\n } else if (summary.errorRate >= this.config.thresholds.errorRateWarning) {\n status = HealthStatus.WARNING\n issues.push(`High error rate: ${summary.errorRate.toFixed(2)}%`)\n }\n\n // Check transition time\n if (\n summary.averageTransitionTime >=\n this.config.thresholds.transitionTimeCritical\n ) {\n status = HealthStatus.CRITICAL\n issues.push(\n `Critical transition time: ${summary.averageTransitionTime.toFixed(2)}ms`,\n )\n } else if (\n summary.averageTransitionTime >=\n this.config.thresholds.transitionTimeWarning\n ) {\n if (status === HealthStatus.HEALTHY) status = HealthStatus.WARNING\n issues.push(\n `Slow transitions: ${summary.averageTransitionTime.toFixed(2)}ms`,\n )\n }\n\n return { status, summary, issues }\n }\n\n /**\n * Collect current metrics\n */\n private collectMetrics(): void {\n const summary = this.metricsCollector.getMetricsSummary()\n\n stateMachineLogger.debug('Performance metrics collected', {\n totalTransitions: summary.totalTransitions,\n errorRate: summary.errorRate,\n averageTransitionTime: summary.averageTransitionTime,\n })\n }\n}\n\n/**\n * Health checker for StateMachine instances\n */\nexport class HealthChecker {\n private performanceMonitor: PerformanceMonitor\n private config: MonitoringConfig\n private intervalId: NodeJS.Timeout | undefined\n private isRunning = false\n private lastHealthCheck: HealthCheckResult | undefined\n\n constructor(\n performanceMonitor: PerformanceMonitor,\n config: Partial<MonitoringConfig> = {},\n ) {\n this.performanceMonitor = performanceMonitor\n this.config = { ...DEFAULT_MONITORING_CONFIG, ...config }\n }\n\n /**\n * Start health checking\n */\n start(): void {\n if (this.isRunning || !this.config.enabled) return\n\n this.isRunning = true\n this.intervalId = setInterval(() => {\n this.performHealthCheck()\n }, this.config.healthCheckInterval)\n\n stateMachineLogger.info('Health checking started', {\n interval: this.config.healthCheckInterval,\n })\n }\n\n /**\n * Stop health checking\n */\n stop(): void {\n if (!this.isRunning) return\n\n this.isRunning = false\n /* c8 ignore next 4 */\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = undefined\n }\n\n stateMachineLogger.info('Health checking stopped')\n }\n\n /**\n * Perform immediate health check\n */\n performHealthCheck(): HealthCheckResult {\n const performanceStatus = this.performanceMonitor.getPerformanceStatus()\n\n const result: HealthCheckResult = {\n status: performanceStatus.status,\n message: this.generateHealthMessage(performanceStatus),\n timestamp: Date.now(),\n metrics: performanceStatus.summary,\n }\n\n this.lastHealthCheck = result\n this.logHealthCheck(result)\n\n return result\n }\n\n /**\n * Get last health check result\n */\n getLastHealthCheck(): HealthCheckResult | undefined {\n return this.lastHealthCheck\n }\n\n /**\n * Generate health message based on status\n */\n private generateHealthMessage(\n performanceStatus: ReturnType<PerformanceMonitor['getPerformanceStatus']>,\n ): string {\n const { status, issues, summary } = performanceStatus\n\n if (status === HealthStatus.HEALTHY) {\n return `StateMachine is healthy. ${summary.totalTransitions} transitions, ${summary.errorRate.toFixed(2)}% error rate`\n }\n\n if (status === HealthStatus.WARNING) {\n return `StateMachine has warnings: ${issues.join(', ')}`\n }\n\n /* c8 ignore next */\n if (status === HealthStatus.CRITICAL) {\n /* c8 ignore next */\n return `StateMachine is in critical state: ${issues.join(', ')}`\n }\n\n /* c8 ignore next */\n return 'StateMachine health status unknown'\n }\n\n /**\n * Log health check results\n */\n private logHealthCheck(result: HealthCheckResult): void {\n const logData = {\n status: result.status,\n message: result.message,\n metrics: result.metrics,\n }\n\n switch (result.status) {\n case HealthStatus.HEALTHY:\n stateMachineLogger.debug('Health check passed', logData)\n break\n case HealthStatus.WARNING:\n stateMachineLogger.warn('Health check warning', logData)\n break\n case HealthStatus.CRITICAL:\n stateMachineLogger.error('Health check critical', logData)\n break\n /* c8 ignore next 2 */\n default:\n stateMachineLogger.info('Health check completed', logData)\n }\n }\n}\n\n/**\n * Comprehensive monitoring system\n */\nexport class StateMachineMonitor {\n private metricsCollector: MetricsCollector\n private performanceMonitor: PerformanceMonitor\n private healthChecker: HealthChecker\n private config: MonitoringConfig\n\n constructor(config: Partial<MonitoringConfig> = {}) {\n this.config = { ...DEFAULT_MONITORING_CONFIG, ...config }\n this.metricsCollector = new MetricsCollector(this.config)\n this.performanceMonitor = new PerformanceMonitor(\n this.metricsCollector,\n this.config,\n )\n this.healthChecker = new HealthChecker(this.performanceMonitor, this.config)\n }\n\n /**\n * Start all monitoring components\n */\n start(): void {\n this.performanceMonitor.start()\n this.healthChecker.start()\n\n stateMachineLogger.info('StateMachine monitoring started', {\n config: this.config,\n })\n }\n\n /**\n * Stop all monitoring components\n */\n stop(): void {\n this.performanceMonitor.stop()\n this.healthChecker.stop()\n\n stateMachineLogger.info('StateMachine monitoring stopped')\n }\n\n /**\n * Record a transition for monitoring (F-T4-TS-5 widening: added success + context params)\n */\n recordTransition(transitionTime: number, success: boolean = true, _context?: TransitionContext): void {\n this.metricsCollector.recordTransition(transitionTime)\n if (!success) this.metricsCollector.recordError()\n // _context kept for future enrichment\n }\n\n /**\n * Record an error for monitoring (F-T4-TS-5 widening: added error + context params)\n */\n recordError(_error?: Error, _context?: ErrorContext): void {\n this.metricsCollector.recordError()\n }\n\n /**\n * Record an event for monitoring (optional IMonitor extension)\n */\n recordEvent(_eventName: string, _duration: number): void {\n // optional implementation; metrics enrichment deferred to follow-up\n }\n\n /**\n * Get aggregate metrics snapshot (optional IMonitor extension)\n */\n getMetrics(): MonitorMetricsSnapshot {\n const summary = this.metricsCollector.getMetricsSummary()\n return {\n totalTransitions: summary.totalTransitions,\n successCount: summary.totalTransitions - summary.totalErrors,\n errorCount: summary.totalErrors,\n averageDuration: summary.averageTransitionTime,\n }\n }\n\n /**\n * Get comprehensive monitoring report\n */\n getMonitoringReport(): {\n health: HealthCheckResult\n performance: ReturnType<PerformanceMonitor['getPerformanceStatus']>\n metrics: ReturnType<MetricsCollector['getMetricsSummary']>\n config: MonitoringConfig\n } {\n const health = this.healthChecker.performHealthCheck()\n const performance = this.performanceMonitor.getPerformanceStatus()\n const metrics = this.metricsCollector.getMetricsSummary()\n\n return {\n health,\n performance,\n metrics,\n config: this.config,\n }\n }\n\n /**\n * Export metrics for external monitoring systems\n */\n exportMetrics(): {\n prometheus?: string\n json: any\n } {\n const metrics = this.metricsCollector.getMetricsSummary()\n const health = this.healthChecker.getLastHealthCheck()\n\n const jsonExport = {\n timestamp: Date.now(),\n metrics,\n health,\n config: this.config,\n }\n\n // Prometheus format\n const prometheusExport = this.generatePrometheusMetrics(metrics, health)\n\n return {\n prometheus: prometheusExport,\n json: jsonExport,\n }\n }\n\n /**\n * Generate Prometheus-compatible metrics (without memory metrics)\n */\n private generatePrometheusMetrics(\n metrics: ReturnType<MetricsCollector['getMetricsSummary']>,\n health?: HealthCheckResult,\n ): string {\n const lines: string[] = []\n\n // Transitions counter\n lines.push(\n '# HELP statemachine_transitions_total Total number of state transitions',\n )\n lines.push('# TYPE statemachine_transitions_total counter')\n lines.push(`statemachine_transitions_total ${metrics.totalTransitions}`)\n\n // Errors counter\n lines.push('# HELP statemachine_errors_total Total number of errors')\n lines.push('# TYPE statemachine_errors_total counter')\n lines.push(`statemachine_errors_total ${metrics.totalErrors}`)\n\n // Average transition time\n lines.push(\n '# HELP statemachine_transition_time_avg Average transition time in milliseconds',\n )\n lines.push('# TYPE statemachine_transition_time_avg gauge')\n lines.push(\n `statemachine_transition_time_avg ${metrics.averageTransitionTime}`,\n )\n\n // Error rate\n lines.push('# HELP statemachine_error_rate Error rate percentage')\n lines.push('# TYPE statemachine_error_rate gauge')\n lines.push(`statemachine_error_rate ${metrics.errorRate}`)\n\n // Uptime\n lines.push('# HELP statemachine_uptime Uptime in milliseconds')\n lines.push('# TYPE statemachine_uptime gauge')\n lines.push(`statemachine_uptime ${metrics.uptime}`)\n\n // Health status\n if (health) {\n const healthValue =\n health.status === HealthStatus.HEALTHY\n ? 1\n : health.status === HealthStatus.WARNING\n ? 0.5\n : 0\n lines.push(\n '# HELP statemachine_health Health status (1=healthy, 0.5=warning, 0=critical)',\n )\n lines.push('# TYPE statemachine_health gauge')\n lines.push(`statemachine_health ${healthValue}`)\n }\n\n return lines.join('\\n')\n }\n}\n\n/**\n * @internal — default factory for StateMachine.monitor injection slot.\n * Returns a new StateMachineMonitor instance (NOT a singleton).\n */\nexport function createDefaultMonitor(): IMonitor {\n return new StateMachineMonitor()\n}\n\n/**\n * Utility functions for monitoring integration\n */\nexport const MonitoringUtils = {\n /**\n * Create monitoring decorator for StateMachine methods\n */\n withMonitoring<T extends (...args: any[]) => any>(\n fn: T,\n monitor: StateMachineMonitor,\n _operationName: string,\n ): T {\n return ((...args: any[]) => {\n const startTime = Date.now()\n\n try {\n const result = fn(...args)\n\n if (result instanceof Promise) {\n return result\n .then((value) => {\n monitor.recordTransition(Date.now() - startTime)\n return value\n })\n .catch((error) => {\n monitor.recordError()\n throw error\n })\n } else {\n monitor.recordTransition(Date.now() - startTime)\n return result\n }\n } catch (error) {\n monitor.recordError()\n throw error\n }\n }) as T\n },\n\n /**\n * Create monitoring middleware\n */\n createMonitoringMiddleware(monitor: StateMachineMonitor) {\n return {\n beforeTransition: (context: any) => {\n context._monitoringStartTime = Date.now()\n },\n afterTransition: (context: any) => {\n if (context._monitoringStartTime) {\n monitor.recordTransition(Date.now() - context._monitoringStartTime)\n }\n },\n onError: (_context: any, _error: any) => {\n monitor.recordError()\n },\n }\n },\n}\n","export type StateName = string\nexport type EventName = string\nexport type EventAction<T, R = void> = (adaptee: T, ...args: unknown[]) => R\nexport type ErrorHandler<T> = EventAction<T, void>\n\n// Helper type to extract only methods from a type T\nexport type MethodsOf<T> = {\n [K in keyof T as T[K] extends (...args: any[]) => any ? K : never]: T[K]\n}\n\n// Helper type to extract only properties (non-functions) from a type T\nexport type PropertiesOf<T> = {\n [K in keyof T as T[K] extends (...args: any[]) => any ? never : K]: T[K]\n}\n\nexport type KeysOf<T, R> = {\n [K in keyof T]: T[K] extends R ? K : never\n}[keyof T]\n\nexport type ErrorContext = {\n state?: StateName\n event?: EventName\n action?: string\n transition?: string\n phase?: 'guard' | 'action' | 'transition' | 'enter' | 'exit'\n}\n\nexport class StateMachineError extends Error {\n readonly context: ErrorContext\n\n constructor(message: string, context: ErrorContext, cause?: Error) {\n super(message)\n this.name = 'StateMachineError'\n this.context = context\n this.cause = cause\n /* c8 ignore next 3 */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, StateMachineError)\n }\n }\n\n override toString(): string {\n const { state, event, action, transition, phase } = this.context\n const details = []\n if (state) details.push(`state: ${state}`)\n if (event) details.push(`event: ${event}`)\n if (action) details.push(`action: ${action}`)\n if (transition) details.push(`transition: ${transition}`)\n if (phase) details.push(`phase: ${phase}`)\n\n return `${this.name}: ${this.message}${details.length ? ` (${details.join(', ')})` : ''}`\n }\n}\n\n// ✅ НОВОЕ: Абстракция логгера\nexport interface ILogger {\n debug(message: string, context?: any): void\n info(message: string, context?: any): void\n warn(message: string, context?: any, error?: Error): void\n error(message: string, context?: any, error?: Error): void\n}\n\n// === WASM-friendly injection contracts (per TD-T4-2a, TD-T4-2, TD-T4-2b) ===\n\n/** @unstable — timer scheduling injection contract; consumed by StateMachine. */\nexport interface ITimerScheduler {\n isActive(): boolean\n schedule(delay: number, callback: () => void): object\n cancel(token: object): void\n /**\n * Optional manual drain — advance virtual time and fire all timers whose\n * `executeAt <= now` (default `now` is the scheduler's own clock). Real-time\n * schedulers driven by setInterval may leave this unimplemented.\n */\n process?(now?: number): void\n}\n\n/** @unstable — transition observability context (additive on IMonitor). */\nexport interface TransitionContext {\n fromState: string\n toState: string\n eventName?: string\n}\n\n/** @unstable — minimal aggregate observability snapshot for tests. */\nexport interface MonitorMetricsSnapshot {\n totalTransitions: number\n successCount: number\n errorCount: number\n averageDuration: number\n}\n\n/**\n * @unstable — observability injection contract.\n * EXPANDED additively in TASK-004 per TD-T4-2: third param of `recordTransition`\n * is parameter-optional; `recordEvent?` and `getMetrics?` are interface-optional.\n * Existing 2-arg call site at state_machine.ts:1665 remains valid.\n */\nexport interface IMonitor {\n recordTransition(duration: number, success: boolean, context?: TransitionContext): void\n recordError(error: Error, context?: ErrorContext): void\n recordEvent?(eventName: string, duration: number): void\n getMetrics?(): MonitorMetricsSnapshot\n}\n\n/** @unstable — error-handler injection contract; surfaces methods consumed by host integrations. */\nexport interface IErrorHandler {\n isEnabled(): boolean\n enable(): void\n disable(): void\n addRecoveryStrategy(strategy: import('./error_handling').ErrorRecoveryStrategy): void\n removeRecoveryStrategy(strategyName: string): void\n getAnalytics(): import('./error_handling').ErrorAnalytics\n}\n\n// ✅ НОВОЕ: Опции инъекции для StateMachine\nexport interface StateMachineOptions {\n logger?: ILogger\n monitor?: IMonitor // EXISTING; element type evolves additively per TD-T4-2\n scheduler?: ITimerScheduler // NEW per TD-T4-2a\n errorHandler?: IErrorHandler // NEW per TD-T4-2b\n /**\n * Clock function returning the current time in milliseconds.\n * Default: `Date.now`. Inject a virtual clock together with a\n * `scheduler` (see `createVirtualScheduler`) for deterministic replay / DST.\n * Used for `stateEntryTimes`, `resumeTimers`, and `getQueuedEvents` age math.\n */\n clock?: () => number\n /**\n * Maximum time (ms) to wait for async entry/exit actions.\n * If exceeded, the transition aborts with an error.\n */\n transitionTimeout?: number\n /**\n * State to transition to if an error occurs during a transition (Zombie State Prevention).\n */\n errorState?: string\n /**\n * If true, aborts the transition if onExit fails, keeping the state machine in the source state.\n */\n abortOnExitError?: boolean\n /**\n * Maximum depth of the event queue before rejecting new events.\n * Default: 1000\n */\n maxQueueDepth?: number\n}\n\n// Simplified and composable StatePaths types for better TypeScript performance\ntype StringKey = string & {}\n\n// Base type for simple state names (no regions)\nexport type SimpleStateName<S> = StringKey & keyof S\n\n// Type for region-based state names (parent.region)\nexport type RegionStateName<S> = {\n [K in keyof S & string]: S[K] extends { regions?: infer R }\n ? R extends Record<string, any>\n ? `${K}.${StringKey & keyof R}`\n : never\n : never\n}[keyof S & string]\n\n// Type for nested state names (parent.region.child)\nexport type NestedStateName<S> = {\n [K in keyof S & string]: S[K] extends { regions?: infer R }\n ? R extends Record<string, any>\n ? {\n [RegKey in keyof R & string]: R[RegKey] extends Record<string, any>\n ? `${K}.${RegKey}.${StringKey & keyof R[RegKey]}`\n : never\n }[keyof R & string]\n : never\n : never\n}[keyof S & string]\n\n// Type for deeply nested state names (parent.region.child.subregion)\nexport type DeepNestedStateName<S> = {\n [K in keyof S & string]: S[K] extends { regions?: infer R }\n ? R extends Record<string, any>\n ? {\n [RegKey in keyof R & string]: R[RegKey] extends Record<string, any>\n ? {\n [ChildKey in keyof R[RegKey] &\n string]: R[RegKey][ChildKey] extends {\n regions?: infer CR\n }\n ? CR extends Record<string, any>\n ? `${K}.${RegKey}.${ChildKey}.${StringKey & keyof CR}`\n : never\n : never\n }[keyof R[RegKey] & string]\n : never\n }[keyof R & string]\n : never\n : never\n}[keyof S & string]\n\n// Composable StatePaths type - union of all possible path types\nexport type StatePaths<S> =\n | SimpleStateName<S>\n | RegionStateName<S>\n | NestedStateName<S>\n | DeepNestedStateName<S>\n\n// Config callbacks and setContext-resolved string callbacks run against the\n// underlying owner object, not the adapter wrapper.\nexport type ActionOrString<T extends object, R = void> =\n | KeysOf<T, EventAction<T, R>>\n | EventAction<T, R>\nexport type ErrorHandlerOrString<T extends object> =\n | KeysOf<T, ErrorHandler<T>>\n | ErrorHandler<T>\n\n// Тип для имени региона\nexport type RegionName = string\n// Конфигурация регионов\nexport type RegionsConfig<T extends object> = Record<\n RegionName,\n StateMachineConfig<T>['states']\n>\n\nexport type State<T extends object> = {\n name: StateName\n display?: string\n comment?: string\n iconCls?: string\n onBeforeEnter?: ActionOrString<T>\n onEnter?: ActionOrString<T>\n onAfterEnter?: ActionOrString<T>\n onBeforeExit?: ActionOrString<T>\n onExit?: ActionOrString<T>\n onAfterExit?: ActionOrString<T>\n onError?: ErrorHandlerOrString<T>\n regions?: RegionsConfig<T> // Заменяем `states` на `regions`\n initial?: StateName // Добавляем initial для регионов и иерархических состояний\n history?: 'deep' | 'shallow' // Добавляем свойство для истории состояний\n /**\n * Marks this atomic state as the SCXML/UML `<final>` pseudo-substate of its\n * region. When every region of a composite has its active atomic leaf marked\n * `final`, that composite is \"done\": the engine raises the `done.state.<id>`\n * event and {@link StateMachine.isDone} returns `true`. Only meaningful on a\n * leaf state (a state without `regions`); set on a composite it is ignored at\n * runtime and flagged by the config validator.\n */\n final?: boolean\n invoke?: StateInvocation<T>[] // Поручения (выполняются при входе в состояние)\n}\n\nexport interface StateInvocation<T extends object> {\n /** Время задержки в миллисекундах */\n delay: number\n /** Событие, которое будет вызвано после задержки */\n event: EventName\n /** Условие запуска поручения */\n cond?: (adaptee: T) => boolean\n /** Действие, выполняемое перед событием */\n action?: ActionOrString<T>\n}\n\n// Использовать для полей from, to в Transition\nexport type Transition<T extends object, S extends States<T>> = {\n from: StatePaths<S>\n to: StatePaths<S>\n priority?: number\n guard?: ActionOrString<T, boolean>\n /**\n * Action executed during the transition (after leaving `from`, before entering `to`).\n * Receives the current owner context. Use for side-effects scoped to this edge.\n */\n onTransition?: ActionOrString<T>\n onError?: ErrorHandlerOrString<T>\n}\n\nexport type Event<T extends object, S extends States<T>> = {\n name: EventName\n display?: string\n comment?: string\n transitions: Array<Transition<T, S>>\n onBefore?: ActionOrString<T>\n onAfter?: ActionOrString<T>\n onSuccess?: ActionOrString<T>\n onError?: ErrorHandlerOrString<T>\n}\n\n///Record<StateName, Omit<State<T>, 'name'>>\nexport type States<T extends object> = Record<StateName, Omit<State<T>, 'name'>>\nexport type Events<T extends object, S extends States<T>> = Record<\n EventName,\n Omit<Event<T, S>, 'name'>\n>\n\nexport interface Adapter<T extends object> {\n get adaptee(): T\n set(property: keyof T, value: T[keyof T]): void\n get(property: keyof T): T[keyof T]\n}\n\nexport type ExtractAdaptee<T> = T extends MemoryAdapter<infer R> ? R : T\n\nexport function isAdapter<T extends object>(inp: unknown): inp is Adapter<T> {\n return !!inp && typeof inp === 'object' && 'set' in inp && 'get' in inp\n}\n\nexport interface StateMachineConfig<T extends object = object> {\n name: string\n description?: string\n stateAttribute: KeysOf<PropertiesOf<T>, string>\n // initialState: StateName; // initialState теперь просто StateName, может быть в регионе\n initialState: keyof StateMachineConfig<T>['states']\n events: Record<\n EventName,\n Omit<Event<T, StateMachineConfig<T>['states']>, 'name'>\n >\n states: States<T> // Корневые состояния машины\n // states: Record<StateName, Omit<State<T>, 'name'>>\n onError?: ErrorHandlerOrString<T>\n}\n\n// `Adaptee<T>`, `Configuree<T>`, and `Config<T>` type-utilities were removed in TASK-003 CODE_REVIEW.\n// They had zero internal usage and were not exported from the curated public surface (TD-T3-4).\n// If a downstream consumer use case emerges, re-introduce as `export type` and add to `src/index.ts`.\n\n// New interface for state persistence\nexport interface StatePersistenceAdapter {\n save(state?: {\n currentState: string\n history: any\n stateEntryTimes: any\n }): Promise<void>\n restore(): Promise<{\n currentState: string\n history: any\n stateEntryTimes: any\n }>\n}\n\n// Memory Adapter (renamed from AdapterJSON)\nexport class MemoryAdapter<T extends object>\n implements Adapter<T>, StatePersistenceAdapter {\n adaptee: T\n private _savedState: unknown\n\n constructor(data: T) {\n this.adaptee = data\n }\n\n set(property: keyof T, value: T[keyof T]) {\n this.adaptee[property] = value\n }\n\n get(property: keyof T): T[keyof T] {\n return this.adaptee[property]\n }\n\n // StatePersistenceAdapter implementation\n async save(state?: { currentState: string; history: unknown; stateEntryTimes: unknown }) {\n this._savedState = state\n }\n\n async restore(): Promise<{ currentState: string; history: unknown; stateEntryTimes: unknown }> {\n return this._savedState as { currentState: string; history: unknown; stateEntryTimes: unknown }\n }\n}\n\n// LocalStorage Adapter\nexport class LocalStorageAdapter<T extends object>\n implements Adapter<T>, StatePersistenceAdapter {\n adaptee: T\n private key: string\n\n constructor(data: T, storageKey = 'state_machine') {\n this.adaptee = data\n this.key = storageKey\n }\n\n set(property: keyof T, value: T[keyof T]) {\n this.adaptee[property] = value\n }\n\n get(property: keyof T): T[keyof T] {\n return this.adaptee[property]\n }\n\n // StatePersistenceAdapter implementation\n async save(state?: any) {\n const data = { ...this.adaptee, state }\n globalThis.localStorage.setItem(this.key, JSON.stringify(data))\n }\n\n async restore() {\n const stored = globalThis.localStorage.getItem(this.key)\n /* c8 ignore next */\n return stored ? JSON.parse(stored).state : { currentState: '', history: {} }\n }\n}\n\n// SessionStorage Adapter\nexport class SessionStorageAdapter<T extends object>\n implements Adapter<T>, StatePersistenceAdapter {\n adaptee: T\n private key: string\n\n constructor(data: T, storageKey = 'state_machine') {\n this.adaptee = data\n this.key = storageKey\n }\n\n set(property: keyof T, value: T[keyof T]) {\n this.adaptee[property] = value\n }\n\n get(property: keyof T): T[keyof T] {\n return this.adaptee[property]\n }\n\n // StatePersistenceAdapter implementation\n async save(state?: any) {\n const data = { ...this.adaptee, state }\n globalThis.sessionStorage.setItem(this.key, JSON.stringify(data))\n }\n\n async restore() {\n const stored = globalThis.sessionStorage.getItem(this.key)\n /* c8 ignore next */\n return stored ? JSON.parse(stored).state : undefined\n }\n}\n\n// Server Adapter (async example)\nexport class ServerAdapter<T extends object>\n implements Adapter<T>, StatePersistenceAdapter {\n adaptee: T\n static data: Record<string, unknown> = {}\n private endpoint: string\n\n constructor(data: T, endpoint = '/api/state') {\n this.adaptee = data\n this.endpoint = endpoint\n }\n\n set(property: keyof T, value: T[keyof T]) {\n this.adaptee[property] = value\n }\n\n get(property: keyof T): T[keyof T] {\n return this.adaptee[property]\n }\n\n // StatePersistenceAdapter implementation (simulated async)\n async save(state?: any): Promise<void> {\n if (state) {\n // Simulate server call\n await new Promise((resolve) => setTimeout(resolve, 100))\n ServerAdapter.data[this.endpoint] = state\n }\n }\n\n async restore(): Promise<any> {\n // Simulate server fetch\n await new Promise((resolve) => setTimeout(resolve, 100))\n return (\n ServerAdapter.data[this.endpoint] || { currentState: '', history: {} }\n )\n }\n}\n","/**\n * Enhanced error handling module for StateMachine library\n * Provides comprehensive error context, recovery strategies, and error analytics\n */\n\nimport { stateMachineLogger } from './logger'\nimport { type ErrorContext, StateMachineError } from './types'\n\n// Extended error context with more detailed information\nexport interface ExtendedErrorContext extends ErrorContext {\n timestamp: number\n machineId?: string\n currentStateHistory?: string[]\n attemptedTransition?: {\n from: string\n to: string\n event: string\n }\n stackTrace?: string | undefined\n userAgent?: string | undefined\n sessionId?: string | undefined\n additionalData?: Record<string, any> | undefined\n}\n\n// Error severity levels\nexport const ErrorSeverity = {\n LOW: 'low',\n MEDIUM: 'medium',\n HIGH: 'high',\n CRITICAL: 'critical',\n} as const\n\nexport type ErrorSeverity = (typeof ErrorSeverity)[keyof typeof ErrorSeverity]\n\n// Error categories for better classification\nexport const ErrorCategory = {\n VALIDATION: 'validation',\n TRANSITION: 'transition',\n ACTION: 'action',\n SERIALIZATION: 'serialization',\n CONFIGURATION: 'configuration',\n SECURITY: 'security',\n PERFORMANCE: 'performance',\n NETWORK: 'network',\n UNKNOWN: 'unknown',\n} as const\n\nexport type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory]\n\n// Enhanced error class with additional metadata\nexport class EnhancedStateMachineError extends StateMachineError {\n readonly severity: ErrorSeverity\n readonly category: ErrorCategory\n readonly extendedContext: ExtendedErrorContext\n readonly recoverable: boolean\n readonly errorCode: string\n\n constructor(\n message: string,\n context: ErrorContext,\n options: {\n severity?: ErrorSeverity\n category?: ErrorCategory\n recoverable?: boolean\n errorCode?: string\n additionalData?: Record<string, any>\n cause?: Error\n } = {},\n ) {\n super(message, context, options.cause)\n\n this.severity = options.severity || ErrorSeverity.MEDIUM\n this.category = options.category || ErrorCategory.UNKNOWN\n this.recoverable = options.recoverable ?? true\n this.errorCode = options.errorCode || this.generateErrorCode()\n\n this.extendedContext = {\n ...context,\n timestamp: Date.now(),\n stackTrace: this.stack,\n additionalData: options.additionalData,\n }\n }\n\n private generateErrorCode(): string {\n const categoryCode = this.category.toUpperCase().substring(0, 3)\n const severityCode = this.severity.toUpperCase().substring(0, 1)\n const timestamp = Date.now().toString().slice(-6)\n return `SM_${categoryCode}_${severityCode}_${timestamp}`\n }\n\n toJSON(): Record<string, any> {\n return {\n name: this.name,\n message: this.message,\n errorCode: this.errorCode,\n severity: this.severity,\n category: this.category,\n recoverable: this.recoverable,\n context: this.extendedContext,\n stack: this.stack,\n }\n }\n}\n\n// Error recovery strategies\nexport interface ErrorRecoveryStrategy {\n name: string\n canRecover(error: EnhancedStateMachineError): boolean\n recover(error: EnhancedStateMachineError, context: any): Promise<boolean>\n}\n\n// Default recovery strategies\nexport class RetryRecoveryStrategy implements ErrorRecoveryStrategy {\n name = 'retry'\n private maxRetries: number\n private retryDelay: number\n\n constructor(maxRetries = 3, retryDelay = 1000) {\n this.maxRetries = maxRetries\n this.retryDelay = retryDelay\n }\n\n canRecover(error: EnhancedStateMachineError): boolean {\n return (\n error.recoverable &&\n error.category !== ErrorCategory.SECURITY &&\n error.severity !== ErrorSeverity.CRITICAL\n )\n }\n\n async recover(\n error: EnhancedStateMachineError,\n context: any,\n ): Promise<boolean> {\n const retryCount = context.retryCount || 0\n\n if (retryCount >= this.maxRetries) {\n stateMachineLogger.warn('Max retries exceeded', {\n errorCode: error.errorCode,\n retryCount,\n maxRetries: this.maxRetries,\n })\n return false\n }\n\n stateMachineLogger.info('Attempting error recovery', {\n errorCode: error.errorCode,\n strategy: this.name,\n attempt: retryCount + 1,\n })\n\n // Wait before retry\n await new Promise((resolve) => setTimeout(resolve, this.retryDelay))\n\n context.retryCount = retryCount + 1\n return true\n }\n}\n\nexport class FallbackStateRecoveryStrategy implements ErrorRecoveryStrategy {\n name = 'fallback_state'\n private fallbackState: string\n\n constructor(fallbackState = 'error_state') {\n this.fallbackState = fallbackState\n }\n\n canRecover(error: EnhancedStateMachineError): boolean {\n return (\n error.category === ErrorCategory.TRANSITION ||\n error.category === ErrorCategory.ACTION\n )\n }\n\n async recover(\n error: EnhancedStateMachineError,\n context: any,\n ): Promise<boolean> {\n try {\n if (\n context.stateMachine &&\n typeof context.stateMachine.setCurrentState === 'function'\n ) {\n stateMachineLogger.info('Recovering to fallback state', {\n errorCode: error.errorCode,\n fallbackState: this.fallbackState,\n originalState: error.context.state,\n })\n\n context.stateMachine.setCurrentState(this.fallbackState)\n return true\n }\n } catch (recoveryError) {\n stateMachineLogger.error(\n 'Fallback recovery failed',\n {\n errorCode: error.errorCode,\n fallbackState: this.fallbackState,\n },\n /* c8 ignore next */\n recoveryError instanceof Error\n ? recoveryError\n : new Error(String(recoveryError)),\n )\n }\n\n return false\n }\n}\n\n// Error analytics and reporting\nexport class ErrorAnalytics {\n private errors: EnhancedStateMachineError[] = []\n private maxStoredErrors: number\n\n constructor(maxStoredErrors = 1000) {\n this.maxStoredErrors = maxStoredErrors\n }\n\n recordError(error: EnhancedStateMachineError): void {\n this.errors.push(error)\n\n // Keep only recent errors\n if (this.errors.length > this.maxStoredErrors) {\n this.errors = this.errors.slice(-this.maxStoredErrors)\n }\n\n // Log error for immediate attention\n stateMachineLogger.error(\n 'StateMachine error recorded',\n {\n errorCode: error.errorCode,\n severity: error.severity,\n category: error.category,\n recoverable: error.recoverable,\n },\n error,\n )\n }\n\n getErrorStats(): {\n total: number\n bySeverity: Record<ErrorSeverity, number>\n byCategory: Record<ErrorCategory, number>\n recentErrors: number\n errorRate: number\n } {\n const now = Date.now()\n const oneHourAgo = now - 60 * 60 * 1000\n\n const recentErrors = this.errors.filter(\n (e) => e.extendedContext.timestamp > oneHourAgo,\n )\n\n const bySeverity = Object.values(ErrorSeverity).reduce(\n (acc, severity) => {\n acc[severity] = this.errors.filter(\n (e) => e.severity === severity,\n ).length\n return acc\n },\n {} as Record<ErrorSeverity, number>,\n )\n\n const byCategory = Object.values(ErrorCategory).reduce(\n (acc, category) => {\n acc[category] = this.errors.filter(\n (e) => e.category === category,\n ).length\n return acc\n },\n {} as Record<ErrorCategory, number>,\n )\n\n return {\n total: this.errors.length,\n bySeverity,\n byCategory,\n recentErrors: recentErrors.length,\n errorRate: recentErrors.length / 60, // errors per minute\n }\n }\n\n getTopErrors(limit = 10): Array<{\n errorCode: string\n message: string\n count: number\n lastOccurrence: number\n severity: ErrorSeverity\n category: ErrorCategory\n }> {\n const errorGroups = new Map<\n string,\n {\n errorCode: string\n message: string\n count: number\n lastOccurrence: number\n severity: ErrorSeverity\n category: ErrorCategory\n }\n >()\n\n this.errors.forEach((error) => {\n const key = `${error.message}_${error.category}`\n const existing = errorGroups.get(key)\n\n if (existing) {\n existing.count++\n existing.lastOccurrence = Math.max(\n existing.lastOccurrence,\n error.extendedContext.timestamp,\n )\n } else {\n errorGroups.set(key, {\n errorCode: error.errorCode,\n message: error.message,\n count: 1,\n lastOccurrence: error.extendedContext.timestamp,\n severity: error.severity,\n category: error.category,\n })\n }\n })\n\n return Array.from(errorGroups.values())\n .sort((a, b) => b.count - a.count)\n .slice(0, limit)\n }\n\n clearErrors(): void {\n this.errors = []\n }\n}\n\n// Main error handler class\nexport class ErrorHandler {\n private recoveryStrategies: ErrorRecoveryStrategy[] = []\n private analytics: ErrorAnalytics\n private enabled = true\n\n constructor() {\n this.analytics = new ErrorAnalytics()\n\n // Add default recovery strategies\n this.addRecoveryStrategy(new RetryRecoveryStrategy())\n this.addRecoveryStrategy(new FallbackStateRecoveryStrategy())\n }\n\n addRecoveryStrategy(strategy: ErrorRecoveryStrategy): void {\n this.recoveryStrategies.push(strategy)\n }\n\n removeRecoveryStrategy(strategyName: string): void {\n this.recoveryStrategies = this.recoveryStrategies.filter(\n (s) => s.name !== strategyName,\n )\n }\n\n async handleError(\n error: Error | EnhancedStateMachineError,\n context: any = {},\n ): Promise<boolean> {\n if (!this.enabled) {\n return false\n }\n\n // Convert to enhanced error if needed\n const enhancedError =\n error instanceof EnhancedStateMachineError\n ? error\n : this.convertToEnhancedError(error, context)\n\n // Record error for analytics\n this.analytics.recordError(enhancedError)\n\n // Attempt recovery\n for (const strategy of this.recoveryStrategies) {\n if (strategy.canRecover(enhancedError)) {\n try {\n const recovered = await strategy.recover(enhancedError, context)\n if (recovered) {\n stateMachineLogger.info('Error recovery successful', {\n errorCode: enhancedError.errorCode,\n strategy: strategy.name,\n })\n return true\n }\n } catch (recoveryError) {\n stateMachineLogger.error(\n 'Recovery strategy failed',\n {\n errorCode: enhancedError.errorCode,\n strategy: strategy.name,\n },\n /* c8 ignore next */\n recoveryError instanceof Error\n ? recoveryError\n : new Error(String(recoveryError)),\n )\n }\n }\n }\n\n stateMachineLogger.error('All recovery strategies failed', {\n errorCode: enhancedError.errorCode,\n severity: enhancedError.severity,\n category: enhancedError.category,\n })\n\n return false\n }\n\n private convertToEnhancedError(\n error: Error,\n context: any,\n ): EnhancedStateMachineError {\n // Determine category based on error message and context\n let category: ErrorCategory = ErrorCategory.UNKNOWN\n let severity: ErrorSeverity = ErrorSeverity.MEDIUM\n\n if (\n error.message.includes('transition') ||\n error.message.includes('state')\n ) {\n category = ErrorCategory.TRANSITION\n } else if (error.message.includes('action')) {\n category = ErrorCategory.ACTION\n } else if (error.message.includes('validation')) {\n category = ErrorCategory.VALIDATION\n severity = ErrorSeverity.HIGH\n } else if (\n error.message.includes('security') ||\n error.message.includes('injection')\n ) {\n category = ErrorCategory.SECURITY\n severity = ErrorSeverity.CRITICAL\n }\n\n return new EnhancedStateMachineError(\n error.message,\n context.errorContext || {},\n {\n category,\n severity,\n cause: error,\n additionalData: context,\n },\n )\n }\n\n getAnalytics(): ErrorAnalytics {\n return this.analytics\n }\n\n enable(): void {\n this.enabled = true\n }\n\n disable(): void {\n this.enabled = false\n }\n\n isEnabled(): boolean {\n return this.enabled\n }\n}\n\n/**\n * @internal — default factory for StateMachine.errorHandler injection slot.\n * Returns a new ErrorHandler instance (NOT a singleton).\n * Constructor at line 343 is public (verified).\n */\nexport function createDefaultErrorHandler(): import('./types').IErrorHandler {\n return new ErrorHandler()\n}\n\n// Utility functions\nexport function createEnhancedError(\n message: string,\n context: ErrorContext,\n options?: {\n severity?: ErrorSeverity\n category?: ErrorCategory\n recoverable?: boolean\n additionalData?: Record<string, any>\n },\n): EnhancedStateMachineError {\n return new EnhancedStateMachineError(message, context, options)\n}\n\nexport function isRecoverableError(error: Error): boolean {\n if (error instanceof EnhancedStateMachineError) {\n return error.recoverable\n }\n return true // Assume recoverable by default\n}\n","import { createDefaultScheduler } from './scheduler'\nimport { type SafeSerializedAction, safeFunctionSerializer } from './security'\nimport { createDefaultMonitor } from './monitoring'\nimport { createDefaultErrorHandler } from './error_handling'\nimport {\n type ActionOrString,\n type Adapter,\n type ErrorContext,\n type ErrorHandler,\n type ErrorHandlerOrString,\n type Event,\n type EventAction,\n type Events,\n type IErrorHandler,\n type ILogger,\n type IMonitor,\n type ITimerScheduler,\n isAdapter,\n type KeysOf,\n MemoryAdapter,\n type MethodsOf,\n type PropertiesOf,\n type RegionsConfig,\n type State,\n type StateMachineConfig,\n StateMachineError,\n type StateMachineOptions,\n type StateName,\n type StatePersistenceAdapter,\n type States,\n type Transition,\n} from './types'\n\n// Removed unused helper functions serializeAction and deserializeAction\n// These functions are available through safeFunctionSerializer directly when needed\n\n// ✅ НОВОЕ: Default implementation для Lite режима (No-Op или Console)\nconst ConsoleLogger: ILogger = {\n debug: () => { }, // По умолчанию выключено для Lite\n info: () => { },\n warn: (msg, ctx) => console.warn(msg, ctx),\n error: (msg, ctx, err) => console.error(msg, ctx, err),\n}\n\ninterface StateInfo {\n name: string\n display?: string\n isComposite: boolean\n regions?: string[]\n parent?: string\n children?: string[]\n}\n\ninterface QueuedEvent<TOwner extends object = object> {\n id: string\n eventName: string\n obj: Adapter<PropertiesOf<TOwner>>\n args: any[]\n resolve?: (value: boolean) => void\n reject?: (error: any) => void\n timestamp: number\n type: 'internal' | 'external'\n}\n\ninterface QueuedEventInfo {\n id: string\n event: string\n age: number\n type: 'internal' | 'external'\n}\n\nexport class StateMachine<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n> {\n // Приватные поля для зависимостей\n private logger: ILogger\n private monitor: IMonitor\n private scheduler: ITimerScheduler\n private errorHandler: IErrorHandler\n private clock: () => number\n private schedulerProvided: boolean\n\n // Свойства\n private states: Map<keyof SMConfig['states'], State<TOwner>>\n private events: Map<\n keyof SMConfig['events'],\n Event<TOwner, SMConfig['states']>\n >\n private stateAttribute: KeysOf<PropertiesOf<TOwner>, string>\n private onError?: ErrorHandlerOrString<TOwner>\n private adaptee?: Adapter<PropertiesOf<TOwner>>\n private context?: MethodsOf<TOwner>\n private historyMap: Map<StateName, string> = new Map()\n private initialState: keyof SMConfig['states']\n private persistenceAdapter?: StatePersistenceAdapter\n private activeTimers: Map<string, any[]> = new Map()\n private stateEntryTimes: Map<string, number> = new Map()\n\n // Event Queue Infrastructure (SCXML Run-to-Completion)\n private externalQueue: QueuedEvent<TOwner>[] = []\n private internalQueue: QueuedEvent<TOwner>[] = []\n private isProcessing = false\n private eventIdCounter = 0\n private transitionDepth = 0\n private readonly MAX_TRANSITION_DEPTH = 100\n\n // Optional configuration\n private transitionTimeout?: number\n private errorState?: string\n private abortOnExitError?: boolean\n private maxQueueDepth = 1000\n\n // Transition state visibility\n private _isTransitioning = false\n private _targetState: string | undefined\n\n public get isTransitioning() {\n return this._isTransitioning\n }\n\n public get targetState() {\n return this._targetState\n }\n\n // Геттеры и сеттеры\n public set currentState(state: StateName) {\n if (!this.adaptee) throw new StateMachineError('no adaptee', { state })\n this.setCurrentState(state, this.adaptee)\n }\n\n public get currentState(): string {\n if (!this.adaptee) {\n const s = this.getCurrentState()\n /* c8 ignore next */\n throw new StateMachineError('no adaptee', s !== undefined ? { state: s } : {})\n }\n /* c8 ignore next */\n return this.getCurrentState(this.adaptee) ?? ''\n }\n\n // Конструктор\n constructor(\n config: SMConfig,\n adaptee?: Adapter<PropertiesOf<TOwner>> | PropertiesOf<TOwner>,\n options?: StateMachineOptions, // ⬅️ Внедрение через опции\n ) {\n this.initialState = config.initialState\n\n // ✅ Внедрение зависимостей (Dependency Injection)\n // Если передали - используем, если нет - fallback на легковесные версии\n this.logger = options?.logger ?? ConsoleLogger\n this.monitor = options?.monitor ?? createDefaultMonitor()\n this.schedulerProvided = options?.scheduler !== undefined\n this.scheduler = options?.scheduler ?? createDefaultScheduler()\n this.clock = options?.clock ?? Date.now\n this.errorHandler = options?.errorHandler ?? createDefaultErrorHandler()\n\n if (adaptee) {\n if (!isAdapter<TOwner>(adaptee)) {\n this.adaptee = new MemoryAdapter(adaptee) as Adapter<\n PropertiesOf<TOwner>\n >\n } else {\n this.adaptee = adaptee as Adapter<PropertiesOf<TOwner>>\n }\n }\n\n // Apply options\n if (options?.transitionTimeout !== undefined) {\n this.transitionTimeout = options.transitionTimeout\n }\n if (options?.errorState !== undefined) {\n this.errorState = options.errorState\n }\n if (options?.abortOnExitError !== undefined) {\n this.abortOnExitError = options.abortOnExitError\n }\n if (options?.maxQueueDepth !== undefined) {\n this.maxQueueDepth = options.maxQueueDepth\n }\n if (config.onError !== undefined) {\n this.onError = config.onError\n }\n this.stateAttribute = config.stateAttribute\n this.states = new Map()\n this.events = new Map(\n Object.entries(config.events).map(([name, value]) => [\n name,\n {\n name,\n ...value,\n transitions: value.transitions.map((t) => ({\n ...t,\n // Support 'action' alias for 'onTransition'\n onTransition: t.onTransition || (t as any).action,\n })),\n },\n ]),\n )\n this.processStates(config.states)\n if (adaptee) {\n this.persistenceAdapter = adaptee as unknown as StatePersistenceAdapter\n this.setInitialState(config.initialState as string)\n }\n\n // Логируем инициализацию\n this.logger.info('StateMachine initialized', { name: config.name })\n }\n\n // Основные публичные методы\n public setContext(context: MethodsOf<TOwner>): void {\n this.context = context\n }\n\n private resolveCallbackOwner(value: Adapter<any> | TOwner): TOwner {\n return isAdapter<TOwner>(value)\n ? (value.adaptee as TOwner)\n : (value as TOwner)\n }\n\n private enqueueEvent(\n eventName: string,\n obj: Adapter<PropertiesOf<TOwner>>,\n args: any[],\n type: 'internal' | 'external',\n ): Promise<boolean> {\n if (\n this.externalQueue.length + this.internalQueue.length >=\n this.maxQueueDepth\n ) {\n const _s0 = this.getCurrentState(obj)\n return Promise.reject(\n new StateMachineError('Event queue overflow — possible infinite loop', {\n /* c8 ignore next */\n ...(_s0 !== undefined ? { state: _s0 } : {}),\n event: eventName,\n }),\n )\n }\n\n if (type === 'external') {\n return new Promise<boolean>((resolve, reject) => {\n this.externalQueue.push({\n id: `ext_${++this.eventIdCounter}`,\n eventName,\n obj,\n args,\n resolve,\n reject,\n timestamp: this.clock(),\n type: 'external',\n })\n this.scheduleProcessing()\n })\n }\n\n /* c8 ignore next 7 */\n this.internalQueue.push({\n id: `int_${++this.eventIdCounter}`,\n eventName,\n obj,\n args,\n timestamp: this.clock(),\n type: 'internal',\n })\n /* c8 ignore next */\n return Promise.resolve(true)\n }\n\n private raiseEvent(\n eventName: string,\n obj: Adapter<PropertiesOf<TOwner>>,\n ...args: any[]\n ): void {\n this.internalQueue.push({\n id: `int_${++this.eventIdCounter}`,\n eventName,\n obj,\n args,\n timestamp: this.clock(),\n type: 'internal',\n })\n }\n\n private scheduleProcessing(): void {\n /* c8 ignore next */\n if (this.isProcessing) return\n queueMicrotask(() => this.processQueues())\n }\n\n private async processQueues(): Promise<void> {\n /* c8 ignore next */\n if (this.isProcessing) return\n this.isProcessing = true\n\n try {\n while (this.internalQueue.length > 0 || this.externalQueue.length > 0) {\n if (this.transitionDepth >= this.MAX_TRANSITION_DEPTH) {\n const _s1 = this.getCurrentState()\n /* c8 ignore next */\n const error = new StateMachineError(\n 'Max transition depth exceeded — possible infinite loop',\n /* c8 ignore next */\n { ...(_s1 !== undefined ? { state: _s1 } : {}), event: 'processQueues' },\n )\n while (this.externalQueue.length > 0) {\n const evt = this.externalQueue.shift()!\n evt.reject?.(error)\n }\n this.internalQueue.length = 0\n throw error\n }\n\n if (this.internalQueue.length > 0) {\n const evt = this.internalQueue.shift()!\n this.transitionDepth++\n try {\n await this.executeQueuedTransition(evt)\n } finally {\n this.transitionDepth--\n }\n } else {\n const evt = this.externalQueue.shift()!\n this.transitionDepth++\n try {\n const result = await this.executeQueuedTransition(evt)\n evt.resolve?.(result)\n } catch (error) {\n evt.reject?.(error)\n } finally {\n this.transitionDepth--\n }\n }\n }\n } finally {\n this.isProcessing = false\n this.transitionDepth = 0\n }\n }\n\n private async executeQueuedTransition(\n queuedEvent: QueuedEvent<TOwner>,\n ): Promise<boolean> {\n const { eventName, obj, args } = queuedEvent\n const targetObj = obj\n\n let currentStateRaw = this.getCurrentState(targetObj)\n if (!currentStateRaw) {\n this.setInitialState(this.initialState as string, targetObj)\n currentStateRaw = this.getCurrentState(targetObj)\n }\n /* c8 ignore next */\n const currentState: string = currentStateRaw ?? ''\n\n let event = this.events.get(eventName as keyof SMConfig['events'])\n let transitions = event\n ? event.transitions.filter((t) =>\n this.isTransitionPossible(t, currentState),\n )\n : []\n\n // D11: engine-generated `done.state.<id>` completion events must NEVER fall\n // through to a user `from: '*'` wildcard transition — that would fire a\n // spurious transition on a machine that uses `*` as a catch-all. They only\n // ever match an explicitly-declared `done.state.<id>` event (handled above).\n const isEngineDoneEvent = String(eventName).startsWith('done.state.')\n if (!transitions.length && !isEngineDoneEvent) {\n const wildcardEvent = this.events.get('*' as keyof SMConfig['events'])\n if (wildcardEvent) {\n const wildcardTransitions = wildcardEvent.transitions.filter((t) =>\n this.isTransitionPossible(t, currentState),\n )\n if (wildcardTransitions.length > 0) {\n event = wildcardEvent\n transitions = wildcardTransitions\n }\n }\n }\n\n if (!event || !transitions.length) {\n throw new StateMachineError(\n `Invalid event: ${eventName} for state: ${currentState}`,\n { state: currentState, event: eventName },\n )\n }\n\n const allowedTransition = await this.getAllowedTransitions(\n targetObj,\n transitions,\n ...args,\n ).catch((error) => {\n this.logger.error(\n 'Error determining allowed transition',\n { event: eventName, state: currentState },\n /* c8 ignore next */\n error instanceof Error ? error : new Error(String(error)),\n )\n return undefined\n })\n\n if (!allowedTransition) {\n return false\n }\n\n const toState = await this.applyTransition(\n targetObj as any,\n currentState,\n allowedTransition,\n args,\n eventName as keyof SMConfig['events'],\n event,\n ).catch((error) => {\n this.logger.error(\n 'Error applying transition',\n {\n event: eventName,\n state: currentState,\n transition: `${allowedTransition.from} -> ${allowedTransition.to}`,\n },\n /* c8 ignore next */\n error instanceof Error ? error : new Error(String(error)),\n )\n if (this.errorHandler.isEnabled()) {\n this.monitor.recordError(\n error instanceof Error ? error : new Error(String(error)),\n { state: currentState, event: eventName },\n )\n }\n throw error // Propagate error to caller (e.g. fireEvent rejection)\n })\n\n if (!toState) {\n return false\n }\n\n this.setCurrentState(toState.name, targetObj)\n return true\n }\n\n /**\n * Fires an event to trigger a state transition.\n *\n * @param eventName - The name of the event to fire. Use '*' for wildcard events.\n * @param args - Additional arguments to pass to guards, actions, and callbacks.\n * @returns Promise<boolean> - True if a transition occurred, false otherwise.\n *\n * @throws StateMachineError if the event is invalid or no transition is possible (unless configured otherwise).\n *\n * @example\n * const success = await sm.fireEvent('submit', payload);\n */\n public async fireEvent(\n eventName: keyof SMConfig['events'] | '*',\n ...args: any[]\n ): Promise<boolean>\n public async fireEvent(\n eventName: keyof SMConfig['events'] | '*',\n obj?: Adapter<PropertiesOf<TOwner>>,\n ...args: unknown[]\n ): Promise<boolean> {\n let targetObj: Adapter<PropertiesOf<TOwner>>\n if (!obj) {\n if (this.adaptee) targetObj = this.adaptee\n else\n throw new StateMachineError('no adaptee or object passed', {\n event: String(eventName),\n })\n } else if (!isAdapter(obj)) {\n args.unshift(obj)\n if (this.adaptee) targetObj = this.adaptee\n else\n throw new StateMachineError('no adaptee or object passed', {\n event: String(eventName),\n })\n } else {\n targetObj = obj\n }\n\n return this.enqueueEvent(String(eventName), targetObj, args, 'external')\n }\n\n public getQueueDepth(): {\n internal: number\n external: number\n total: number\n } {\n return {\n internal: this.internalQueue.length,\n external: this.externalQueue.length,\n total: this.internalQueue.length + this.externalQueue.length,\n }\n }\n\n public getQueuedEvents(): QueuedEventInfo[] {\n const now = this.clock()\n const mapEvent = (evt: QueuedEvent<TOwner>): QueuedEventInfo => ({\n id: evt.id,\n event: evt.eventName,\n age: now - evt.timestamp,\n type: evt.type,\n })\n return [\n ...this.internalQueue.map(mapEvent),\n ...this.externalQueue.map(mapEvent),\n ]\n }\n\n public isProcessingEvents(): boolean {\n return this.isProcessing\n }\n\n /**\n * Checks if an event can be fired in the current state.\n *\n * @param eventName - The name of the event to check.\n * @param adaptee - Optional adapter/object to check against (defaults to internal adaptee).\n * @returns boolean - True if the event has a valid transition from the current state (guards are not executed).\n */\n public canFireEvent(\n eventName: keyof SMConfig['events'] | '*',\n adaptee?: Adapter<PropertiesOf<TOwner>>,\n ): boolean {\n const targetAdaptee = adaptee || this.adaptee\n if (!targetAdaptee) return false\n\n const currentState = this.getCurrentState(targetAdaptee)\n const effectiveState =\n currentState === ''\n ? this.getInitialCompositeState(this.initialState as string)\n : currentState\n /* c8 ignore next */ if (effectiveState === undefined) return false\n\n const event = this.events.get(String(eventName))\n if (\n !event ||\n !event.transitions.some((t) =>\n this.isTransitionPossible(t, effectiveState),\n )\n ) {\n const wildcardEvent = this.events.get('*')\n if (wildcardEvent) {\n return wildcardEvent.transitions.some((t) =>\n this.isTransitionPossible(t, effectiveState),\n )\n }\n return false\n }\n\n return true\n }\n\n public getAvailableEvents(adaptee?: Adapter<PropertiesOf<TOwner>>): string[] {\n const available: string[] = []\n for (const [name] of this.events) {\n if (this.canFireEvent(name, adaptee)) {\n available.push(String(name))\n }\n }\n return available\n }\n\n public async reset(adaptee?: Adapter<PropertiesOf<TOwner>>): Promise<void> {\n const targetAdaptee = adaptee || this.adaptee\n if (!targetAdaptee) {\n const _s2 = this.getCurrentState()\n throw new StateMachineError('no adaptee', _s2 !== undefined ? { state: _s2 } : {})\n }\n\n this.historyMap.clear()\n\n // Clear all active timers\n for (const timers of this.activeTimers.values()) {\n for (const id of timers) {\n this.clearTimer(id)\n }\n }\n this.activeTimers.clear()\n this.stateEntryTimes.clear()\n\n this.setInitialState(this.initialState as string, targetAdaptee)\n }\n\n public getStateHistory(): Record<string, string> {\n return Object.fromEntries(this.historyMap)\n }\n\n public getCurrentStateInfo(): StateInfo | undefined {\n const currentState = this.getCurrentState()\n if (currentState === undefined) return undefined\n\n const isComposite = currentState.includes('|')\n if (isComposite) {\n const activeStates = currentState.split('|').filter(Boolean)\n const regions = activeStates.map((s) => this.getRegionKey(s))\n return {\n name: currentState,\n isComposite: true,\n regions,\n children: activeStates,\n }\n }\n\n const state = this.states.get(currentState)\n /* c8 ignore next */ if (!state) return undefined\n\n const parent = currentState.includes('.')\n ? currentState.split('.').slice(0, -1).join('.')\n : undefined\n\n const children = this.getDirectChildren(currentState)\n const regions = state.regions ? Object.keys(state.regions) : undefined\n\n return {\n name: currentState,\n ...(state.display !== undefined ? { display: state.display } : {}),\n isComposite: Boolean(state.regions),\n ...(regions !== undefined ? { regions } : {}),\n ...(parent !== undefined ? { parent } : {}),\n ...(children.length ? { children } : {}),\n }\n }\n\n /**\n * Checks if the machine is in a specific state.\n * Supports hierarchical states (e.g. 'parent' matches 'parent.child').\n *\n * @param expectedState - The state name to check.\n * @param adaptee - Optional adapter to check against.\n * @returns boolean - True if the current state matches or is a substate of the expected state.\n */\n public isInState(\n expectedState: StateName,\n adaptee?: Adapter<PropertiesOf<TOwner>>,\n ): boolean {\n const currentState = this.getCurrentState(adaptee)\n if (!currentState) return expectedState === ''\n\n const currentParts = currentState.split('|').sort()\n const expectedParts = expectedState.split('|').sort()\n\n // D5: ancestor-aware matching — true when every expected '|'-part equals OR\n // is an ancestor (isParentState) of some active leaf. Keeps isInState('C')\n // and isInState('C.region') true after a composite root expands to leaves.\n const ancestorMatch = expectedParts.every((expectedPart) =>\n currentParts.some((leaf) => this.isParentState(expectedPart, leaf)),\n )\n if (ancestorMatch) return true\n\n if (currentParts.length !== expectedParts.length) return false\n\n return currentParts.every((part, index) => part === expectedParts[index])\n }\n\n public attachToObject(\n object: any,\n eventMap: { [key: string]: string },\n ): void {\n for (const objectEventName of Object.keys(eventMap)) {\n const stateMachineEventName = eventMap[objectEventName]\n /* c8 ignore next */ if (stateMachineEventName === undefined) continue\n if (typeof object.addEventListener === 'function') {\n object.addEventListener(objectEventName, (...args: any[]) => {\n this.fireEvent(stateMachineEventName, object, ...args).catch((e) =>\n this.logger.error(\n 'Error firing event',\n {\n objectEventName,\n stateMachineEventName,\n },\n /* c8 ignore next */\n e instanceof Error ? e : new Error(String(e)),\n ),\n )\n })\n } else if (typeof object.on === 'function') {\n object.on(objectEventName, (...args: any[]) => {\n this.fireEvent(stateMachineEventName, object, ...args).catch((e) =>\n this.logger.error(\n 'Error firing event',\n {\n objectEventName,\n stateMachineEventName,\n },\n /* c8 ignore next */\n e instanceof Error ? e : new Error(String(e)),\n ),\n )\n })\n } else {\n object[`on${objectEventName}`] = async (...args: any[]) => {\n return this.fireEvent(stateMachineEventName, object, ...args).catch(\n (e) =>\n this.logger.error(\n 'Error firing event',\n {\n objectEventName,\n stateMachineEventName,\n },\n /* c8 ignore next */\n e instanceof Error ? e : new Error(String(e)),\n ),\n )\n }\n }\n }\n }\n\n // Методы для работы с состоянием\n public async saveState(adapter?: StatePersistenceAdapter) {\n const targetAdapter = adapter || this.persistenceAdapter\n if (!targetAdapter) {\n return\n }\n\n const currentState = this.getCurrentState() ?? ''\n const history = Object.fromEntries(this.historyMap)\n const stateData = {\n currentState,\n history,\n stateEntryTimes: Object.fromEntries(this.stateEntryTimes),\n }\n\n await targetAdapter.save(stateData)\n }\n\n public async restoreState(adapter?: StatePersistenceAdapter): Promise<void> {\n const targetAdapter = adapter || this.persistenceAdapter\n if (!targetAdapter) {\n return\n }\n\n const result = await targetAdapter.restore()\n this.validateCompositeState(result.currentState)\n this.historyMap = new Map(Object.entries(result.history))\n if (result.stateEntryTimes) {\n this.stateEntryTimes = new Map(Object.entries(result.stateEntryTimes))\n }\n this.setCurrentState(result.currentState)\n this.resumeTimers()\n }\n\n // Статические методы\n public static fromData<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n >(\n config: SMConfig,\n initialState?: string,\n context?: TOwner,\n options?: StateMachineOptions, // ⬅️ Добавляем опции\n ): StateMachine<TOwner, SMConfig> {\n const sm = new StateMachine<TOwner, SMConfig>(config, context, options)\n\n if (sm.adaptee) {\n sm.setCurrentState(initialState || (config.initialState as string))\n }\n\n return sm\n }\n\n public static fromJSON<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n >(\n jsonData: string,\n obj?: TOwner | Adapter<TOwner>,\n options?: StateMachineOptions,\n ): StateMachine<TOwner, SMConfig> {\n const parsedData = JSON.parse(jsonData)\n const { config, currentState, historyMap, stateEntryTimes } = parsedData\n\n const deserializedStates = StateMachine.deserializeStates<TOwner>(\n config.states,\n )\n const deserializedEvents = StateMachine.deserializeEvents<TOwner>(\n config.events,\n )\n\n const smConfig: StateMachineConfig<TOwner> = {\n name: 'DeserializedStateMachine',\n initialState: config.initialState,\n stateAttribute: config.stateAttribute,\n states: deserializedStates,\n events: deserializedEvents,\n onError: StateMachine.deserializeAction(config.onError) as KeysOf<\n TOwner,\n ErrorHandler<TOwner>\n >,\n }\n\n const sm = new StateMachine<TOwner, StateMachineConfig<TOwner>>(\n smConfig as SMConfig,\n obj as any,\n options,\n )\n\n sm.historyMap = new Map(historyMap)\n if (stateEntryTimes) {\n sm.stateEntryTimes = new Map(stateEntryTimes)\n }\n if (sm.adaptee && currentState) {\n sm.setCurrentState(currentState)\n sm.resumeTimers()\n }\n\n return sm\n }\n\n /**\n * Securely deserializes a StateMachine from JSON string (Async).\n * Verifies cryptographic hashes of serialized functions.\n */\n public static async fromSecureJSON<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n >(\n jsonData: string,\n obj?: TOwner | Adapter<TOwner>,\n options?: StateMachineOptions,\n ): Promise<StateMachine<TOwner, SMConfig>> {\n const parsedData = JSON.parse(jsonData)\n const { config, currentState, historyMap, stateEntryTimes } = parsedData\n\n // Async deserialization of states and events\n const deserializedStates =\n await StateMachine.deserializeStatesAsync<TOwner>(config.states)\n const deserializedEvents =\n await StateMachine.deserializeEventsAsync<TOwner>(config.events)\n\n const smConfig: StateMachineConfig<TOwner> = {\n name: 'DeserializedStateMachine',\n initialState: config.initialState,\n stateAttribute: config.stateAttribute,\n states: deserializedStates,\n events: deserializedEvents,\n onError: (await StateMachine.deserializeActionAsync(\n config.onError,\n )) as KeysOf<TOwner, ErrorHandler<TOwner>>,\n }\n\n const sm = new StateMachine<TOwner, StateMachineConfig<TOwner>>(\n smConfig as SMConfig,\n obj as any,\n options,\n )\n\n sm.historyMap = new Map(historyMap)\n if (stateEntryTimes) {\n sm.stateEntryTimes = new Map(stateEntryTimes)\n }\n if (sm.adaptee && currentState) {\n sm.setCurrentState(currentState)\n sm.resumeTimers()\n }\n\n return sm\n }\n\n /**\n * Deserialize states configuration (Async)\n */\n private static async deserializeStatesAsync<TOwner extends object>(\n statesConfig: any,\n ): Promise<States<TOwner>> {\n const result: States<TOwner> = {}\n for (const [name, stateData] of Object.entries(statesConfig) as [\n string,\n any,\n ][]) {\n const deserializedState = {\n ...stateData,\n onBeforeEnter: await StateMachine.deserializeActionAsync(\n stateData.onBeforeEnter,\n ),\n onEnter: await StateMachine.deserializeActionAsync(stateData.onEnter),\n onAfterEnter: await StateMachine.deserializeActionAsync(\n stateData.onAfterEnter,\n ),\n onBeforeExit: await StateMachine.deserializeActionAsync(\n stateData.onBeforeExit,\n ),\n onExit: await StateMachine.deserializeActionAsync(stateData.onExit),\n onAfterExit: await StateMachine.deserializeActionAsync(\n stateData.onAfterExit,\n ),\n onError: await StateMachine.deserializeActionAsync(stateData.onError),\n }\n\n if (stateData.invoke && Array.isArray(stateData.invoke)) {\n deserializedState.invoke = await Promise.all(\n stateData.invoke.map(async (inv: any) => ({\n ...inv,\n cond: await StateMachine.deserializeActionAsync(inv.cond),\n action: await StateMachine.deserializeActionAsync(inv.action),\n })),\n )\n }\n\n result[name] = deserializedState\n }\n return result\n }\n\n /**\n * Deserialize states configuration\n */\n private static deserializeStates<TOwner extends object>(\n statesConfig: any,\n ): States<TOwner> {\n return Object.entries(statesConfig).reduce(\n (acc, [name, stateData]: [string, any]) => {\n const deserializedState = {\n ...stateData,\n onBeforeEnter: StateMachine.deserializeAction(\n stateData.onBeforeEnter,\n ),\n onEnter: StateMachine.deserializeAction(stateData.onEnter),\n onAfterEnter: StateMachine.deserializeAction(stateData.onAfterEnter),\n onBeforeExit: StateMachine.deserializeAction(stateData.onBeforeExit),\n onExit: StateMachine.deserializeAction(stateData.onExit),\n onAfterExit: StateMachine.deserializeAction(stateData.onAfterExit),\n onError: StateMachine.deserializeAction(stateData.onError),\n }\n\n if (stateData.invoke && Array.isArray(stateData.invoke)) {\n deserializedState.invoke = stateData.invoke.map((inv: any) => ({\n ...inv,\n cond: StateMachine.deserializeAction(inv.cond),\n action: StateMachine.deserializeAction(inv.action),\n }))\n }\n\n acc[name] = deserializedState\n return acc\n },\n {} as States<TOwner>,\n )\n }\n\n /**\n * Deserialize events configuration (Async)\n */\n private static async deserializeEventsAsync<TOwner extends object>(\n eventsConfig: any,\n ): Promise<Events<TOwner, States<TOwner>>> {\n const result: Events<TOwner, States<TOwner>> = {}\n for (const [name, eventData] of Object.entries(eventsConfig) as [\n string,\n any,\n ][]) {\n result[name] = {\n ...eventData,\n onBefore: await StateMachine.deserializeActionAsync(eventData.onBefore),\n onAfter: await StateMachine.deserializeActionAsync(eventData.onAfter),\n onSuccess: await StateMachine.deserializeActionAsync(\n eventData.onSuccess,\n ),\n onError: await StateMachine.deserializeActionAsync(eventData.onError),\n transitions: await Promise.all(\n eventData.transitions.map((transitionData: any) =>\n StateMachine.deserializeTransitionAsync(transitionData),\n ),\n ),\n }\n }\n return result\n }\n\n /**\n * Deserialize events configuration\n */\n private static deserializeEvents<TOwner extends object>(\n eventsConfig: any,\n ): Events<TOwner, States<TOwner>> {\n return Object.entries(eventsConfig).reduce(\n (acc, [name, eventData]: [string, any]) => {\n acc[name] = {\n ...eventData,\n onBefore: StateMachine.deserializeAction(eventData.onBefore),\n onAfter: StateMachine.deserializeAction(eventData.onAfter),\n onSuccess: StateMachine.deserializeAction(eventData.onSuccess),\n onError: StateMachine.deserializeAction(eventData.onError),\n transitions: eventData.transitions.map((transitionData: any) =>\n StateMachine.deserializeTransition(transitionData),\n ),\n }\n return acc\n },\n {} as Events<TOwner, States<TOwner>>,\n )\n }\n\n /**\n * Deserialize transition configuration (Async)\n */\n private static async deserializeTransitionAsync(\n transitionData: any,\n ): Promise<any> {\n return {\n ...transitionData,\n guard: await StateMachine.deserializeActionAsync(transitionData.guard),\n // Support 'action' alias for 'onTransition'\n onTransition: await StateMachine.deserializeActionAsync(\n transitionData.onTransition || transitionData.action,\n ),\n onError: await StateMachine.deserializeActionAsync(\n transitionData.onError,\n ),\n }\n }\n\n /**\n * Deserialize transition configuration\n */\n private static deserializeTransition(transitionData: any): any {\n return {\n ...transitionData,\n guard: StateMachine.deserializeAction(transitionData.guard),\n // Support 'action' alias for 'onTransition' for compatibility\n onTransition: StateMachine.deserializeAction(\n transitionData.onTransition || transitionData.action\n ),\n onError: StateMachine.deserializeAction(transitionData.onError),\n }\n }\n\n /**\n * Static method for deserializing actions (Async)\n */\n private static async deserializeActionAsync(action: any): Promise<any> {\n if (!action) return action\n\n if (typeof action === 'object' && action.type === 'function') {\n return safeFunctionSerializer.deserializeActionAsync(action)\n }\n\n return StateMachine.deserializeAction(action)\n }\n\n /**\n * Static method for deserializing actions (now using safe deserializer)\n */\n private static deserializeAction(action: any): any {\n if (!action) return action\n\n // 1. Modern secure format with type and hash validation\n if (typeof action === 'object' && action.type === 'function') {\n return safeFunctionSerializer.deserializeAction(action)\n }\n\n // 2. Legacy string format (function or arrow function)\n if (typeof action === 'string') {\n const trimmed = action.trim()\n\n // Check if it looks like function code (not just a function name)\n if (\n trimmed.startsWith('function') ||\n trimmed.startsWith('(') ||\n trimmed.includes('=>')\n ) {\n // Use secure deserializer for legacy strings\n const safeFn = safeFunctionSerializer.deserializeLegacyString(action)\n if (safeFn) {\n return safeFn\n }\n // If validation failed, return undefined to prevent execution\n return undefined\n }\n }\n\n // 3. Action name reference (regular string like 'onEnter')\n return action\n }\n\n public static fromJSONWithContext<\n TOwner extends object,\n SMConfig extends StateMachineConfig<TOwner>,\n >(\n jsonData: string,\n context?: MethodsOf<TOwner>,\n options?: StateMachineOptions, // ⬅️ Добавляем опции\n ): StateMachine<TOwner, SMConfig> {\n const sm = StateMachine.fromJSON<TOwner, SMConfig>(\n jsonData,\n undefined,\n options,\n )\n if (context !== undefined) {\n sm.setContext(context)\n }\n return sm\n }\n\n // Приватные методы\n private setCurrentState(\n state: StateName,\n obj?: Adapter<PropertiesOf<TOwner>>,\n ) {\n const adaptee = obj || this.adaptee\n const stateConfig = this.states.get(state)\n\n if (\n stateConfig?.history &&\n stateConfig.history !== 'deep' &&\n stateConfig.regions\n ) {\n const historyState = this.historyMap.get(state)\n if (historyState && adaptee) {\n const currentState = this.getCurrentState(adaptee) ?? ''\n const newCompositeState = this.updatePartialState(\n currentState,\n state,\n historyState,\n )\n adaptee.set(\n this.stateAttribute,\n newCompositeState as TOwner[KeysOf<PropertiesOf<TOwner>, string>],\n )\n return\n }\n }\n if (stateConfig?.history === 'deep' && stateConfig.regions) {\n const historyState = this.historyMap.get(state)\n if (historyState && adaptee) {\n adaptee.set(\n this.stateAttribute,\n historyState as TOwner[KeysOf<PropertiesOf<TOwner>, string>],\n )\n return\n }\n }\n\n if (adaptee) {\n this.setCurrentStateInternal(state, adaptee)\n }\n }\n\n private setCurrentStateInternal(\n state: StateName,\n adaptee: Adapter<PropertiesOf<TOwner>>,\n ) {\n const currentState = this.getCurrentState(adaptee) || ''\n const currentStateMap = this.parseCompositeState(currentState)\n\n const newStateParts = state.split('|')\n // D1: a bare-root composite that declares regions must NOT short-circuit\n // as a simple root; it falls through to the region-expansion branch below\n // (1158-1167) so its regions expand identically to initialState/dotted\n // entry. A genuine region-less leaf root still short-circuits unchanged.\n const isRootState =\n newStateParts.length === 1 &&\n !state.includes('.') &&\n !this.states.get(state)?.regions\n if (isRootState) {\n currentStateMap.clear()\n currentStateMap.set(state, state)\n } else {\n for (const newStatePart of newStateParts) {\n if (!this.states.has(newStatePart)) {\n throw new StateMachineError(\n `Invalid state path: ${newStatePart} in composite state: ${state} states: ${Array.from(this.states.keys()).join(',')}`,\n { state: newStatePart },\n )\n }\n\n const regionKey = this.getRegionKey(newStatePart)\n const stateConfig = this.states.get(newStatePart)\n\n for (const [existingRegionKey] of currentStateMap.entries()) {\n if (\n existingRegionKey === regionKey ||\n existingRegionKey.startsWith(regionKey + '.') ||\n regionKey.startsWith(existingRegionKey + '.')\n ) {\n currentStateMap.delete(existingRegionKey)\n }\n }\n\n if (stateConfig?.regions) {\n const initialStatesForRegions = this.getInitialStatesForRegions(\n stateConfig.regions,\n newStatePart,\n )\n const regionStates = initialStatesForRegions.split('|')\n for (const regionState of regionStates) {\n const regionKeyNested = this.getRegionKey(regionState)\n currentStateMap.set(regionKeyNested, regionState)\n }\n } else {\n currentStateMap.set(regionKey, newStatePart)\n }\n }\n\n for (const [key, value] of currentStateMap.entries()) {\n if (!value.includes('.')) {\n currentStateMap.delete(key)\n }\n }\n }\n\n const newCompositeState = Array.from(currentStateMap.values()).join('|')\n this.validateCompositeState(newCompositeState)\n adaptee.set(\n this.stateAttribute,\n newCompositeState as TOwner[KeysOf<PropertiesOf<TOwner>, string>],\n )\n }\n\n public getCurrentState(adaptee?: Adapter<PropertiesOf<TOwner>>) {\n const targetAdaptee = adaptee || this.adaptee\n if (!targetAdaptee) return\n\n const currentState = targetAdaptee.get(this.stateAttribute) as string\n if (!currentState) return ''\n\n const stateParts = currentState.split('|')\n for (const statePart of stateParts) {\n if (!this.states.has(statePart)) {\n throw new StateMachineError(\n `Invalid state path in current state: ${statePart}`,\n { state: currentState },\n )\n }\n }\n return currentState\n }\n\n private setInitialState(\n initialState: string,\n obj?: Adapter<PropertiesOf<TOwner>>,\n ) {\n const targetAdaptee = obj || this.adaptee\n if (!targetAdaptee) return\n\n const stateConfig = this.states.get(initialState)\n let initialStates: string\n if (stateConfig?.regions) {\n initialStates = this.getInitialStatesForRegions(\n stateConfig.regions,\n initialState,\n )\n } else {\n initialStates = initialState\n }\n\n this.setCurrentState(initialStates, targetAdaptee)\n\n // D8: drive enter actions through the SAME ancestor-first enter set used by\n // a transition (computeEnterExitSets from the empty old configuration), so\n // initial entry (and reset, which delegates here) fires a composite\n // parent's onEnter BEFORE its region children — identical ordering to a\n // transition into the same composite. Fire-and-forget with .catch to keep\n // construction non-blocking, as the prior per-leaf loop did.\n const { enterStates } = this.computeEnterExitSets('', initialStates)\n const enterFireOrder =\n enterStates.length > 0 ? enterStates : [initialStates]\n const context: ErrorContext = {\n state: initialStates,\n phase: 'enter',\n }\n\n for (const statePart of enterFireOrder) {\n this.executeEnterActions(\n targetAdaptee as unknown as Adapter<TOwner>,\n statePart,\n [],\n context,\n ).catch((err) => {\n this.logger.error(\n 'Error in initial state enter actions',\n { state: statePart },\n err,\n )\n })\n }\n\n // D12: a degenerate all-final initial configuration should raise\n // done.state.<C> just like a transition that reaches it. setInitialState\n // runs in the constructor; checkCompletion only ever uses raiseEvent +\n // scheduleProcessing (queueMicrotask), so the join fires AFTER construction\n // returns, never on a half-constructed instance.\n this.checkCompletion(\n targetAdaptee as Adapter<PropertiesOf<TOwner>>,\n '',\n initialStates,\n )\n }\n\n private getInitialCompositeState(initialState: string): string {\n const stateConfig = this.states.get(initialState)\n if (stateConfig?.regions) {\n return this.getInitialStatesForRegions(stateConfig.regions, initialState)\n }\n return initialState\n }\n\n private getDirectChildren(stateName: string): string[] {\n const prefix = `${stateName}.`\n const depth = stateName.split('.').length + 1\n\n const children: string[] = []\n for (const name of this.states.keys()) {\n const nameStr = String(name)\n if (!nameStr.startsWith(prefix)) continue\n if (nameStr.split('.').length !== depth) continue\n children.push(nameStr)\n }\n return children\n }\n\n private getInitialStatesForRegions(\n regions: RegionsConfig<TOwner>,\n parentPath: string,\n ): string {\n const regionStates: string[] = []\n for (const [regionName, regionStatesConfig] of Object.entries(regions)) {\n const regionPath = `${parentPath}.${regionName}`\n const initialState =\n regionStatesConfig.initial || Object.keys(regionStatesConfig)[0]\n const fullPath = `${regionPath}.${initialState}`\n\n const stateConfig = this.states.get(fullPath)\n if (stateConfig?.regions) {\n const nestedInitialStates = this.getInitialStatesForRegions(\n stateConfig.regions,\n fullPath,\n )\n regionStates.push(...nestedInitialStates.split('|'))\n } else {\n regionStates.push(fullPath)\n }\n }\n return regionStates.join('|')\n }\n\n /**\n * Whether `leaf` is a UML/SCXML `<final>` atomic state of its region.\n *\n * Reads the `final` marker straight from the flattened state map populated by\n * processStates, so it works for any registered atomic leaf regardless of\n * nesting depth. Returns `false` for unregistered names and for composites\n * (the all-regions-final join derives doneness from atomic leaves, not from a\n * `final` flag on a composite parent).\n */\n private isStateFinal(leaf: string): boolean {\n return Boolean(this.states.get(leaf)?.final)\n }\n\n /**\n * Whether composite `compositeId` has reached its UML/SCXML \"done\"\n * configuration: every one of its regions has its active atomic leaf in a\n * `final` state (recursively, for nested composites).\n *\n * D10 (mustFix): doneness is derived by scanning the active atomic `|`-leaves\n * against the STATIC regions tree (`this.states.get(C)?.regions`), NEVER via a\n * region-key Map lookup (`configMap.get`) — that map keys leaves by their\n * deepest region container and so cannot answer \"which leaf is active in\n * region X of composite C\". For each region we locate the active leaf via the\n * `C.region.` dotted prefix; the region is final iff that leaf is `final`, or\n * the leaf lives under a nested composite that is itself `isCompositeDone`.\n *\n * Returns `false` for a non-composite id, for a composite with no active leaf\n * in some region, or when no substate under it is ever `final` (cheap miss).\n */\n private isCompositeDone(compositeId: string, atomicLeaves: string[]): boolean {\n const regions = this.states.get(compositeId)?.regions\n if (!regions) return false\n\n for (const regionName of Object.keys(regions)) {\n const regionPrefix = `${compositeId}.${regionName}.`\n const activeLeaf = atomicLeaves.find((leaf) =>\n leaf.startsWith(regionPrefix),\n )\n if (!activeLeaf) return false\n\n // Determine whether the region's active sub-configuration is complete.\n // If the region holds a NESTED COMPOSITE (e.g. region p -> composite D),\n // the region is final iff that composite is all-regions-final — checking\n // a single parallel branch leaf's `final` flag is NOT sufficient (one\n // branch being final does not finalize the whole nested composite). We\n // therefore defer to isCompositeDone on the region's OUTERMOST nested\n // composite first, and only fall back to a direct atomic `final` check\n // when the region holds a simple state.\n const nestedComposite = this.regionComposite(activeLeaf, regionPrefix)\n if (nestedComposite) {\n if (this.isCompositeDone(nestedComposite, atomicLeaves)) continue\n return false\n }\n if (this.isStateFinal(activeLeaf)) continue\n return false\n }\n return true\n }\n\n /**\n * The OUTERMOST registered composite (regions-bearing) ancestor of `leaf`\n * that lives strictly under `regionPrefix`, or `undefined` if the region\n * holds a simple atomic state directly. Used by {@link isCompositeDone} to\n * delegate a region's completeness to its nested composite (recursing over\n * every parallel branch), independent of whether any single branch leaf\n * happens to carry the `final` flag.\n *\n * ancestorChain is root-to-leaf, so the FIRST matching ancestor is the\n * region's direct composite child (e.g. `C.p.D` for leaf `C.p.D.s.s2` under\n * region prefix `C.p.`); isCompositeDone then recurses into its regions.\n */\n private regionComposite(\n leaf: string,\n regionPrefix: string,\n ): string | undefined {\n for (const ancestor of this.ancestorChain(leaf)) {\n if (\n ancestor !== leaf &&\n ancestor.startsWith(regionPrefix) &&\n this.states.get(ancestor)?.regions\n ) {\n return ancestor\n }\n }\n return undefined\n }\n\n /**\n * Whether composite `compositeId` has reached its all-regions-final (\"done\")\n * configuration in the CURRENT active state. Public guard surface (`@stable`)\n * for authoring a join as `guard: () => sm.isDone('C')` instead of (or\n * alongside) listening on the engine `done.state.<C>` event.\n *\n * @param compositeId - The dotted id of the composite/parallel state.\n * @returns `true` iff every region's active atomic leaf is `final`.\n */\n public isDone(\n compositeId: string,\n adaptee?: Adapter<PropertiesOf<TOwner>>,\n ): boolean {\n const currentState = this.getCurrentState(adaptee)\n if (!currentState) return false\n const atomicLeaves = currentState.split('|').filter(Boolean)\n return this.isCompositeDone(compositeId, atomicLeaves)\n }\n\n /**\n * SCXML completion hook (D10/D11/D12): after a new configuration is written,\n * raise `done.state.<C>` for each composite that became all-regions-final.\n *\n * - Scans only composites that GAINED an active leaf (the ancestor chain of\n * each `|`-leaf of `newState`), so unaffected composites are not re-checked.\n * - Emits INNERMOST-first (a deeper composite's `done.state` precedes its\n * parent's), matching SCXML's inner-before-outer completion ordering, via a\n * per-config emitted-id Set so each id is raised at most once per call.\n * - Gates each emission on `this.events.has('done.state.'+C)` (D11 mustFix):\n * raising an undeclared event would hit the `Invalid event` throw\n * (executeQueuedTransition) as an unhandled microtask rejection. No declared\n * `done.state.<C>` event => no emission, no crash, no observable effect.\n * - Uses the internal queue (`raiseEvent`) + `scheduleProcessing` so the\n * completion event is processed before subsequent external events.\n */\n private checkCompletion(\n obj: Adapter<PropertiesOf<TOwner>>,\n oldState: string,\n newState: string,\n ): void {\n const atomicLeaves = newState.split('|').filter(Boolean)\n if (atomicLeaves.length === 0) return\n\n // EDGE-TRIGGERED (SCXML): done.state.<C> is generated once, when the done\n // configuration is ENTERED — not on every macrostep that leaves C all-final.\n // We therefore emit only for composites that became done ON THIS transition:\n // done in `newState` AND NOT already done in `oldState`. A composite that\n // stays all-final across an unrelated (e.g. sibling-region) transition is\n // not re-signalled; a composite that leaves and later re-enters its done\n // configuration is correctly re-signalled. `oldState === ''` (initial/reset)\n // makes every all-final composite newly-done, so a degenerate all-final\n // initial config still raises done.state once.\n const oldLeaves = oldState.split('|').filter(Boolean)\n\n // Collect the composite ancestors of the newly-active leaves, then sort\n // DEEPEST-first so a nested inner composite's done.state is enqueued before\n // its parent's (SCXML inner-before-outer). Sorting by depth is required:\n // relying on leaf iteration order is unsound because the `|`-leaf order is\n // map-insertion dependent, so an outer-only leaf (e.g. a sibling region of\n // the inner composite) can otherwise surface the parent before the child.\n const seen = new Set<string>()\n for (const leaf of atomicLeaves) {\n for (const ancestor of this.ancestorChain(leaf)) {\n if (ancestor === leaf) continue\n if (seen.has(ancestor)) continue\n if (!this.states.get(ancestor)?.regions) continue\n seen.add(ancestor)\n }\n }\n const candidates = Array.from(seen).sort(\n (a, b) => b.split('.').length - a.split('.').length,\n )\n\n const emitted = new Set<string>()\n for (const compositeId of candidates) {\n if (emitted.has(compositeId)) continue\n if (!this.isCompositeDone(compositeId, atomicLeaves)) continue\n // Edge gate: skip if C was ALREADY all-final before this transition.\n if (this.isCompositeDone(compositeId, oldLeaves)) continue\n emitted.add(compositeId)\n const doneEvent = `done.state.${compositeId}`\n if (!this.events.has(doneEvent as keyof SMConfig['events'])) continue\n this.raiseEvent(doneEvent, obj)\n this.scheduleProcessing()\n }\n }\n\n /**\n * Build the registered ancestor chain for an atomic leaf, ordered root-to-leaf.\n *\n * Walks every dot-prefix of `leaf` and keeps only the ones that are real\n * registered states (`this.states.has`). Region containers are never\n * registered (only composite parents and atomic leaves are — see\n * processStates/processRegions), so they are filtered out automatically. The\n * result is exactly `[parent..leaf]` for a leaf inside a composite, and\n * `[leaf]` for a flat state.\n *\n * Example: `ancestorChain('a.r1.c1')` -> `['a', 'a.r1.c1']` (the `a.r1`\n * region container is excluded). Nested:\n * `ancestorChain('a.r1.c1.r3.x')` -> `['a', 'a.r1.c1', 'a.r1.c1.r3.x']`.\n */\n private ancestorChain(leaf: string): string[] {\n const chain: string[] = []\n let dotIndex = leaf.indexOf('.')\n while (dotIndex !== -1) {\n const prefix = leaf.substring(0, dotIndex)\n if (this.states.has(prefix)) {\n chain.push(prefix)\n }\n dotIndex = leaf.indexOf('.', dotIndex + 1)\n }\n if (this.states.has(leaf)) {\n chain.push(leaf)\n }\n return chain\n }\n\n /**\n * Compute the ordered enter/exit sets between two composite configurations\n * (SCXML ancestor-first entry / descendant-first exit).\n *\n * For each `|`-separated atomic leaf in `oldComposite` and `newComposite` the\n * union of its {@link ancestorChain} forms the old/new active ancestry. A\n * state shared by both ancestries lands in NEITHER diff, so a surviving\n * ancestor is never re-entered nor exited (no onEnter/onExit re-fire, no\n * timer re-arm/leak).\n *\n * - `enterStates` = new ancestry MINUS old, sorted ascending by depth then\n * document (insertion) order -> root-to-leaf entry.\n * - `exitStates` = old ancestry MINUS new, sorted descending by depth ->\n * leaf-to-root exit.\n *\n * Consumed by BOTH R1 (applyTransition / setInitialState / reset) and R2.\n */\n private computeEnterExitSets(\n oldComposite: string,\n newComposite: string,\n ): { enterStates: string[]; exitStates: string[] } {\n const collectAncestry = (composite: string): Set<string> => {\n const ancestry = new Set<string>()\n if (!composite) return ancestry\n for (const leaf of composite.split('|')) {\n if (!leaf) continue\n for (const ancestor of this.ancestorChain(leaf)) {\n ancestry.add(ancestor)\n }\n }\n return ancestry\n }\n\n const oldAncestry = collectAncestry(oldComposite)\n const newAncestry = collectAncestry(newComposite)\n\n const depthOf = (state: string): number => {\n let depth = 0\n for (let i = 0; i < state.length; i++) {\n if (state[i] === '.') depth++\n }\n return depth\n }\n\n // Preserve document (insertion) order for equal depth via a stable sort on\n // the original collection order.\n const enterRaw: string[] = []\n for (const state of newAncestry) {\n if (!oldAncestry.has(state)) enterRaw.push(state)\n }\n const exitRaw: string[] = []\n for (const state of oldAncestry) {\n if (!newAncestry.has(state)) exitRaw.push(state)\n }\n\n const enterStates = enterRaw\n .map((state, index) => ({ state, index, depth: depthOf(state) }))\n .sort((a, b) => a.depth - b.depth || a.index - b.index)\n .map((entry) => entry.state)\n const exitStates = exitRaw\n .map((state, index) => ({ state, index, depth: depthOf(state) }))\n .sort((a, b) => b.depth - a.depth || a.index - b.index)\n .map((entry) => entry.state)\n\n return { enterStates, exitStates }\n }\n\n private validateCompositeState(compositeState: string): void {\n const stateParts = compositeState.split('|')\n const regionKeys = new Set<string>()\n for (const statePart of stateParts) {\n const regionKey = this.getRegionKey(statePart)\n if (regionKeys.has(regionKey)) {\n throw new StateMachineError(\n `Contradictory state detected: multiple states for region ${regionKey} in composite state ${compositeState}`,\n { state: compositeState },\n )\n }\n regionKeys.add(regionKey)\n }\n }\n\n private processStates(\n statesConfig: States<TOwner>,\n parentStateName?: StateName,\n ) {\n for (const [name, value] of Object.entries(statesConfig)) {\n if (name === 'initial') continue\n\n const stateName = parentStateName ? `${parentStateName}.${name}` : name\n const state: State<TOwner> = { name: stateName, ...value }\n this.states.set(stateName, state)\n\n if (value.regions) {\n this.processRegions(value.regions, stateName)\n }\n }\n }\n\n private processRegions(\n regionsConfig: RegionsConfig<TOwner>,\n parentStateName: StateName,\n ) {\n for (const [regionName, regionStatesConfig] of Object.entries(\n regionsConfig,\n )) {\n this.processStates(regionStatesConfig, `${parentStateName}.${regionName}`)\n }\n }\n\n private processError(\n adaptee: Adapter<TOwner>,\n context: ErrorContext,\n ...fallback: Array<ErrorHandlerOrString<TOwner> | undefined>\n ) {\n let handler: ErrorHandler<TOwner> = (adaptee, err) => {\n // Safely get current state, fallback to context.state if adaptee is invalid\n let currentState: string\n try {\n if (adaptee && typeof (adaptee as any).get === 'function') {\n currentState = this.getCurrentState(\n adaptee as unknown as Adapter<PropertiesOf<TOwner>>,\n ) ?? ''\n } else {\n /* c8 ignore next */\n currentState = context.state || ''\n }\n } catch {\n /* c8 ignore next */\n currentState = context.state || ''\n }\n\n const _phase = err instanceof StateMachineError\n ? (err.context.phase ?? context.phase)\n : context.phase\n const _event = err instanceof StateMachineError\n ? (err.context.event ?? context.event)\n : context.event\n const _action = err instanceof StateMachineError\n ? (err.context.action ?? context.action)\n : context.action\n const _transition = err instanceof StateMachineError\n ? (err.context.transition ?? context.transition)\n : context.transition\n const errorContext: ErrorContext = {\n state: currentState,\n ...(_phase !== undefined ? { phase: _phase } : {}),\n ...(_event !== undefined ? { event: _event } : {}),\n ...(_action !== undefined ? { action: _action } : {}),\n ...(_transition !== undefined ? { transition: _transition } : {}),\n }\n\n throw new StateMachineError(\n `Error in state machine: ${err ? (err instanceof Error ? err.message : String(err)) : 'Unknown error'}`,\n errorContext,\n (err instanceof StateMachineError\n ? err.cause\n : err instanceof Error\n ? err\n : undefined) as Error | undefined,\n )\n }\n const handlers = (fallback ?? [this.onError]).filter(Boolean)\n if (handlers.length > 0) {\n const r = handlers\n .map((action) =>\n action\n ? typeof action === 'function'\n ? action\n : (this.context &&\n ((this.context as Record<string, unknown>)[action as string] as ErrorHandler<TOwner>)) ||\n (adaptee.get(action) as ErrorHandler<TOwner>)\n : undefined,\n )\n .filter(Boolean)\n .find((t) => t)\n if (r) handler = r\n }\n return (...args: any[]) => {\n const targetAdaptee = args.length >= 2 ? args[0] : adaptee\n const error = args.length >= 2 ? args[1] : args[0]\n return handler(this.resolveCallbackOwner(targetAdaptee), error)\n }\n }\n\n private async callAction<CallResult>(\n obj: Adapter<TOwner>,\n actionName: ActionOrString<TOwner, CallResult>,\n ...args: any[]\n ): Promise<CallResult | void> {\n const targetOwner = this.resolveCallbackOwner(obj)\n const _callActionState = this.getCurrentState(\n obj as unknown as Adapter<PropertiesOf<TOwner>>,\n )\n const context: ErrorContext = {\n /* c8 ignore next */\n ...(_callActionState !== undefined ? { state: _callActionState } : {}),\n phase: 'action',\n action: typeof actionName === 'string' ? actionName : 'anonymous',\n }\n\n const executeAction = async (): Promise<CallResult | void> => {\n try {\n // 1. Check in Context (Dependency Injection)\n if (this.context && (this.context as Record<string, unknown>)[actionName as string]) {\n const action = (this.context as Record<string, unknown>)[actionName as string] as EventAction<\n TOwner,\n CallResult\n >\n /* c8 ignore next */\n if (typeof action === 'function') {\n const result = action(targetOwner, ...args)\n return result instanceof Promise ? await result : result\n }\n }\n\n // 2. Check if it's an inline function (Compatibility mode)\n else if (typeof actionName === 'function') {\n const result = actionName(targetOwner, ...args)\n return result instanceof Promise ? await result : result\n }\n\n // 3. Check in Object/Adaptee (Data Context)\n else if (obj.get(actionName as any)) {\n const action = obj.get(actionName as any)\n /* c8 ignore next */\n if (typeof action === 'function') {\n const result = action(targetOwner, ...args)\n /* c8 ignore next */\n return result instanceof Promise ? await result : result\n }\n }\n throw new StateMachineError('No action found', context)\n } catch (error) {\n if (error instanceof StateMachineError) throw error\n throw new StateMachineError(\n `Error executing action: ${error instanceof Error ? error.message : String(error)}`,\n context,\n /* c8 ignore next */\n error instanceof Error ? error : undefined,\n )\n }\n }\n\n // Apply timeout if configured\n if (this.transitionTimeout && this.transitionTimeout > 0) {\n const timeoutMs = this.transitionTimeout\n let timeoutHandle: any\n const timeoutPromise = new Promise<never>((_, reject) => {\n const fire = () => reject(new StateMachineError('Transition timeout', {\n /* c8 ignore next */\n action: typeof actionName === 'string' ? actionName : 'anonymous',\n phase: 'action',\n }))\n timeoutHandle = this.setTimer(fire, timeoutMs)\n })\n if (this.schedulerProvided) {\n return Promise.race([executeAction(), timeoutPromise]).finally(() => {\n this.clearTimer(timeoutHandle)\n })\n }\n return Promise.race([executeAction(), timeoutPromise])\n }\n\n return executeAction()\n }\n\n private async getAllowedTransitions(\n obj: Adapter<PropertiesOf<TOwner>>,\n transitions: Array<Transition<TOwner, SMConfig['states']>>,\n ...args: unknown[]\n ) {\n let highestPriority = Number.NEGATIVE_INFINITY\n let selectedTransition: Transition<TOwner, SMConfig['states']> | undefined\n\n for (const transition of transitions) {\n if ((transition.priority ?? Number.NEGATIVE_INFINITY) < highestPriority) {\n continue\n }\n\n const _guardState = this.getCurrentState(obj)\n const context: ErrorContext = {\n /* c8 ignore next */\n ...(_guardState !== undefined ? { state: _guardState } : {}),\n phase: 'guard',\n transition: `${transition.from} -> ${transition.to}`,\n }\n\n const guardResult = transition.guard\n ? await this.callAction(obj as any, transition.guard, ...args).catch(\n this.processError(\n obj as any,\n context,\n transition.onError,\n this.onError,\n ),\n )\n : true\n if (!guardResult) {\n continue\n }\n\n highestPriority = transition.priority ?? Number.NEGATIVE_INFINITY\n selectedTransition = transition\n }\n\n return selectedTransition\n }\n\n private isTransitionPossible(\n transition: Transition<TOwner, SMConfig['states']>,\n currentState: string,\n ): boolean {\n const currentStates = this.parseCompositeState(currentState)\n\n // Handle wildcard transition\n if (transition.from === '*') {\n return true\n }\n\n const fromStates = transition.from.split('|')\n\n return fromStates.every((fromState) => {\n // Handle wildcard in parallel state part (e.g. \"lobby|*\")\n if (fromState === '*') return true\n\n // Fast path: exact region-key lookup (leaf or in-region ancestor `from`).\n const regionKey = this.getRegionKey(fromState)\n const currentStateForRegion = currentStates.get(regionKey)\n if (\n currentStateForRegion &&\n (currentStateForRegion === fromState ||\n this.isParentState(currentStateForRegion, fromState))\n ) {\n return true\n }\n\n // Ancestor-scan fallback (D3): a transition whose source is a composite\n // parent is eligible whenever its parent is in the active configuration,\n // i.e. `fromState` equals or is an ancestor of any active atomic leaf.\n // Mirrors SCXML source-in-active-configuration; preserves the outer\n // .every() so a multi-part `from` still requires every part to match.\n return Array.from(currentStates.values()).some(\n (leaf) => leaf === fromState || this.isParentState(fromState, leaf),\n )\n })\n }\n\n private isParentState(parentState: string, childState: string): boolean {\n return (\n childState.startsWith(parentState + '.') || childState === parentState\n )\n }\n\n private async applyTransition(\n obj: Adapter<TOwner>,\n currentState: string,\n transition: Transition<TOwner, SMConfig['states']>,\n args: any[],\n eventName: keyof SMConfig['events'],\n event: Event<TOwner, SMConfig['states']>,\n ): Promise<State<TOwner> | undefined> {\n const context: ErrorContext = {\n state: currentState,\n event: String(eventName),\n transition: `${transition.from} -> ${transition.to}`,\n phase: 'transition',\n }\n\n const targetState = transition.to === '*' ? currentState : transition.to\n this._isTransitioning = true\n this._targetState = targetState as string\n\n // D7: compute the immutable new configuration together with its SCXML\n // ancestor-first enter / descendant-first exit sets ONCE, BEFORE any exit\n // or enter action runs, so Phase 6 enters know the expanded leaves and\n // Phase 8 reuses the same `newState` (no recompute). `updateState` calls\n // `validateCompositeState`, which can throw on a contradictory target; we\n // wrap the early compute so such a throw aborts cleanly with NO half-run\n // exit/enter set rather than after Phase 3 has already exited states.\n let newState: string\n let enterStates: string[]\n let exitStates: string[]\n try {\n newState = this.updateState(currentState, targetState as string)\n const sets = this.computeEnterExitSets(currentState, newState)\n enterStates = sets.enterStates\n exitStates = sets.exitStates\n } catch (error) {\n this.logger.warn('Transition aborted: invalid target configuration', {\n state: currentState,\n target: String(targetState),\n error,\n })\n this._isTransitioning = false\n this._targetState = undefined\n return undefined\n }\n // Fallbacks: a flat (non-composite) transition has no registered ancestor\n // chain delta, so drive a single onExit/onEnter for the literal\n // from/to names, preserving prior behaviour for flat states.\n const exitFireOrder =\n exitStates.length > 0 ? exitStates : [transition.from as string]\n const enterFireOrder =\n enterStates.length > 0 ? enterStates : [transition.to as string]\n\n try {\n // Phase 1: Guard validation\n if (transition.guard) {\n const allow = await this.callAction(obj, transition.guard, ...args).catch(\n this.processError(\n obj,\n { ...context, phase: 'guard' },\n transition.onError,\n this.onError,\n ),\n )\n /* c8 ignore next */\n if (!allow) {\n /* c8 ignore next */\n return undefined\n }\n }\n\n // Phase 2: Before event action\n if (event.onBefore) {\n await this.callAction(obj, event.onBefore, ...args).catch(\n this.processError(\n obj,\n { ...context },\n transition.onError,\n this.onError,\n ),\n )\n }\n\n // Phase 3: Exit actions — descendant-first (leaf-to-root) over the\n // computed exit set (D2). Each exited leaf clears its own per-leaf\n // invoke timers inside executeExitActions, so no timer leaks.\n try {\n for (const exitStateName of exitFireOrder) {\n await this.executeExitActions(obj, exitStateName, args, context)\n }\n } catch (error) {\n if (this.abortOnExitError) {\n this.logger.warn('Transition aborted due to onExit error', { state: currentState, error })\n return undefined // Stay in source state\n }\n throw error // Propagate error (likely stopping transition but potentially leaving inconsistent state if not handled by caller)\n }\n\n // Phase 4: History management\n this.manageStateHistory(transition.from, currentState, obj)\n\n // Phase 5: Transition action\n if (transition.onTransition) {\n await this.callAction(obj, transition.onTransition, ...args).catch(\n this.processError(\n obj,\n { ...context },\n transition.onError,\n this.onError,\n ),\n )\n }\n\n // Phase 6: Enter actions — ancestor-first (root-to-leaf) over the\n // computed enter set (D2), so a composite parent's onEnter fires before\n // each of its region children and each region leaf arms its own invoke\n // timers.\n try {\n for (const enterStateName of enterFireOrder) {\n await this.executeEnterActions(obj, enterStateName, args, context)\n }\n } catch (error) {\n // ZOMBIE STATE PREVENTION\n if (this.errorState) {\n this.logger.error(`Failed to enter state '${targetState}'. Fallback to error state '${this.errorState}'`, { error })\n const errorNewState = this.updateState(currentState, this.errorState)\n this.setCurrentState(errorNewState, obj as any)\n return this.states.get(this.errorState)\n }\n throw error\n }\n\n // Phase 7: After event action\n if (event.onAfter) {\n try {\n await this.callAction(obj, event.onAfter, ...args)\n } catch (error) {\n const errorHandler = this.processError(\n obj,\n { ...context },\n event.onError,\n this.onError,\n )\n errorHandler(this.resolveCallbackOwner(obj), error)\n }\n }\n\n // Phase 8: State update — reuse the immutable `newState` computed once\n // before Phase 3 (D7); never recompute. updateState is side-effect-free,\n // so only the setCurrentState write stays late.\n // Intentional wall-clock telemetry (NOT this.clock()): measures real\n // transition latency for monitor.recordTransition. Must stay Date.now() —\n // a virtual clock would report meaningless ~0ms durations. Do not virtualize.\n const transitionStartTime = Date.now()\n this.setCurrentState(newState, obj as any)\n\n // D10/D11: after the new configuration is written, raise `done.state.<C>`\n // for every composite that just became all-regions-final (innermost-first,\n // only when a matching event is declared). Consumes the immutable R1\n // `newState`; edge-triggered against `currentState` so a composite that\n // merely STAYS all-final is not re-signalled. Gated internally so an\n // undeclared join cannot crash.\n this.checkCompletion(obj as any, currentState, newState)\n\n // Record successful transition\n const transitionTime = Date.now() - transitionStartTime\n this.monitor.recordTransition(transitionTime, true)\n\n return this.states.get(targetState)\n } finally {\n this._isTransitioning = false\n this._targetState = undefined\n }\n }\n\n /**\n * Execute exit actions for a state\n */\n private async executeExitActions(\n obj: Adapter<TOwner>,\n fromStateName: string,\n args: any[],\n context: ErrorContext,\n ): Promise<void> {\n const fromState = this.states.get(fromStateName)\n\n // Clear timers when exiting the state\n if (this.activeTimers.has(fromStateName)) {\n const timers = this.activeTimers.get(fromStateName) || []\n for (const timerId of timers) {\n this.clearTimer(timerId)\n }\n this.activeTimers.delete(fromStateName)\n }\n\n // Clear entry time\n this.stateEntryTimes.delete(fromStateName)\n\n if (!fromState) return\n\n const exitContext = { ...context, phase: 'exit' as const }\n\n // Execute exit actions in sequence\n const exitActions = [\n fromState.onBeforeExit,\n fromState.onExit,\n fromState.onAfterExit,\n ]\n\n for (const action of exitActions) {\n if (action) {\n await this.callAction(obj, action, ...args).catch(\n this.processError(obj, exitContext, fromState.onError, this.onError),\n )\n }\n }\n }\n\n /**\n * Execute enter actions for a state\n */\n private async executeEnterActions(\n obj: Adapter<TOwner>,\n toStateName: string,\n args: any[],\n context: ErrorContext,\n ): Promise<void> {\n const toState = this.states.get(toStateName)\n if (!toState) return\n\n const enterContext = { ...context, phase: 'enter' as const }\n\n // Execute enter actions in sequence\n const enterActions = [\n toState.onBeforeEnter,\n toState.onEnter,\n toState.onAfterEnter,\n ]\n\n for (const action of enterActions) {\n if (action) {\n await this.callAction(obj, action, ...args).catch(\n this.processError(obj, enterContext, toState.onError, this.onError),\n )\n }\n }\n\n // Handle time-based transitions (invoke)\n if (toState.invoke && toState.invoke.length > 0) {\n // Record entry time if not already recorded (e.g. from resumeTimers)\n if (!this.stateEntryTimes.has(toStateName)) {\n this.stateEntryTimes.set(toStateName, this.clock())\n }\n\n const timers: any[] = []\n for (const invocation of toState.invoke) {\n // Check condition (cond) before starting the timer\n if (invocation.cond) {\n try {\n const shouldInvoke = invocation.cond(obj.adaptee)\n if (!shouldInvoke) continue\n } catch (e) {\n this.logger.error(\n 'Error in invoke condition',\n { state: toStateName },\n e as Error,\n )\n continue\n }\n }\n\n const callback = async () => {\n const currentState = this.getCurrentState(obj as any)\n if (currentState?.split('|').includes(toStateName)) {\n try {\n if (invocation.action) {\n await this.callAction(obj, invocation.action)\n }\n this.raiseEvent(invocation.event as string, obj as any)\n this.scheduleProcessing()\n } catch (err) {\n this.logger.error(\n 'Invocation error',\n { state: toStateName, event: invocation.event },\n err as Error,\n )\n }\n }\n }\n\n const timerId = this.setTimer(callback, invocation.delay)\n timers.push(timerId)\n }\n this.activeTimers.set(toStateName, timers)\n }\n }\n\n /**\n * Helper to set timer (native or scheduled)\n */\n private setTimer(callback: () => void, delay: number): any {\n const scheduler = this.scheduler\n // Blocker #2: when a scheduler was EXPLICITLY provided (e.g. a virtual\n // scheduler), ALWAYS route through it — never fall back to real setTimeout.\n // The scheduler computes executeAt against its own injected clock.\n if (this.schedulerProvided) {\n return scheduler.schedule(delay, callback)\n }\n // Default (no scheduler option): preserve the original isActive()-gated\n // behavior — use the lazy real scheduler if running, else native setTimeout.\n if (scheduler.isActive()) {\n return scheduler.schedule(delay, callback)\n }\n return setTimeout(callback, delay)\n }\n\n /**\n * Helper to clear timer\n */\n private clearTimer(timerId: any): void {\n const scheduler = this.scheduler\n // Blocker #2 symmetry: explicitly-provided scheduler always cancels via it.\n // (cancel() handles unknown tokens gracefully.)\n if (this.schedulerProvided) {\n if (timerId !== undefined) scheduler.cancel(timerId)\n return\n }\n // Default: preserve the original token-heuristic gating.\n // Note: TimerToken is object, setTimeout returns Timeout (Node) or number (Browser).\n // We check if it looks like our token (simple object) or native handle.\n if (\n scheduler.isActive() &&\n typeof timerId === 'object' &&\n timerId !== null &&\n !('ref' in timerId)\n ) {\n scheduler.cancel(timerId)\n } else {\n clearTimeout(timerId)\n }\n }\n\n /**\n * Manage state history for transitions\n */\n private manageStateHistory(\n fromStateName: string,\n currentState: string,\n obj: Adapter<TOwner>,\n ): void {\n const fromState = this.states.get(fromStateName)\n\n // Handle state history\n if (fromState?.history) {\n if (fromState.history === 'deep') {\n this.historyMap.set(fromState.name, currentState)\n } else if (fromState.history === 'shallow' && fromState.regions) {\n this.historyMap.set(fromState.name, this.getCurrentState(obj as any) ?? '')\n }\n }\n\n // Handle parent state history\n const fromStateParent = this.findParentStateWithHistory(fromStateName)\n if (fromStateParent?.history) {\n this.historyMap.set(fromStateParent.name, currentState)\n }\n }\n\n private findParentStateWithHistory(\n stateName: string,\n ): State<TOwner> | undefined {\n let current = stateName\n while (current.includes('.')) {\n current = current.split('.').slice(0, -1).join('.')\n const state = this.states.get(current)\n if (state?.history) return state\n }\n return undefined\n }\n\n private updatePartialState(\n currentState: string,\n parentState: StateName,\n newSubstate: string,\n ): string {\n if (!currentState) return newSubstate\n\n const currentParts = currentState.split('|')\n const regionKey = parentState.split('.').slice(0, -1).join('.')\n\n let updatedParts = currentParts\n .map((part) => {\n const partRegionKey = this.getRegionKey(part)\n if (partRegionKey === regionKey) {\n return newSubstate\n }\n if (partRegionKey.startsWith(`${regionKey}.`)) {\n return null\n }\n return part\n })\n .filter((m): m is string => m !== null && m !== undefined)\n\n if (!updatedParts.some((part) => this.getRegionKey(part) === regionKey)) {\n const regionState = this.states.get(newSubstate)\n if (regionState?.regions) {\n return currentState\n } else {\n updatedParts.push(newSubstate)\n }\n }\n\n updatedParts = updatedParts.filter((part) => part !== null) as string[]\n\n const newCompositeState = updatedParts.join('|')\n this.validateCompositeState(newCompositeState)\n\n return newCompositeState\n }\n\n private updateState(currentState: string, toState: string): string {\n const currentStateMap = this.parseCompositeState(currentState)\n const toStateParts = toState.split('|')\n\n // Handle simple root state transition (region-LESS roots only).\n // D1: a bare-root composite that declares regions must NOT short-circuit\n // here; it falls through to the addRegionStates expansion loop so its\n // regions expand identically to initialState/dotted entry. A genuine\n // non-region leaf root still short-circuits byte-for-byte.\n if (\n toStateParts.length === 1 &&\n !toState.includes('.') &&\n !this.states.get(toState)?.regions\n ) {\n currentStateMap.clear()\n currentStateMap.set(toState, toState)\n return toState\n }\n\n // Handle complex state transitions with regions\n for (const toStatePart of toStateParts) {\n const regionKey = this.getRegionKey(toStatePart)\n const stateConfig = this.states.get(toStatePart)\n\n // Remove conflicting states efficiently\n this.removeConflictingStates(currentStateMap, regionKey)\n\n // Add new state or region states\n if (stateConfig?.regions) {\n this.addRegionStates(currentStateMap, stateConfig, toStatePart)\n } else {\n currentStateMap.set(regionKey, toStatePart)\n }\n }\n\n // Clean up root states\n this.cleanupRootStates(currentStateMap)\n\n const newCompositeState = Array.from(currentStateMap.values()).join('|')\n this.validateCompositeState(newCompositeState)\n return newCompositeState\n }\n\n /**\n * Remove conflicting states from the state map\n */\n private removeConflictingStates(\n currentStateMap: Map<string, string>,\n regionKey: string,\n ): void {\n const keysToDelete: string[] = []\n\n for (const [key, value] of currentStateMap.entries()) {\n const existingRegionKey = this.getRegionKey(value)\n if (\n existingRegionKey === regionKey ||\n existingRegionKey.startsWith(`${regionKey}.`)\n ) {\n keysToDelete.push(key)\n }\n }\n\n // Batch delete for better performance\n for (const key of keysToDelete) {\n currentStateMap.delete(key)\n }\n }\n\n /**\n * Add region states to the state map\n */\n private addRegionStates(\n currentStateMap: Map<string, string>,\n stateConfig: State<TOwner>,\n toStatePart: string,\n ): void {\n const initialStatesForRegions = this.getInitialStatesForRegions(\n stateConfig.regions!,\n toStatePart,\n )\n const regionStates = initialStatesForRegions.split('|')\n\n for (const regionState of regionStates) {\n const regionKeyNested = this.getRegionKey(regionState)\n currentStateMap.set(regionKeyNested, regionState)\n }\n }\n\n /**\n * Clean up root states from the state map\n */\n private cleanupRootStates(currentStateMap: Map<string, string>): void {\n const keysToDelete: string[] = []\n\n for (const [key, value] of currentStateMap.entries()) {\n if (!value.includes('.')) {\n keysToDelete.push(key)\n }\n }\n\n // Batch delete for better performance\n for (const key of keysToDelete) {\n currentStateMap.delete(key)\n }\n }\n\n private parseCompositeState(compositeState: string): Map<string, string> {\n const stateMap = new Map<string, string>()\n if (!compositeState) return stateMap\n\n // Optimized parsing with single split operation\n const stateParts = compositeState.split('|')\n for (let i = 0; i < stateParts.length; i++) {\n const statePart = stateParts[i]\n /* c8 ignore next */ if (statePart === undefined) continue\n const regionKey = this.getRegionKey(statePart)\n stateMap.set(regionKey, statePart)\n }\n return stateMap\n }\n\n private getRegionKey(statePath: string): string {\n // Optimized with lastIndexOf for better performance\n const lastDotIndex = statePath.lastIndexOf('.')\n return lastDotIndex === -1\n ? statePath\n : statePath.substring(0, lastDotIndex)\n }\n\n private resumeTimers() {\n // Clear any existing active timers first\n for (const timers of this.activeTimers.values()) {\n for (const id of timers) {\n this.clearTimer(id)\n }\n }\n this.activeTimers.clear()\n\n const currentState = this.getCurrentState()\n if (!currentState) return\n\n const activeStates = currentState.split('|')\n const activeStatesSet = new Set(activeStates)\n\n // GC: Remove times for inactive states to prevent memory leaks in stateEntryTimes\n for (const stateName of this.stateEntryTimes.keys()) {\n if (!activeStatesSet.has(stateName)) {\n this.stateEntryTimes.delete(stateName)\n }\n }\n\n const now = this.clock()\n\n for (const stateName of activeStates) {\n const state = this.states.get(stateName)\n if (!state || !state.invoke || state.invoke.length === 0) continue\n\n const entryTime = this.stateEntryTimes.get(stateName)\n // If no entry time recorded, assume just entered (fallback for old data).\n // Use ?? / === undefined (not ||) so a legitimate entry time of 0 — valid\n // under an injected virtual clock that starts at t=0 — is preserved\n // instead of being treated as \"missing\". With the default Date.now clock\n // an entry time is never 0, so the default path stays byte-identical.\n const startTime = entryTime ?? now\n if (entryTime === undefined) {\n this.stateEntryTimes.set(stateName, startTime)\n }\n\n const elapsed = now - startTime\n const timers: any[] = []\n\n for (const invocation of state.invoke) {\n const remaining = Math.max(0, invocation.delay - elapsed)\n\n // If time already passed, fire immediately (in next tick)\n const callback = async () => {\n // Verify we are still in this state\n const current = this.getCurrentState(this.adaptee)\n if (current?.split('|').includes(stateName)) {\n try {\n // Check condition (cond) at execution time, not at setup time\n if (invocation.cond && this.adaptee) {\n try {\n if (!invocation.cond(this.adaptee.adaptee as any)) return\n } catch (_e) {\n return\n }\n }\n\n if (invocation.action && this.adaptee) {\n await this.callAction(this.adaptee as any, invocation.action)\n }\n await this.fireEvent(invocation.event as any).catch((err) => {\n this.logger.error(\n 'Resumed timer transition error',\n { state: stateName, event: invocation.event },\n err,\n )\n })\n } catch (_err) {\n /* log */\n }\n }\n }\n\n const timerId = this.setTimer(callback, remaining)\n timers.push(timerId)\n }\n this.activeTimers.set(stateName, timers)\n }\n }\n\n // Методы сериализации\n public toJSON(): string {\n // Pre-allocate objects for better performance\n const serializedStates: Record<string, any> = {}\n const serializedEvents: Record<string, any> = {}\n\n // Serialize states with optimized approach\n for (const [name, state] of this.states) {\n serializedStates[name as string] = this.serializeState(state)\n }\n\n // Serialize events with optimized approach\n for (const [name, event] of this.events) {\n serializedEvents[name as string] = this.serializeEvent(event)\n }\n\n const config = {\n initialState: this.initialState,\n stateAttribute: this.stateAttribute,\n states: serializedStates,\n events: serializedEvents,\n onError: this.serializeAction(this.onError, 'config_onError'),\n }\n\n return JSON.stringify({\n config,\n currentState: this.getCurrentState(),\n historyMap: Array.from(this.historyMap.entries()),\n stateEntryTimes: Array.from(this.stateEntryTimes.entries()),\n })\n }\n\n /**\n * Securely serializes the StateMachine to JSON (Async).\n * Generates cryptographic hashes for all functions.\n */\n public async toSecureJSON(): Promise<string> {\n const serializedStates: Record<string, any> = {}\n const serializedEvents: Record<string, any> = {}\n\n for (const [name, state] of this.states) {\n serializedStates[name as string] = await this.serializeStateAsync(state)\n }\n\n for (const [name, event] of this.events) {\n serializedEvents[name as string] = await this.serializeEventAsync(event)\n }\n\n const config = {\n initialState: this.initialState,\n stateAttribute: this.stateAttribute,\n states: serializedStates,\n events: serializedEvents,\n onError: await this.serializeActionAsync(this.onError, 'config_onError'),\n }\n\n return JSON.stringify({\n config,\n currentState: this.getCurrentState(),\n historyMap: Array.from(this.historyMap.entries()),\n stateEntryTimes: Array.from(this.stateEntryTimes.entries()),\n })\n }\n\n /**\n * Serialize state with optimized performance (Async)\n */\n private async serializeStateAsync(state: State<TOwner>): Promise<any> {\n const { name: _name, ...stateWithoutName } = state\n\n const serializedState: any = {\n ...stateWithoutName,\n onBeforeEnter: await this.serializeActionAsync(\n state.onBeforeEnter,\n 'onBeforeEnter',\n ),\n onEnter: await this.serializeActionAsync(state.onEnter, 'onEnter'),\n onAfterEnter: await this.serializeActionAsync(\n state.onAfterEnter,\n 'onAfterEnter',\n ),\n onBeforeExit: await this.serializeActionAsync(\n state.onBeforeExit,\n 'onBeforeExit',\n ),\n onExit: await this.serializeActionAsync(state.onExit, 'onExit'),\n onAfterExit: await this.serializeActionAsync(\n state.onAfterExit,\n 'onAfterExit',\n ),\n onError: await this.serializeActionAsync(state.onError, 'state_onError'),\n }\n\n if (state.invoke) {\n serializedState.invoke = await Promise.all(\n state.invoke.map(async (inv) => ({\n ...inv,\n cond: inv.cond != null\n ? await safeFunctionSerializer.serializeActionAsync(\n inv.cond,\n 'invoke_cond',\n )\n : undefined,\n action: inv.action != null\n ? await safeFunctionSerializer.serializeActionAsync(\n inv.action,\n 'invoke_action',\n )\n : undefined,\n })),\n )\n }\n\n return serializedState\n }\n\n /**\n * Serialize state with optimized performance\n */\n private serializeState(state: State<TOwner>): any {\n const { name: _name, ...stateWithoutName } = state\n\n const serializedState: any = {\n ...stateWithoutName,\n onBeforeEnter: this.serializeAction(state.onBeforeEnter, 'onBeforeEnter'),\n onEnter: this.serializeAction(state.onEnter, 'onEnter'),\n onAfterEnter: this.serializeAction(state.onAfterEnter, 'onAfterEnter'),\n onBeforeExit: this.serializeAction(state.onBeforeExit, 'onBeforeExit'),\n onExit: this.serializeAction(state.onExit, 'onExit'),\n onAfterExit: this.serializeAction(state.onAfterExit, 'onAfterExit'),\n onError: this.serializeAction(state.onError, 'state_onError'),\n }\n\n if (state.invoke) {\n serializedState.invoke = state.invoke.map((inv) => ({\n ...inv,\n cond: inv.cond != null\n ? safeFunctionSerializer.serializeAction(inv.cond, 'invoke_cond')\n : undefined,\n action: inv.action != null\n ? safeFunctionSerializer.serializeAction(inv.action, 'invoke_action')\n : undefined,\n }))\n }\n\n return serializedState\n }\n\n /**\n * Serialize event with optimized performance (Async)\n */\n private async serializeEventAsync(event: Event<TOwner, any>): Promise<any> {\n const { name: _name, ...eventWithoutName } = event\n\n return {\n ...eventWithoutName,\n onBefore: await this.serializeActionAsync(\n event.onBefore,\n 'event_onBefore',\n ),\n onAfter: await this.serializeActionAsync(event.onAfter, 'event_onAfter'),\n onSuccess: await this.serializeActionAsync(\n event.onSuccess,\n 'event_onSuccess',\n ),\n onError: await this.serializeActionAsync(event.onError, 'event_onError'),\n transitions: await Promise.all(\n event.transitions.map((t) => this.serializeTransitionAsync(t)),\n ),\n }\n }\n\n /**\n * Serialize transition (Async)\n */\n private async serializeTransitionAsync(\n transition: Transition<TOwner, any>,\n ): Promise<any> {\n return {\n ...transition,\n guard: await this.serializeActionAsync(\n transition.guard,\n 'transition_guard',\n ),\n onTransition: await this.serializeActionAsync(\n transition.onTransition,\n 'transition_onTransition',\n ),\n onError: await this.serializeActionAsync(\n transition.onError,\n 'transition_onError',\n ),\n }\n }\n\n /**\n * Serialize event with optimized performance\n */\n private serializeEvent(event: Event<TOwner, any>): any {\n const { name: _name, ...eventWithoutName } = event\n\n return {\n ...eventWithoutName,\n onBefore: this.serializeAction(event.onBefore, 'event_onBefore'),\n onAfter: this.serializeAction(event.onAfter, 'event_onAfter'),\n onSuccess: this.serializeAction(event.onSuccess, 'event_onSuccess'),\n onError: this.serializeAction(event.onError, 'event_onError'),\n transitions: event.transitions.map((transition) => ({\n ...transition,\n guard: this.serializeAction(transition.guard, 'transition_guard'),\n onTransition: this.serializeAction(\n transition.onTransition,\n 'transition_onTransition',\n ),\n onError: this.serializeAction(transition.onError, 'transition_onError'),\n })),\n }\n }\n\n private async serializeActionAsync(\n action: any,\n name: string,\n ): Promise<SafeSerializedAction | undefined> {\n if (!action) return undefined\n return safeFunctionSerializer.serializeActionAsync(action, name)\n }\n\n /**\n * Optimized action serialization using safe serializer\n */\n private serializeAction(action: any, functionName?: string): any {\n if (typeof action === 'function') {\n return safeFunctionSerializer.serializeAction(action, functionName)\n }\n return action\n }\n}\n","// src/lite.ts (INTERNAL module; the public API is exposed via src/index.ts)\n// This file holds the createMachine factory. Do NOT add subsystem re-exports here—\n// they belong in src/index.ts. Adding them here creates duplicate exports under\n// node16 moduleResolution.\n\nimport { StateMachine } from './state_machine'\nimport {\n type Adapter,\n MemoryAdapter,\n type StateMachineConfig,\n type StateMachineOptions,\n} from './types'\n\n/**\n * Public factory for @vedmalex/statemachine. DI-free; the only factory in this package.\n */\nexport function createMachine<T extends object>(\n config: StateMachineConfig<T>,\n owner?: T | Adapter<T>,\n options?: StateMachineOptions,\n): StateMachine<T, any> {\n if (owner && 'get' in owner) {\n return new StateMachine(config, owner as any, options)\n } else if (owner) {\n const adapter = new MemoryAdapter(owner)\n return new StateMachine(config, adapter as any, options)\n } else {\n return new StateMachine(config, undefined, options)\n }\n}\n","/**\n * Configuration validation module for StateMachine library\n * Validates StateMachine configurations to prevent runtime errors\n */\n\n// Removed unused imports from error_handling\nimport { stateMachineLogger } from './logger'\nimport type { Event, Events, State, StateMachineConfig, States } from './types'\n\n// Validation result types\nexport interface ValidationResult {\n isValid: boolean\n errors: ValidationError[]\n warnings: ValidationWarning[]\n}\n\nexport interface ValidationError {\n code: string\n message: string\n severity: 'error' | 'warning'\n path: string\n details?: Record<string, any>\n // ✅ НОВЫЕ ПОЛЯ\n suggestion?: string // Текстовая подсказка \"Как исправить\"\n documentationUrl?: string // Ссылка на раздел документации\n}\n\nexport interface ValidationWarning extends ValidationError {\n severity: 'warning'\n}\n\n// ✅ НОВЫЕ ИНТЕРФЕЙСЫ ДЛЯ КАСТОМНЫХ ПРАВИЛ\ninterface ValidationContext {\n addError(\n code: string,\n message: string,\n path: string,\n suggestion?: string,\n ): void\n addWarning(\n code: string,\n message: string,\n path: string,\n suggestion?: string,\n ): void\n}\n\ntype CustomRule<T extends object = any> = {\n id: string\n validate: (config: StateMachineConfig<T>, context: ValidationContext) => void\n}\n\n// Validation rules configuration\nexport interface ValidationConfig {\n strictMode: boolean\n allowEmptyStates: boolean\n allowEmptyEvents: boolean\n maxStateDepth: number\n maxStatesCount: number\n maxEventsCount: number\n requireInitialState: boolean\n validateTransitionPaths: boolean\n validateActionReferences: boolean\n customRules?: CustomRule[] // ✅ Добавлено\n}\n\nexport const DEFAULT_VALIDATION_CONFIG: ValidationConfig = {\n strictMode: false,\n allowEmptyStates: false,\n allowEmptyEvents: false,\n maxStateDepth: 10,\n maxStatesCount: 1000,\n maxEventsCount: 1000,\n requireInitialState: true,\n validateTransitionPaths: true,\n validateActionReferences: false, // Disabled by default as actions might be dynamic\n}\n\n// Configuration validator class\nexport class ConfigValidator {\n private config: ValidationConfig\n private errors: ValidationError[] = []\n private warnings: ValidationWarning[] = []\n\n constructor(config: Partial<ValidationConfig> = {}) {\n this.config = { ...DEFAULT_VALIDATION_CONFIG, ...config }\n }\n\n /**\n * Validates a complete StateMachine configuration\n */\n validate<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): ValidationResult {\n this.errors = []\n this.warnings = []\n\n try {\n // Basic structure validation\n this.validateBasicStructure(smConfig)\n\n // States validation\n this.validateStates(smConfig.states, 'states')\n\n // Events validation\n this.validateEvents(smConfig.events, smConfig.states, 'events')\n\n // Initial state validation\n this.validateInitialState(smConfig)\n\n // Cross-references validation\n this.validateCrossReferences(smConfig)\n\n // Performance validation\n this.validatePerformanceConstraints(smConfig)\n\n // SCXML/UML final-state + done.state join validation\n this.validateFinalStates(smConfig)\n\n // ✅ Запуск кастомных правил\n this.runCustomRules(smConfig)\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error)\n this.addError(\n 'VALIDATION_FAILED',\n `Validation process failed: ${msg}`,\n 'validation',\n )\n }\n\n const result: ValidationResult = {\n isValid: this.errors.length === 0,\n errors: this.errors,\n warnings: this.warnings,\n }\n\n // Log validation results\n if (!result.isValid) {\n stateMachineLogger.error('StateMachine configuration validation failed', {\n errorCount: this.errors.length,\n warningCount: this.warnings.length,\n configName: smConfig.name,\n })\n } else if (this.warnings.length > 0) {\n stateMachineLogger.warn('StateMachine configuration has warnings', {\n warningCount: this.warnings.length,\n configName: smConfig.name,\n })\n }\n\n return result\n }\n\n /**\n * Runs custom validation rules\n */\n private runCustomRules<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n if (!this.config.customRules || this.config.customRules.length === 0) return\n\n const context: ValidationContext = {\n addError: (code, msg, path, sugg) =>\n this.addError(code, msg, path, undefined, sugg),\n addWarning: (code, msg, path, sugg) =>\n this.addWarning(code, msg, path, undefined, sugg),\n }\n\n for (const rule of this.config.customRules) {\n try {\n rule.validate(smConfig, context)\n } catch (e) {\n this.addError(\n 'CUSTOM_RULE_ERROR',\n `Rule ${rule.id} failed: ${e instanceof Error ? e.message : String(e)}`,\n 'root',\n )\n }\n }\n }\n\n private validateBasicStructure<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n // Required fields\n if (!smConfig.name || typeof smConfig.name !== 'string') {\n this.addError(\n 'MISSING_NAME',\n 'StateMachine must have a valid name',\n 'name',\n )\n }\n\n if (\n !smConfig.stateAttribute ||\n typeof smConfig.stateAttribute !== 'string'\n ) {\n this.addError(\n 'MISSING_STATE_ATTRIBUTE',\n 'StateMachine must have a valid stateAttribute',\n 'stateAttribute',\n )\n }\n\n if (!smConfig.states || typeof smConfig.states !== 'object') {\n this.addError(\n 'MISSING_STATES',\n 'StateMachine must have states configuration',\n 'states',\n )\n return\n }\n\n if (!smConfig.events || typeof smConfig.events !== 'object') {\n this.addError(\n 'MISSING_EVENTS',\n 'StateMachine must have events configuration',\n 'events',\n )\n return\n }\n\n // Empty collections check\n if (\n !this.config.allowEmptyStates &&\n Object.keys(smConfig.states).length === 0\n ) {\n this.addError(\n 'EMPTY_STATES',\n 'StateMachine cannot have empty states collection',\n 'states',\n )\n }\n\n if (\n !this.config.allowEmptyEvents &&\n Object.keys(smConfig.events).length === 0\n ) {\n this.addError(\n 'EMPTY_EVENTS',\n 'StateMachine cannot have empty events collection',\n 'events',\n )\n }\n }\n\n private validateStates<T extends object>(\n states: States<T>,\n basePath: string,\n depth = 0,\n ): void {\n if (depth > this.config.maxStateDepth) {\n this.addError(\n 'MAX_DEPTH_EXCEEDED',\n `State nesting depth exceeds maximum of ${this.config.maxStateDepth}`,\n basePath,\n )\n return\n }\n\n for (const [stateName, stateConfig] of Object.entries(states)) {\n const statePath = `${basePath}.${stateName}`\n this.validateState(stateConfig, statePath, depth)\n }\n }\n\n private validateState<T extends object>(\n state: Omit<State<T>, 'name'>,\n path: string,\n depth: number,\n ): void {\n // State name validation\n if (!path.split('.').pop()) {\n this.addError('INVALID_STATE_NAME', 'State name cannot be empty', path)\n }\n\n // Display name validation\n if (state.display && typeof state.display !== 'string') {\n this.addWarning(\n 'INVALID_DISPLAY',\n 'State display should be a string',\n `${path}.display`,\n )\n }\n\n // Regions validation\n if (state.regions) {\n if (typeof state.regions !== 'object') {\n this.addError(\n 'INVALID_REGIONS',\n 'State regions must be an object',\n `${path}.regions`,\n )\n } else {\n for (const [regionName, regionStates] of Object.entries(\n state.regions,\n )) {\n if (!regionName) {\n this.addError(\n 'EMPTY_REGION_NAME',\n 'Region name cannot be empty',\n `${path}.regions`,\n )\n continue\n }\n\n this.validateStates(\n regionStates,\n `${path}.regions.${regionName}`,\n depth + 1,\n )\n }\n }\n }\n\n // History validation\n if (state.history && !['deep', 'shallow'].includes(state.history)) {\n this.addError(\n 'INVALID_HISTORY',\n 'State history must be \"deep\" or \"shallow\"',\n `${path}.history`,\n )\n }\n\n // Initial state validation for regions\n if (state.regions && state.initial) {\n const hasInitialState = Object.values(state.regions).some(\n (regionStates) => Object.keys(regionStates).includes(state.initial!),\n )\n if (!hasInitialState) {\n this.addError(\n 'INVALID_INITIAL_STATE',\n `Initial state \"${state.initial}\" not found in any region`,\n `${path}.initial`,\n )\n }\n }\n\n // Invoke (StateInvocation) validation\n if (state.invoke) {\n if (!Array.isArray(state.invoke)) {\n this.addError(\n 'INVALID_INVOKE',\n 'State \"invoke\" must be an array of StateInvocation',\n `${path}.invoke`,\n )\n } else {\n state.invoke.forEach((inv, index) => {\n const invPath = `${path}.invoke[${index}]`\n if (typeof inv.delay !== 'number' || inv.delay < 0) {\n this.addError(\n 'INVALID_DELAY',\n 'Delay must be a positive number',\n `${invPath}.delay`,\n )\n }\n if (!inv.event || typeof inv.event !== 'string') {\n this.addError(\n 'INVALID_EVENT_NAME',\n 'Event name must be a string',\n `${invPath}.event`,\n )\n }\n if (inv.cond && typeof inv.cond !== 'function') {\n this.addError(\n 'INVALID_COND',\n 'Condition must be a function',\n `${invPath}.cond`,\n )\n }\n })\n }\n }\n }\n\n private validateEvents<T extends object>(\n events: Events<T, States<T>>,\n states: States<T>,\n basePath: string,\n ): void {\n for (const [eventName, eventConfig] of Object.entries(events)) {\n const eventPath = `${basePath}.${eventName}`\n this.validateEvent(eventConfig, eventPath, states)\n }\n }\n\n private validateEvent<T extends object>(\n event: Omit<Event<T, States<T>>, 'name'>,\n path: string,\n states: States<T>,\n ): void {\n // Transitions validation\n if (!event.transitions || !Array.isArray(event.transitions)) {\n this.addError(\n 'MISSING_TRANSITIONS',\n 'Event must have transitions array',\n `${path}.transitions`,\n )\n return\n }\n\n if (event.transitions.length === 0) {\n this.addWarning(\n 'EMPTY_TRANSITIONS',\n 'Event has no transitions',\n `${path}.transitions`,\n )\n }\n\n // Validate each transition\n event.transitions.forEach((transition, index) => {\n this.validateTransition(\n transition,\n `${path}.transitions[${index}]`,\n states,\n )\n })\n\n // Priority validation\n const priorities = event.transitions\n .map((t) => t.priority)\n .filter((p) => p !== undefined) as number[]\n\n if (\n priorities.length > 0 &&\n priorities.length !== event.transitions.length\n ) {\n this.addWarning(\n 'MIXED_PRIORITIES',\n 'Some transitions have priority while others do not',\n `${path}.transitions`,\n )\n }\n }\n\n private validateTransition<T extends object>(\n transition: any,\n path: string,\n states: States<T>,\n ): void {\n // From state validation\n if (!transition.from || typeof transition.from !== 'string') {\n this.addError(\n 'INVALID_FROM_STATE',\n 'Transition must have a valid from state',\n `${path}.from`,\n )\n } else if (this.config.validateTransitionPaths) {\n this.validateStatePath(transition.from, states, `${path}.from`)\n }\n\n // To state validation\n if (!transition.to || typeof transition.to !== 'string') {\n this.addError(\n 'INVALID_TO_STATE',\n 'Transition must have a valid to state',\n `${path}.to`,\n )\n } else if (this.config.validateTransitionPaths) {\n this.validateStatePath(transition.to, states, `${path}.to`)\n }\n\n // Priority validation\n if (\n transition.priority !== undefined &&\n typeof transition.priority !== 'number'\n ) {\n this.addError(\n 'INVALID_PRIORITY',\n 'Transition priority must be a number',\n `${path}.priority`,\n )\n }\n\n // Self-transition warning\n if (transition.from === transition.to) {\n this.addWarning(\n 'SELF_TRANSITION',\n 'Transition from and to states are the same',\n path,\n )\n }\n }\n\n private validateStatePath<T extends object>(\n statePath: string,\n states: States<T>,\n path: string,\n ): void {\n // Handle composite states (separated by |)\n const stateParts = statePath.split('|')\n\n for (const part of stateParts) {\n if (!this.isValidStatePath(part, states)) {\n this.addError(\n 'INVALID_STATE_PATH',\n `State path \"${part}\" does not exist`,\n path,\n )\n }\n }\n }\n\n private isValidStatePath<T extends object>(\n statePath: string,\n states: States<T>,\n ): boolean {\n const parts = statePath.split('.')\n let currentStates = states\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (part === undefined) return false\n\n if (i === 0) {\n // Root state\n if (!currentStates[part]) {\n return false\n }\n const state = currentStates[part]\n if (parts.length === 1) {\n return true // Simple state path\n }\n if (!state.regions) {\n return false // No regions but path continues\n }\n // Continue with regions\n } else if (i === 1) {\n // Region name\n const rootStatePart = parts[0]\n if (rootStatePart === undefined) return false\n const rootState = currentStates[rootStatePart]\n if (!rootState || !rootState.regions || !rootState.regions[part]) {\n return false\n }\n currentStates = rootState.regions[part]\n } else {\n // Nested state in region\n if (!currentStates[part]) {\n return false\n }\n const state = currentStates[part]\n if (i === parts.length - 1) {\n return true // Last part\n }\n if (!state.regions) {\n return false\n }\n // Continue deeper...\n }\n }\n\n return true\n }\n\n private validateInitialState<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n if (this.config.requireInitialState) {\n if (!smConfig.initialState) {\n this.addError(\n 'MISSING_INITIAL_STATE',\n 'StateMachine must have an initial state',\n 'initialState',\n )\n return\n }\n\n if (!smConfig.states[smConfig.initialState as string]) {\n this.addError(\n 'INVALID_INITIAL_STATE',\n `Initial state \"${smConfig.initialState}\" does not exist`,\n 'initialState',\n undefined,\n `Check the 'states' object. Ensure that '${smConfig.initialState}' is defined as a root state.`,\n )\n }\n }\n }\n\n private validateCrossReferences<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n // Collect all state names (including nested)\n const allStateNames = new Set<string>()\n this.collectStateNames(smConfig.states, '', allStateNames)\n\n // Event names are available through Object.keys(smConfig.events)\n\n // Check for unreachable states\n const reachableStates = new Set<string>()\n if (smConfig.initialState) {\n reachableStates.add(smConfig.initialState as string)\n }\n\n // Add states reachable through transitions\n for (const event of Object.values(smConfig.events)) {\n for (const transition of event.transitions) {\n if (transition.to) {\n const toParts = transition.to.split('|')\n toParts.forEach((part) => reachableStates.add(part))\n }\n }\n }\n\n // A `final:true` leaf is entered via region expansion (when its composite is\n // entered), never as an explicit transition `to`; treat it as reachable so it\n // does not spuriously trigger UNREACHABLE_STATE.\n const finalStatePaths = this.collectFinalStatePaths(smConfig.states)\n for (const finalPath of finalStatePaths) {\n reachableStates.add(finalPath)\n }\n\n // Report unreachable states\n for (const stateName of allStateNames) {\n if (!reachableStates.has(stateName)) {\n this.addWarning(\n 'UNREACHABLE_STATE',\n `State \"${stateName}\" is not reachable`,\n `states.${stateName}`,\n )\n }\n }\n\n // Check for unused events (events with no valid transitions).\n // Engine-generated done.state.<C> join events are reachable whenever their\n // composite C exists, even though C is not an explicit transition target.\n for (const [eventName, event] of Object.entries(smConfig.events)) {\n const isDoneStateEvent = eventName.startsWith('done.state.')\n const hasValidTransitions = event.transitions.some(\n (t) =>\n (allStateNames.has(t.from) ||\n (isDoneStateEvent &&\n allStateNames.has(eventName.slice('done.state.'.length)))) &&\n allStateNames.has(t.to),\n )\n if (!hasValidTransitions) {\n this.addWarning(\n 'UNUSED_EVENT',\n `Event \"${eventName}\" has no valid transitions`,\n `events.${eventName}`,\n )\n }\n }\n }\n\n private collectStateNames<T extends object>(\n states: States<T>,\n prefix: string,\n collector: Set<string>,\n ): void {\n for (const [stateName, state] of Object.entries(states)) {\n const fullName = prefix ? `${prefix}.${stateName}` : stateName\n collector.add(fullName)\n\n if (state.regions) {\n for (const [regionName, regionStates] of Object.entries(\n state.regions,\n )) {\n this.collectStateNames(\n regionStates,\n `${fullName}.${regionName}`,\n collector,\n )\n }\n }\n }\n }\n\n /**\n * Collects every state in the tree as {dottedPath, config} entries, walking\n * region containers (region names are NOT registered states, so they are part\n * of the path but never emitted as an entry — mirroring runtime expansion).\n */\n private collectStateEntries<T extends object>(\n states: States<T>,\n prefix: string,\n collector: Array<{ path: string; state: Omit<State<T>, 'name'> }>,\n ): void {\n for (const [stateName, state] of Object.entries(states)) {\n const fullName = prefix ? `${prefix}.${stateName}` : stateName\n collector.push({ path: fullName, state })\n\n if (state.regions) {\n for (const [regionName, regionStates] of Object.entries(\n state.regions,\n )) {\n this.collectStateEntries(\n regionStates,\n `${fullName}.${regionName}`,\n collector,\n )\n }\n }\n }\n }\n\n /**\n * True when `composite` has at least one `final:true` atomic substate reachable\n * through its (possibly nested) region tree — i.e. some region of the composite\n * can become done. Used by REGION_NO_REACHABLE_FINAL.\n */\n private hasReachableFinal<T extends object>(\n composite: Omit<State<T>, 'name'>,\n ): boolean {\n if (!composite.regions) return false\n for (const regionStates of Object.values(composite.regions)) {\n for (const state of Object.values(regionStates)) {\n if (state.final) return true\n if (state.regions && this.hasReachableFinal(state)) return true\n }\n }\n return false\n }\n\n /**\n * SCXML/UML final-state and all-regions-final (done.state.<C>) join validation.\n *\n * - FINAL_STATE_HAS_OUTGOING (error): a `final:true` state is the `from` of a\n * transition (a final pseudo-state cannot itself transition out).\n * - FINAL_ON_COMPOSITE (warning): `final:true` on a state that has regions\n * (final is meaningful only on an atomic leaf; ignored at runtime).\n * - REGION_NO_REACHABLE_FINAL (warning): a `done.state.<C>` transition exists\n * but composite C declares no `final` substate, so the join can never fire.\n * - DONE_VS_PARALLEL_EXIT_AMBIGUITY (warning): the same composite C has BOTH a\n * `done.state.C` join AND a plain `from:'C'` user-event parallel-exit, which\n * can preempt the all-final join (the user event is eligible on ANY leaf).\n * - REGION_MISSING_INITIAL (advisory warning, valid:true): a region omits an\n * explicit `initial`, so expansion relies on first-key insertion order.\n */\n private validateFinalStates<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n const entries: Array<{ path: string; state: Omit<State<T>, 'name'> }> = []\n this.collectStateEntries(smConfig.states, '', entries)\n\n // Index final-leaf paths for the outgoing-transition check.\n const finalStatePaths = new Set<string>()\n\n for (const { path, state } of entries) {\n if (!state.final) continue\n\n if (state.regions) {\n // final on a composite is ignored at runtime — flag it.\n this.addWarning(\n 'FINAL_ON_COMPOSITE',\n `Final flag on composite state \"${path}\" is ignored; mark an atomic leaf inside a region as final instead`,\n `states.${path}.final`,\n undefined,\n 'Remove `final: true` from this composite and set it on the atomic leaf state that represents the region\\'s completion.',\n )\n } else {\n finalStatePaths.add(path)\n }\n }\n\n // Collect `from` states used by user transitions and the set of declared\n // done.state.<C> composite ids.\n const userFromStates = new Set<string>()\n const doneStateComposites = new Set<string>()\n\n for (const [eventName, event] of Object.entries(smConfig.events)) {\n if (!event.transitions || !Array.isArray(event.transitions)) continue\n\n // done.state.<C> engine event: extract the composite id suffix.\n if (eventName.startsWith('done.state.')) {\n const compositeId = eventName.slice('done.state.'.length)\n if (compositeId) doneStateComposites.add(compositeId)\n }\n\n for (const transition of event.transitions) {\n if (typeof transition.from !== 'string') continue\n for (const fromPart of transition.from.split('|')) {\n // FINAL_STATE_HAS_OUTGOING: a final leaf must not be a transition source.\n if (finalStatePaths.has(fromPart)) {\n this.addError(\n 'FINAL_STATE_HAS_OUTGOING',\n `Final state \"${fromPart}\" cannot be the source of transition on event \"${eventName}\"; a final pseudo-state has no outgoing transitions`,\n `events.${eventName}`,\n undefined,\n `Remove the outgoing transition from \"${fromPart}\", or clear its \\`final: true\\` flag if it is not actually a final state.`,\n )\n }\n\n if (!eventName.startsWith('done.state.')) {\n userFromStates.add(fromPart)\n }\n }\n }\n }\n\n // REGION_NO_REACHABLE_FINAL: each done.state.<C> needs a final substate under C.\n const entryByPath = new Map(entries.map((e) => [e.path, e.state]))\n for (const compositeId of doneStateComposites) {\n const composite = entryByPath.get(compositeId)\n if (!composite) {\n // Unknown composite id is already caught by transition-path validation;\n // do not double-report here.\n continue\n }\n if (!this.hasReachableFinal(composite)) {\n this.addWarning(\n 'REGION_NO_REACHABLE_FINAL',\n `Join event \"done.state.${compositeId}\" can never fire: composite \"${compositeId}\" has no \\`final\\` substate in any region`,\n `events.done.state.${compositeId}`,\n undefined,\n `Mark the completion leaf of each region under \"${compositeId}\" with \\`final: true\\`, or remove the done.state join.`,\n )\n }\n\n // DONE_VS_PARALLEL_EXIT_AMBIGUITY: same composite also used as a plain\n // user-event parallel-exit source.\n if (userFromStates.has(compositeId)) {\n this.addWarning(\n 'DONE_VS_PARALLEL_EXIT_AMBIGUITY',\n `Composite \"${compositeId}\" has both a done.state join and a user-event transition with from:\"${compositeId}\"; the user event can preempt the all-final join because it is eligible on any active leaf`,\n `events.done.state.${compositeId}`,\n undefined,\n `Disambiguate by using the done.state.${compositeId} join exclusively, or scope the user-event transition to a specific leaf instead of the bare composite.`,\n )\n }\n }\n\n // REGION_MISSING_INITIAL (advisory): a region's starting leaf is not pinned\n // by the composite's `initial`, so runtime expansion falls back to first-key\n // insertion order (getInitialStatesForRegions uses Object.keys(region)[0]).\n for (const { path, state } of entries) {\n if (!state.regions) continue\n for (const [regionName, regionStates] of Object.entries(state.regions)) {\n const regionKeys = Object.keys(regionStates)\n if (regionKeys.length === 0) continue\n // The only explicit start-selection mechanism is the parent composite's\n // `initial` pointing at one of this region's leaves.\n const parentInitialInRegion =\n state.initial !== undefined && regionKeys.includes(state.initial)\n if (!parentInitialInRegion) {\n this.addWarning(\n 'REGION_MISSING_INITIAL',\n `Region \"${regionName}\" of composite \"${path}\" has no explicit initial; expansion falls back to the first key \"${regionKeys[0]}\" (insertion-order dependent)`,\n `states.${path}.regions.${regionName}`,\n undefined,\n `Set \\`initial\\` on composite \"${path}\" to a leaf of region \"${regionName}\", to make the starting substate explicit and order-independent.`,\n )\n }\n }\n }\n }\n\n /**\n * Collects the dotted paths of every `final:true` atomic leaf in the tree.\n */\n private collectFinalStatePaths<T extends object>(\n states: States<T>,\n prefix = '',\n collector: Set<string> = new Set(),\n ): Set<string> {\n for (const [stateName, state] of Object.entries(states)) {\n const fullName = prefix ? `${prefix}.${stateName}` : stateName\n if (state.final && !state.regions) {\n collector.add(fullName)\n }\n if (state.regions) {\n for (const [regionName, regionStates] of Object.entries(\n state.regions,\n )) {\n this.collectFinalStatePaths(\n regionStates,\n `${fullName}.${regionName}`,\n collector,\n )\n }\n }\n }\n return collector\n }\n\n private validatePerformanceConstraints<T extends object>(\n smConfig: StateMachineConfig<T>,\n ): void {\n const stateCount = this.countStates(smConfig.states)\n const eventCount = Object.keys(smConfig.events).length\n\n if (stateCount > this.config.maxStatesCount) {\n this.addWarning(\n 'TOO_MANY_STATES',\n `State count (${stateCount}) exceeds recommended maximum (${this.config.maxStatesCount})`,\n 'states',\n )\n }\n\n if (eventCount > this.config.maxEventsCount) {\n this.addWarning(\n 'TOO_MANY_EVENTS',\n `Event count (${eventCount}) exceeds recommended maximum (${this.config.maxEventsCount})`,\n 'events',\n )\n }\n\n // Check for complex transition patterns\n let totalTransitions = 0\n for (const event of Object.values(smConfig.events)) {\n totalTransitions += event.transitions.length\n }\n\n if (totalTransitions > stateCount * 3) {\n this.addWarning(\n 'COMPLEX_TRANSITIONS',\n 'High transition-to-state ratio may impact performance',\n 'events',\n )\n }\n }\n\n private countStates<T extends object>(states: States<T>): number {\n let count = Object.keys(states).length\n\n for (const state of Object.values(states)) {\n if (state.regions) {\n for (const regionStates of Object.values(state.regions)) {\n count += this.countStates(regionStates)\n }\n }\n }\n\n return count\n }\n\n private addError(\n code: string,\n message: string,\n path: string,\n details?: Record<string, any>,\n suggestion?: string,\n ): void {\n this.errors.push({\n code,\n message,\n severity: 'error',\n path,\n ...(details !== undefined ? { details } : {}),\n ...(suggestion !== undefined ? { suggestion } : {}),\n })\n }\n\n private addWarning(\n code: string,\n message: string,\n path: string,\n details?: Record<string, any>,\n suggestion?: string,\n ): void {\n this.warnings.push({\n code,\n message,\n severity: 'warning',\n path,\n ...(details !== undefined ? { details } : {}),\n ...(suggestion !== undefined ? { suggestion } : {}),\n })\n }\n}\n\n// Utility functions\nexport function validateConfig<T extends object>(\n config: StateMachineConfig<T>,\n validationConfig?: Partial<ValidationConfig>,\n): ValidationResult {\n const validator = new ConfigValidator(validationConfig)\n return validator.validate(config)\n}\n\nexport function validateConfigStrict<T extends object>(\n config: StateMachineConfig<T>,\n): ValidationResult {\n return validateConfig(config, { strictMode: true })\n}\n\nexport function isValidConfig<T extends object>(\n config: StateMachineConfig<T>,\n): boolean {\n return validateConfig(config).isValid\n}\n"],"mappings":"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","names":["regions","adaptee"]}
|