@quazardous/quarkernel 2.2.5 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{create-machine-CYsscHPX.d.cts → create-machine-SGkCnU0g.d.cts} +33 -1
- package/dist/{create-machine-CYsscHPX.d.ts → create-machine-SGkCnU0g.d.ts} +33 -1
- package/dist/fsm.cjs +100 -0
- package/dist/fsm.cjs.map +1 -1
- package/dist/fsm.d.cts +2 -2
- package/dist/fsm.d.ts +2 -2
- package/dist/fsm.js +100 -0
- package/dist/fsm.js.map +1 -1
- package/dist/{index-BDf1xZi6.d.cts → index-0UbjHkkt.d.ts} +62 -4
- package/dist/{index-BPMXiW32.d.ts → index-KSnUuM2s.d.cts} +62 -4
- package/dist/index.cjs +100 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +100 -0
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/xstate.d.cts +1 -1
- package/dist/xstate.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/kernel-event.ts","../src/listener-context.ts","../src/wildcard.ts","../src/toposort.ts","../src/composition/mergers/namespaced.ts","../src/composition/mergers/override.ts","../src/composition/composition.ts","../src/kernel.ts","../src/types.ts","../src/fsm/machine.ts","../src/fsm/create-machine.ts","../src/xstate/xstate-import.ts","../src/xstate/xstate-behaviors.ts","../src/index.ts"],"names":["entries","snapshot"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * KernelEvent - Custom event implementation for QuarKernel\n *\n * NOT based on native Event/EventTarget for design reasons:\n * - Need shared mutable context between listeners\n * - Need dependency-ordered execution\n * - Simpler API without DOM baggage\n */\n\n/**\n * Event propagation control for listener execution\n */\nexport class KernelEvent<T = unknown> {\n /**\n * Event name/type\n */\n readonly name: string;\n\n /**\n * Event payload (typed, immutable)\n */\n readonly data: T;\n\n /**\n * Shared mutable context for passing data between listeners\n */\n readonly context: Record<string, any>;\n\n /**\n * Event creation timestamp (milliseconds since epoch)\n */\n readonly timestamp: number;\n\n /**\n * Internal flag: stop propagation to remaining listeners\n * @private\n */\n private _propagationStopped = false;\n\n constructor(name: string, data: T, context: Record<string, any> = {}) {\n this.name = name;\n this.data = data;\n this.context = context;\n this.timestamp = Date.now();\n }\n\n /**\n * Stop propagation to remaining listeners in the chain\n * Similar to DOM Event.stopPropagation()\n *\n * After calling this, no more listeners will execute.\n */\n stopPropagation = (): void => {\n this._propagationStopped = true;\n };\n\n /**\n * Check if propagation was stopped\n * @internal\n */\n get isPropagationStopped(): boolean {\n return this._propagationStopped;\n }\n}\n","/**\n * ListenerContext provides metadata and utilities for event listeners.\n * Passed as the second parameter to listener callbacks: (event, ctx) => {}\n *\n * Features:\n * - Listener metadata (id, eventName, priority, dependencies)\n * - Cancellation via cancel() or AbortSignal\n * - Event emission from within listeners\n * - Propagation control\n */\n\nimport type { KernelEvent } from './kernel-event';\n\n/**\n * Context object passed to each listener callback.\n * Provides utilities for listener self-management without polluting the event object.\n */\nexport class ListenerContext {\n /** Unique identifier for this listener instance */\n readonly id: string;\n\n /** Event name this listener is registered for */\n readonly eventName: string;\n\n /** Listener priority (higher = earlier execution) */\n readonly priority: number;\n\n /** Listener dependencies (IDs of listeners that must execute first) */\n readonly dependencies: readonly string[];\n\n /** AbortSignal for cancellation (if provided during registration) */\n readonly signal?: AbortSignal;\n\n /** Reference to the kernel instance for emit/off operations */\n private readonly kernel: ListenerContextKernel;\n\n /** Reference to the listener function for removal */\n private readonly listenerFn: Function;\n\n /** Current event being processed (set during emit) */\n private currentEvent?: KernelEvent<any>;\n\n /**\n * Creates a new ListenerContext.\n * @internal Use Kernel.on() to register listeners, which creates contexts automatically.\n */\n constructor(\n id: string,\n eventName: string,\n priority: number,\n dependencies: readonly string[],\n kernel: ListenerContextKernel,\n listenerFn: Function,\n signal?: AbortSignal\n ) {\n this.id = id;\n this.eventName = eventName;\n this.priority = priority;\n this.dependencies = dependencies;\n this.kernel = kernel;\n this.listenerFn = listenerFn;\n this.signal = signal;\n\n // Note: AbortSignal handling is managed by Kernel.on() (kernel.ts:131-138)\n // to avoid duplicate listeners. The signal is stored here for reference only.\n }\n\n /**\n * Sets the current event being processed.\n * @internal Called by Kernel during emit()\n */\n setCurrentEvent = (event: KernelEvent<any>): void => {\n this.currentEvent = event;\n };\n\n /**\n * Clears the current event after processing.\n * @internal Called by Kernel after listener execution\n */\n clearCurrentEvent = (): void => {\n this.currentEvent = undefined;\n };\n\n /**\n * Removes this listener from the kernel.\n * Alias for kernel.off() with this listener's reference.\n */\n cancel = (): void => {\n this.kernel.off(this.eventName, this.listenerFn);\n };\n\n /**\n * Alias for cancel() to match common naming patterns.\n */\n off = (): void => {\n this.cancel();\n };\n\n /**\n * Emits an event from within this listener.\n * Delegates to kernel.emit().\n */\n emit = async <T = any>(eventName: string, data?: T): Promise<void> => {\n return this.kernel.emit(eventName, data);\n };\n\n /**\n * Stops propagation of the current event to remaining listeners.\n * Requires an event to be currently processing.\n */\n stopPropagation = (): void => {\n if (!this.currentEvent) {\n throw new Error('stopPropagation() can only be called during event processing');\n }\n this.currentEvent.stopPropagation();\n };\n}\n\n/**\n * Minimal kernel interface required by ListenerContext.\n * Prevents circular dependencies between ListenerContext and Kernel.\n */\nexport interface ListenerContextKernel {\n off(eventName: string, listener: Function): void;\n emit<T = any>(eventName: string, data?: T): Promise<void>;\n}\n\n/**\n * WeakMap storage for listener contexts to prevent memory leaks.\n * Maps listener function to its context.\n */\nconst contextStorage = new WeakMap<Function, ListenerContext>();\n\n/**\n * Associates a listener function with its context.\n * @internal Used by Kernel during listener registration\n */\nexport const setListenerContext = (fn: Function, ctx: ListenerContext): void => {\n contextStorage.set(fn, ctx);\n};\n\n/**\n * Retrieves the context for a listener function.\n * @internal Used by Kernel during listener execution\n */\nexport const getListenerContext = (fn: Function): ListenerContext | undefined => {\n return contextStorage.get(fn);\n};\n\n/**\n * Removes the context for a listener function.\n * @internal Used by Kernel during listener removal\n */\nexport const deleteListenerContext = (fn: Function): boolean => {\n return contextStorage.delete(fn);\n};\n","/**\n * Wildcard pattern matching for event names\n *\n * Supports:\n * - * (single segment wildcard): matches any single segment\n * - ** (multi-segment wildcard): matches any number of segments\n * - Prefix patterns: user:* matches user:login, user:logout\n * - Suffix patterns: *:created matches user:created, post:created\n *\n * Uses RegExp compilation with LRU caching for performance.\n */\n\n/**\n * Cache for compiled wildcard patterns\n * Maps pattern string to compiled RegExp\n */\nconst patternCache = new Map<string, RegExp>();\n\n/**\n * Maximum cache size before eviction (LRU)\n */\nconst MAX_CACHE_SIZE = 100;\n\n/**\n * Convert wildcard pattern to RegExp\n *\n * @param pattern - Wildcard pattern (e.g., \"user:*\", \"**:created\")\n * @param delimiter - Event name delimiter (default: \":\")\n * @returns Compiled RegExp that matches event names\n */\nconst patternToRegex = (pattern: string, delimiter: string = ':'): RegExp => {\n // Escape delimiter for regex\n const escapedDelimiter = delimiter.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n // Handle special case: just \"*\" should match single segment (non-empty)\n // Handle special case: just \"**\" should match any path (including empty)\n if (pattern === '*') {\n return new RegExp(`^[^${escapedDelimiter}]+$`);\n }\n if (pattern === '**') {\n return new RegExp('^.*$');\n }\n\n // Replace ** with regex for multiple segments (including zero segments)\n // Replace * with regex for single segment (must be non-empty)\n const regexPattern = pattern\n .replace(/\\*\\*/g, '___DOUBLE_WILDCARD___')\n .replace(/\\*/g, `[^${escapedDelimiter}]+`)\n .replace(/___DOUBLE_WILDCARD___/g, '.*');\n\n // Anchor to start and end\n return new RegExp(`^${regexPattern}$`);\n};\n\n/**\n * Check if a pattern contains wildcards\n *\n * @param pattern - Event name pattern\n * @returns true if pattern contains * or **\n */\nexport const hasWildcard = (pattern: string): boolean => {\n return pattern.includes('*');\n};\n\n/**\n * Get compiled RegExp for a wildcard pattern (with caching)\n *\n * @param pattern - Wildcard pattern\n * @param delimiter - Event name delimiter\n * @returns Compiled and cached RegExp\n */\nexport const getPatternRegex = (pattern: string, delimiter: string = ':'): RegExp => {\n const cacheKey = `${pattern}::${delimiter}`;\n\n // Check cache first\n let regex = patternCache.get(cacheKey);\n\n if (!regex) {\n // Compile and cache\n regex = patternToRegex(pattern, delimiter);\n\n // LRU eviction: if cache is full, remove oldest entry\n if (patternCache.size >= MAX_CACHE_SIZE) {\n const firstKey = patternCache.keys().next().value;\n if (firstKey !== undefined) {\n patternCache.delete(firstKey);\n }\n }\n\n patternCache.set(cacheKey, regex);\n }\n\n return regex;\n};\n\n/**\n * Test if an event name matches a wildcard pattern\n *\n * @param eventName - Event name to test\n * @param pattern - Wildcard pattern\n * @param delimiter - Event name delimiter\n * @returns true if event name matches pattern\n */\nexport const matchesPattern = (\n eventName: string,\n pattern: string,\n delimiter: string = ':'\n): boolean => {\n // Exact match (no wildcard)\n if (!hasWildcard(pattern)) {\n return eventName === pattern;\n }\n\n // Wildcard match\n const regex = getPatternRegex(pattern, delimiter);\n return regex.test(eventName);\n};\n\n/**\n * Find all wildcard patterns that match an event name\n *\n * @param eventName - Event name to test\n * @param patterns - Array of patterns (may include wildcards)\n * @param delimiter - Event name delimiter\n * @returns Array of matching patterns\n */\nexport const findMatchingPatterns = (\n eventName: string,\n patterns: string[],\n delimiter: string = ':'\n): string[] => {\n return patterns.filter(pattern => matchesPattern(eventName, pattern, delimiter));\n};\n\n/**\n * Clear the pattern cache\n * Useful for testing or when patterns change frequently\n */\nexport const clearPatternCache = (): void => {\n patternCache.clear();\n};\n\n/**\n * Get current cache size\n * Useful for monitoring and testing\n */\nexport const getCacheSize = (): number => {\n return patternCache.size;\n};\n","/**\n * Internal topological sort implementation\n * Kahn's algorithm for dependency resolution with cycle detection\n */\n\nexport interface TopoNode {\n id: string;\n after: string[];\n}\n\nexport class CyclicDependencyError extends Error {\n constructor(\n public readonly cycle: string[]\n ) {\n super(`Cyclic dependency detected: ${cycle.join(' -> ')}`);\n this.name = 'CyclicDependencyError';\n }\n}\n\n/**\n * Topologically sort nodes by their dependencies\n * @param nodes - Array of nodes with id and after (dependencies) fields\n * @returns Sorted array of node IDs respecting dependency order\n * @throws CyclicDependencyError if circular dependencies exist\n */\nexport const toposort = (nodes: TopoNode[]): string[] => {\n // Build adjacency list and in-degree map\n const graph = new Map<string, string[]>();\n const inDegree = new Map<string, number>();\n const allNodes = new Set<string>();\n\n // Initialize all nodes\n nodes.forEach(node => {\n allNodes.add(node.id);\n if (!graph.has(node.id)) {\n graph.set(node.id, []);\n }\n if (!inDegree.has(node.id)) {\n inDegree.set(node.id, 0);\n }\n });\n\n // Build graph edges and calculate in-degrees\n nodes.forEach(node => {\n node.after.forEach(dep => {\n // Add dependency node if not already in the graph\n if (!allNodes.has(dep)) {\n allNodes.add(dep);\n graph.set(dep, []);\n inDegree.set(dep, 0);\n }\n\n // Add edge: dep -> node.id\n graph.get(dep)!.push(node.id);\n inDegree.set(node.id, (inDegree.get(node.id) || 0) + 1);\n });\n });\n\n // Kahn's algorithm: start with nodes that have no dependencies\n const queue: string[] = [];\n const result: string[] = [];\n\n allNodes.forEach(id => {\n if (inDegree.get(id) === 0) {\n queue.push(id);\n }\n });\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n result.push(current);\n\n // Reduce in-degree for all dependent nodes\n const neighbors = graph.get(current) || [];\n neighbors.forEach(neighbor => {\n const newDegree = inDegree.get(neighbor)! - 1;\n inDegree.set(neighbor, newDegree);\n\n if (newDegree === 0) {\n queue.push(neighbor);\n }\n });\n }\n\n // If not all nodes are processed, there's a cycle\n if (result.length !== allNodes.size) {\n const remaining = Array.from(allNodes).filter(id => !result.includes(id));\n const cycle = detectCycle(remaining, graph);\n throw new CyclicDependencyError(cycle);\n }\n\n // Return only the IDs that were in the original input\n return result.filter(id => nodes.some(n => n.id === id));\n};\n\n/**\n * Detect and extract a cycle from the dependency graph\n */\nconst detectCycle = (remaining: string[], graph: Map<string, string[]>): string[] => {\n const visited = new Set<string>();\n const recStack = new Set<string>();\n const path: string[] = [];\n\n const dfs = (node: string): boolean => {\n visited.add(node);\n recStack.add(node);\n path.push(node);\n\n const neighbors = graph.get(node) || [];\n for (const neighbor of neighbors) {\n if (!remaining.includes(neighbor)) continue;\n\n if (!visited.has(neighbor)) {\n if (dfs(neighbor)) return true;\n } else if (recStack.has(neighbor)) {\n // Found cycle\n return true;\n }\n }\n\n recStack.delete(node);\n path.pop();\n return false;\n };\n\n for (const node of remaining) {\n if (!visited.has(node)) {\n if (dfs(node)) {\n return [...path];\n }\n }\n }\n\n // Fallback - return remaining nodes\n return remaining;\n};\n","/**\n * NamespacedMerger - Prefixes all context keys with source event name\n *\n * Prevents key collisions by namespacing each event's context with its event name.\n * This is the default merger strategy as it guarantees no conflicts.\n *\n * Example:\n * Input:\n * 'user:loaded': { count: 1, name: \"Alice\" }\n * 'profile:loaded': { count: 2, city: \"NYC\" }\n *\n * Output:\n * {\n * \"user:loaded:count\": 1,\n * \"user:loaded:name\": \"Alice\",\n * \"profile:loaded:count\": 2,\n * \"profile:loaded:city\": \"NYC\"\n * }\n */\n\nimport type { ContextMerger, EventName, MergeResult } from '../types.js';\n\nexport const createNamespacedMerger = (): ContextMerger => ({\n merge: (contexts: Map<EventName, Record<string, any>>, _sources: EventName[]): Record<string, any> => {\n const result: Record<string, any> = {};\n\n for (const [eventName, context] of contexts) {\n for (const [key, value] of Object.entries(context)) {\n result[`${eventName}:${key}`] = value;\n }\n }\n\n return result;\n },\n\n mergeWithConflicts: (contexts: Map<EventName, Record<string, any>>, _sources: EventName[]): MergeResult => {\n const result: Record<string, any> = {};\n\n // Namespaced merger never has conflicts by design (all keys are prefixed)\n for (const [eventName, context] of contexts) {\n for (const [key, value] of Object.entries(context)) {\n result[`${eventName}:${key}`] = value;\n }\n }\n\n return {\n context: result,\n conflicts: [], // No conflicts possible with namespacing\n };\n },\n});\n","/**\n * OverrideMerger - Last-write-wins strategy\n *\n * Merges contexts by iterating through source events in order.\n * Later events override values from earlier events for the same key.\n *\n * Example:\n * Sources order: ['user:loaded', 'profile:loaded']\n * Input:\n * 'user:loaded': { count: 1, name: \"Alice\" }\n * 'profile:loaded': { count: 2, city: \"NYC\" }\n *\n * Output:\n * { count: 2, name: \"Alice\", city: \"NYC\" }\n * (profile:loaded's count overrode user:loaded's count)\n */\n\nimport type { ContextMerger, EventName, MergeResult, ConflictInfo } from '../types.js';\n\nexport const createOverrideMerger = (): ContextMerger => ({\n merge: (contexts: Map<EventName, Record<string, any>>, sources: EventName[]): Record<string, any> => {\n const result: Record<string, any> = {};\n\n for (const eventName of sources) {\n const context = contexts.get(eventName);\n if (!context) continue;\n\n for (const [key, value] of Object.entries(context)) {\n result[key] = value;\n }\n }\n\n return result;\n },\n\n mergeWithConflicts: (contexts: Map<EventName, Record<string, any>>, sources: EventName[]): MergeResult => {\n const result: Record<string, any> = {};\n const conflicts: ConflictInfo[] = [];\n const keySources = new Map<string, Array<{ source: EventName; value: any }>>();\n\n // Track all sources for each key\n for (const eventName of sources) {\n const context = contexts.get(eventName);\n if (!context) continue;\n\n for (const [key, value] of Object.entries(context)) {\n if (!keySources.has(key)) {\n keySources.set(key, []);\n }\n keySources.get(key)!.push({ source: eventName, value });\n }\n }\n\n // Detect conflicts and build result\n for (const [key, sourceList] of keySources) {\n if (sourceList.length > 1) {\n // Conflict detected - multiple sources provide this key\n conflicts.push({\n key,\n sources: sourceList.map(s => s.source),\n values: sourceList.map(s => s.value),\n });\n }\n\n // Last source wins (override behavior)\n result[key] = sourceList[sourceList.length - 1].value;\n }\n\n return {\n context: result,\n conflicts,\n };\n },\n});\n","/**\n * Composition class - Merges multiple kernels into a unified interface\n *\n * Subscribes to events from multiple kernels, buffers them, and emits\n * composite events when all source events have fired. Contexts are merged\n * using a configurable ContextMerger strategy.\n */\n\nimport { Kernel } from '../kernel.js';\nimport { createNamespacedMerger } from './mergers/index.js';\nimport type {\n EventName,\n ContextMerger,\n CompositionOptions,\n ConflictInfo,\n} from './types.js';\nimport type { IKernelEvent } from '../types.js';\nimport type {\n EventMap,\n ListenerFunction,\n ListenerOptions,\n} from '../types.js';\n\n/**\n * Reserved internal event name for composite emissions\n * Using a prefix that users are unlikely to use accidentally\n */\nconst COMPOSED_EVENT = '__qk:composed__';\n\n/**\n * Buffered event entry for a source kernel\n */\ninterface BufferedEvent {\n name: string;\n data: any;\n context: Record<string, any>;\n timestamp: number;\n}\n\n/**\n * Source kernel subscription\n */\ninterface KernelSubscription {\n kernel: Kernel;\n eventName: EventName;\n unbind: () => void;\n}\n\n/**\n * Composition class that merges events from multiple kernels\n *\n * Example:\n * ```ts\n * const userKernel = createKernel();\n * const profileKernel = createKernel();\n *\n * const composition = new Composition([\n * [userKernel, 'user:loaded'],\n * [profileKernel, 'profile:loaded'],\n * ], {\n * merger: createNamespacedMerger(),\n * bufferLimit: 100,\n * });\n *\n * composition.onComposed((event) => {\n * // event.data.merged contains merged contexts from all sources\n * });\n * ```\n */\nexport class Composition<Events extends EventMap = EventMap> {\n private kernel: Kernel<Events>;\n private subscriptions: KernelSubscription[] = [];\n private buffers: Map<EventName, BufferedEvent[]> = new Map();\n private merger: ContextMerger;\n private bufferLimit: number;\n private reset: boolean;\n private eventTTL: number;\n private eventTTLs: Record<EventName, number | 'permanent' | 'instant'>;\n private sourceEvents: Set<EventName> = new Set();\n private firedSinceLastComposite: Set<EventName> = new Set();\n private lastConflicts: ConflictInfo[] = [];\n private expirationTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n\n /**\n * Create a new Composition\n *\n * @param kernels - Array of [kernel, eventName] tuples to subscribe to\n * @param options - Composition options\n */\n constructor(\n kernels: Array<[Kernel, EventName]>,\n options: CompositionOptions = {}\n ) {\n if (kernels.length === 0) {\n throw new Error('Composition requires at least one kernel');\n }\n\n this.merger = options.merger ?? createNamespacedMerger();\n this.bufferLimit = options.bufferLimit ?? 100;\n this.reset = options.reset ?? true;\n this.eventTTL = options.eventTTL ?? 0;\n this.eventTTLs = options.eventTTLs ?? {};\n\n // Create internal kernel for composite events\n this.kernel = new Kernel<Events>({\n debug: false,\n errorBoundary: true,\n onContextConflict: options.onConflict\n ? (key: string, values: any[]) => {\n options.onConflict!({\n key,\n sources: [],\n values,\n });\n }\n : undefined,\n });\n\n // Subscribe to all source kernels\n for (const [kernel, eventName] of kernels) {\n this.subscribeToKernel(kernel, eventName);\n this.sourceEvents.add(eventName);\n }\n }\n\n /**\n * Subscribe to events from a source kernel\n */\n private subscribeToKernel(kernel: Kernel, eventName: EventName): void {\n // Initialize buffer for this event\n this.buffers.set(eventName, []);\n\n // Subscribe to the kernel's events with lowest priority\n // This ensures we capture the event AFTER all other listeners have modified the context\n const unbind = kernel.on(\n eventName,\n async (event) => {\n await this.handleSourceEvent(eventName, event);\n },\n { priority: -Infinity }\n );\n\n this.subscriptions.push({\n kernel,\n eventName,\n unbind,\n });\n }\n\n /**\n * Get the effective TTL for a specific event\n * Priority: per-event TTL > global TTL > 0 (permanent)\n */\n private getEffectiveTTL(eventName: EventName): number | 'permanent' | 'instant' {\n const perEventTTL = this.eventTTLs[eventName];\n if (perEventTTL !== undefined) {\n return perEventTTL;\n }\n // Global TTL (0 means permanent)\n return this.eventTTL > 0 ? this.eventTTL : 'permanent';\n }\n\n /**\n * Handle an event from a source kernel\n */\n private async handleSourceEvent(eventName: EventName, event: IKernelEvent<any>): Promise<void> {\n const buffer = this.buffers.get(eventName);\n if (!buffer) return;\n\n const effectiveTTL = this.getEffectiveTTL(eventName);\n\n // Generate unique ID for this buffered event (for TTL tracking)\n const eventId = `${eventName}:${event.timestamp}:${Math.random().toString(36).slice(2, 8)}`;\n\n // Add to buffer (FIFO)\n buffer.push({\n name: event.name,\n data: event.data,\n context: { ...event.context },\n timestamp: event.timestamp,\n });\n\n // Enforce buffer limit\n if (buffer.length > this.bufferLimit) {\n buffer.shift();\n }\n\n // Mark this source as having fired since last composite\n this.firedSinceLastComposite.add(eventName);\n\n // Check if all sources have fired - this determines if composition completes\n const compositionCompleted = await this.checkAndEmitComposite();\n\n // Handle 'instant' mode: if composition didn't complete, remove the event immediately\n if (effectiveTTL === 'instant' && !compositionCompleted) {\n // Remove the event we just added\n buffer.pop();\n this.firedSinceLastComposite.delete(eventName);\n return;\n }\n\n // Set up TTL expiration if configured (numeric TTL)\n if (typeof effectiveTTL === 'number' && effectiveTTL > 0) {\n const timer = setTimeout(() => {\n this.expireEvent(eventName, event.timestamp);\n this.expirationTimers.delete(eventId);\n }, effectiveTTL);\n\n this.expirationTimers.set(eventId, timer);\n }\n }\n\n /**\n * Expire an event from the buffer based on timestamp\n */\n private expireEvent(eventName: EventName, timestamp: number): void {\n const buffer = this.buffers.get(eventName);\n if (!buffer) return;\n\n // Remove events with matching timestamp (or older)\n const filtered = buffer.filter(e => e.timestamp > timestamp);\n this.buffers.set(eventName, filtered);\n\n // If buffer is now empty, remove from firedSinceLastComposite\n if (filtered.length === 0) {\n this.firedSinceLastComposite.delete(eventName);\n }\n }\n\n /**\n * Check if all source events have fired and emit composite event\n * @returns true if composite was emitted, false otherwise\n */\n private async checkAndEmitComposite(): Promise<boolean> {\n // Check if all buffers have at least one event\n for (const eventName of this.sourceEvents) {\n const buffer = this.buffers.get(eventName);\n if (!buffer || buffer.length === 0) {\n return false; // Not ready yet\n }\n }\n\n // Check if all sources have fired since last composite\n // This ensures we only emit once per \"cycle\" of all sources\n for (const eventName of this.sourceEvents) {\n if (!this.firedSinceLastComposite.has(eventName)) {\n return false; // Not all sources have fired yet in this cycle\n }\n }\n\n // Only emit if there are listeners (skip if no one is listening)\n if (this.kernel.listenerCount(COMPOSED_EVENT as keyof Events) === 0) {\n return false;\n }\n\n // All sources have fired - collect and merge contexts\n const contexts = new Map<EventName, Record<string, any>>();\n const sources: EventName[] = Array.from(this.sourceEvents);\n\n for (const eventName of sources) {\n const buffer = this.buffers.get(eventName);\n if (!buffer || buffer.length === 0) continue;\n\n // Get the latest event from this source\n const latestEvent = buffer[buffer.length - 1];\n\n // Merge both event data and context\n // If data is an object, spread it along with context\n const eventData = latestEvent.data && typeof latestEvent.data === 'object'\n ? latestEvent.data\n : {};\n const combined = { ...eventData, ...latestEvent.context };\n\n contexts.set(eventName, combined);\n }\n\n // Merge contexts using the merger strategy with conflict detection\n const mergeResult = this.merger.mergeWithConflicts(contexts, sources);\n this.lastConflicts = mergeResult.conflicts;\n\n // Emit composed event through internal kernel\n await this.kernel.emit(COMPOSED_EVENT as keyof Events, {\n sources,\n contexts: Object.fromEntries(contexts),\n merged: mergeResult.context,\n } as Events[keyof Events]);\n\n // Clear the \"fired since last composite\" tracker\n this.firedSinceLastComposite.clear();\n\n // Reset buffers if configured\n // Keep only the latest event from each source to enable continuous composition\n if (this.reset) {\n for (const eventName of this.sourceEvents) {\n const buffer = this.buffers.get(eventName);\n if (buffer && buffer.length > 0) {\n const latest = buffer[buffer.length - 1];\n this.buffers.set(eventName, [latest]);\n }\n }\n }\n\n return true;\n }\n\n /**\n * Register a listener for when all source events have fired\n * This is the primary way to react to composition completion\n *\n * @param listener - Function called with merged context when composition completes\n * @param options - Listener options (priority, id, etc.)\n * @returns Unbind function to remove the listener\n */\n onComposed(\n listener: ListenerFunction<Events[keyof Events]>,\n options?: ListenerOptions\n ): () => void {\n return this.kernel.on(COMPOSED_EVENT as keyof Events, listener, options);\n }\n\n /**\n * Remove a listener for composed events\n */\n offComposed(listener?: Function): void {\n this.kernel.off(COMPOSED_EVENT, listener);\n }\n\n /**\n * Get number of composed event listeners\n */\n composedListenerCount(): number {\n return this.kernel.listenerCount(COMPOSED_EVENT as keyof Events);\n }\n\n /**\n * Register a listener for events on internal kernel\n * Note: Use onComposed() to listen for composition completion\n */\n on<K extends keyof Events>(\n eventName: K,\n listener: ListenerFunction<Events[K]>,\n options?: ListenerOptions\n ): () => void {\n return this.kernel.on(eventName, listener, options);\n }\n\n /**\n * Remove a listener\n * Delegates to internal kernel\n */\n off(eventName: string, listener?: Function): void {\n this.kernel.off(eventName, listener);\n }\n\n /**\n * Emit an event through the composition\n * Note: Reserved internal events (prefixed with __qk:) cannot be emitted\n */\n async emit<K extends keyof Events>(\n eventName: K,\n data?: Events[K]\n ): Promise<void> {\n if (String(eventName).startsWith('__qk:')) {\n throw new Error(`Cannot emit reserved event: ${String(eventName)}`);\n }\n return this.kernel.emit(eventName, data);\n }\n\n /**\n * Get merged context from latest buffered events\n * Does not emit - just returns the merged context\n */\n getContext(): Record<string, any> | null {\n // Check if all buffers have at least one event\n for (const eventName of this.sourceEvents) {\n const buffer = this.buffers.get(eventName);\n if (!buffer || buffer.length === 0) {\n return null; // Not ready yet\n }\n }\n\n // Collect latest contexts\n const contexts = new Map<EventName, Record<string, any>>();\n const sources: EventName[] = Array.from(this.sourceEvents);\n\n for (const eventName of sources) {\n const buffer = this.buffers.get(eventName);\n if (!buffer || buffer.length === 0) continue;\n\n const latestEvent = buffer[buffer.length - 1];\n\n // Merge both event data and context\n const eventData = latestEvent.data && typeof latestEvent.data === 'object'\n ? latestEvent.data\n : {};\n const combined = { ...eventData, ...latestEvent.context };\n\n contexts.set(eventName, combined);\n }\n\n // Merge with conflict detection\n const mergeResult = this.merger.mergeWithConflicts(contexts, sources);\n this.lastConflicts = mergeResult.conflicts;\n\n return mergeResult.context;\n }\n\n /**\n * Get number of listeners for an event\n */\n listenerCount(eventName?: keyof Events): number {\n return this.kernel.listenerCount(eventName);\n }\n\n /**\n * Get all event names with registered listeners\n */\n eventNames(): (keyof Events)[] {\n return this.kernel.eventNames();\n }\n\n /**\n * Remove all listeners\n */\n offAll(eventName?: keyof Events): void {\n this.kernel.offAll(eventName);\n }\n\n /**\n * Enable/disable debug mode\n */\n debug(enabled: boolean): void {\n this.kernel.debug(enabled);\n }\n\n /**\n * Get buffer for a specific source event (for debugging)\n */\n getBuffer(eventName: EventName): ReadonlyArray<BufferedEvent> | undefined {\n return this.buffers.get(eventName);\n }\n\n /**\n * Clear all buffers\n */\n clearBuffers(): void {\n for (const eventName of this.sourceEvents) {\n this.buffers.set(eventName, []);\n }\n this.firedSinceLastComposite.clear();\n }\n\n /**\n * Get conflicts detected during the last merge operation\n *\n * Returns an array of ConflictInfo objects describing which source events\n * provided conflicting values for the same context keys.\n *\n * @returns Array of conflicts from the last merge, or empty array if no conflicts\n */\n getConflicts(): ReadonlyArray<ConflictInfo> {\n return this.lastConflicts;\n }\n\n /**\n * Cleanup all subscriptions and listeners\n */\n dispose(): void {\n // Unsubscribe from all source kernels\n for (const sub of this.subscriptions) {\n sub.unbind();\n }\n this.subscriptions = [];\n\n // Clear all expiration timers\n for (const timer of this.expirationTimers.values()) {\n clearTimeout(timer);\n }\n this.expirationTimers.clear();\n\n // Clear all listeners on internal kernel\n this.kernel.offAll();\n\n // Clear buffers and trackers\n this.buffers.clear();\n this.sourceEvents.clear();\n this.firedSinceLastComposite.clear();\n this.lastConflicts = [];\n }\n\n /**\n * Get the configured global event TTL in milliseconds\n * @returns The TTL value, or 0 if no TTL is configured\n */\n getEventTTL(): number {\n return this.eventTTL;\n }\n\n /**\n * Set the global event TTL in milliseconds\n * @param ttl - TTL in milliseconds (0 = permanent)\n */\n setEventTTL(ttl: number): void {\n this.eventTTL = ttl;\n }\n\n /**\n * Get per-event TTL configuration\n * @returns The eventTTLs configuration object\n */\n getEventTTLs(): Readonly<Record<EventName, number | 'permanent' | 'instant'>> {\n return this.eventTTLs;\n }\n\n /**\n * Set TTL for a specific event\n * @param eventName - The event name to configure\n * @param ttl - TTL value: number (ms), 'permanent', or 'instant'\n */\n setEventTTLFor(eventName: EventName, ttl: number | 'permanent' | 'instant'): void {\n this.eventTTLs[eventName] = ttl;\n }\n\n /**\n * Remove per-event TTL configuration (falls back to global TTL)\n * @param eventName - The event name to reset\n */\n clearEventTTLFor(eventName: EventName): void {\n delete this.eventTTLs[eventName];\n }\n}\n\n/**\n * Factory function to create a Composition instance\n */\nexport const createComposition = <Events extends EventMap = EventMap>(\n kernels: Array<[Kernel, EventName]>,\n options?: CompositionOptions\n): Composition<Events> => {\n return new Composition<Events>(kernels, options);\n};\n","/**\n * QuarKernel Core Implementation\n *\n * A TypeScript event kernel with:\n * - Priority-based listener ordering\n * - Shared context between listeners\n * - Async-first with Promise-based API\n * - Arrow functions only (no `this` binding)\n */\n\nimport { KernelEvent } from './kernel-event.js';\nimport { ListenerContext, type ListenerContextKernel } from './listener-context.js';\nimport { findMatchingPatterns } from './wildcard.js';\nimport { toposort, type TopoNode } from './toposort.js';\nimport { Composition } from './composition/composition.js';\nimport type { EventName, CompositionOptions } from './composition/types.js';\nimport type {\n EventMap,\n ListenerFunction,\n ListenerOptions,\n ListenerEntry,\n KernelOptions,\n} from './types.js';\n\n/**\n * Error collected during event execution\n */\ninterface ExecutionError {\n listenerId: string;\n error: Error;\n timestamp: number;\n eventName: string;\n}\n\n/**\n * Core Kernel class\n * Implements basic on(), off(), emit() with Map-based storage\n */\nexport class Kernel<Events extends EventMap = EventMap> implements ListenerContextKernel {\n private listeners = new Map<string, ListenerEntry[]>();\n private options: Required<KernelOptions>;\n private listenerIdCounter = 0;\n private executionErrors: ExecutionError[] = [];\n\n constructor(options: KernelOptions = {}) {\n this.options = {\n delimiter: options.delimiter ?? ':',\n wildcard: options.wildcard ?? true,\n maxListeners: options.maxListeners ?? Infinity,\n debug: options.debug ?? false,\n errorBoundary: options.errorBoundary ?? true,\n onError: options.onError ?? ((error: Error) => {\n console.error('Kernel error:', error);\n }),\n contextMerger: options.contextMerger ?? undefined,\n onContextConflict: options.onContextConflict ?? undefined,\n } as Required<KernelOptions>;\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Kernel initialized', {\n delimiter: this.options.delimiter,\n wildcard: this.options.wildcard,\n maxListeners: this.options.maxListeners,\n errorBoundary: this.options.errorBoundary,\n });\n }\n }\n\n /**\n * Register an event listener\n * Returns an unbind function for cleanup\n */\n on<K extends keyof Events>(\n eventName: K,\n listener: ListenerFunction<Events[K]>,\n options: ListenerOptions = {}\n ): () => void {\n const event = String(eventName);\n\n // If signal already aborted, don't register listener\n if (options.signal?.aborted) {\n if (this.options.debug) {\n console.debug('[QuarKernel] Listener not added (signal already aborted)', {\n event,\n });\n }\n // Return no-op unbind function\n return () => {};\n }\n\n const priority = options.priority ?? 0;\n const id = options.id ?? `listener_${++this.listenerIdCounter}`;\n const after = Array.isArray(options.after)\n ? options.after\n : options.after\n ? [options.after]\n : [];\n\n // Create abort listener if signal provided\n let abortListener: (() => void) | undefined;\n if (options.signal) {\n abortListener = () => this.off(event, listener);\n }\n\n const entry: ListenerEntry = {\n id,\n callback: listener as ListenerFunction,\n after,\n priority,\n once: options.once ?? false,\n original: listener as ListenerFunction,\n signal: options.signal,\n abortListener,\n };\n\n // Get or create listener array for this event\n const entries = this.listeners.get(event) ?? [];\n entries.push(entry);\n\n // Sort by priority (descending: higher priority first)\n // Note: Dependency ordering is handled in emit() by sortListenersByDependencies()\n entries.sort((a, b) => b.priority - a.priority);\n\n this.listeners.set(event, entries);\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Listener added', {\n event,\n listenerId: id,\n priority,\n after,\n once: entry.once,\n totalListeners: entries.length,\n });\n }\n\n // Check maxListeners warning\n if (this.options.maxListeners > 0 && entries.length > this.options.maxListeners) {\n console.warn(\n `MaxListenersExceeded: Event \"${event}\" has ${entries.length} listeners (limit: ${this.options.maxListeners})`\n );\n }\n\n // Handle AbortSignal - add abort listener (signal not already aborted, checked above)\n if (options.signal && abortListener) {\n options.signal.addEventListener('abort', abortListener, { once: true });\n }\n\n // Return unbind function\n return () => this.off(event, listener);\n }\n\n /**\n * Remove an event listener\n * If no listener provided, removes all listeners for the event\n */\n off(eventName: string, listener?: Function): void {\n const entries = this.listeners.get(eventName);\n\n if (!entries) {\n return;\n }\n\n if (!listener) {\n if (this.options.debug) {\n console.debug('[QuarKernel] All listeners removed', {\n event: eventName,\n count: entries.length,\n });\n }\n // Remove all listeners for this event and cleanup abort listeners\n for (const entry of entries) {\n if (entry.signal && entry.abortListener) {\n entry.signal.removeEventListener('abort', entry.abortListener);\n }\n }\n this.listeners.delete(eventName);\n return;\n }\n\n // Find the entry to remove and cleanup its abort listener\n const entryToRemove = entries.find((entry) => entry.original === listener);\n if (entryToRemove?.signal && entryToRemove.abortListener) {\n entryToRemove.signal.removeEventListener('abort', entryToRemove.abortListener);\n }\n\n // Remove specific listener by original function reference equality\n const filtered = entries.filter((entry) => entry.original !== listener);\n const removed = entries.length - filtered.length;\n\n if (this.options.debug && removed > 0) {\n console.debug('[QuarKernel] Listener removed', {\n event: eventName,\n removed,\n remaining: filtered.length,\n });\n }\n\n if (filtered.length === 0) {\n this.listeners.delete(eventName);\n } else {\n this.listeners.set(eventName, filtered);\n }\n }\n\n /**\n * Emit an event\n * Executes all registered listeners in parallel (by default)\n * Returns a Promise that resolves when all listeners complete\n * Throws AggregateError if any listeners failed\n */\n async emit<K extends keyof Events>(\n eventName: K,\n data?: Events[K]\n ): Promise<void> {\n const event = String(eventName);\n\n // Get all matching listeners (exact match + wildcards)\n const allPatterns = Array.from(this.listeners.keys());\n const matchingPatterns = this.options.wildcard\n ? findMatchingPatterns(event, allPatterns, this.options.delimiter)\n : allPatterns.filter(p => p === event);\n\n // Collect all listeners from matching patterns\n const allEntries: ListenerEntry[] = [];\n for (const pattern of matchingPatterns) {\n const entries = this.listeners.get(pattern);\n if (entries) {\n allEntries.push(...entries);\n }\n }\n\n if (allEntries.length === 0) {\n if (this.options.debug) {\n console.debug('[QuarKernel] Event emitted (no listeners)', { event });\n }\n return;\n }\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Event emitted', {\n event,\n listenerCount: allEntries.length,\n data: data !== undefined ? JSON.stringify(data).substring(0, 100) : undefined,\n });\n }\n\n // Clear execution errors from previous emit\n this.executionErrors = [];\n\n const kernelEvent = new KernelEvent<Events[K]>(\n event,\n data as Events[K],\n {}\n );\n\n // Sort listeners by dependencies and priority\n const sortedEntries = this.sortListenersByDependencies(allEntries);\n\n // Execute all listeners in parallel using Promise.allSettled\n // to ensure one failure doesn't block others\n const promises = sortedEntries.map((entry) =>\n this.executeListener(entry, kernelEvent, event)\n );\n\n const results = await Promise.allSettled(promises);\n\n // Remove once listeners after execution\n this.removeOnceListeners(event, sortedEntries, kernelEvent);\n\n // Collect errors from rejected promises (only if errorBoundary is false)\n if (!this.options.errorBoundary) {\n const errors = results\n .filter((result): result is PromiseRejectedResult => result.status === 'rejected')\n .map((result) => result.reason);\n\n if (errors.length > 0) {\n throw new AggregateError(errors, `${errors.length} listener(s) failed for event \"${event}\"`);\n }\n }\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Event completed', {\n event,\n });\n }\n }\n\n /**\n * Emit an event with serial execution\n * Executes listeners sequentially (one after another) instead of in parallel\n * Respects the same dependency and priority ordering as emit()\n * Stops on first error if errorBoundary is false, otherwise continues and collects errors\n */\n async emitSerial<K extends keyof Events>(\n eventName: K,\n data?: Events[K]\n ): Promise<void> {\n const event = String(eventName);\n\n // Get all matching listeners (exact match + wildcards)\n const allPatterns = Array.from(this.listeners.keys());\n const matchingPatterns = this.options.wildcard\n ? findMatchingPatterns(event, allPatterns, this.options.delimiter)\n : allPatterns.filter(p => p === event);\n\n // Collect all listeners from matching patterns\n const allEntries: ListenerEntry[] = [];\n for (const pattern of matchingPatterns) {\n const entries = this.listeners.get(pattern);\n if (entries) {\n allEntries.push(...entries);\n }\n }\n\n if (allEntries.length === 0) {\n if (this.options.debug) {\n console.debug('[QuarKernel] Event emitted serially (no listeners)', { event });\n }\n return;\n }\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Event emitted serially', {\n event,\n listenerCount: allEntries.length,\n data: data !== undefined ? JSON.stringify(data).substring(0, 100) : undefined,\n });\n }\n\n // Clear execution errors from previous emit\n this.executionErrors = [];\n\n const kernelEvent = new KernelEvent<Events[K]>(\n event,\n data as Events[K],\n {}\n );\n\n // Sort listeners by dependencies and priority\n const sortedEntries = this.sortListenersByDependencies(allEntries);\n\n // Execute listeners sequentially\n const errors: Error[] = [];\n for (const entry of sortedEntries) {\n try {\n await this.executeListener(entry, kernelEvent, event);\n } catch (error) {\n if (!this.options.errorBoundary) {\n // Stop on first error if error boundary is disabled\n // Clean up once listeners before throwing\n this.removeOnceListeners(event, sortedEntries, kernelEvent);\n throw error;\n }\n // errorBoundary is true, collect error and continue\n errors.push(error as Error);\n }\n }\n\n // Remove once listeners after execution\n this.removeOnceListeners(event, sortedEntries, kernelEvent);\n\n // If errorBoundary is false and we have errors, throw AggregateError\n if (!this.options.errorBoundary && errors.length > 0) {\n throw new AggregateError(errors, `${errors.length} listener(s) failed for event \"${event}\"`);\n }\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Event completed serially', {\n event,\n });\n }\n }\n\n /**\n * Sort listeners by dependencies and priority\n * Uses topological sort for dependency resolution\n */\n private sortListenersByDependencies(entries: ListenerEntry[]): ListenerEntry[] {\n // If no dependencies, just return sorted by priority\n const hasDependencies = entries.some(e => e.after.length > 0);\n if (!hasDependencies) {\n return [...entries].sort((a, b) => b.priority - a.priority);\n }\n\n // Check for missing dependencies\n const listenerIds = new Set(entries.map(e => e.id));\n for (const entry of entries) {\n for (const dep of entry.after) {\n if (!listenerIds.has(dep)) {\n throw new Error(`Listener \"${entry.id}\" depends on missing listener \"${dep}\"`);\n }\n }\n }\n\n // Convert to TopoNode format\n const nodes: TopoNode[] = entries.map(e => ({\n id: e.id,\n after: e.after,\n }));\n\n // Get topologically sorted IDs (validates dependencies, unused but required for validation)\n toposort(nodes);\n\n // Group by dependency level and sort by priority within each level\n const levelMap = new Map<string, number>();\n const assignLevel = (id: string, visited = new Set<string>()): number => {\n if (levelMap.has(id)) {\n return levelMap.get(id)!;\n }\n if (visited.has(id)) {\n return 0;\n }\n visited.add(id);\n\n const entry = entries.find(e => e.id === id);\n if (!entry || entry.after.length === 0) {\n levelMap.set(id, 0);\n return 0;\n }\n\n const maxDepLevel = Math.max(...entry.after.map(dep => assignLevel(dep, visited)));\n const level = maxDepLevel + 1;\n levelMap.set(id, level);\n return level;\n };\n\n entries.forEach(e => assignLevel(e.id));\n\n // Sort by level, then by priority within level\n return [...entries].sort((a, b) => {\n const levelA = levelMap.get(a.id) ?? 0;\n const levelB = levelMap.get(b.id) ?? 0;\n if (levelA !== levelB) {\n return levelA - levelB; // Lower level first\n }\n return b.priority - a.priority; // Higher priority first within same level\n });\n }\n\n /**\n * Execute a single listener with error handling\n */\n private async executeListener(\n entry: ListenerEntry,\n event: KernelEvent<any>,\n eventName: string\n ): Promise<void> {\n // Check if propagation was stopped\n if (event.isPropagationStopped) {\n if (this.options.debug) {\n console.debug('[QuarKernel] Listener skipped (propagation stopped)', {\n listenerId: entry.id,\n });\n }\n return;\n }\n\n const startTime = Date.now();\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Listener executing', {\n listenerId: entry.id,\n event: eventName,\n priority: entry.priority,\n });\n }\n\n try {\n // Create listener context\n const ctx = new ListenerContext(\n entry.id,\n eventName,\n entry.priority,\n entry.after,\n this,\n entry.original,\n entry.signal\n );\n\n // Set current event for context methods\n ctx.setCurrentEvent(event);\n\n try {\n await entry.callback(event, ctx);\n\n if (this.options.debug) {\n const duration = Date.now() - startTime;\n console.debug('[QuarKernel] Listener completed', {\n listenerId: entry.id,\n duration: `${duration}ms`,\n });\n }\n } finally {\n // Clear current event after execution\n ctx.clearCurrentEvent();\n }\n } catch (error) {\n const executionError: ExecutionError = {\n listenerId: entry.id,\n error: error as Error,\n timestamp: Date.now(),\n eventName,\n };\n\n // Collect error for reporting\n this.executionErrors.push(executionError);\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Listener error', {\n listenerId: entry.id,\n error: (error as Error).message,\n });\n }\n\n if (this.options.errorBoundary) {\n // Call error handler but continue with other listeners\n this.options.onError(error as Error, event);\n } else {\n // Re-throw if error boundary is disabled\n throw error;\n }\n }\n }\n\n /**\n * Remove listeners marked with once: true or whose predicate returns true after execution\n *\n * This method is called AFTER all listeners have executed for an event.\n * The predicate functions receive the event object with the final state after all listeners ran.\n *\n * Behavior:\n * - If once: true, the listener is always removed after execution\n * - If once is a predicate function, it's evaluated with the post-execution event state\n * - Predicates can examine event.context to make decisions based on listener modifications\n * - Listeners are removed even if they threw errors (when errorBoundary: true)\n *\n * @param eventName - The event name being processed\n * @param entries - Listeners that executed (or were scheduled to execute)\n * @param event - The event object with final state after all listeners executed\n */\n private removeOnceListeners(eventName: string, entries: ListenerEntry[], event: KernelEvent<any>): void {\n const listenersToRemove = entries.filter((entry) => {\n if (!entry.once) {\n return false;\n }\n\n // If once is true, always remove\n if (entry.once === true) {\n return true;\n }\n\n // If once is a predicate function, evaluate it\n if (typeof entry.once === 'function') {\n return entry.once(event);\n }\n\n return false;\n });\n\n if (listenersToRemove.length === 0) {\n return;\n }\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Removing once listeners', {\n event: eventName,\n count: listenersToRemove.length,\n });\n }\n\n // Remove each listener that should be removed\n // For wildcard patterns, we need to find which pattern they belong to\n for (const entry of listenersToRemove) {\n // Find the pattern this listener was registered under\n for (const [pattern, entries] of this.listeners.entries()) {\n if (entries.includes(entry)) {\n this.off(pattern, entry.original);\n break;\n }\n }\n }\n }\n\n /**\n * Get number of listeners for an event\n */\n listenerCount(eventName?: keyof Events): number {\n if (!eventName) {\n // Total count across all events\n let total = 0;\n for (const entries of this.listeners.values()) {\n total += entries.length;\n }\n return total;\n }\n\n const event = String(eventName);\n const entries = this.listeners.get(event);\n return entries?.length ?? 0;\n }\n\n /**\n * Get all event names with registered listeners\n */\n eventNames(): (keyof Events)[] {\n return Array.from(this.listeners.keys()) as (keyof Events)[];\n }\n\n /**\n * Remove all listeners for all events (or specific event)\n */\n offAll(eventName?: keyof Events): void {\n if (!eventName) {\n // Cleanup all abort listeners\n for (const entries of this.listeners.values()) {\n for (const entry of entries) {\n if (entry.signal && entry.abortListener) {\n entry.signal.removeEventListener('abort', entry.abortListener);\n }\n }\n }\n this.listeners.clear();\n return;\n }\n\n // Cleanup abort listeners for specific event\n const event = String(eventName);\n const entries = this.listeners.get(event);\n if (entries) {\n for (const entry of entries) {\n if (entry.signal && entry.abortListener) {\n entry.signal.removeEventListener('abort', entry.abortListener);\n }\n }\n }\n\n this.listeners.delete(event);\n }\n\n /**\n * Enable/disable debug mode\n * In T115, this is a placeholder - full debug implementation in T129\n */\n debug(enabled: boolean): void {\n this.options.debug = enabled;\n if (enabled) {\n console.debug('[QuarKernel] Debug mode enabled');\n } else {\n console.debug('[QuarKernel] Debug mode disabled');\n }\n }\n\n /**\n * Get collected execution errors from the last emit\n * Useful for error aggregation and reporting\n */\n getExecutionErrors(): ReadonlyArray<ExecutionError> {\n return this.executionErrors;\n }\n\n /**\n * Clear collected execution errors\n */\n clearExecutionErrors(): void {\n this.executionErrors = [];\n }\n\n /**\n * Create a composition from multiple kernels\n *\n * @param kernels - Rest parameters of [kernel, eventName] tuples\n * @param options - Optional composition options (if last argument is not a tuple)\n * @returns Composition instance that merges events from all kernels\n *\n * @example\n * ```ts\n * const userKernel = createKernel();\n * const profileKernel = createKernel();\n *\n * const composition = Kernel.compose(\n * [userKernel, 'user:loaded'],\n * [profileKernel, 'profile:loaded'],\n * { merger: createNamespacedMerger() }\n * );\n *\n * composition.onComposed((event) => {\n * console.log('All sources ready:', event.data.merged);\n * });\n * ```\n */\n static compose<Events extends EventMap = EventMap>(\n ...args: (readonly [Kernel, EventName] | CompositionOptions)[]\n ): Composition<Events> {\n // Separate kernel tuples from options\n const kernels: Array<[Kernel, EventName]> = [];\n let options: CompositionOptions | undefined;\n\n for (const arg of args) {\n // Check if this is a kernel tuple or options object\n if (Array.isArray(arg) && arg.length === 2 && arg[0] instanceof Kernel) {\n kernels.push(arg as [Kernel, EventName]);\n } else if (typeof arg === 'object' && !Array.isArray(arg)) {\n options = arg as CompositionOptions;\n }\n }\n\n return new Composition<Events>(kernels, options);\n }\n}\n\n/**\n * Factory function to create a Kernel instance\n */\nexport const createKernel = <Events extends EventMap = EventMap>(\n options?: KernelOptions\n): Kernel<Events> => {\n return new Kernel<Events>(options);\n};\n\n","/**\n * Type definitions for QuarKernel v2\n *\n * This module contains all TypeScript types, interfaces, and type guards\n * for the event kernel. Uses strict typing with generic parameters for\n * type-safe event handling.\n */\n\n// ============================================================================\n// Event Data Types\n// ============================================================================\n\n/**\n * Event name type - can be string or branded type\n */\nexport type EventName = string;\n\n/**\n * Event data type - the payload for each event\n * Can be any JSON-serializable value or undefined\n */\nexport type EventData = any;\n\n/**\n * Type map for events - maps event names to their data types\n * @example\n * ```ts\n * interface Events {\n * 'user:login': { userId: string }\n * 'user:logout': { userId: string }\n * 'app:ready': undefined\n * }\n * ```\n */\nexport type EventMap = Record<EventName, EventData>;\n\n// ============================================================================\n// Kernel Event\n// ============================================================================\n\n/**\n * Event object passed to listeners\n * @template T - The event data type\n *\n * Note: The actual implementation is in kernel-event.ts\n * This interface is for type checking only\n */\nexport interface IKernelEvent<T = any> {\n /** Event name */\n readonly name: string;\n\n /** Event payload (typed, immutable) */\n readonly data: T;\n\n /** Shared mutable context - passed through listener chain */\n readonly context: Record<string, any>;\n\n /** Timestamp when event was created */\n readonly timestamp: number;\n\n /** Stop propagation to remaining listeners */\n stopPropagation(): void;\n\n /** Whether propagation was stopped */\n readonly isPropagationStopped: boolean;\n}\n\n// ============================================================================\n// Listener Types\n// ============================================================================\n\n/**\n * Listener context - utilities available to each listener\n */\nexport interface IListenerContext {\n /** Unique identifier of this listener */\n id: string;\n\n /** Remove this listener */\n off(): void;\n\n /** Emit another event */\n emit<K extends string = string>(event: K, data?: any): Promise<void>;\n\n /** Stop propagation to remaining listeners */\n stopPropagation(): void;\n}\n\n/**\n * Listener function signature\n * @template T - The event data type\n */\nexport type ListenerFunction<T = any> = (\n event: IKernelEvent<T>,\n context: IListenerContext\n) => void | Promise<void>;\n\n/**\n * Predicate function for conditional once listeners\n *\n * IMPORTANT: Evaluated AFTER listener execution, not before.\n * The event parameter contains the final state after the listener has run.\n *\n * @template T - The event data type\n * @param event - Event with post-execution state (includes listener modifications to context)\n * @returns true to remove the listener, false to keep it for next emission\n */\nexport type PredicateFunction<T = any> = (event: IKernelEvent<T>) => boolean;\n\n/**\n * Options for registering a listener\n */\nexport interface ListenerOptions {\n /** Unique identifier for dependency resolution */\n id?: string;\n\n /** Dependencies - listener IDs that must execute before this one */\n after?: string | string[];\n\n /** Priority - higher values execute earlier (within same dependency level) */\n priority?: number;\n\n /**\n * Listen only once - true for always, or predicate function for conditional removal\n *\n * IMPORTANT: The predicate is evaluated AFTER listener execution, not before.\n * This means:\n * - The listener always executes at least once\n * - The predicate receives the event object after the listener has run\n * - The predicate sees any modifications to event.context made by the listener\n * - If the listener throws an error, the predicate still evaluates (with errorBoundary: true)\n * - The listener is removed after execution if predicate returns true\n *\n * @example\n * ```ts\n * // Listener always executes, then removed after execution\n * kernel.on('event', handler, { once: true });\n *\n * // Listener executes each time, removed after count reaches 3\n * kernel.on('event', handler, {\n * once: (event) => event.context.count >= 3\n * });\n * ```\n */\n once?: boolean | PredicateFunction;\n\n /** AbortSignal for cleanup */\n signal?: AbortSignal;\n}\n\n/**\n * Internal listener entry stored in the kernel\n * @internal\n */\nexport interface ListenerEntry {\n /** Unique identifier */\n id: string;\n\n /** The listener function */\n callback: ListenerFunction;\n\n /** Dependencies (listener IDs) */\n after: string[];\n\n /** Priority for ordering */\n priority: number;\n\n /** Listen only once - true for always, or predicate function evaluated after execution */\n once: boolean | PredicateFunction;\n\n /** Original listener function reference (for off()) */\n original: ListenerFunction;\n\n /** AbortSignal for cleanup */\n signal?: AbortSignal;\n\n /** Abort event listener reference for cleanup */\n abortListener?: () => void;\n}\n\n// ============================================================================\n// Kernel Options\n// ============================================================================\n\n/**\n * Options for creating a kernel instance\n */\nexport interface KernelOptions {\n /** Event name delimiter for namespacing (default: ':') */\n delimiter?: string;\n\n /** Enable wildcard pattern matching (default: true) */\n wildcard?: boolean;\n\n /** Maximum listeners per event (default: Infinity, 0 = unlimited) */\n maxListeners?: number;\n\n /** Error handler for listener exceptions */\n onError?: (error: Error, event: IKernelEvent) => void;\n\n /** Debug mode - enables warnings and logging */\n debug?: boolean;\n\n /** Error boundary - continue executing listeners even if one fails */\n errorBoundary?: boolean;\n\n /** Default context merger for composite events */\n contextMerger?: ContextMerger | ContextMergerFunction;\n\n /** Callback when context keys conflict during merge */\n onContextConflict?: (key: string, values: any[]) => void;\n}\n\n// ============================================================================\n// Composition Types\n// ============================================================================\n\n/**\n * Event stack for composition - maps event names to their event objects\n */\nexport type EventStack = Record<string, IKernelEvent>;\n\n/**\n * Factory function to create composite event from source events\n * @param stack - Map of event names to their event objects\n * @returns The composite event specification (type and data)\n */\nexport type CompositionFactory = (stack: EventStack) => {\n type: string;\n data: any;\n} | null;\n\n/**\n * Options for event composition\n */\nexport interface CompositionOptions {\n /** Reset buffer after composition fires (default: true) */\n reset?: boolean;\n\n /** Context merger for this composition (overrides kernel default) */\n contextMerger?: ContextMerger | ContextMergerFunction;\n}\n\n/**\n * Internal composition entry\n * @internal\n */\nexport interface IComposition {\n /** Event names to compose */\n events: string[];\n\n /** Buffer of received events */\n buffer: Map<string, IKernelEvent>;\n\n /** Factory to create composite event */\n factory: CompositionFactory;\n\n /** Reset buffer after firing */\n reset: boolean;\n\n /** Context merger */\n merger: ContextMerger;\n}\n\n// ============================================================================\n// Context Merger Interface\n// ============================================================================\n\n/**\n * Strategy pattern for merging event contexts in compositions\n */\nexport interface ContextMerger {\n /**\n * Merge contexts from multiple events\n * @param contexts - Map of event names to their context objects\n * @returns The merged context\n */\n merge(contexts: Record<string, any>): any;\n}\n\n/**\n * Function-based context merger (shorthand for ContextMerger interface)\n */\nexport type ContextMergerFunction = (contexts: Record<string, any>) => any;\n\n// ============================================================================\n// Kernel Interface\n// ============================================================================\n\n/**\n * Main kernel interface\n * @template Events - Event map defining event names and their data types\n */\nexport interface IKernel<Events extends EventMap = EventMap> {\n // Subscribe methods\n on<K extends keyof Events>(\n event: K | K[],\n listener: ListenerFunction<Events[K]>,\n options?: ListenerOptions\n ): () => void;\n\n once<K extends keyof Events>(\n event: K,\n listener: ListenerFunction<Events[K]>,\n options?: Omit<ListenerOptions, 'once'>\n ): () => void;\n\n once<K extends keyof Events>(\n event: K,\n predicate: PredicateFunction<Events[K]>,\n listener: ListenerFunction<Events[K]>,\n options?: Omit<ListenerOptions, 'once'>\n ): () => void;\n\n once<K extends keyof Events>(\n event: K\n ): Promise<IKernelEvent<Events[K]>>;\n\n // Unsubscribe methods\n off<K extends keyof Events>(\n event: K,\n listener?: ListenerFunction<Events[K]>\n ): void;\n\n offAll(event?: keyof Events): void;\n\n // Emit methods\n emit<K extends keyof Events>(\n event: K,\n data?: Events[K]\n ): Promise<void>;\n\n emitSerial<K extends keyof Events>(\n event: K,\n data?: Events[K]\n ): Promise<void>;\n\n // Composition\n compose(\n events: string[],\n factory: CompositionFactory,\n options?: CompositionOptions\n ): () => void;\n\n // Async iteration\n events<K extends keyof Events>(\n event: K\n ): AsyncIterable<IKernelEvent<Events[K]>>;\n\n // Utilities\n listenerCount(event?: keyof Events): number;\n eventNames(): (keyof Events)[];\n\n // Debug\n debug(enabled: boolean): void;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard to check if value is a valid event name\n */\nexport function isEventName(value: unknown): value is EventName {\n return typeof value === 'string' && value.length > 0;\n}\n\n/**\n * Type guard to check if value is a listener function\n */\nexport function isListenerFunction(value: unknown): value is ListenerFunction {\n return typeof value === 'function';\n}\n\n/**\n * Type guard to check if value is a predicate function\n */\nexport function isPredicateFunction(value: unknown): value is PredicateFunction {\n return typeof value === 'function';\n}\n\n/**\n * Type guard to check if value is a context merger\n */\nexport function isContextMerger(value: unknown): value is ContextMerger {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'merge' in value &&\n typeof (value as any).merge === 'function'\n );\n}\n\n/**\n * Type guard to check if value is a context merger function\n */\nexport function isContextMergerFunction(value: unknown): value is ContextMergerFunction {\n return typeof value === 'function';\n}\n\n/**\n * Type guard to check if value is ListenerOptions\n */\nexport function isListenerOptions(value: unknown): value is ListenerOptions {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n\n const opts = value as any;\n\n // Check optional properties have correct types if present\n if ('id' in opts && typeof opts.id !== 'string') return false;\n if ('after' in opts && typeof opts.after !== 'string' && !Array.isArray(opts.after)) return false;\n if ('priority' in opts && typeof opts.priority !== 'number') return false;\n if ('once' in opts && typeof opts.once !== 'boolean' && typeof opts.once !== 'function') return false;\n if ('signal' in opts && !(opts.signal instanceof AbortSignal)) return false;\n\n return true;\n}\n\n/**\n * Type guard to check if value is IKernelEvent\n */\nexport function isKernelEvent<T = any>(value: unknown): value is IKernelEvent<T> {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n\n const event = value as any;\n\n return (\n typeof event.name === 'string' &&\n 'data' in event &&\n typeof event.context === 'object' &&\n event.context !== null &&\n typeof event.timestamp === 'number' &&\n typeof event.stopPropagation === 'function' &&\n typeof event.isPropagationStopped === 'boolean'\n );\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Extract event names from an EventMap\n */\nexport type EventNames<E extends EventMap> = keyof E;\n\n/**\n * Extract event data type for a specific event\n */\nexport type EventDataType<E extends EventMap, K extends keyof E> = E[K];\n\n/**\n * Unbind function returned by on() and once()\n */\nexport type UnbindFunction = () => void;\n\n/**\n * Error thrown when circular dependencies are detected\n */\nexport class CircularDependencyError extends Error {\n constructor(cycle: string[]) {\n super(`Circular dependency detected: ${cycle.join(' -> ')}`);\n this.name = 'CircularDependencyError';\n }\n}\n\n/**\n * Error thrown when a listener dependency is missing\n */\nexport class MissingDependencyError extends Error {\n constructor(listenerId: string, missingDep: string) {\n super(`Listener \"${listenerId}\" depends on missing listener \"${missingDep}\"`);\n this.name = 'MissingDependencyError';\n }\n}\n\n/**\n * Error thrown when max listeners exceeded\n */\nexport class MaxListenersExceededError extends Error {\n constructor(event: string, max: number) {\n super(`Max listeners (${max}) exceeded for event \"${event}\"`);\n this.name = 'MaxListenersExceededError';\n }\n}\n","/**\n * FSM Machine Implementation\n *\n * Flexible state machine layer built on quarkernel events.\n * Uses prefixed events for loose coupling and multi-machine orchestration.\n */\n\nimport type { Kernel } from '../kernel.js';\nimport type {\n MachineConfig,\n Machine,\n MachineSnapshot,\n StateName,\n TransitionEvent,\n TransitionDef,\n SendOptions,\n FSMEventData,\n} from './types.js';\n\n/**\n * Create a state machine on a kernel\n *\n * @param kernel - The quarkernel instance to use\n * @param config - Machine configuration\n * @returns Machine instance\n *\n * @example\n * ```ts\n * const kernel = new Kernel();\n *\n * const order = useMachine(kernel, {\n * prefix: 'order',\n * initial: 'draft',\n * states: {\n * draft: { on: { SUBMIT: 'pending' } },\n * pending: { on: { APPROVE: 'confirmed', REJECT: 'draft' } },\n * confirmed: { on: { SHIP: 'shipped' } },\n * shipped: {}\n * }\n * });\n *\n * // Listen to state changes\n * kernel.on('order:enter:confirmed', (e) => {\n * console.log('Order confirmed!');\n * });\n *\n * await order.send('SUBMIT');\n * await order.send('APPROVE');\n * ```\n */\nexport function useMachine<TContext = Record<string, any>>(\n kernel: Kernel,\n config: MachineConfig<TContext>\n): Machine<TContext> {\n const {\n prefix,\n initial,\n states,\n allowForce = true,\n snapshot,\n trackHistory = false,\n maxHistory = 100,\n } = config;\n\n // History entry type\n type HistoryEntry = { from: StateName; to: StateName; event: TransitionEvent; timestamp: number };\n\n // Initialize state from snapshot or initial\n let currentState: StateName = snapshot?.state ?? initial;\n let context: TContext = snapshot?.context ?? config.context ?? ({} as TContext);\n let history: HistoryEntry[] = snapshot?.history ? [...snapshot.history] : [];\n\n // Validate initial state exists\n if (!states[currentState]) {\n throw new Error(`Invalid initial state \"${currentState}\" - not defined in states`);\n }\n\n // Cleanup functions for listeners\n const cleanupFns: Array<() => void> = [];\n\n /**\n * Emit FSM event on kernel\n */\n const emitFSM = async (\n eventType: string,\n data: Omit<FSMEventData, 'machine'>\n ): Promise<void> => {\n const eventData: FSMEventData = {\n machine: prefix,\n ...data,\n };\n await kernel.emit(`${prefix}:${eventType}` as any, eventData as any);\n };\n\n /**\n * Get transition definition for event from current state\n */\n const getTransition = (event: TransitionEvent): TransitionDef<TContext> | null => {\n const stateNode = states[currentState];\n if (!stateNode?.on) return null;\n\n const transition = stateNode.on[event];\n if (!transition) return null;\n\n // Normalize string to TransitionDef\n if (typeof transition === 'string') {\n return { target: transition };\n }\n\n return transition;\n };\n\n /**\n * Execute transition\n */\n const doTransition = async (\n event: TransitionEvent,\n targetState: StateName,\n payload?: any,\n forced = false\n ): Promise<void> => {\n const fromState = currentState;\n const fromNode = states[fromState];\n const toNode = states[targetState];\n\n if (!toNode) {\n throw new Error(`Invalid target state \"${targetState}\" - not defined in states`);\n }\n\n // Exit current state\n if (fromNode?.exit) {\n await fromNode.exit(context, event, payload);\n }\n await emitFSM(`exit:${fromState}`, {\n state: fromState,\n from: fromState,\n to: targetState,\n event,\n payload,\n forced,\n });\n\n // Update state\n currentState = targetState;\n\n // Track history\n if (trackHistory) {\n history.push({\n from: fromState,\n to: targetState,\n event,\n timestamp: Date.now(),\n });\n // Trim history if needed\n if (history.length > maxHistory) {\n history = history.slice(-maxHistory);\n }\n }\n\n // Emit transition event\n await emitFSM('transition', {\n state: targetState,\n from: fromState,\n to: targetState,\n event,\n payload,\n forced,\n });\n await emitFSM(`transition:${event}`, {\n state: targetState,\n from: fromState,\n to: targetState,\n event,\n payload,\n forced,\n });\n\n // Enter new state\n await emitFSM(`enter:${targetState}`, {\n state: targetState,\n from: fromState,\n to: targetState,\n event,\n payload,\n forced,\n });\n if (toNode.entry) {\n await toNode.entry(context, event, payload);\n }\n };\n\n /**\n * Machine instance\n */\n const machine: Machine<TContext> = {\n prefix,\n\n getState(): StateName {\n return currentState;\n },\n\n getContext(): TContext {\n return context;\n },\n\n setContext(updater): void {\n if (typeof updater === 'function') {\n context = (updater as (ctx: TContext) => TContext)(context);\n } else {\n context = { ...context, ...updater };\n }\n },\n\n async send(\n event: TransitionEvent,\n payload?: any,\n options: SendOptions<TContext> = {}\n ): Promise<boolean> {\n const { force = false, target, guard: inlineGuard, fallback } = options;\n\n // Force transition\n if (force && allowForce) {\n const targetState = target ?? initial;\n await doTransition(event, targetState, payload, true);\n return true;\n }\n\n // Get transition from state definition\n const transition = getTransition(event);\n\n // No transition defined\n if (!transition) {\n if (force && !allowForce) {\n throw new Error(`Force transitions not allowed on machine \"${prefix}\"`);\n }\n return false;\n }\n\n // Check guard\n const guardFn = inlineGuard ?? transition.guard;\n if (guardFn && !guardFn(context, event, payload)) {\n // Guard rejected\n await emitFSM('guard:rejected', {\n state: currentState,\n event,\n payload,\n });\n\n // Use fallback if provided\n if (fallback) {\n if (!states[fallback]) {\n throw new Error(`Invalid fallback state \"${fallback}\" - not defined in states`);\n }\n await doTransition(event, fallback, payload, false);\n return true;\n }\n\n return false;\n }\n\n // Execute transition actions\n if (transition.actions) {\n const actions = Array.isArray(transition.actions)\n ? transition.actions\n : [transition.actions];\n for (const action of actions) {\n await action(context, event, payload);\n }\n }\n\n // Do the transition\n await doTransition(event, transition.target, payload, false);\n return true;\n },\n\n can(event: TransitionEvent): boolean {\n return getTransition(event) !== null;\n },\n\n transitions(): TransitionEvent[] {\n const stateNode = states[currentState];\n if (!stateNode?.on) return [];\n return Object.keys(stateNode.on);\n },\n\n toJSON(): MachineSnapshot<TContext> {\n return {\n state: currentState,\n context: structuredClone(context),\n history: trackHistory ? [...history] : undefined,\n };\n },\n\n restore(snapshot: MachineSnapshot<TContext>): void {\n if (!states[snapshot.state]) {\n throw new Error(`Invalid snapshot state \"${snapshot.state}\" - not defined in states`);\n }\n currentState = snapshot.state;\n context = snapshot.context;\n if (snapshot.history) {\n history = [...snapshot.history];\n }\n },\n\n destroy(): void {\n for (const cleanup of cleanupFns) {\n cleanup();\n }\n cleanupFns.length = 0;\n },\n };\n\n // Emit initial enter event (unless restoring from snapshot)\n if (!snapshot) {\n // Schedule initial enter event for next tick to allow listeners to be set up\n setTimeout(async () => {\n const initialNode = states[initial];\n await emitFSM(`enter:${initial}`, {\n state: initial,\n });\n if (initialNode?.entry) {\n await initialNode.entry(context, '__INIT__', undefined);\n }\n }, 0);\n }\n\n return machine;\n}\n\n/**\n * Type helper for defining typed machine configs\n */\nexport function defineMachine<TContext = Record<string, any>>(\n config: Omit<MachineConfig<TContext>, 'prefix'>\n): Omit<MachineConfig<TContext>, 'prefix'> {\n return config;\n}\n","/**\n * createMachine - High-level FSM factory\n *\n * Standalone state machine with declarative behaviors.\n * Can work independently or connect to a kernel.\n */\n\nimport { Kernel } from '../kernel.js';\nimport { useMachine } from './machine.js';\nimport type { Machine, MachineConfig } from './types.js';\n\n/**\n * Built-in helpers (always available)\n */\nexport interface BuiltInHelpers<TContext = Record<string, unknown>> {\n /** Merge into context */\n set: (partial: Partial<TContext>) => void;\n /** Trigger transition */\n send: (event: string, payload?: unknown) => void;\n /** Log message (default: console.log) */\n log: (message: string) => void;\n}\n\n/**\n * Behavior helpers passed to callbacks (built-ins + custom)\n */\nexport type BehaviorHelpers<TContext = Record<string, unknown>, TCustom = Record<string, unknown>> =\n BuiltInHelpers<TContext> & TCustom;\n\n/**\n * Behavior callback\n */\nexport type BehaviorFn<TContext = Record<string, unknown>> = (\n ctx: TContext,\n helpers: BehaviorHelpers<TContext>\n) => void | Promise<void>;\n\n/**\n * Timer/after definition\n */\nexport interface AfterDef {\n /** Event to send */\n send: string;\n /** Delay in ms */\n delay: number;\n}\n\n/**\n * State-centric state definition\n */\nexport interface StateConfig<TContext = Record<string, unknown>> {\n /** Transitions: { EVENT: 'target' } or { EVENT: { target: 'x', cond: 'guard' } } */\n on?: Record<string, string | { target: string; cond?: string }>;\n /** Action on entering this state */\n entry?: BehaviorFn<TContext>;\n /** Action on exiting this state */\n exit?: BehaviorFn<TContext>;\n /** Auto-transition after delay: { delay: 3000, send: 'TIMER' } */\n after?: AfterDef;\n}\n\n/**\n * High-level machine config (state-centric)\n */\nexport interface CreateMachineConfig<TContext = Record<string, unknown>, THelpers = Record<string, unknown>> {\n /** Machine identifier */\n id: string;\n\n /** Initial state */\n initial: string;\n\n /** Initial context */\n context?: TContext;\n\n /** State definitions with entry/exit/after inline */\n states: Record<string, StateConfig<TContext>>;\n\n /** Global event handlers: { EVENT_NAME: (ctx, helpers) => ... } */\n on?: Record<string, BehaviorFn<TContext>>;\n\n /** Custom helpers merged with built-ins (set, send) */\n helpers?: THelpers;\n}\n\n/**\n * Extended machine interface with behaviors\n */\nexport interface BehaviorMachine<TContext = Record<string, unknown>> extends Machine<TContext> {\n /** Machine ID */\n readonly id: string;\n\n /** Current state (getter) */\n readonly state: string;\n\n /** Current context (getter) */\n readonly context: TContext;\n}\n\n/**\n * Create a standalone state machine with behaviors (state-centric)\n *\n * @example\n * ```ts\n * const order = createMachine({\n * id: 'order',\n * initial: 'draft',\n * context: { items: 0, total: 0 },\n *\n * states: {\n * draft: {\n * on: { ADD_ITEM: 'draft', SUBMIT: 'pending' }\n * },\n * pending: {\n * entry: (ctx, { log }) => log('Order pending...'),\n * on: { APPROVE: 'confirmed', REJECT: 'draft' }\n * },\n * confirmed: {\n * entry: (ctx, { log }) => log(`Order confirmed: ${ctx.items} items`),\n * on: { SHIP: 'shipped' }\n * },\n * processing: {\n * after: { delay: 2000, send: 'COMPLETE' },\n * on: { COMPLETE: 'done' }\n * },\n * shipped: {},\n * },\n *\n * // Global event handlers (optional)\n * on: {\n * ADD_ITEM: (ctx, { set }) => {\n * set({ items: ctx.items + 1, total: ctx.total + 29.99 });\n * },\n * },\n * });\n *\n * order.send('ADD_ITEM');\n * order.send('SUBMIT');\n * console.log(order.state); // 'pending'\n * console.log(order.context); // { items: 1, total: 29.99 }\n * ```\n */\nexport function createMachine<TContext = Record<string, unknown>>(\n config: CreateMachineConfig<TContext>\n): BehaviorMachine<TContext> {\n const {\n id,\n initial,\n context: initialContext,\n states,\n on: eventHandlers = {},\n helpers: customHelpers = {},\n } = config;\n\n // Create internal kernel\n const kernel = new Kernel();\n\n // Active timers for cleanup\n const activeTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n // Convert to MachineConfig format\n const machineConfig: MachineConfig<TContext> = {\n prefix: id,\n initial,\n context: initialContext,\n states: {},\n trackHistory: true,\n };\n\n // Convert states (extract only transitions for base machine)\n for (const [stateName, stateDef] of Object.entries(states)) {\n machineConfig.states[stateName] = {\n on: stateDef.on ? { ...stateDef.on } : undefined,\n };\n }\n\n // Create base machine\n const baseMachine = useMachine<TContext>(kernel, machineConfig);\n\n // Create helpers factory (built-ins + custom)\n const createHelpers = () => ({\n // Built-ins\n set: (partial: Partial<TContext>) => baseMachine.setContext(partial),\n send: (event: string, payload?: unknown) => baseMachine.send(event, payload),\n log: console.log,\n // Custom helpers (can override built-ins)\n ...customHelpers,\n });\n\n // Register behavior handlers\n // Entry handlers (read from each state's entry property)\n kernel.on(`${id}:enter:*`, async (e: any) => {\n const stateName = e.data?.state;\n if (!stateName) return;\n\n // Clear any existing timer for previous state\n activeTimers.forEach((timer, key) => {\n if (!key.startsWith(stateName + ':')) {\n clearTimeout(timer);\n activeTimers.delete(key);\n }\n });\n\n // Get state config\n const stateConfig = states[stateName];\n if (!stateConfig) return;\n\n // Call entry handler\n if (stateConfig.entry) {\n await stateConfig.entry(baseMachine.getContext(), createHelpers());\n }\n\n // Set up after timer if defined\n if (stateConfig.after) {\n const timerId = setTimeout(() => {\n baseMachine.send(stateConfig.after!.send);\n activeTimers.delete(stateName + ':timer');\n }, stateConfig.after.delay);\n activeTimers.set(stateName + ':timer', timerId);\n }\n });\n\n // Exit handlers (read from each state's exit property)\n kernel.on(`${id}:exit:*`, async (e: any) => {\n const stateName = e.data?.state;\n if (!stateName) return;\n\n // Clear timer\n const timerId = activeTimers.get(stateName + ':timer');\n if (timerId) {\n clearTimeout(timerId);\n activeTimers.delete(stateName + ':timer');\n }\n\n // Get state config\n const stateConfig = states[stateName];\n if (!stateConfig) return;\n\n // Call exit handler\n if (stateConfig.exit) {\n await stateConfig.exit(baseMachine.getContext(), createHelpers());\n }\n });\n\n // Global event handlers\n kernel.on(`${id}:transition`, async (e: any) => {\n const event = e.data?.event;\n if (!event) return;\n\n const handler = eventHandlers[event];\n if (handler) {\n await handler(baseMachine.getContext(), createHelpers());\n }\n });\n\n // Build extended machine\n const machine: BehaviorMachine<TContext> = {\n ...baseMachine,\n id,\n\n get state() {\n return baseMachine.getState();\n },\n\n get context() {\n return baseMachine.getContext();\n },\n\n destroy() {\n // Clear all timers\n activeTimers.forEach((timer) => clearTimeout(timer));\n activeTimers.clear();\n baseMachine.destroy();\n },\n };\n\n return machine;\n}\n","/**\n * XState Import Helper\n *\n * Converts XState machine definitions to quarkernel FSM format.\n * Supports basic XState v4/v5 machine structures.\n */\n\nimport type { MachineConfig, StateNode, TransitionDef, GuardFunction, ActionFunction } from '../fsm/types.js';\n\n/**\n * XState-like state node (simplified)\n */\ninterface XStateNode {\n on?: Record<string, string | XStateTransition>;\n entry?: string | string[] | XStateAction | XStateAction[];\n exit?: string | string[] | XStateAction | XStateAction[];\n always?: XStateTransition | XStateTransition[];\n after?: Record<string, string | XStateTransition>;\n meta?: Record<string, any>;\n}\n\n/**\n * XState-like transition\n */\ninterface XStateTransition {\n target?: string;\n cond?: string | XStateGuard;\n guard?: string | XStateGuard; // v5 uses guard instead of cond\n actions?: string | string[] | XStateAction | XStateAction[];\n}\n\n/**\n * XState guard definition\n */\ninterface XStateGuard {\n type: string;\n [key: string]: any;\n}\n\n/**\n * XState action definition\n */\ninterface XStateAction {\n type: string;\n [key: string]: any;\n}\n\n/**\n * XState-like machine config\n */\nexport interface XStateMachineConfig {\n id?: string;\n initial: string;\n context?: Record<string, any>;\n states: Record<string, XStateNode>;\n}\n\n/**\n * Import options\n */\nexport interface ImportOptions<TContext = any> {\n /** Machine prefix (required for quarkernel) */\n prefix: string;\n\n /** Guard implementations (keyed by guard name/type) */\n guards?: Record<string, GuardFunction<TContext>>;\n\n /** Action implementations (keyed by action name/type) */\n actions?: Record<string, ActionFunction<TContext>>;\n\n /** Allow force transitions */\n allowForce?: boolean;\n\n /** Track history */\n trackHistory?: boolean;\n}\n\n/**\n * Convert XState machine config to quarkernel format\n *\n * @param xstateConfig - XState machine configuration\n * @param options - Import options with implementations\n * @returns quarkernel MachineConfig\n *\n * @example\n * ```ts\n * // XState format\n * const xstateMachine = {\n * id: 'order',\n * initial: 'draft',\n * context: { retries: 0 },\n * states: {\n * draft: { on: { SUBMIT: 'pending' } },\n * pending: {\n * on: {\n * APPROVE: { target: 'confirmed', cond: 'canApprove' },\n * REJECT: 'draft'\n * }\n * },\n * confirmed: {}\n * }\n * };\n *\n * // Convert to quarkernel\n * const config = fromXState(xstateMachine, {\n * prefix: 'order',\n * guards: {\n * canApprove: (ctx) => ctx.retries < 3\n * }\n * });\n *\n * const machine = useMachine(kernel, config);\n * ```\n */\nexport function fromXState<TContext = Record<string, any>>(\n xstateConfig: XStateMachineConfig,\n options: ImportOptions<TContext>\n): MachineConfig<TContext> {\n const { prefix, guards = {}, actions = {}, allowForce, trackHistory } = options;\n\n const states: Record<string, StateNode<TContext>> = {};\n\n for (const [stateName, xstateNode] of Object.entries(xstateConfig.states)) {\n const stateNode: StateNode<TContext> = {};\n\n // Convert transitions\n if (xstateNode.on) {\n stateNode.on = {};\n\n for (const [event, transition] of Object.entries(xstateNode.on)) {\n if (typeof transition === 'string') {\n // Simple string target\n stateNode.on[event] = transition;\n } else {\n // Object transition with target, guard, actions\n const transitionDef: TransitionDef<TContext> = {\n target: transition.target || stateName, // Self-transition if no target\n };\n\n // Convert guard (cond in v4, guard in v5)\n const guardRef = transition.cond || transition.guard;\n if (guardRef) {\n const guardName = typeof guardRef === 'string' ? guardRef : guardRef.type;\n const guardFn = guards[guardName];\n if (guardFn) {\n transitionDef.guard = guardFn;\n } else {\n console.warn(`Guard \"${guardName}\" not provided in options.guards`);\n }\n }\n\n // Convert actions\n if (transition.actions) {\n const actionRefs = Array.isArray(transition.actions)\n ? transition.actions\n : [transition.actions];\n\n const actionFns: ActionFunction<TContext>[] = [];\n for (const actionRef of actionRefs) {\n const actionName = typeof actionRef === 'string' ? actionRef : actionRef.type;\n const actionFn = actions[actionName];\n if (actionFn) {\n actionFns.push(actionFn);\n } else {\n console.warn(`Action \"${actionName}\" not provided in options.actions`);\n }\n }\n\n if (actionFns.length > 0) {\n transitionDef.actions = actionFns.length === 1 ? actionFns[0] : actionFns;\n }\n }\n\n stateNode.on[event] = transitionDef;\n }\n }\n }\n\n // Convert entry actions\n if (xstateNode.entry) {\n const entryRefs = Array.isArray(xstateNode.entry)\n ? xstateNode.entry\n : [xstateNode.entry];\n\n const entryFns: ActionFunction<TContext>[] = [];\n for (const actionRef of entryRefs) {\n const actionName = typeof actionRef === 'string' ? actionRef : actionRef.type;\n const actionFn = actions[actionName];\n if (actionFn) {\n entryFns.push(actionFn);\n }\n }\n\n if (entryFns.length > 0) {\n stateNode.entry = async (ctx, event, payload) => {\n for (const fn of entryFns) {\n await fn(ctx, event, payload);\n }\n };\n }\n }\n\n // Convert exit actions\n if (xstateNode.exit) {\n const exitRefs = Array.isArray(xstateNode.exit)\n ? xstateNode.exit\n : [xstateNode.exit];\n\n const exitFns: ActionFunction<TContext>[] = [];\n for (const actionRef of exitRefs) {\n const actionName = typeof actionRef === 'string' ? actionRef : actionRef.type;\n const actionFn = actions[actionName];\n if (actionFn) {\n exitFns.push(actionFn);\n }\n }\n\n if (exitFns.length > 0) {\n stateNode.exit = async (ctx, event, payload) => {\n for (const fn of exitFns) {\n await fn(ctx, event, payload);\n }\n };\n }\n }\n\n states[stateName] = stateNode;\n }\n\n return {\n prefix,\n initial: xstateConfig.initial,\n context: xstateConfig.context as TContext,\n states,\n allowForce,\n trackHistory,\n };\n}\n\n/**\n * Export quarkernel machine config to XState-compatible format\n * Useful for visualization tools that understand XState format\n *\n * @param config - quarkernel MachineConfig\n * @returns XState-compatible config (without function implementations)\n */\nexport function toXStateFormat<TContext = any>(\n config: MachineConfig<TContext>\n): XStateMachineConfig {\n const states: Record<string, XStateNode> = {};\n\n for (const [stateName, stateNode] of Object.entries(config.states)) {\n const xstateNode: XStateNode = {};\n\n if (stateNode.on) {\n xstateNode.on = {};\n\n for (const [event, transition] of Object.entries(stateNode.on)) {\n if (typeof transition === 'string') {\n xstateNode.on[event] = transition;\n } else {\n const xstateTransition: XStateTransition = {\n target: transition.target,\n };\n\n // Note: guard and action functions can't be serialized\n // We just mark that they exist\n if (transition.guard) {\n xstateTransition.guard = { type: 'guard' };\n }\n if (transition.actions) {\n xstateTransition.actions = { type: 'action' };\n }\n\n xstateNode.on[event] = xstateTransition;\n }\n }\n }\n\n if (stateNode.entry) {\n xstateNode.entry = { type: 'entry' };\n }\n\n if (stateNode.exit) {\n xstateNode.exit = { type: 'exit' };\n }\n\n states[stateName] = xstateNode;\n }\n\n return {\n id: config.prefix,\n initial: config.initial,\n context: config.context as Record<string, any>,\n states,\n };\n}\n","/**\n * XState <-> FSM Behaviors Conversion\n *\n * Converts between QuarKernel FSM (state-centric) and XState format.\n */\n\nimport type { CreateMachineConfig } from '../fsm/create-machine.js';\n\n/**\n * XState config with actions\n */\nexport interface XStateConfigWithActions {\n id: string;\n initial: string;\n context?: Record<string, unknown>;\n states: Record<string, {\n entry?: string | string[];\n exit?: string | string[];\n on?: Record<string, string | { target: string; actions?: string | string[] }>;\n after?: Record<number, { target?: string; actions?: string | string[] }>;\n }>;\n}\n\n/**\n * Format state-centric FSM config as JavaScript code string\n *\n * @example\n * ```ts\n * const code = formatStateCentricCode(config);\n * // Returns formatted JS code string with entry/exit/after inline in states\n * ```\n */\nexport function formatStateCentricCode<TContext = Record<string, unknown>>(\n config: CreateMachineConfig<TContext>\n): string {\n const { id, initial, context, states, on: globalHandlers } = config;\n\n const lines: string[] = [\n `// FSM Definition for \"${id}\"`,\n `// Helpers: ctx, set(obj), send(event), log(msg)`,\n '',\n `export default {`,\n ` id: '${id}',`,\n ` initial: '${initial}',`,\n ];\n\n // Context\n if (context && Object.keys(context).length > 0) {\n lines.push(` context: ${JSON.stringify(context)},`);\n }\n\n // States\n lines.push(' states: {');\n for (const [stateName, stateConfig] of Object.entries(states)) {\n lines.push(` ${stateName}: {`);\n\n // entry\n if (stateConfig.entry) {\n lines.push(` entry: ${stateConfig.entry.toString()},`);\n }\n\n // exit\n if (stateConfig.exit) {\n lines.push(` exit: ${stateConfig.exit.toString()},`);\n }\n\n // after\n if (stateConfig.after) {\n lines.push(` after: { delay: ${stateConfig.after.delay}, send: '${stateConfig.after.send}' },`);\n }\n\n // on (transitions)\n if (stateConfig.on && Object.keys(stateConfig.on).length > 0) {\n lines.push(' on: {');\n for (const [event, target] of Object.entries(stateConfig.on)) {\n if (typeof target === 'string') {\n lines.push(` ${event}: '${target}',`);\n } else {\n lines.push(` ${event}: { target: '${target.target}'${target.cond ? `, cond: '${target.cond}'` : ''} },`);\n }\n }\n lines.push(' },');\n }\n\n lines.push(' },');\n }\n lines.push(' },');\n\n // Global event handlers\n if (globalHandlers && Object.keys(globalHandlers).length > 0) {\n lines.push(' on: {');\n for (const [event, fn] of Object.entries(globalHandlers)) {\n lines.push(` ${event}: ${fn.toString()},`);\n }\n lines.push(' },');\n }\n\n lines.push('};');\n return lines.join('\\n');\n}\n","/**\n * QuarKernel v2 - Micro Custom Events Kernel\n *\n * A TypeScript event kernel with unique features:\n * - Dependency-ordered listeners\n * - Shared context between listeners\n * - Composite events with context merging\n * - AbortSignal support for cleanup\n * - Wildcard pattern matching\n * - Zero runtime dependencies\n */\n\nexport const VERSION = '2.2.0';\n\n// Core exports\nexport { KernelEvent } from './kernel-event.js';\nexport { Kernel, createKernel } from './kernel.js';\nexport { ListenerContext } from './listener-context.js';\n\n// Composition\nexport { Composition, createComposition, createNamespacedMerger, createOverrideMerger } from './composition/index.js';\nexport type { EventName as CompositionEventName, ContextMerger, ConflictInfo, CompositionOptions } from './composition/index.js';\n\n// Export all types and interfaces\nexport type {\n EventName,\n EventData,\n EventMap,\n IKernelEvent,\n IKernel,\n IListenerContext,\n ListenerFunction,\n PredicateFunction,\n ListenerOptions,\n ListenerEntry,\n KernelOptions,\n EventStack,\n CompositionFactory,\n IComposition,\n ContextMergerFunction,\n EventNames,\n EventDataType,\n UnbindFunction,\n} from './types';\n\n// Export type guards\nexport {\n isEventName,\n isListenerFunction,\n isPredicateFunction,\n isContextMerger,\n isContextMergerFunction,\n isListenerOptions,\n isKernelEvent,\n} from './types';\n\n// Export error classes\nexport {\n CircularDependencyError,\n MissingDependencyError,\n MaxListenersExceededError,\n} from './types';\n\n// Internal utilities\nexport { toposort, CyclicDependencyError, type TopoNode } from './toposort.js';\n\n// FSM - State Machine Layer\nexport { useMachine, defineMachine, createMachine } from './fsm/index.js';\nexport type {\n MachineConfig,\n Machine,\n MachineSnapshot,\n StateNode,\n TransitionDef,\n SendOptions,\n FSMEventData,\n StateName,\n TransitionEvent,\n GuardFunction,\n ActionFunction,\n CreateMachineConfig,\n StateConfig,\n BehaviorMachine,\n BehaviorFn,\n BehaviorHelpers,\n BuiltInHelpers,\n AfterDef,\n} from './fsm/index.js';\n\n// XState interop (separate sub-package: @quazardous/quarkernel/xstate)\nexport { fromXState, toXStateFormat, formatStateCentricCode } from './xstate/index.js';\nexport type { XStateMachineConfig, ImportOptions, XStateConfigWithActions } from './xstate/index.js';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/kernel-event.ts","../src/listener-context.ts","../src/wildcard.ts","../src/toposort.ts","../src/composition/mergers/namespaced.ts","../src/composition/mergers/override.ts","../src/composition/composition.ts","../src/kernel.ts","../src/types.ts","../src/fsm/machine.ts","../src/fsm/create-machine.ts","../src/xstate/xstate-import.ts","../src/xstate/xstate-behaviors.ts","../src/index.ts"],"names":["entries","snapshot"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * KernelEvent - Custom event implementation for QuarKernel\n *\n * NOT based on native Event/EventTarget for design reasons:\n * - Need shared mutable context between listeners\n * - Need dependency-ordered execution\n * - Simpler API without DOM baggage\n */\n\n/**\n * Event propagation control for listener execution\n */\nexport class KernelEvent<T = unknown> {\n /**\n * Event name/type\n */\n readonly name: string;\n\n /**\n * Event payload (typed, immutable)\n */\n readonly data: T;\n\n /**\n * Shared mutable context for passing data between listeners\n */\n readonly context: Record<string, any>;\n\n /**\n * Event creation timestamp (milliseconds since epoch)\n */\n readonly timestamp: number;\n\n /**\n * Internal flag: stop propagation to remaining listeners\n * @private\n */\n private _propagationStopped = false;\n\n constructor(name: string, data: T, context: Record<string, any> = {}) {\n this.name = name;\n this.data = data;\n this.context = context;\n this.timestamp = Date.now();\n }\n\n /**\n * Stop propagation to remaining listeners in the chain\n * Similar to DOM Event.stopPropagation()\n *\n * After calling this, no more listeners will execute.\n */\n stopPropagation = (): void => {\n this._propagationStopped = true;\n };\n\n /**\n * Check if propagation was stopped\n * @internal\n */\n get isPropagationStopped(): boolean {\n return this._propagationStopped;\n }\n}\n","/**\n * ListenerContext provides metadata and utilities for event listeners.\n * Passed as the second parameter to listener callbacks: (event, ctx) => {}\n *\n * Features:\n * - Listener metadata (id, eventName, priority, dependencies)\n * - Cancellation via cancel() or AbortSignal\n * - Event emission from within listeners\n * - Propagation control\n */\n\nimport type { KernelEvent } from './kernel-event';\n\n/**\n * Context object passed to each listener callback.\n * Provides utilities for listener self-management without polluting the event object.\n */\nexport class ListenerContext {\n /** Unique identifier for this listener instance */\n readonly id: string;\n\n /** Event name this listener is registered for */\n readonly eventName: string;\n\n /** Listener priority (higher = earlier execution) */\n readonly priority: number;\n\n /** Listener dependencies (IDs of listeners that must execute first) */\n readonly dependencies: readonly string[];\n\n /** AbortSignal for cancellation (if provided during registration) */\n readonly signal?: AbortSignal;\n\n /** Reference to the kernel instance for emit/off operations */\n private readonly kernel: ListenerContextKernel;\n\n /** Reference to the listener function for removal */\n private readonly listenerFn: Function;\n\n /** Current event being processed (set during emit) */\n private currentEvent?: KernelEvent<any>;\n\n /**\n * Creates a new ListenerContext.\n * @internal Use Kernel.on() to register listeners, which creates contexts automatically.\n */\n constructor(\n id: string,\n eventName: string,\n priority: number,\n dependencies: readonly string[],\n kernel: ListenerContextKernel,\n listenerFn: Function,\n signal?: AbortSignal\n ) {\n this.id = id;\n this.eventName = eventName;\n this.priority = priority;\n this.dependencies = dependencies;\n this.kernel = kernel;\n this.listenerFn = listenerFn;\n this.signal = signal;\n\n // Note: AbortSignal handling is managed by Kernel.on() (kernel.ts:131-138)\n // to avoid duplicate listeners. The signal is stored here for reference only.\n }\n\n /**\n * Sets the current event being processed.\n * @internal Called by Kernel during emit()\n */\n setCurrentEvent = (event: KernelEvent<any>): void => {\n this.currentEvent = event;\n };\n\n /**\n * Clears the current event after processing.\n * @internal Called by Kernel after listener execution\n */\n clearCurrentEvent = (): void => {\n this.currentEvent = undefined;\n };\n\n /**\n * Removes this listener from the kernel.\n * Alias for kernel.off() with this listener's reference.\n */\n cancel = (): void => {\n this.kernel.off(this.eventName, this.listenerFn);\n };\n\n /**\n * Alias for cancel() to match common naming patterns.\n */\n off = (): void => {\n this.cancel();\n };\n\n /**\n * Emits an event from within this listener.\n * Delegates to kernel.emit().\n */\n emit = async <T = any>(eventName: string, data?: T): Promise<void> => {\n return this.kernel.emit(eventName, data);\n };\n\n /**\n * Stops propagation of the current event to remaining listeners.\n * Requires an event to be currently processing.\n */\n stopPropagation = (): void => {\n if (!this.currentEvent) {\n throw new Error('stopPropagation() can only be called during event processing');\n }\n this.currentEvent.stopPropagation();\n };\n}\n\n/**\n * Minimal kernel interface required by ListenerContext.\n * Prevents circular dependencies between ListenerContext and Kernel.\n */\nexport interface ListenerContextKernel {\n off(eventName: string, listener: Function): void;\n emit<T = any>(eventName: string, data?: T): Promise<void>;\n}\n\n/**\n * WeakMap storage for listener contexts to prevent memory leaks.\n * Maps listener function to its context.\n */\nconst contextStorage = new WeakMap<Function, ListenerContext>();\n\n/**\n * Associates a listener function with its context.\n * @internal Used by Kernel during listener registration\n */\nexport const setListenerContext = (fn: Function, ctx: ListenerContext): void => {\n contextStorage.set(fn, ctx);\n};\n\n/**\n * Retrieves the context for a listener function.\n * @internal Used by Kernel during listener execution\n */\nexport const getListenerContext = (fn: Function): ListenerContext | undefined => {\n return contextStorage.get(fn);\n};\n\n/**\n * Removes the context for a listener function.\n * @internal Used by Kernel during listener removal\n */\nexport const deleteListenerContext = (fn: Function): boolean => {\n return contextStorage.delete(fn);\n};\n","/**\n * Wildcard pattern matching for event names\n *\n * Supports:\n * - * (single segment wildcard): matches any single segment\n * - ** (multi-segment wildcard): matches any number of segments\n * - Prefix patterns: user:* matches user:login, user:logout\n * - Suffix patterns: *:created matches user:created, post:created\n *\n * Uses RegExp compilation with LRU caching for performance.\n */\n\n/**\n * Cache for compiled wildcard patterns\n * Maps pattern string to compiled RegExp\n */\nconst patternCache = new Map<string, RegExp>();\n\n/**\n * Maximum cache size before eviction (LRU)\n */\nconst MAX_CACHE_SIZE = 100;\n\n/**\n * Convert wildcard pattern to RegExp\n *\n * @param pattern - Wildcard pattern (e.g., \"user:*\", \"**:created\")\n * @param delimiter - Event name delimiter (default: \":\")\n * @returns Compiled RegExp that matches event names\n */\nconst patternToRegex = (pattern: string, delimiter: string = ':'): RegExp => {\n // Escape delimiter for regex\n const escapedDelimiter = delimiter.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n // Handle special case: just \"*\" should match single segment (non-empty)\n // Handle special case: just \"**\" should match any path (including empty)\n if (pattern === '*') {\n return new RegExp(`^[^${escapedDelimiter}]+$`);\n }\n if (pattern === '**') {\n return new RegExp('^.*$');\n }\n\n // Replace ** with regex for multiple segments (including zero segments)\n // Replace * with regex for single segment (must be non-empty)\n const regexPattern = pattern\n .replace(/\\*\\*/g, '___DOUBLE_WILDCARD___')\n .replace(/\\*/g, `[^${escapedDelimiter}]+`)\n .replace(/___DOUBLE_WILDCARD___/g, '.*');\n\n // Anchor to start and end\n return new RegExp(`^${regexPattern}$`);\n};\n\n/**\n * Check if a pattern contains wildcards\n *\n * @param pattern - Event name pattern\n * @returns true if pattern contains * or **\n */\nexport const hasWildcard = (pattern: string): boolean => {\n return pattern.includes('*');\n};\n\n/**\n * Get compiled RegExp for a wildcard pattern (with caching)\n *\n * @param pattern - Wildcard pattern\n * @param delimiter - Event name delimiter\n * @returns Compiled and cached RegExp\n */\nexport const getPatternRegex = (pattern: string, delimiter: string = ':'): RegExp => {\n const cacheKey = `${pattern}::${delimiter}`;\n\n // Check cache first\n let regex = patternCache.get(cacheKey);\n\n if (!regex) {\n // Compile and cache\n regex = patternToRegex(pattern, delimiter);\n\n // LRU eviction: if cache is full, remove oldest entry\n if (patternCache.size >= MAX_CACHE_SIZE) {\n const firstKey = patternCache.keys().next().value;\n if (firstKey !== undefined) {\n patternCache.delete(firstKey);\n }\n }\n\n patternCache.set(cacheKey, regex);\n }\n\n return regex;\n};\n\n/**\n * Test if an event name matches a wildcard pattern\n *\n * @param eventName - Event name to test\n * @param pattern - Wildcard pattern\n * @param delimiter - Event name delimiter\n * @returns true if event name matches pattern\n */\nexport const matchesPattern = (\n eventName: string,\n pattern: string,\n delimiter: string = ':'\n): boolean => {\n // Exact match (no wildcard)\n if (!hasWildcard(pattern)) {\n return eventName === pattern;\n }\n\n // Wildcard match\n const regex = getPatternRegex(pattern, delimiter);\n return regex.test(eventName);\n};\n\n/**\n * Find all wildcard patterns that match an event name\n *\n * @param eventName - Event name to test\n * @param patterns - Array of patterns (may include wildcards)\n * @param delimiter - Event name delimiter\n * @returns Array of matching patterns\n */\nexport const findMatchingPatterns = (\n eventName: string,\n patterns: string[],\n delimiter: string = ':'\n): string[] => {\n return patterns.filter(pattern => matchesPattern(eventName, pattern, delimiter));\n};\n\n/**\n * Clear the pattern cache\n * Useful for testing or when patterns change frequently\n */\nexport const clearPatternCache = (): void => {\n patternCache.clear();\n};\n\n/**\n * Get current cache size\n * Useful for monitoring and testing\n */\nexport const getCacheSize = (): number => {\n return patternCache.size;\n};\n","/**\n * Internal topological sort implementation\n * Kahn's algorithm for dependency resolution with cycle detection\n */\n\nexport interface TopoNode {\n id: string;\n after: string[];\n}\n\nexport class CyclicDependencyError extends Error {\n constructor(\n public readonly cycle: string[]\n ) {\n super(`Cyclic dependency detected: ${cycle.join(' -> ')}`);\n this.name = 'CyclicDependencyError';\n }\n}\n\n/**\n * Topologically sort nodes by their dependencies\n * @param nodes - Array of nodes with id and after (dependencies) fields\n * @returns Sorted array of node IDs respecting dependency order\n * @throws CyclicDependencyError if circular dependencies exist\n */\nexport const toposort = (nodes: TopoNode[]): string[] => {\n // Build adjacency list and in-degree map\n const graph = new Map<string, string[]>();\n const inDegree = new Map<string, number>();\n const allNodes = new Set<string>();\n\n // Initialize all nodes\n nodes.forEach(node => {\n allNodes.add(node.id);\n if (!graph.has(node.id)) {\n graph.set(node.id, []);\n }\n if (!inDegree.has(node.id)) {\n inDegree.set(node.id, 0);\n }\n });\n\n // Build graph edges and calculate in-degrees\n nodes.forEach(node => {\n node.after.forEach(dep => {\n // Add dependency node if not already in the graph\n if (!allNodes.has(dep)) {\n allNodes.add(dep);\n graph.set(dep, []);\n inDegree.set(dep, 0);\n }\n\n // Add edge: dep -> node.id\n graph.get(dep)!.push(node.id);\n inDegree.set(node.id, (inDegree.get(node.id) || 0) + 1);\n });\n });\n\n // Kahn's algorithm: start with nodes that have no dependencies\n const queue: string[] = [];\n const result: string[] = [];\n\n allNodes.forEach(id => {\n if (inDegree.get(id) === 0) {\n queue.push(id);\n }\n });\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n result.push(current);\n\n // Reduce in-degree for all dependent nodes\n const neighbors = graph.get(current) || [];\n neighbors.forEach(neighbor => {\n const newDegree = inDegree.get(neighbor)! - 1;\n inDegree.set(neighbor, newDegree);\n\n if (newDegree === 0) {\n queue.push(neighbor);\n }\n });\n }\n\n // If not all nodes are processed, there's a cycle\n if (result.length !== allNodes.size) {\n const remaining = Array.from(allNodes).filter(id => !result.includes(id));\n const cycle = detectCycle(remaining, graph);\n throw new CyclicDependencyError(cycle);\n }\n\n // Return only the IDs that were in the original input\n return result.filter(id => nodes.some(n => n.id === id));\n};\n\n/**\n * Detect and extract a cycle from the dependency graph\n */\nconst detectCycle = (remaining: string[], graph: Map<string, string[]>): string[] => {\n const visited = new Set<string>();\n const recStack = new Set<string>();\n const path: string[] = [];\n\n const dfs = (node: string): boolean => {\n visited.add(node);\n recStack.add(node);\n path.push(node);\n\n const neighbors = graph.get(node) || [];\n for (const neighbor of neighbors) {\n if (!remaining.includes(neighbor)) continue;\n\n if (!visited.has(neighbor)) {\n if (dfs(neighbor)) return true;\n } else if (recStack.has(neighbor)) {\n // Found cycle\n return true;\n }\n }\n\n recStack.delete(node);\n path.pop();\n return false;\n };\n\n for (const node of remaining) {\n if (!visited.has(node)) {\n if (dfs(node)) {\n return [...path];\n }\n }\n }\n\n // Fallback - return remaining nodes\n return remaining;\n};\n","/**\n * NamespacedMerger - Prefixes all context keys with source event name\n *\n * Prevents key collisions by namespacing each event's context with its event name.\n * This is the default merger strategy as it guarantees no conflicts.\n *\n * Example:\n * Input:\n * 'user:loaded': { count: 1, name: \"Alice\" }\n * 'profile:loaded': { count: 2, city: \"NYC\" }\n *\n * Output:\n * {\n * \"user:loaded:count\": 1,\n * \"user:loaded:name\": \"Alice\",\n * \"profile:loaded:count\": 2,\n * \"profile:loaded:city\": \"NYC\"\n * }\n */\n\nimport type { ContextMerger, EventName, MergeResult } from '../types.js';\n\nexport const createNamespacedMerger = (): ContextMerger => ({\n merge: (contexts: Map<EventName, Record<string, any>>, _sources: EventName[]): Record<string, any> => {\n const result: Record<string, any> = {};\n\n for (const [eventName, context] of contexts) {\n for (const [key, value] of Object.entries(context)) {\n result[`${eventName}:${key}`] = value;\n }\n }\n\n return result;\n },\n\n mergeWithConflicts: (contexts: Map<EventName, Record<string, any>>, _sources: EventName[]): MergeResult => {\n const result: Record<string, any> = {};\n\n // Namespaced merger never has conflicts by design (all keys are prefixed)\n for (const [eventName, context] of contexts) {\n for (const [key, value] of Object.entries(context)) {\n result[`${eventName}:${key}`] = value;\n }\n }\n\n return {\n context: result,\n conflicts: [], // No conflicts possible with namespacing\n };\n },\n});\n","/**\n * OverrideMerger - Last-write-wins strategy\n *\n * Merges contexts by iterating through source events in order.\n * Later events override values from earlier events for the same key.\n *\n * Example:\n * Sources order: ['user:loaded', 'profile:loaded']\n * Input:\n * 'user:loaded': { count: 1, name: \"Alice\" }\n * 'profile:loaded': { count: 2, city: \"NYC\" }\n *\n * Output:\n * { count: 2, name: \"Alice\", city: \"NYC\" }\n * (profile:loaded's count overrode user:loaded's count)\n */\n\nimport type { ContextMerger, EventName, MergeResult, ConflictInfo } from '../types.js';\n\nexport const createOverrideMerger = (): ContextMerger => ({\n merge: (contexts: Map<EventName, Record<string, any>>, sources: EventName[]): Record<string, any> => {\n const result: Record<string, any> = {};\n\n for (const eventName of sources) {\n const context = contexts.get(eventName);\n if (!context) continue;\n\n for (const [key, value] of Object.entries(context)) {\n result[key] = value;\n }\n }\n\n return result;\n },\n\n mergeWithConflicts: (contexts: Map<EventName, Record<string, any>>, sources: EventName[]): MergeResult => {\n const result: Record<string, any> = {};\n const conflicts: ConflictInfo[] = [];\n const keySources = new Map<string, Array<{ source: EventName; value: any }>>();\n\n // Track all sources for each key\n for (const eventName of sources) {\n const context = contexts.get(eventName);\n if (!context) continue;\n\n for (const [key, value] of Object.entries(context)) {\n if (!keySources.has(key)) {\n keySources.set(key, []);\n }\n keySources.get(key)!.push({ source: eventName, value });\n }\n }\n\n // Detect conflicts and build result\n for (const [key, sourceList] of keySources) {\n if (sourceList.length > 1) {\n // Conflict detected - multiple sources provide this key\n conflicts.push({\n key,\n sources: sourceList.map(s => s.source),\n values: sourceList.map(s => s.value),\n });\n }\n\n // Last source wins (override behavior)\n result[key] = sourceList[sourceList.length - 1].value;\n }\n\n return {\n context: result,\n conflicts,\n };\n },\n});\n","/**\n * Composition class - Merges multiple kernels into a unified interface\n *\n * Subscribes to events from multiple kernels, buffers them, and emits\n * composite events when all source events have fired. Contexts are merged\n * using a configurable ContextMerger strategy.\n */\n\nimport { Kernel } from '../kernel.js';\nimport { createNamespacedMerger } from './mergers/index.js';\nimport type {\n EventName,\n ContextMerger,\n CompositionOptions,\n ConflictInfo,\n} from './types.js';\nimport type { IKernelEvent } from '../types.js';\nimport type {\n EventMap,\n ListenerFunction,\n ListenerOptions,\n} from '../types.js';\n\n/**\n * Reserved internal event name for composite emissions\n * Using a prefix that users are unlikely to use accidentally\n */\nconst COMPOSED_EVENT = '__qk:composed__';\n\n/**\n * Buffered event entry for a source kernel\n */\ninterface BufferedEvent {\n name: string;\n data: any;\n context: Record<string, any>;\n timestamp: number;\n}\n\n/**\n * Source kernel subscription\n */\ninterface KernelSubscription {\n kernel: Kernel;\n eventName: EventName;\n unbind: () => void;\n}\n\n/**\n * Composition class that merges events from multiple kernels\n *\n * Example:\n * ```ts\n * const userKernel = createKernel();\n * const profileKernel = createKernel();\n *\n * const composition = new Composition([\n * [userKernel, 'user:loaded'],\n * [profileKernel, 'profile:loaded'],\n * ], {\n * merger: createNamespacedMerger(),\n * bufferLimit: 100,\n * });\n *\n * composition.onComposed((event) => {\n * // event.data.merged contains merged contexts from all sources\n * });\n * ```\n */\nexport class Composition<Events extends EventMap = EventMap> {\n private kernel: Kernel<Events>;\n private subscriptions: KernelSubscription[] = [];\n private buffers: Map<EventName, BufferedEvent[]> = new Map();\n private merger: ContextMerger;\n private bufferLimit: number;\n private reset: boolean;\n private eventTTL: number;\n private eventTTLs: Record<EventName, number | 'permanent' | 'instant'>;\n private sourceEvents: Set<EventName> = new Set();\n private firedSinceLastComposite: Set<EventName> = new Set();\n private lastConflicts: ConflictInfo[] = [];\n private expirationTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n\n /**\n * Create a new Composition\n *\n * @param kernels - Array of [kernel, eventName] tuples to subscribe to\n * @param options - Composition options\n */\n constructor(\n kernels: Array<[Kernel, EventName]>,\n options: CompositionOptions = {}\n ) {\n if (kernels.length === 0) {\n throw new Error('Composition requires at least one kernel');\n }\n\n this.merger = options.merger ?? createNamespacedMerger();\n this.bufferLimit = options.bufferLimit ?? 100;\n this.reset = options.reset ?? true;\n this.eventTTL = options.eventTTL ?? 0;\n this.eventTTLs = options.eventTTLs ?? {};\n\n // Create internal kernel for composite events\n this.kernel = new Kernel<Events>({\n debug: false,\n errorBoundary: true,\n onContextConflict: options.onConflict\n ? (key: string, values: any[]) => {\n options.onConflict!({\n key,\n sources: [],\n values,\n });\n }\n : undefined,\n });\n\n // Subscribe to all source kernels\n for (const [kernel, eventName] of kernels) {\n this.subscribeToKernel(kernel, eventName);\n this.sourceEvents.add(eventName);\n }\n }\n\n /**\n * Subscribe to events from a source kernel\n */\n private subscribeToKernel(kernel: Kernel, eventName: EventName): void {\n // Initialize buffer for this event\n this.buffers.set(eventName, []);\n\n // Subscribe to the kernel's events with lowest priority\n // This ensures we capture the event AFTER all other listeners have modified the context\n const unbind = kernel.on(\n eventName,\n async (event) => {\n await this.handleSourceEvent(eventName, event);\n },\n { priority: -Infinity }\n );\n\n this.subscriptions.push({\n kernel,\n eventName,\n unbind,\n });\n }\n\n /**\n * Get the effective TTL for a specific event\n * Priority: per-event TTL > global TTL > 0 (permanent)\n */\n private getEffectiveTTL(eventName: EventName): number | 'permanent' | 'instant' {\n const perEventTTL = this.eventTTLs[eventName];\n if (perEventTTL !== undefined) {\n return perEventTTL;\n }\n // Global TTL (0 means permanent)\n return this.eventTTL > 0 ? this.eventTTL : 'permanent';\n }\n\n /**\n * Handle an event from a source kernel\n */\n private async handleSourceEvent(eventName: EventName, event: IKernelEvent<any>): Promise<void> {\n const buffer = this.buffers.get(eventName);\n if (!buffer) return;\n\n const effectiveTTL = this.getEffectiveTTL(eventName);\n\n // Generate unique ID for this buffered event (for TTL tracking)\n const eventId = `${eventName}:${event.timestamp}:${Math.random().toString(36).slice(2, 8)}`;\n\n // Add to buffer (FIFO)\n buffer.push({\n name: event.name,\n data: event.data,\n context: { ...event.context },\n timestamp: event.timestamp,\n });\n\n // Enforce buffer limit\n if (buffer.length > this.bufferLimit) {\n buffer.shift();\n }\n\n // Mark this source as having fired since last composite\n this.firedSinceLastComposite.add(eventName);\n\n // Check if all sources have fired - this determines if composition completes\n const compositionCompleted = await this.checkAndEmitComposite();\n\n // Handle 'instant' mode: if composition didn't complete, remove the event immediately\n if (effectiveTTL === 'instant' && !compositionCompleted) {\n // Remove the event we just added\n buffer.pop();\n this.firedSinceLastComposite.delete(eventName);\n return;\n }\n\n // Set up TTL expiration if configured (numeric TTL)\n if (typeof effectiveTTL === 'number' && effectiveTTL > 0) {\n const timer = setTimeout(() => {\n this.expireEvent(eventName, event.timestamp);\n this.expirationTimers.delete(eventId);\n }, effectiveTTL);\n\n this.expirationTimers.set(eventId, timer);\n }\n }\n\n /**\n * Expire an event from the buffer based on timestamp\n */\n private expireEvent(eventName: EventName, timestamp: number): void {\n const buffer = this.buffers.get(eventName);\n if (!buffer) return;\n\n // Remove events with matching timestamp (or older)\n const filtered = buffer.filter(e => e.timestamp > timestamp);\n this.buffers.set(eventName, filtered);\n\n // If buffer is now empty, remove from firedSinceLastComposite\n if (filtered.length === 0) {\n this.firedSinceLastComposite.delete(eventName);\n }\n }\n\n /**\n * Check if all source events have fired and emit composite event\n * @returns true if composite was emitted, false otherwise\n */\n private async checkAndEmitComposite(): Promise<boolean> {\n // Check if all buffers have at least one event\n for (const eventName of this.sourceEvents) {\n const buffer = this.buffers.get(eventName);\n if (!buffer || buffer.length === 0) {\n return false; // Not ready yet\n }\n }\n\n // Check if all sources have fired since last composite\n // This ensures we only emit once per \"cycle\" of all sources\n for (const eventName of this.sourceEvents) {\n if (!this.firedSinceLastComposite.has(eventName)) {\n return false; // Not all sources have fired yet in this cycle\n }\n }\n\n // Only emit if there are listeners (skip if no one is listening)\n if (this.kernel.listenerCount(COMPOSED_EVENT as keyof Events) === 0) {\n return false;\n }\n\n // All sources have fired - collect and merge contexts\n const contexts = new Map<EventName, Record<string, any>>();\n const sources: EventName[] = Array.from(this.sourceEvents);\n\n for (const eventName of sources) {\n const buffer = this.buffers.get(eventName);\n if (!buffer || buffer.length === 0) continue;\n\n // Get the latest event from this source\n const latestEvent = buffer[buffer.length - 1];\n\n // Merge both event data and context\n // If data is an object, spread it along with context\n const eventData = latestEvent.data && typeof latestEvent.data === 'object'\n ? latestEvent.data\n : {};\n const combined = { ...eventData, ...latestEvent.context };\n\n contexts.set(eventName, combined);\n }\n\n // Merge contexts using the merger strategy with conflict detection\n const mergeResult = this.merger.mergeWithConflicts(contexts, sources);\n this.lastConflicts = mergeResult.conflicts;\n\n // Emit composed event through internal kernel\n await this.kernel.emit(COMPOSED_EVENT as keyof Events, {\n sources,\n contexts: Object.fromEntries(contexts),\n merged: mergeResult.context,\n } as Events[keyof Events]);\n\n // Clear the \"fired since last composite\" tracker\n this.firedSinceLastComposite.clear();\n\n // Reset buffers if configured\n // Keep only the latest event from each source to enable continuous composition\n if (this.reset) {\n for (const eventName of this.sourceEvents) {\n const buffer = this.buffers.get(eventName);\n if (buffer && buffer.length > 0) {\n const latest = buffer[buffer.length - 1];\n this.buffers.set(eventName, [latest]);\n }\n }\n }\n\n return true;\n }\n\n /**\n * Register a listener for when all source events have fired\n * This is the primary way to react to composition completion\n *\n * @param listener - Function called with merged context when composition completes\n * @param options - Listener options (priority, id, etc.)\n * @returns Unbind function to remove the listener\n */\n onComposed(\n listener: ListenerFunction<Events[keyof Events]>,\n options?: ListenerOptions\n ): () => void {\n return this.kernel.on(COMPOSED_EVENT as keyof Events, listener, options);\n }\n\n /**\n * Wait for the next composition completion as a Promise\n *\n * @param options - Optional timeout configuration\n * @returns Promise resolving with composed event data\n *\n * @example\n * ```typescript\n * // .then() receives: { sources, contexts, merged }\n * const result = await composition.once();\n * console.log(result.data.merged); // merged context from all sources\n * console.log(result.data.sources); // ['event1', 'event2']\n *\n * // With timeout\n * const result = await composition.once({ timeout: 5000 });\n * ```\n */\n once(options?: { timeout?: number }): Promise<IKernelEvent<{\n sources: EventName[];\n contexts: Record<EventName, Record<string, any>>;\n merged: Record<string, any>;\n }>> {\n return new Promise((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const listener: ListenerFunction<any> = (event) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve(event);\n };\n\n const unbind = this.kernel.on(COMPOSED_EVENT as keyof Events, listener, { once: true });\n\n if (options?.timeout) {\n timeoutId = setTimeout(() => {\n unbind();\n reject(new Error(`composition.once() timed out after ${options.timeout}ms`));\n }, options.timeout);\n }\n });\n }\n\n /**\n * Remove a listener for composed events\n */\n offComposed(listener?: Function): void {\n this.kernel.off(COMPOSED_EVENT, listener);\n }\n\n /**\n * Get number of composed event listeners\n */\n composedListenerCount(): number {\n return this.kernel.listenerCount(COMPOSED_EVENT as keyof Events);\n }\n\n /**\n * Register a listener for events on internal kernel\n * Note: Use onComposed() to listen for composition completion\n */\n on<K extends keyof Events>(\n eventName: K,\n listener: ListenerFunction<Events[K]>,\n options?: ListenerOptions\n ): () => void {\n return this.kernel.on(eventName, listener, options);\n }\n\n /**\n * Remove a listener\n * Delegates to internal kernel\n */\n off(eventName: string, listener?: Function): void {\n this.kernel.off(eventName, listener);\n }\n\n /**\n * Emit an event through the composition\n * Note: Reserved internal events (prefixed with __qk:) cannot be emitted\n */\n async emit<K extends keyof Events>(\n eventName: K,\n data?: Events[K]\n ): Promise<void> {\n if (String(eventName).startsWith('__qk:')) {\n throw new Error(`Cannot emit reserved event: ${String(eventName)}`);\n }\n return this.kernel.emit(eventName, data);\n }\n\n /**\n * Get merged context from latest buffered events\n * Does not emit - just returns the merged context\n */\n getContext(): Record<string, any> | null {\n // Check if all buffers have at least one event\n for (const eventName of this.sourceEvents) {\n const buffer = this.buffers.get(eventName);\n if (!buffer || buffer.length === 0) {\n return null; // Not ready yet\n }\n }\n\n // Collect latest contexts\n const contexts = new Map<EventName, Record<string, any>>();\n const sources: EventName[] = Array.from(this.sourceEvents);\n\n for (const eventName of sources) {\n const buffer = this.buffers.get(eventName);\n if (!buffer || buffer.length === 0) continue;\n\n const latestEvent = buffer[buffer.length - 1];\n\n // Merge both event data and context\n const eventData = latestEvent.data && typeof latestEvent.data === 'object'\n ? latestEvent.data\n : {};\n const combined = { ...eventData, ...latestEvent.context };\n\n contexts.set(eventName, combined);\n }\n\n // Merge with conflict detection\n const mergeResult = this.merger.mergeWithConflicts(contexts, sources);\n this.lastConflicts = mergeResult.conflicts;\n\n return mergeResult.context;\n }\n\n /**\n * Get number of listeners for an event\n */\n listenerCount(eventName?: keyof Events): number {\n return this.kernel.listenerCount(eventName);\n }\n\n /**\n * Get all event names with registered listeners\n */\n eventNames(): (keyof Events)[] {\n return this.kernel.eventNames();\n }\n\n /**\n * Remove all listeners\n */\n offAll(eventName?: keyof Events): void {\n this.kernel.offAll(eventName);\n }\n\n /**\n * Enable/disable debug mode\n */\n debug(enabled: boolean): void {\n this.kernel.debug(enabled);\n }\n\n /**\n * Get buffer for a specific source event (for debugging)\n */\n getBuffer(eventName: EventName): ReadonlyArray<BufferedEvent> | undefined {\n return this.buffers.get(eventName);\n }\n\n /**\n * Clear all buffers\n */\n clearBuffers(): void {\n for (const eventName of this.sourceEvents) {\n this.buffers.set(eventName, []);\n }\n this.firedSinceLastComposite.clear();\n }\n\n /**\n * Get conflicts detected during the last merge operation\n *\n * Returns an array of ConflictInfo objects describing which source events\n * provided conflicting values for the same context keys.\n *\n * @returns Array of conflicts from the last merge, or empty array if no conflicts\n */\n getConflicts(): ReadonlyArray<ConflictInfo> {\n return this.lastConflicts;\n }\n\n /**\n * Cleanup all subscriptions and listeners\n */\n dispose(): void {\n // Unsubscribe from all source kernels\n for (const sub of this.subscriptions) {\n sub.unbind();\n }\n this.subscriptions = [];\n\n // Clear all expiration timers\n for (const timer of this.expirationTimers.values()) {\n clearTimeout(timer);\n }\n this.expirationTimers.clear();\n\n // Clear all listeners on internal kernel\n this.kernel.offAll();\n\n // Clear buffers and trackers\n this.buffers.clear();\n this.sourceEvents.clear();\n this.firedSinceLastComposite.clear();\n this.lastConflicts = [];\n }\n\n /**\n * Get the configured global event TTL in milliseconds\n * @returns The TTL value, or 0 if no TTL is configured\n */\n getEventTTL(): number {\n return this.eventTTL;\n }\n\n /**\n * Set the global event TTL in milliseconds\n * @param ttl - TTL in milliseconds (0 = permanent)\n */\n setEventTTL(ttl: number): void {\n this.eventTTL = ttl;\n }\n\n /**\n * Get per-event TTL configuration\n * @returns The eventTTLs configuration object\n */\n getEventTTLs(): Readonly<Record<EventName, number | 'permanent' | 'instant'>> {\n return this.eventTTLs;\n }\n\n /**\n * Set TTL for a specific event\n * @param eventName - The event name to configure\n * @param ttl - TTL value: number (ms), 'permanent', or 'instant'\n */\n setEventTTLFor(eventName: EventName, ttl: number | 'permanent' | 'instant'): void {\n this.eventTTLs[eventName] = ttl;\n }\n\n /**\n * Remove per-event TTL configuration (falls back to global TTL)\n * @param eventName - The event name to reset\n */\n clearEventTTLFor(eventName: EventName): void {\n delete this.eventTTLs[eventName];\n }\n}\n\n/**\n * Factory function to create a Composition instance\n */\nexport const createComposition = <Events extends EventMap = EventMap>(\n kernels: Array<[Kernel, EventName]>,\n options?: CompositionOptions\n): Composition<Events> => {\n return new Composition<Events>(kernels, options);\n};\n","/**\n * QuarKernel Core Implementation\n *\n * A TypeScript event kernel with:\n * - Priority-based listener ordering\n * - Shared context between listeners\n * - Async-first with Promise-based API\n * - Arrow functions only (no `this` binding)\n */\n\nimport { KernelEvent } from './kernel-event.js';\nimport { ListenerContext, type ListenerContextKernel } from './listener-context.js';\nimport { findMatchingPatterns } from './wildcard.js';\nimport { toposort, type TopoNode } from './toposort.js';\nimport { Composition } from './composition/composition.js';\nimport type { EventName, CompositionOptions } from './composition/types.js';\nimport type {\n EventMap,\n ListenerFunction,\n ListenerOptions,\n ListenerEntry,\n KernelOptions,\n} from './types.js';\n\n/**\n * Error collected during event execution\n */\ninterface ExecutionError {\n listenerId: string;\n error: Error;\n timestamp: number;\n eventName: string;\n}\n\n/**\n * Core Kernel class\n * Implements basic on(), off(), emit() with Map-based storage\n */\nexport class Kernel<Events extends EventMap = EventMap> implements ListenerContextKernel {\n private listeners = new Map<string, ListenerEntry[]>();\n private options: Required<KernelOptions>;\n private listenerIdCounter = 0;\n private executionErrors: ExecutionError[] = [];\n\n constructor(options: KernelOptions = {}) {\n this.options = {\n delimiter: options.delimiter ?? ':',\n wildcard: options.wildcard ?? true,\n maxListeners: options.maxListeners ?? Infinity,\n debug: options.debug ?? false,\n errorBoundary: options.errorBoundary ?? true,\n onError: options.onError ?? ((error: Error) => {\n console.error('Kernel error:', error);\n }),\n contextMerger: options.contextMerger ?? undefined,\n onContextConflict: options.onContextConflict ?? undefined,\n } as Required<KernelOptions>;\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Kernel initialized', {\n delimiter: this.options.delimiter,\n wildcard: this.options.wildcard,\n maxListeners: this.options.maxListeners,\n errorBoundary: this.options.errorBoundary,\n });\n }\n }\n\n /**\n * Register an event listener\n * Returns an unbind function for cleanup\n */\n on<K extends keyof Events>(\n eventName: K,\n listener: ListenerFunction<Events[K]>,\n options: ListenerOptions = {}\n ): () => void {\n const event = String(eventName);\n\n // If signal already aborted, don't register listener\n if (options.signal?.aborted) {\n if (this.options.debug) {\n console.debug('[QuarKernel] Listener not added (signal already aborted)', {\n event,\n });\n }\n // Return no-op unbind function\n return () => {};\n }\n\n const priority = options.priority ?? 0;\n const id = options.id ?? `listener_${++this.listenerIdCounter}`;\n const after = Array.isArray(options.after)\n ? options.after\n : options.after\n ? [options.after]\n : [];\n\n // Create abort listener if signal provided\n let abortListener: (() => void) | undefined;\n if (options.signal) {\n abortListener = () => this.off(event, listener);\n }\n\n const entry: ListenerEntry = {\n id,\n callback: listener as ListenerFunction,\n after,\n priority,\n once: options.once ?? false,\n original: listener as ListenerFunction,\n signal: options.signal,\n abortListener,\n };\n\n // Get or create listener array for this event\n const entries = this.listeners.get(event) ?? [];\n entries.push(entry);\n\n // Sort by priority (descending: higher priority first)\n // Note: Dependency ordering is handled in emit() by sortListenersByDependencies()\n entries.sort((a, b) => b.priority - a.priority);\n\n this.listeners.set(event, entries);\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Listener added', {\n event,\n listenerId: id,\n priority,\n after,\n once: entry.once,\n totalListeners: entries.length,\n });\n }\n\n // Check maxListeners warning\n if (this.options.maxListeners > 0 && entries.length > this.options.maxListeners) {\n console.warn(\n `MaxListenersExceeded: Event \"${event}\" has ${entries.length} listeners (limit: ${this.options.maxListeners})`\n );\n }\n\n // Handle AbortSignal - add abort listener (signal not already aborted, checked above)\n if (options.signal && abortListener) {\n options.signal.addEventListener('abort', abortListener, { once: true });\n }\n\n // Return unbind function\n return () => this.off(event, listener);\n }\n\n /**\n * Wait for an event once (Promise-based)\n *\n * For callback style, use: `qk.on(event, listener, { once: true })`\n *\n * @param eventName - Event to wait for\n * @param options - Optional timeout in ms\n * @returns Promise resolving with the event\n *\n * @example\n * ```typescript\n * // .then() receives: IKernelEvent { name, data, context, timestamp }\n * const event = await qk.once('user:loaded');\n * console.log(event.data); // event payload\n * console.log(event.context); // shared context\n *\n * // With timeout (rejects if event doesn't fire)\n * const event = await qk.once('user:loaded', { timeout: 5000 });\n * ```\n */\n once<K extends keyof Events>(\n eventName: K,\n options?: { timeout?: number }\n ): Promise<KernelEvent<Events[K]>> {\n return new Promise<KernelEvent<Events[K]>>((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n const listener: ListenerFunction<Events[K]> = (event) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve(event as KernelEvent<Events[K]>);\n };\n\n const unbind = this.on(eventName, listener, { once: true });\n\n if (options?.timeout) {\n timeoutId = setTimeout(() => {\n unbind();\n reject(new Error(`once('${String(eventName)}') timed out after ${options.timeout}ms`));\n }, options.timeout);\n }\n });\n }\n\n /**\n * Remove an event listener\n * If no listener provided, removes all listeners for the event\n */\n off(eventName: string, listener?: Function): void {\n const entries = this.listeners.get(eventName);\n\n if (!entries) {\n return;\n }\n\n if (!listener) {\n if (this.options.debug) {\n console.debug('[QuarKernel] All listeners removed', {\n event: eventName,\n count: entries.length,\n });\n }\n // Remove all listeners for this event and cleanup abort listeners\n for (const entry of entries) {\n if (entry.signal && entry.abortListener) {\n entry.signal.removeEventListener('abort', entry.abortListener);\n }\n }\n this.listeners.delete(eventName);\n return;\n }\n\n // Find the entry to remove and cleanup its abort listener\n const entryToRemove = entries.find((entry) => entry.original === listener);\n if (entryToRemove?.signal && entryToRemove.abortListener) {\n entryToRemove.signal.removeEventListener('abort', entryToRemove.abortListener);\n }\n\n // Remove specific listener by original function reference equality\n const filtered = entries.filter((entry) => entry.original !== listener);\n const removed = entries.length - filtered.length;\n\n if (this.options.debug && removed > 0) {\n console.debug('[QuarKernel] Listener removed', {\n event: eventName,\n removed,\n remaining: filtered.length,\n });\n }\n\n if (filtered.length === 0) {\n this.listeners.delete(eventName);\n } else {\n this.listeners.set(eventName, filtered);\n }\n }\n\n /**\n * Emit an event\n * Executes all registered listeners in parallel (by default)\n * Returns a Promise that resolves when all listeners complete\n * Throws AggregateError if any listeners failed\n */\n async emit<K extends keyof Events>(\n eventName: K,\n data?: Events[K]\n ): Promise<void> {\n const event = String(eventName);\n\n // Get all matching listeners (exact match + wildcards)\n const allPatterns = Array.from(this.listeners.keys());\n const matchingPatterns = this.options.wildcard\n ? findMatchingPatterns(event, allPatterns, this.options.delimiter)\n : allPatterns.filter(p => p === event);\n\n // Collect all listeners from matching patterns\n const allEntries: ListenerEntry[] = [];\n for (const pattern of matchingPatterns) {\n const entries = this.listeners.get(pattern);\n if (entries) {\n allEntries.push(...entries);\n }\n }\n\n if (allEntries.length === 0) {\n if (this.options.debug) {\n console.debug('[QuarKernel] Event emitted (no listeners)', { event });\n }\n return;\n }\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Event emitted', {\n event,\n listenerCount: allEntries.length,\n data: data !== undefined ? JSON.stringify(data).substring(0, 100) : undefined,\n });\n }\n\n // Clear execution errors from previous emit\n this.executionErrors = [];\n\n const kernelEvent = new KernelEvent<Events[K]>(\n event,\n data as Events[K],\n {}\n );\n\n // Sort listeners by dependencies and priority\n const sortedEntries = this.sortListenersByDependencies(allEntries);\n\n // Execute all listeners in parallel using Promise.allSettled\n // to ensure one failure doesn't block others\n const promises = sortedEntries.map((entry) =>\n this.executeListener(entry, kernelEvent, event)\n );\n\n const results = await Promise.allSettled(promises);\n\n // Remove once listeners after execution\n this.removeOnceListeners(event, sortedEntries, kernelEvent);\n\n // Collect errors from rejected promises (only if errorBoundary is false)\n if (!this.options.errorBoundary) {\n const errors = results\n .filter((result): result is PromiseRejectedResult => result.status === 'rejected')\n .map((result) => result.reason);\n\n if (errors.length > 0) {\n throw new AggregateError(errors, `${errors.length} listener(s) failed for event \"${event}\"`);\n }\n }\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Event completed', {\n event,\n });\n }\n }\n\n /**\n * Emit an event with serial execution\n * Executes listeners sequentially (one after another) instead of in parallel\n * Respects the same dependency and priority ordering as emit()\n * Stops on first error if errorBoundary is false, otherwise continues and collects errors\n */\n async emitSerial<K extends keyof Events>(\n eventName: K,\n data?: Events[K]\n ): Promise<void> {\n const event = String(eventName);\n\n // Get all matching listeners (exact match + wildcards)\n const allPatterns = Array.from(this.listeners.keys());\n const matchingPatterns = this.options.wildcard\n ? findMatchingPatterns(event, allPatterns, this.options.delimiter)\n : allPatterns.filter(p => p === event);\n\n // Collect all listeners from matching patterns\n const allEntries: ListenerEntry[] = [];\n for (const pattern of matchingPatterns) {\n const entries = this.listeners.get(pattern);\n if (entries) {\n allEntries.push(...entries);\n }\n }\n\n if (allEntries.length === 0) {\n if (this.options.debug) {\n console.debug('[QuarKernel] Event emitted serially (no listeners)', { event });\n }\n return;\n }\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Event emitted serially', {\n event,\n listenerCount: allEntries.length,\n data: data !== undefined ? JSON.stringify(data).substring(0, 100) : undefined,\n });\n }\n\n // Clear execution errors from previous emit\n this.executionErrors = [];\n\n const kernelEvent = new KernelEvent<Events[K]>(\n event,\n data as Events[K],\n {}\n );\n\n // Sort listeners by dependencies and priority\n const sortedEntries = this.sortListenersByDependencies(allEntries);\n\n // Execute listeners sequentially\n const errors: Error[] = [];\n for (const entry of sortedEntries) {\n try {\n await this.executeListener(entry, kernelEvent, event);\n } catch (error) {\n if (!this.options.errorBoundary) {\n // Stop on first error if error boundary is disabled\n // Clean up once listeners before throwing\n this.removeOnceListeners(event, sortedEntries, kernelEvent);\n throw error;\n }\n // errorBoundary is true, collect error and continue\n errors.push(error as Error);\n }\n }\n\n // Remove once listeners after execution\n this.removeOnceListeners(event, sortedEntries, kernelEvent);\n\n // If errorBoundary is false and we have errors, throw AggregateError\n if (!this.options.errorBoundary && errors.length > 0) {\n throw new AggregateError(errors, `${errors.length} listener(s) failed for event \"${event}\"`);\n }\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Event completed serially', {\n event,\n });\n }\n }\n\n /**\n * Sort listeners by dependencies and priority\n * Uses topological sort for dependency resolution\n */\n private sortListenersByDependencies(entries: ListenerEntry[]): ListenerEntry[] {\n // If no dependencies, just return sorted by priority\n const hasDependencies = entries.some(e => e.after.length > 0);\n if (!hasDependencies) {\n return [...entries].sort((a, b) => b.priority - a.priority);\n }\n\n // Check for missing dependencies\n const listenerIds = new Set(entries.map(e => e.id));\n for (const entry of entries) {\n for (const dep of entry.after) {\n if (!listenerIds.has(dep)) {\n throw new Error(`Listener \"${entry.id}\" depends on missing listener \"${dep}\"`);\n }\n }\n }\n\n // Convert to TopoNode format\n const nodes: TopoNode[] = entries.map(e => ({\n id: e.id,\n after: e.after,\n }));\n\n // Get topologically sorted IDs (validates dependencies, unused but required for validation)\n toposort(nodes);\n\n // Group by dependency level and sort by priority within each level\n const levelMap = new Map<string, number>();\n const assignLevel = (id: string, visited = new Set<string>()): number => {\n if (levelMap.has(id)) {\n return levelMap.get(id)!;\n }\n if (visited.has(id)) {\n return 0;\n }\n visited.add(id);\n\n const entry = entries.find(e => e.id === id);\n if (!entry || entry.after.length === 0) {\n levelMap.set(id, 0);\n return 0;\n }\n\n const maxDepLevel = Math.max(...entry.after.map(dep => assignLevel(dep, visited)));\n const level = maxDepLevel + 1;\n levelMap.set(id, level);\n return level;\n };\n\n entries.forEach(e => assignLevel(e.id));\n\n // Sort by level, then by priority within level\n return [...entries].sort((a, b) => {\n const levelA = levelMap.get(a.id) ?? 0;\n const levelB = levelMap.get(b.id) ?? 0;\n if (levelA !== levelB) {\n return levelA - levelB; // Lower level first\n }\n return b.priority - a.priority; // Higher priority first within same level\n });\n }\n\n /**\n * Execute a single listener with error handling\n */\n private async executeListener(\n entry: ListenerEntry,\n event: KernelEvent<any>,\n eventName: string\n ): Promise<void> {\n // Check if propagation was stopped\n if (event.isPropagationStopped) {\n if (this.options.debug) {\n console.debug('[QuarKernel] Listener skipped (propagation stopped)', {\n listenerId: entry.id,\n });\n }\n return;\n }\n\n const startTime = Date.now();\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Listener executing', {\n listenerId: entry.id,\n event: eventName,\n priority: entry.priority,\n });\n }\n\n try {\n // Create listener context\n const ctx = new ListenerContext(\n entry.id,\n eventName,\n entry.priority,\n entry.after,\n this,\n entry.original,\n entry.signal\n );\n\n // Set current event for context methods\n ctx.setCurrentEvent(event);\n\n try {\n await entry.callback(event, ctx);\n\n if (this.options.debug) {\n const duration = Date.now() - startTime;\n console.debug('[QuarKernel] Listener completed', {\n listenerId: entry.id,\n duration: `${duration}ms`,\n });\n }\n } finally {\n // Clear current event after execution\n ctx.clearCurrentEvent();\n }\n } catch (error) {\n const executionError: ExecutionError = {\n listenerId: entry.id,\n error: error as Error,\n timestamp: Date.now(),\n eventName,\n };\n\n // Collect error for reporting\n this.executionErrors.push(executionError);\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Listener error', {\n listenerId: entry.id,\n error: (error as Error).message,\n });\n }\n\n if (this.options.errorBoundary) {\n // Call error handler but continue with other listeners\n this.options.onError(error as Error, event);\n } else {\n // Re-throw if error boundary is disabled\n throw error;\n }\n }\n }\n\n /**\n * Remove listeners marked with once: true or whose predicate returns true after execution\n *\n * This method is called AFTER all listeners have executed for an event.\n * The predicate functions receive the event object with the final state after all listeners ran.\n *\n * Behavior:\n * - If once: true, the listener is always removed after execution\n * - If once is a predicate function, it's evaluated with the post-execution event state\n * - Predicates can examine event.context to make decisions based on listener modifications\n * - Listeners are removed even if they threw errors (when errorBoundary: true)\n *\n * @param eventName - The event name being processed\n * @param entries - Listeners that executed (or were scheduled to execute)\n * @param event - The event object with final state after all listeners executed\n */\n private removeOnceListeners(eventName: string, entries: ListenerEntry[], event: KernelEvent<any>): void {\n const listenersToRemove = entries.filter((entry) => {\n if (!entry.once) {\n return false;\n }\n\n // If once is true, always remove\n if (entry.once === true) {\n return true;\n }\n\n // If once is a predicate function, evaluate it\n if (typeof entry.once === 'function') {\n return entry.once(event);\n }\n\n return false;\n });\n\n if (listenersToRemove.length === 0) {\n return;\n }\n\n if (this.options.debug) {\n console.debug('[QuarKernel] Removing once listeners', {\n event: eventName,\n count: listenersToRemove.length,\n });\n }\n\n // Remove each listener that should be removed\n // For wildcard patterns, we need to find which pattern they belong to\n for (const entry of listenersToRemove) {\n // Find the pattern this listener was registered under\n for (const [pattern, entries] of this.listeners.entries()) {\n if (entries.includes(entry)) {\n this.off(pattern, entry.original);\n break;\n }\n }\n }\n }\n\n /**\n * Get number of listeners for an event\n */\n listenerCount(eventName?: keyof Events): number {\n if (!eventName) {\n // Total count across all events\n let total = 0;\n for (const entries of this.listeners.values()) {\n total += entries.length;\n }\n return total;\n }\n\n const event = String(eventName);\n const entries = this.listeners.get(event);\n return entries?.length ?? 0;\n }\n\n /**\n * Get all event names with registered listeners\n */\n eventNames(): (keyof Events)[] {\n return Array.from(this.listeners.keys()) as (keyof Events)[];\n }\n\n /**\n * Remove all listeners for all events (or specific event)\n */\n offAll(eventName?: keyof Events): void {\n if (!eventName) {\n // Cleanup all abort listeners\n for (const entries of this.listeners.values()) {\n for (const entry of entries) {\n if (entry.signal && entry.abortListener) {\n entry.signal.removeEventListener('abort', entry.abortListener);\n }\n }\n }\n this.listeners.clear();\n return;\n }\n\n // Cleanup abort listeners for specific event\n const event = String(eventName);\n const entries = this.listeners.get(event);\n if (entries) {\n for (const entry of entries) {\n if (entry.signal && entry.abortListener) {\n entry.signal.removeEventListener('abort', entry.abortListener);\n }\n }\n }\n\n this.listeners.delete(event);\n }\n\n /**\n * Enable/disable debug mode\n * In T115, this is a placeholder - full debug implementation in T129\n */\n debug(enabled: boolean): void {\n this.options.debug = enabled;\n if (enabled) {\n console.debug('[QuarKernel] Debug mode enabled');\n } else {\n console.debug('[QuarKernel] Debug mode disabled');\n }\n }\n\n /**\n * Get collected execution errors from the last emit\n * Useful for error aggregation and reporting\n */\n getExecutionErrors(): ReadonlyArray<ExecutionError> {\n return this.executionErrors;\n }\n\n /**\n * Clear collected execution errors\n */\n clearExecutionErrors(): void {\n this.executionErrors = [];\n }\n\n /**\n * Create a composition from multiple kernels\n *\n * @param kernels - Rest parameters of [kernel, eventName] tuples\n * @param options - Optional composition options (if last argument is not a tuple)\n * @returns Composition instance that merges events from all kernels\n *\n * @example\n * ```ts\n * const userKernel = createKernel();\n * const profileKernel = createKernel();\n *\n * const composition = Kernel.compose(\n * [userKernel, 'user:loaded'],\n * [profileKernel, 'profile:loaded'],\n * { merger: createNamespacedMerger() }\n * );\n *\n * composition.onComposed((event) => {\n * console.log('All sources ready:', event.data.merged);\n * });\n * ```\n */\n static compose<Events extends EventMap = EventMap>(\n ...args: (readonly [Kernel, EventName] | CompositionOptions)[]\n ): Composition<Events> {\n // Separate kernel tuples from options\n const kernels: Array<[Kernel, EventName]> = [];\n let options: CompositionOptions | undefined;\n\n for (const arg of args) {\n // Check if this is a kernel tuple or options object\n if (Array.isArray(arg) && arg.length === 2 && arg[0] instanceof Kernel) {\n kernels.push(arg as [Kernel, EventName]);\n } else if (typeof arg === 'object' && !Array.isArray(arg)) {\n options = arg as CompositionOptions;\n }\n }\n\n return new Composition<Events>(kernels, options);\n }\n}\n\n/**\n * Factory function to create a Kernel instance\n */\nexport const createKernel = <Events extends EventMap = EventMap>(\n options?: KernelOptions\n): Kernel<Events> => {\n return new Kernel<Events>(options);\n};\n\n","/**\n * Type definitions for QuarKernel v2\n *\n * This module contains all TypeScript types, interfaces, and type guards\n * for the event kernel. Uses strict typing with generic parameters for\n * type-safe event handling.\n */\n\n// ============================================================================\n// Event Data Types\n// ============================================================================\n\n/**\n * Event name type - can be string or branded type\n */\nexport type EventName = string;\n\n/**\n * Event data type - the payload for each event\n * Can be any JSON-serializable value or undefined\n */\nexport type EventData = any;\n\n/**\n * Type map for events - maps event names to their data types\n * @example\n * ```ts\n * interface Events {\n * 'user:login': { userId: string }\n * 'user:logout': { userId: string }\n * 'app:ready': undefined\n * }\n * ```\n */\nexport type EventMap = Record<EventName, EventData>;\n\n// ============================================================================\n// Kernel Event\n// ============================================================================\n\n/**\n * Event object passed to listeners\n * @template T - The event data type\n *\n * Note: The actual implementation is in kernel-event.ts\n * This interface is for type checking only\n */\nexport interface IKernelEvent<T = any> {\n /** Event name */\n readonly name: string;\n\n /** Event payload (typed, immutable) */\n readonly data: T;\n\n /** Shared mutable context - passed through listener chain */\n readonly context: Record<string, any>;\n\n /** Timestamp when event was created */\n readonly timestamp: number;\n\n /** Stop propagation to remaining listeners */\n stopPropagation(): void;\n\n /** Whether propagation was stopped */\n readonly isPropagationStopped: boolean;\n}\n\n// ============================================================================\n// Listener Types\n// ============================================================================\n\n/**\n * Listener context - utilities available to each listener\n */\nexport interface IListenerContext {\n /** Unique identifier of this listener */\n id: string;\n\n /** Remove this listener */\n off(): void;\n\n /** Emit another event */\n emit<K extends string = string>(event: K, data?: any): Promise<void>;\n\n /** Stop propagation to remaining listeners */\n stopPropagation(): void;\n}\n\n/**\n * Listener function signature\n * @template T - The event data type\n */\nexport type ListenerFunction<T = any> = (\n event: IKernelEvent<T>,\n context: IListenerContext\n) => void | Promise<void>;\n\n/**\n * Predicate function for conditional once listeners\n *\n * IMPORTANT: Evaluated AFTER listener execution, not before.\n * The event parameter contains the final state after the listener has run.\n *\n * @template T - The event data type\n * @param event - Event with post-execution state (includes listener modifications to context)\n * @returns true to remove the listener, false to keep it for next emission\n */\nexport type PredicateFunction<T = any> = (event: IKernelEvent<T>) => boolean;\n\n/**\n * Options for registering a listener\n */\nexport interface ListenerOptions {\n /** Unique identifier for dependency resolution */\n id?: string;\n\n /** Dependencies - listener IDs that must execute before this one */\n after?: string | string[];\n\n /** Priority - higher values execute earlier (within same dependency level) */\n priority?: number;\n\n /**\n * Listen only once - true for always, or predicate function for conditional removal\n *\n * IMPORTANT: The predicate is evaluated AFTER listener execution, not before.\n * This means:\n * - The listener always executes at least once\n * - The predicate receives the event object after the listener has run\n * - The predicate sees any modifications to event.context made by the listener\n * - If the listener throws an error, the predicate still evaluates (with errorBoundary: true)\n * - The listener is removed after execution if predicate returns true\n *\n * @example\n * ```ts\n * // Listener always executes, then removed after execution\n * kernel.on('event', handler, { once: true });\n *\n * // Listener executes each time, removed after count reaches 3\n * kernel.on('event', handler, {\n * once: (event) => event.context.count >= 3\n * });\n * ```\n */\n once?: boolean | PredicateFunction;\n\n /** AbortSignal for cleanup */\n signal?: AbortSignal;\n}\n\n/**\n * Internal listener entry stored in the kernel\n * @internal\n */\nexport interface ListenerEntry {\n /** Unique identifier */\n id: string;\n\n /** The listener function */\n callback: ListenerFunction;\n\n /** Dependencies (listener IDs) */\n after: string[];\n\n /** Priority for ordering */\n priority: number;\n\n /** Listen only once - true for always, or predicate function evaluated after execution */\n once: boolean | PredicateFunction;\n\n /** Original listener function reference (for off()) */\n original: ListenerFunction;\n\n /** AbortSignal for cleanup */\n signal?: AbortSignal;\n\n /** Abort event listener reference for cleanup */\n abortListener?: () => void;\n}\n\n// ============================================================================\n// Kernel Options\n// ============================================================================\n\n/**\n * Options for creating a kernel instance\n */\nexport interface KernelOptions {\n /** Event name delimiter for namespacing (default: ':') */\n delimiter?: string;\n\n /** Enable wildcard pattern matching (default: true) */\n wildcard?: boolean;\n\n /** Maximum listeners per event (default: Infinity, 0 = unlimited) */\n maxListeners?: number;\n\n /** Error handler for listener exceptions */\n onError?: (error: Error, event: IKernelEvent) => void;\n\n /** Debug mode - enables warnings and logging */\n debug?: boolean;\n\n /** Error boundary - continue executing listeners even if one fails */\n errorBoundary?: boolean;\n\n /** Default context merger for composite events */\n contextMerger?: ContextMerger | ContextMergerFunction;\n\n /** Callback when context keys conflict during merge */\n onContextConflict?: (key: string, values: any[]) => void;\n}\n\n// ============================================================================\n// Composition Types\n// ============================================================================\n\n/**\n * Event stack for composition - maps event names to their event objects\n */\nexport type EventStack = Record<string, IKernelEvent>;\n\n/**\n * Factory function to create composite event from source events\n * @param stack - Map of event names to their event objects\n * @returns The composite event specification (type and data)\n */\nexport type CompositionFactory = (stack: EventStack) => {\n type: string;\n data: any;\n} | null;\n\n/**\n * Options for event composition\n */\nexport interface CompositionOptions {\n /** Reset buffer after composition fires (default: true) */\n reset?: boolean;\n\n /** Context merger for this composition (overrides kernel default) */\n contextMerger?: ContextMerger | ContextMergerFunction;\n}\n\n/**\n * Internal composition entry\n * @internal\n */\nexport interface IComposition {\n /** Event names to compose */\n events: string[];\n\n /** Buffer of received events */\n buffer: Map<string, IKernelEvent>;\n\n /** Factory to create composite event */\n factory: CompositionFactory;\n\n /** Reset buffer after firing */\n reset: boolean;\n\n /** Context merger */\n merger: ContextMerger;\n}\n\n// ============================================================================\n// Context Merger Interface\n// ============================================================================\n\n/**\n * Strategy pattern for merging event contexts in compositions\n */\nexport interface ContextMerger {\n /**\n * Merge contexts from multiple events\n * @param contexts - Map of event names to their context objects\n * @returns The merged context\n */\n merge(contexts: Record<string, any>): any;\n}\n\n/**\n * Function-based context merger (shorthand for ContextMerger interface)\n */\nexport type ContextMergerFunction = (contexts: Record<string, any>) => any;\n\n// ============================================================================\n// Kernel Interface\n// ============================================================================\n\n/**\n * Main kernel interface\n * @template Events - Event map defining event names and their data types\n */\nexport interface IKernel<Events extends EventMap = EventMap> {\n // Subscribe methods\n on<K extends keyof Events>(\n event: K | K[],\n listener: ListenerFunction<Events[K]>,\n options?: ListenerOptions\n ): () => void;\n\n /**\n * Wait for an event once (Promise-based)\n *\n * For callback style, use: `on(event, listener, { once: true })`\n *\n * @example\n * ```typescript\n * const event = await qk.once('user:loaded');\n * const event = await qk.once('user:loaded', { timeout: 5000 });\n * ```\n */\n once<K extends keyof Events>(\n event: K,\n options?: { timeout?: number }\n ): Promise<IKernelEvent<Events[K]>>;\n\n // Unsubscribe methods\n off<K extends keyof Events>(\n event: K,\n listener?: ListenerFunction<Events[K]>\n ): void;\n\n offAll(event?: keyof Events): void;\n\n // Emit methods\n emit<K extends keyof Events>(\n event: K,\n data?: Events[K]\n ): Promise<void>;\n\n emitSerial<K extends keyof Events>(\n event: K,\n data?: Events[K]\n ): Promise<void>;\n\n // Composition\n compose(\n events: string[],\n factory: CompositionFactory,\n options?: CompositionOptions\n ): () => void;\n\n // Async iteration\n events<K extends keyof Events>(\n event: K\n ): AsyncIterable<IKernelEvent<Events[K]>>;\n\n // Utilities\n listenerCount(event?: keyof Events): number;\n eventNames(): (keyof Events)[];\n\n // Debug\n debug(enabled: boolean): void;\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard to check if value is a valid event name\n */\nexport function isEventName(value: unknown): value is EventName {\n return typeof value === 'string' && value.length > 0;\n}\n\n/**\n * Type guard to check if value is a listener function\n */\nexport function isListenerFunction(value: unknown): value is ListenerFunction {\n return typeof value === 'function';\n}\n\n/**\n * Type guard to check if value is a predicate function\n */\nexport function isPredicateFunction(value: unknown): value is PredicateFunction {\n return typeof value === 'function';\n}\n\n/**\n * Type guard to check if value is a context merger\n */\nexport function isContextMerger(value: unknown): value is ContextMerger {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'merge' in value &&\n typeof (value as any).merge === 'function'\n );\n}\n\n/**\n * Type guard to check if value is a context merger function\n */\nexport function isContextMergerFunction(value: unknown): value is ContextMergerFunction {\n return typeof value === 'function';\n}\n\n/**\n * Type guard to check if value is ListenerOptions\n */\nexport function isListenerOptions(value: unknown): value is ListenerOptions {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n\n const opts = value as any;\n\n // Check optional properties have correct types if present\n if ('id' in opts && typeof opts.id !== 'string') return false;\n if ('after' in opts && typeof opts.after !== 'string' && !Array.isArray(opts.after)) return false;\n if ('priority' in opts && typeof opts.priority !== 'number') return false;\n if ('once' in opts && typeof opts.once !== 'boolean' && typeof opts.once !== 'function') return false;\n if ('signal' in opts && !(opts.signal instanceof AbortSignal)) return false;\n\n return true;\n}\n\n/**\n * Type guard to check if value is IKernelEvent\n */\nexport function isKernelEvent<T = any>(value: unknown): value is IKernelEvent<T> {\n if (value === null || typeof value !== 'object') {\n return false;\n }\n\n const event = value as any;\n\n return (\n typeof event.name === 'string' &&\n 'data' in event &&\n typeof event.context === 'object' &&\n event.context !== null &&\n typeof event.timestamp === 'number' &&\n typeof event.stopPropagation === 'function' &&\n typeof event.isPropagationStopped === 'boolean'\n );\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Extract event names from an EventMap\n */\nexport type EventNames<E extends EventMap> = keyof E;\n\n/**\n * Extract event data type for a specific event\n */\nexport type EventDataType<E extends EventMap, K extends keyof E> = E[K];\n\n/**\n * Unbind function returned by on() and once()\n */\nexport type UnbindFunction = () => void;\n\n/**\n * Error thrown when circular dependencies are detected\n */\nexport class CircularDependencyError extends Error {\n constructor(cycle: string[]) {\n super(`Circular dependency detected: ${cycle.join(' -> ')}`);\n this.name = 'CircularDependencyError';\n }\n}\n\n/**\n * Error thrown when a listener dependency is missing\n */\nexport class MissingDependencyError extends Error {\n constructor(listenerId: string, missingDep: string) {\n super(`Listener \"${listenerId}\" depends on missing listener \"${missingDep}\"`);\n this.name = 'MissingDependencyError';\n }\n}\n\n/**\n * Error thrown when max listeners exceeded\n */\nexport class MaxListenersExceededError extends Error {\n constructor(event: string, max: number) {\n super(`Max listeners (${max}) exceeded for event \"${event}\"`);\n this.name = 'MaxListenersExceededError';\n }\n}\n","/**\n * FSM Machine Implementation\n *\n * Flexible state machine layer built on quarkernel events.\n * Uses prefixed events for loose coupling and multi-machine orchestration.\n */\n\nimport type { Kernel } from '../kernel.js';\nimport type {\n MachineConfig,\n Machine,\n MachineSnapshot,\n StateName,\n TransitionEvent,\n TransitionDef,\n SendOptions,\n FSMEventData,\n} from './types.js';\n\n/**\n * Create a state machine on a kernel\n *\n * @param kernel - The quarkernel instance to use\n * @param config - Machine configuration\n * @returns Machine instance\n *\n * @example\n * ```ts\n * const kernel = new Kernel();\n *\n * const order = useMachine(kernel, {\n * prefix: 'order',\n * initial: 'draft',\n * states: {\n * draft: { on: { SUBMIT: 'pending' } },\n * pending: { on: { APPROVE: 'confirmed', REJECT: 'draft' } },\n * confirmed: { on: { SHIP: 'shipped' } },\n * shipped: {}\n * }\n * });\n *\n * // Listen to state changes\n * kernel.on('order:enter:confirmed', (e) => {\n * console.log('Order confirmed!');\n * });\n *\n * await order.send('SUBMIT');\n * await order.send('APPROVE');\n * ```\n */\nexport function useMachine<TContext = Record<string, any>>(\n kernel: Kernel,\n config: MachineConfig<TContext>\n): Machine<TContext> {\n const {\n prefix,\n initial,\n states,\n allowForce = true,\n snapshot,\n trackHistory = false,\n maxHistory = 100,\n } = config;\n\n // History entry type\n type HistoryEntry = { from: StateName; to: StateName; event: TransitionEvent; timestamp: number };\n\n // Initialize state from snapshot or initial\n let currentState: StateName = snapshot?.state ?? initial;\n let context: TContext = snapshot?.context ?? config.context ?? ({} as TContext);\n let history: HistoryEntry[] = snapshot?.history ? [...snapshot.history] : [];\n\n // Validate initial state exists\n if (!states[currentState]) {\n throw new Error(`Invalid initial state \"${currentState}\" - not defined in states`);\n }\n\n // Cleanup functions for listeners\n const cleanupFns: Array<() => void> = [];\n\n /**\n * Emit FSM event on kernel\n */\n const emitFSM = async (\n eventType: string,\n data: Omit<FSMEventData, 'machine'>\n ): Promise<void> => {\n const eventData: FSMEventData = {\n machine: prefix,\n ...data,\n };\n await kernel.emit(`${prefix}:${eventType}` as any, eventData as any);\n };\n\n /**\n * Get transition definition for event from current state\n */\n const getTransition = (event: TransitionEvent): TransitionDef<TContext> | null => {\n const stateNode = states[currentState];\n if (!stateNode?.on) return null;\n\n const transition = stateNode.on[event];\n if (!transition) return null;\n\n // Normalize string to TransitionDef\n if (typeof transition === 'string') {\n return { target: transition };\n }\n\n return transition;\n };\n\n /**\n * Execute transition\n */\n const doTransition = async (\n event: TransitionEvent,\n targetState: StateName,\n payload?: any,\n forced = false\n ): Promise<void> => {\n const fromState = currentState;\n const fromNode = states[fromState];\n const toNode = states[targetState];\n\n if (!toNode) {\n throw new Error(`Invalid target state \"${targetState}\" - not defined in states`);\n }\n\n // Exit current state\n if (fromNode?.exit) {\n await fromNode.exit(context, event, payload);\n }\n await emitFSM(`exit:${fromState}`, {\n state: fromState,\n from: fromState,\n to: targetState,\n event,\n payload,\n forced,\n });\n\n // Update state\n currentState = targetState;\n\n // Track history\n if (trackHistory) {\n history.push({\n from: fromState,\n to: targetState,\n event,\n timestamp: Date.now(),\n });\n // Trim history if needed\n if (history.length > maxHistory) {\n history = history.slice(-maxHistory);\n }\n }\n\n // Emit transition event\n await emitFSM('transition', {\n state: targetState,\n from: fromState,\n to: targetState,\n event,\n payload,\n forced,\n });\n await emitFSM(`transition:${event}`, {\n state: targetState,\n from: fromState,\n to: targetState,\n event,\n payload,\n forced,\n });\n\n // Enter new state\n await emitFSM(`enter:${targetState}`, {\n state: targetState,\n from: fromState,\n to: targetState,\n event,\n payload,\n forced,\n });\n if (toNode.entry) {\n await toNode.entry(context, event, payload);\n }\n };\n\n /**\n * Machine instance\n */\n const machine: Machine<TContext> = {\n prefix,\n\n getState(): StateName {\n return currentState;\n },\n\n getContext(): TContext {\n return context;\n },\n\n setContext(updater): void {\n if (typeof updater === 'function') {\n context = (updater as (ctx: TContext) => TContext)(context);\n } else {\n context = { ...context, ...updater };\n }\n },\n\n async send(\n event: TransitionEvent,\n payload?: any,\n options: SendOptions<TContext> = {}\n ): Promise<boolean> {\n const { force = false, target, guard: inlineGuard, fallback } = options;\n\n // Force transition\n if (force && allowForce) {\n const targetState = target ?? initial;\n await doTransition(event, targetState, payload, true);\n return true;\n }\n\n // Get transition from state definition\n const transition = getTransition(event);\n\n // No transition defined\n if (!transition) {\n if (force && !allowForce) {\n throw new Error(`Force transitions not allowed on machine \"${prefix}\"`);\n }\n return false;\n }\n\n // Check guard\n const guardFn = inlineGuard ?? transition.guard;\n if (guardFn && !guardFn(context, event, payload)) {\n // Guard rejected\n await emitFSM('guard:rejected', {\n state: currentState,\n event,\n payload,\n });\n\n // Use fallback if provided\n if (fallback) {\n if (!states[fallback]) {\n throw new Error(`Invalid fallback state \"${fallback}\" - not defined in states`);\n }\n await doTransition(event, fallback, payload, false);\n return true;\n }\n\n return false;\n }\n\n // Execute transition actions\n if (transition.actions) {\n const actions = Array.isArray(transition.actions)\n ? transition.actions\n : [transition.actions];\n for (const action of actions) {\n await action(context, event, payload);\n }\n }\n\n // Do the transition\n await doTransition(event, transition.target, payload, false);\n return true;\n },\n\n can(event: TransitionEvent): boolean {\n return getTransition(event) !== null;\n },\n\n transitions(): TransitionEvent[] {\n const stateNode = states[currentState];\n if (!stateNode?.on) return [];\n return Object.keys(stateNode.on);\n },\n\n toJSON(): MachineSnapshot<TContext> {\n return {\n state: currentState,\n context: structuredClone(context),\n history: trackHistory ? [...history] : undefined,\n };\n },\n\n restore(snapshot: MachineSnapshot<TContext>): void {\n if (!states[snapshot.state]) {\n throw new Error(`Invalid snapshot state \"${snapshot.state}\" - not defined in states`);\n }\n currentState = snapshot.state;\n context = snapshot.context;\n if (snapshot.history) {\n history = [...snapshot.history];\n }\n },\n\n waitFor(\n targetState: StateName,\n options?: { timeout?: number }\n ): Promise<{\n state: StateName;\n from?: StateName;\n event?: TransitionEvent;\n context: TContext;\n }> {\n // Already in target state\n if (currentState === targetState) {\n return Promise.resolve({\n state: currentState,\n context: structuredClone(context),\n });\n }\n\n return new Promise((resolve, reject) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n // Listen for enter event on target state\n const unbind = kernel.on(\n `${prefix}:enter:${targetState}` as any,\n (event: any) => {\n if (timeoutId) clearTimeout(timeoutId);\n unbind();\n resolve({\n state: targetState,\n from: event.data?.from,\n event: event.data?.event,\n context: structuredClone(context),\n });\n }\n );\n\n // Track cleanup\n cleanupFns.push(unbind);\n\n if (options?.timeout) {\n timeoutId = setTimeout(() => {\n unbind();\n reject(new Error(`waitFor('${targetState}') timed out after ${options.timeout}ms`));\n }, options.timeout);\n }\n });\n },\n\n destroy(): void {\n for (const cleanup of cleanupFns) {\n cleanup();\n }\n cleanupFns.length = 0;\n },\n };\n\n // Emit initial enter event (unless restoring from snapshot)\n if (!snapshot) {\n // Schedule initial enter event for next tick to allow listeners to be set up\n setTimeout(async () => {\n const initialNode = states[initial];\n await emitFSM(`enter:${initial}`, {\n state: initial,\n });\n if (initialNode?.entry) {\n await initialNode.entry(context, '__INIT__', undefined);\n }\n }, 0);\n }\n\n return machine;\n}\n\n/**\n * Type helper for defining typed machine configs\n */\nexport function defineMachine<TContext = Record<string, any>>(\n config: Omit<MachineConfig<TContext>, 'prefix'>\n): Omit<MachineConfig<TContext>, 'prefix'> {\n return config;\n}\n","/**\n * createMachine - High-level FSM factory\n *\n * Standalone state machine with declarative behaviors.\n * Can work independently or connect to a kernel.\n */\n\nimport { Kernel } from '../kernel.js';\nimport { useMachine } from './machine.js';\nimport type { Machine, MachineConfig } from './types.js';\n\n/**\n * Built-in helpers (always available)\n */\nexport interface BuiltInHelpers<TContext = Record<string, unknown>> {\n /** Merge into context */\n set: (partial: Partial<TContext>) => void;\n /** Trigger transition */\n send: (event: string, payload?: unknown) => void;\n /** Log message (default: console.log) */\n log: (message: string) => void;\n}\n\n/**\n * Behavior helpers passed to callbacks (built-ins + custom)\n */\nexport type BehaviorHelpers<TContext = Record<string, unknown>, TCustom = Record<string, unknown>> =\n BuiltInHelpers<TContext> & TCustom;\n\n/**\n * Behavior callback\n */\nexport type BehaviorFn<TContext = Record<string, unknown>> = (\n ctx: TContext,\n helpers: BehaviorHelpers<TContext>\n) => void | Promise<void>;\n\n/**\n * Timer/after definition\n */\nexport interface AfterDef {\n /** Event to send */\n send: string;\n /** Delay in ms */\n delay: number;\n}\n\n/**\n * State-centric state definition\n */\nexport interface StateConfig<TContext = Record<string, unknown>> {\n /** Transitions: { EVENT: 'target' } or { EVENT: { target: 'x', cond: 'guard' } } */\n on?: Record<string, string | { target: string; cond?: string }>;\n /** Action on entering this state */\n entry?: BehaviorFn<TContext>;\n /** Action on exiting this state */\n exit?: BehaviorFn<TContext>;\n /** Auto-transition after delay: { delay: 3000, send: 'TIMER' } */\n after?: AfterDef;\n}\n\n/**\n * High-level machine config (state-centric)\n */\nexport interface CreateMachineConfig<TContext = Record<string, unknown>, THelpers = Record<string, unknown>> {\n /** Machine identifier */\n id: string;\n\n /** Initial state */\n initial: string;\n\n /** Initial context */\n context?: TContext;\n\n /** State definitions with entry/exit/after inline */\n states: Record<string, StateConfig<TContext>>;\n\n /** Global event handlers: { EVENT_NAME: (ctx, helpers) => ... } */\n on?: Record<string, BehaviorFn<TContext>>;\n\n /** Custom helpers merged with built-ins (set, send) */\n helpers?: THelpers;\n}\n\n/**\n * Extended machine interface with behaviors\n */\nexport interface BehaviorMachine<TContext = Record<string, unknown>> extends Machine<TContext> {\n /** Machine ID */\n readonly id: string;\n\n /** Current state (getter) */\n readonly state: string;\n\n /** Current context (getter) */\n readonly context: TContext;\n}\n\n/**\n * Create a standalone state machine with behaviors (state-centric)\n *\n * @example\n * ```ts\n * const order = createMachine({\n * id: 'order',\n * initial: 'draft',\n * context: { items: 0, total: 0 },\n *\n * states: {\n * draft: {\n * on: { ADD_ITEM: 'draft', SUBMIT: 'pending' }\n * },\n * pending: {\n * entry: (ctx, { log }) => log('Order pending...'),\n * on: { APPROVE: 'confirmed', REJECT: 'draft' }\n * },\n * confirmed: {\n * entry: (ctx, { log }) => log(`Order confirmed: ${ctx.items} items`),\n * on: { SHIP: 'shipped' }\n * },\n * processing: {\n * after: { delay: 2000, send: 'COMPLETE' },\n * on: { COMPLETE: 'done' }\n * },\n * shipped: {},\n * },\n *\n * // Global event handlers (optional)\n * on: {\n * ADD_ITEM: (ctx, { set }) => {\n * set({ items: ctx.items + 1, total: ctx.total + 29.99 });\n * },\n * },\n * });\n *\n * order.send('ADD_ITEM');\n * order.send('SUBMIT');\n * console.log(order.state); // 'pending'\n * console.log(order.context); // { items: 1, total: 29.99 }\n * ```\n */\nexport function createMachine<TContext = Record<string, unknown>>(\n config: CreateMachineConfig<TContext>\n): BehaviorMachine<TContext> {\n const {\n id,\n initial,\n context: initialContext,\n states,\n on: eventHandlers = {},\n helpers: customHelpers = {},\n } = config;\n\n // Create internal kernel\n const kernel = new Kernel();\n\n // Active timers for cleanup\n const activeTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n // Convert to MachineConfig format\n const machineConfig: MachineConfig<TContext> = {\n prefix: id,\n initial,\n context: initialContext,\n states: {},\n trackHistory: true,\n };\n\n // Convert states (extract only transitions for base machine)\n for (const [stateName, stateDef] of Object.entries(states)) {\n machineConfig.states[stateName] = {\n on: stateDef.on ? { ...stateDef.on } : undefined,\n };\n }\n\n // Create base machine\n const baseMachine = useMachine<TContext>(kernel, machineConfig);\n\n // Create helpers factory (built-ins + custom)\n const createHelpers = () => ({\n // Built-ins\n set: (partial: Partial<TContext>) => baseMachine.setContext(partial),\n send: (event: string, payload?: unknown) => baseMachine.send(event, payload),\n log: console.log,\n // Custom helpers (can override built-ins)\n ...customHelpers,\n });\n\n // Register behavior handlers\n // Entry handlers (read from each state's entry property)\n kernel.on(`${id}:enter:*`, async (e: any) => {\n const stateName = e.data?.state;\n if (!stateName) return;\n\n // Clear any existing timer for previous state\n activeTimers.forEach((timer, key) => {\n if (!key.startsWith(stateName + ':')) {\n clearTimeout(timer);\n activeTimers.delete(key);\n }\n });\n\n // Get state config\n const stateConfig = states[stateName];\n if (!stateConfig) return;\n\n // Call entry handler\n if (stateConfig.entry) {\n await stateConfig.entry(baseMachine.getContext(), createHelpers());\n }\n\n // Set up after timer if defined\n if (stateConfig.after) {\n const timerId = setTimeout(() => {\n baseMachine.send(stateConfig.after!.send);\n activeTimers.delete(stateName + ':timer');\n }, stateConfig.after.delay);\n activeTimers.set(stateName + ':timer', timerId);\n }\n });\n\n // Exit handlers (read from each state's exit property)\n kernel.on(`${id}:exit:*`, async (e: any) => {\n const stateName = e.data?.state;\n if (!stateName) return;\n\n // Clear timer\n const timerId = activeTimers.get(stateName + ':timer');\n if (timerId) {\n clearTimeout(timerId);\n activeTimers.delete(stateName + ':timer');\n }\n\n // Get state config\n const stateConfig = states[stateName];\n if (!stateConfig) return;\n\n // Call exit handler\n if (stateConfig.exit) {\n await stateConfig.exit(baseMachine.getContext(), createHelpers());\n }\n });\n\n // Global event handlers\n kernel.on(`${id}:transition`, async (e: any) => {\n const event = e.data?.event;\n if (!event) return;\n\n const handler = eventHandlers[event];\n if (handler) {\n await handler(baseMachine.getContext(), createHelpers());\n }\n });\n\n // Build extended machine\n const machine: BehaviorMachine<TContext> = {\n ...baseMachine,\n id,\n\n get state() {\n return baseMachine.getState();\n },\n\n get context() {\n return baseMachine.getContext();\n },\n\n destroy() {\n // Clear all timers\n activeTimers.forEach((timer) => clearTimeout(timer));\n activeTimers.clear();\n baseMachine.destroy();\n },\n };\n\n return machine;\n}\n","/**\n * XState Import Helper\n *\n * Converts XState machine definitions to quarkernel FSM format.\n * Supports basic XState v4/v5 machine structures.\n */\n\nimport type { MachineConfig, StateNode, TransitionDef, GuardFunction, ActionFunction } from '../fsm/types.js';\n\n/**\n * XState-like state node (simplified)\n */\ninterface XStateNode {\n on?: Record<string, string | XStateTransition>;\n entry?: string | string[] | XStateAction | XStateAction[];\n exit?: string | string[] | XStateAction | XStateAction[];\n always?: XStateTransition | XStateTransition[];\n after?: Record<string, string | XStateTransition>;\n meta?: Record<string, any>;\n}\n\n/**\n * XState-like transition\n */\ninterface XStateTransition {\n target?: string;\n cond?: string | XStateGuard;\n guard?: string | XStateGuard; // v5 uses guard instead of cond\n actions?: string | string[] | XStateAction | XStateAction[];\n}\n\n/**\n * XState guard definition\n */\ninterface XStateGuard {\n type: string;\n [key: string]: any;\n}\n\n/**\n * XState action definition\n */\ninterface XStateAction {\n type: string;\n [key: string]: any;\n}\n\n/**\n * XState-like machine config\n */\nexport interface XStateMachineConfig {\n id?: string;\n initial: string;\n context?: Record<string, any>;\n states: Record<string, XStateNode>;\n}\n\n/**\n * Import options\n */\nexport interface ImportOptions<TContext = any> {\n /** Machine prefix (required for quarkernel) */\n prefix: string;\n\n /** Guard implementations (keyed by guard name/type) */\n guards?: Record<string, GuardFunction<TContext>>;\n\n /** Action implementations (keyed by action name/type) */\n actions?: Record<string, ActionFunction<TContext>>;\n\n /** Allow force transitions */\n allowForce?: boolean;\n\n /** Track history */\n trackHistory?: boolean;\n}\n\n/**\n * Convert XState machine config to quarkernel format\n *\n * @param xstateConfig - XState machine configuration\n * @param options - Import options with implementations\n * @returns quarkernel MachineConfig\n *\n * @example\n * ```ts\n * // XState format\n * const xstateMachine = {\n * id: 'order',\n * initial: 'draft',\n * context: { retries: 0 },\n * states: {\n * draft: { on: { SUBMIT: 'pending' } },\n * pending: {\n * on: {\n * APPROVE: { target: 'confirmed', cond: 'canApprove' },\n * REJECT: 'draft'\n * }\n * },\n * confirmed: {}\n * }\n * };\n *\n * // Convert to quarkernel\n * const config = fromXState(xstateMachine, {\n * prefix: 'order',\n * guards: {\n * canApprove: (ctx) => ctx.retries < 3\n * }\n * });\n *\n * const machine = useMachine(kernel, config);\n * ```\n */\nexport function fromXState<TContext = Record<string, any>>(\n xstateConfig: XStateMachineConfig,\n options: ImportOptions<TContext>\n): MachineConfig<TContext> {\n const { prefix, guards = {}, actions = {}, allowForce, trackHistory } = options;\n\n const states: Record<string, StateNode<TContext>> = {};\n\n for (const [stateName, xstateNode] of Object.entries(xstateConfig.states)) {\n const stateNode: StateNode<TContext> = {};\n\n // Convert transitions\n if (xstateNode.on) {\n stateNode.on = {};\n\n for (const [event, transition] of Object.entries(xstateNode.on)) {\n if (typeof transition === 'string') {\n // Simple string target\n stateNode.on[event] = transition;\n } else {\n // Object transition with target, guard, actions\n const transitionDef: TransitionDef<TContext> = {\n target: transition.target || stateName, // Self-transition if no target\n };\n\n // Convert guard (cond in v4, guard in v5)\n const guardRef = transition.cond || transition.guard;\n if (guardRef) {\n const guardName = typeof guardRef === 'string' ? guardRef : guardRef.type;\n const guardFn = guards[guardName];\n if (guardFn) {\n transitionDef.guard = guardFn;\n } else {\n console.warn(`Guard \"${guardName}\" not provided in options.guards`);\n }\n }\n\n // Convert actions\n if (transition.actions) {\n const actionRefs = Array.isArray(transition.actions)\n ? transition.actions\n : [transition.actions];\n\n const actionFns: ActionFunction<TContext>[] = [];\n for (const actionRef of actionRefs) {\n const actionName = typeof actionRef === 'string' ? actionRef : actionRef.type;\n const actionFn = actions[actionName];\n if (actionFn) {\n actionFns.push(actionFn);\n } else {\n console.warn(`Action \"${actionName}\" not provided in options.actions`);\n }\n }\n\n if (actionFns.length > 0) {\n transitionDef.actions = actionFns.length === 1 ? actionFns[0] : actionFns;\n }\n }\n\n stateNode.on[event] = transitionDef;\n }\n }\n }\n\n // Convert entry actions\n if (xstateNode.entry) {\n const entryRefs = Array.isArray(xstateNode.entry)\n ? xstateNode.entry\n : [xstateNode.entry];\n\n const entryFns: ActionFunction<TContext>[] = [];\n for (const actionRef of entryRefs) {\n const actionName = typeof actionRef === 'string' ? actionRef : actionRef.type;\n const actionFn = actions[actionName];\n if (actionFn) {\n entryFns.push(actionFn);\n }\n }\n\n if (entryFns.length > 0) {\n stateNode.entry = async (ctx, event, payload) => {\n for (const fn of entryFns) {\n await fn(ctx, event, payload);\n }\n };\n }\n }\n\n // Convert exit actions\n if (xstateNode.exit) {\n const exitRefs = Array.isArray(xstateNode.exit)\n ? xstateNode.exit\n : [xstateNode.exit];\n\n const exitFns: ActionFunction<TContext>[] = [];\n for (const actionRef of exitRefs) {\n const actionName = typeof actionRef === 'string' ? actionRef : actionRef.type;\n const actionFn = actions[actionName];\n if (actionFn) {\n exitFns.push(actionFn);\n }\n }\n\n if (exitFns.length > 0) {\n stateNode.exit = async (ctx, event, payload) => {\n for (const fn of exitFns) {\n await fn(ctx, event, payload);\n }\n };\n }\n }\n\n states[stateName] = stateNode;\n }\n\n return {\n prefix,\n initial: xstateConfig.initial,\n context: xstateConfig.context as TContext,\n states,\n allowForce,\n trackHistory,\n };\n}\n\n/**\n * Export quarkernel machine config to XState-compatible format\n * Useful for visualization tools that understand XState format\n *\n * @param config - quarkernel MachineConfig\n * @returns XState-compatible config (without function implementations)\n */\nexport function toXStateFormat<TContext = any>(\n config: MachineConfig<TContext>\n): XStateMachineConfig {\n const states: Record<string, XStateNode> = {};\n\n for (const [stateName, stateNode] of Object.entries(config.states)) {\n const xstateNode: XStateNode = {};\n\n if (stateNode.on) {\n xstateNode.on = {};\n\n for (const [event, transition] of Object.entries(stateNode.on)) {\n if (typeof transition === 'string') {\n xstateNode.on[event] = transition;\n } else {\n const xstateTransition: XStateTransition = {\n target: transition.target,\n };\n\n // Note: guard and action functions can't be serialized\n // We just mark that they exist\n if (transition.guard) {\n xstateTransition.guard = { type: 'guard' };\n }\n if (transition.actions) {\n xstateTransition.actions = { type: 'action' };\n }\n\n xstateNode.on[event] = xstateTransition;\n }\n }\n }\n\n if (stateNode.entry) {\n xstateNode.entry = { type: 'entry' };\n }\n\n if (stateNode.exit) {\n xstateNode.exit = { type: 'exit' };\n }\n\n states[stateName] = xstateNode;\n }\n\n return {\n id: config.prefix,\n initial: config.initial,\n context: config.context as Record<string, any>,\n states,\n };\n}\n","/**\n * XState <-> FSM Behaviors Conversion\n *\n * Converts between QuarKernel FSM (state-centric) and XState format.\n */\n\nimport type { CreateMachineConfig } from '../fsm/create-machine.js';\n\n/**\n * XState config with actions\n */\nexport interface XStateConfigWithActions {\n id: string;\n initial: string;\n context?: Record<string, unknown>;\n states: Record<string, {\n entry?: string | string[];\n exit?: string | string[];\n on?: Record<string, string | { target: string; actions?: string | string[] }>;\n after?: Record<number, { target?: string; actions?: string | string[] }>;\n }>;\n}\n\n/**\n * Format state-centric FSM config as JavaScript code string\n *\n * @example\n * ```ts\n * const code = formatStateCentricCode(config);\n * // Returns formatted JS code string with entry/exit/after inline in states\n * ```\n */\nexport function formatStateCentricCode<TContext = Record<string, unknown>>(\n config: CreateMachineConfig<TContext>\n): string {\n const { id, initial, context, states, on: globalHandlers } = config;\n\n const lines: string[] = [\n `// FSM Definition for \"${id}\"`,\n `// Helpers: ctx, set(obj), send(event), log(msg)`,\n '',\n `export default {`,\n ` id: '${id}',`,\n ` initial: '${initial}',`,\n ];\n\n // Context\n if (context && Object.keys(context).length > 0) {\n lines.push(` context: ${JSON.stringify(context)},`);\n }\n\n // States\n lines.push(' states: {');\n for (const [stateName, stateConfig] of Object.entries(states)) {\n lines.push(` ${stateName}: {`);\n\n // entry\n if (stateConfig.entry) {\n lines.push(` entry: ${stateConfig.entry.toString()},`);\n }\n\n // exit\n if (stateConfig.exit) {\n lines.push(` exit: ${stateConfig.exit.toString()},`);\n }\n\n // after\n if (stateConfig.after) {\n lines.push(` after: { delay: ${stateConfig.after.delay}, send: '${stateConfig.after.send}' },`);\n }\n\n // on (transitions)\n if (stateConfig.on && Object.keys(stateConfig.on).length > 0) {\n lines.push(' on: {');\n for (const [event, target] of Object.entries(stateConfig.on)) {\n if (typeof target === 'string') {\n lines.push(` ${event}: '${target}',`);\n } else {\n lines.push(` ${event}: { target: '${target.target}'${target.cond ? `, cond: '${target.cond}'` : ''} },`);\n }\n }\n lines.push(' },');\n }\n\n lines.push(' },');\n }\n lines.push(' },');\n\n // Global event handlers\n if (globalHandlers && Object.keys(globalHandlers).length > 0) {\n lines.push(' on: {');\n for (const [event, fn] of Object.entries(globalHandlers)) {\n lines.push(` ${event}: ${fn.toString()},`);\n }\n lines.push(' },');\n }\n\n lines.push('};');\n return lines.join('\\n');\n}\n","/**\n * QuarKernel v2 - Micro Custom Events Kernel\n *\n * A TypeScript event kernel with unique features:\n * - Dependency-ordered listeners\n * - Shared context between listeners\n * - Composite events with context merging\n * - AbortSignal support for cleanup\n * - Wildcard pattern matching\n * - Zero runtime dependencies\n */\n\nexport const VERSION = '2.2.0';\n\n// Core exports\nexport { KernelEvent } from './kernel-event.js';\nexport { Kernel, createKernel } from './kernel.js';\nexport { ListenerContext } from './listener-context.js';\n\n// Composition\nexport { Composition, createComposition, createNamespacedMerger, createOverrideMerger } from './composition/index.js';\nexport type { EventName as CompositionEventName, ContextMerger, ConflictInfo, CompositionOptions } from './composition/index.js';\n\n// Export all types and interfaces\nexport type {\n EventName,\n EventData,\n EventMap,\n IKernelEvent,\n IKernel,\n IListenerContext,\n ListenerFunction,\n PredicateFunction,\n ListenerOptions,\n ListenerEntry,\n KernelOptions,\n EventStack,\n CompositionFactory,\n IComposition,\n ContextMergerFunction,\n EventNames,\n EventDataType,\n UnbindFunction,\n} from './types';\n\n// Export type guards\nexport {\n isEventName,\n isListenerFunction,\n isPredicateFunction,\n isContextMerger,\n isContextMergerFunction,\n isListenerOptions,\n isKernelEvent,\n} from './types';\n\n// Export error classes\nexport {\n CircularDependencyError,\n MissingDependencyError,\n MaxListenersExceededError,\n} from './types';\n\n// Internal utilities\nexport { toposort, CyclicDependencyError, type TopoNode } from './toposort.js';\n\n// FSM - State Machine Layer\nexport { useMachine, defineMachine, createMachine } from './fsm/index.js';\nexport type {\n MachineConfig,\n Machine,\n MachineSnapshot,\n StateNode,\n TransitionDef,\n SendOptions,\n FSMEventData,\n StateName,\n TransitionEvent,\n GuardFunction,\n ActionFunction,\n CreateMachineConfig,\n StateConfig,\n BehaviorMachine,\n BehaviorFn,\n BehaviorHelpers,\n BuiltInHelpers,\n AfterDef,\n} from './fsm/index.js';\n\n// XState interop (separate sub-package: @quazardous/quarkernel/xstate)\nexport { fromXState, toXStateFormat, formatStateCentricCode } from './xstate/index.js';\nexport type { XStateMachineConfig, ImportOptions, XStateConfigWithActions } from './xstate/index.js';\n"]}
|