@esengine/fsm 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/StateMachine.ts","../src/tokens.ts","../src/nodes/StateMachineNodes.ts"],"sourcesContent":["/**\n * @zh 状态机实现\n * @en State Machine Implementation\n *\n * @zh 提供有限状态机的默认实现\n * @en Provides default implementation for finite state machine\n */\n\nimport type {\n IStateMachine,\n StateConfig,\n TransitionConfig,\n TransitionCondition,\n StateChangeEvent,\n StateChangeListener\n} from './IStateMachine';\n\n// =============================================================================\n// 状态机配置 | State Machine Configuration\n// =============================================================================\n\n/**\n * @zh 状态机配置选项\n * @en State machine configuration options\n */\nexport interface StateMachineOptions<TContext = unknown> {\n /**\n * @zh 上下文对象\n * @en Context object\n */\n context?: TContext;\n\n /**\n * @zh 最大历史记录数量\n * @en Maximum history size\n */\n maxHistorySize?: number;\n\n /**\n * @zh 是否启用历史记录\n * @en Whether to enable history\n */\n enableHistory?: boolean;\n}\n\n// =============================================================================\n// 状态机实现 | State Machine Implementation\n// =============================================================================\n\n/**\n * @zh 状态机实现\n * @en State machine implementation\n */\nexport class StateMachine<TState extends string = string, TContext = unknown>\n implements IStateMachine<TState, TContext>\n{\n private _current: TState;\n private _previous: TState | null = null;\n private _context: TContext;\n private _isTransitioning = false;\n private _stateStartTime = 0;\n\n private states: Map<TState, StateConfig<TState, TContext>> = new Map();\n private transitions: Map<TState, TransitionConfig<TState, TContext>[]> = new Map();\n\n private enterListeners: Map<TState, Set<(from: TState | null) => void>> = new Map();\n private exitListeners: Map<TState, Set<(to: TState) => void>> = new Map();\n private changeListeners: Set<StateChangeListener<TState>> = new Set();\n\n private history: StateChangeEvent<TState>[] = [];\n private maxHistorySize: number;\n private enableHistory: boolean;\n\n constructor(initialState: TState, options: StateMachineOptions<TContext> = {}) {\n this._current = initialState;\n this._context = (options.context ?? {}) as TContext;\n this.maxHistorySize = options.maxHistorySize ?? 100;\n this.enableHistory = options.enableHistory ?? true;\n this._stateStartTime = Date.now();\n\n // Auto-define initial state if not defined\n this.defineState(initialState);\n }\n\n // =========================================================================\n // 属性 | Properties\n // =========================================================================\n\n get current(): TState {\n return this._current;\n }\n\n get previous(): TState | null {\n return this._previous;\n }\n\n get context(): TContext {\n return this._context;\n }\n\n get isTransitioning(): boolean {\n return this._isTransitioning;\n }\n\n get currentStateDuration(): number {\n return Date.now() - this._stateStartTime;\n }\n\n // =========================================================================\n // 状态定义 | State Definition\n // =========================================================================\n\n defineState(state: TState, config?: Partial<StateConfig<TState, TContext>>): void {\n const stateConfig: StateConfig<TState, TContext> = {\n name: state,\n ...config\n };\n this.states.set(state, stateConfig);\n }\n\n hasState(state: TState): boolean {\n return this.states.has(state);\n }\n\n getStateConfig(state: TState): StateConfig<TState, TContext> | undefined {\n return this.states.get(state);\n }\n\n getStates(): TState[] {\n return Array.from(this.states.keys());\n }\n\n // =========================================================================\n // 转换定义 | Transition Definition\n // =========================================================================\n\n defineTransition(\n from: TState,\n to: TState,\n condition?: TransitionCondition<TContext>,\n priority = 0\n ): void {\n if (!this.transitions.has(from)) {\n this.transitions.set(from, []);\n }\n\n const transitions = this.transitions.get(from)!;\n\n // Remove existing transition with same from/to\n const existingIndex = transitions.findIndex(t => t.to === to);\n if (existingIndex >= 0) {\n transitions.splice(existingIndex, 1);\n }\n\n transitions.push({\n from,\n to,\n condition,\n priority\n });\n\n // Sort by priority (descending)\n transitions.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));\n }\n\n removeTransition(from: TState, to: TState): void {\n const transitions = this.transitions.get(from);\n if (transitions) {\n const index = transitions.findIndex(t => t.to === to);\n if (index >= 0) {\n transitions.splice(index, 1);\n }\n }\n }\n\n getTransitionsFrom(from: TState): TransitionConfig<TState, TContext>[] {\n return this.transitions.get(from) ?? [];\n }\n\n // =========================================================================\n // 转换操作 | Transition Operations\n // =========================================================================\n\n canTransition(to: TState): boolean {\n if (this._isTransitioning) {\n return false;\n }\n\n if (this._current === to) {\n return false;\n }\n\n const transitions = this.transitions.get(this._current);\n if (!transitions) {\n return true; // Allow if no restrictions defined\n }\n\n const transition = transitions.find(t => t.to === to);\n if (!transition) {\n return true; // Allow if no specific transition defined\n }\n\n if (transition.condition) {\n return transition.condition(this._context);\n }\n\n return true;\n }\n\n transition(to: TState, force = false): boolean {\n if (this._isTransitioning) {\n console.warn('StateMachine: Cannot transition while already transitioning');\n return false;\n }\n\n if (this._current === to) {\n return false;\n }\n\n if (!force && !this.canTransition(to)) {\n return false;\n }\n\n this.performTransition(to);\n return true;\n }\n\n evaluateTransitions(): boolean {\n if (this._isTransitioning) {\n return false;\n }\n\n const transitions = this.transitions.get(this._current);\n if (!transitions || transitions.length === 0) {\n return false;\n }\n\n for (const transition of transitions) {\n if (!transition.condition || transition.condition(this._context)) {\n this.performTransition(transition.to);\n return true;\n }\n }\n\n return false;\n }\n\n private performTransition(to: TState): void {\n this._isTransitioning = true;\n\n const from = this._current;\n\n // Exit current state\n const currentConfig = this.states.get(from);\n if (currentConfig?.onExit) {\n try {\n currentConfig.onExit(this._context, to);\n } catch (error) {\n console.error(`StateMachine: Error in onExit for state '${from}':`, error);\n }\n }\n\n // Notify exit listeners\n const exitListeners = this.exitListeners.get(from);\n if (exitListeners) {\n for (const listener of exitListeners) {\n try {\n listener(to);\n } catch (error) {\n console.error(`StateMachine: Error in exit listener for state '${from}':`, error);\n }\n }\n }\n\n // Update state\n this._previous = from;\n this._current = to;\n this._stateStartTime = Date.now();\n\n // Record history\n if (this.enableHistory) {\n const event: StateChangeEvent<TState> = {\n from,\n to,\n timestamp: this._stateStartTime\n };\n this.history.push(event);\n\n if (this.history.length > this.maxHistorySize) {\n this.history.shift();\n }\n\n // Notify change listeners\n for (const listener of this.changeListeners) {\n try {\n listener(event);\n } catch (error) {\n console.error('StateMachine: Error in change listener:', error);\n }\n }\n }\n\n // Enter new state\n const newConfig = this.states.get(to);\n if (newConfig?.onEnter) {\n try {\n newConfig.onEnter(this._context, from);\n } catch (error) {\n console.error(`StateMachine: Error in onEnter for state '${to}':`, error);\n }\n }\n\n // Notify enter listeners\n const enterListeners = this.enterListeners.get(to);\n if (enterListeners) {\n for (const listener of enterListeners) {\n try {\n listener(from);\n } catch (error) {\n console.error(`StateMachine: Error in enter listener for state '${to}':`, error);\n }\n }\n }\n\n this._isTransitioning = false;\n }\n\n // =========================================================================\n // 生命周期 | Lifecycle\n // =========================================================================\n\n update(deltaTime: number): void {\n const config = this.states.get(this._current);\n if (config?.onUpdate) {\n try {\n config.onUpdate(this._context, deltaTime);\n } catch (error) {\n console.error(`StateMachine: Error in onUpdate for state '${this._current}':`, error);\n }\n }\n }\n\n reset(initialState?: TState): void {\n const targetState = initialState ?? this._current;\n\n this._previous = null;\n this._current = targetState;\n this._stateStartTime = Date.now();\n this._isTransitioning = false;\n\n this.clearHistory();\n }\n\n // =========================================================================\n // 事件监听 | Event Listening\n // =========================================================================\n\n onEnter(state: TState, callback: (from: TState | null) => void): () => void {\n if (!this.enterListeners.has(state)) {\n this.enterListeners.set(state, new Set());\n }\n this.enterListeners.get(state)!.add(callback);\n\n return () => {\n this.enterListeners.get(state)?.delete(callback);\n };\n }\n\n onExit(state: TState, callback: (to: TState) => void): () => void {\n if (!this.exitListeners.has(state)) {\n this.exitListeners.set(state, new Set());\n }\n this.exitListeners.get(state)!.add(callback);\n\n return () => {\n this.exitListeners.get(state)?.delete(callback);\n };\n }\n\n onChange(callback: StateChangeListener<TState>): () => void {\n this.changeListeners.add(callback);\n\n return () => {\n this.changeListeners.delete(callback);\n };\n }\n\n // =========================================================================\n // 调试 | Debug\n // =========================================================================\n\n getHistory(): StateChangeEvent<TState>[] {\n return [...this.history];\n }\n\n clearHistory(): void {\n this.history = [];\n }\n\n /**\n * @zh 获取状态机的调试信息\n * @en Get debug info for the state machine\n */\n getDebugInfo(): {\n current: TState;\n previous: TState | null;\n duration: number;\n stateCount: number;\n transitionCount: number;\n historySize: number;\n } {\n let transitionCount = 0;\n for (const transitions of this.transitions.values()) {\n transitionCount += transitions.length;\n }\n\n return {\n current: this._current,\n previous: this._previous,\n duration: this.currentStateDuration,\n stateCount: this.states.size,\n transitionCount,\n historySize: this.history.length\n };\n }\n}\n\n// =============================================================================\n// 工厂函数 | Factory Functions\n// =============================================================================\n\n/**\n * @zh 创建状态机\n * @en Create state machine\n *\n * @param initialState - @zh 初始状态 @en Initial state\n * @param options - @zh 配置选项 @en Configuration options\n * @returns @zh 状态机实例 @en State machine instance\n */\nexport function createStateMachine<TState extends string = string, TContext = unknown>(\n initialState: TState,\n options?: StateMachineOptions<TContext>\n): IStateMachine<TState, TContext> {\n return new StateMachine<TState, TContext>(initialState, options);\n}\n","/**\n * @zh 状态机服务令牌\n * @en State Machine Service Tokens\n */\n\nimport { createServiceToken } from '@esengine/ecs-framework';\nimport type { IStateMachine } from './IStateMachine';\n\n/**\n * @zh 状态机服务令牌\n * @en State machine service token\n *\n * @zh 用于注入状态机服务\n * @en Used for injecting state machine service\n */\nexport const StateMachineToken = createServiceToken<IStateMachine<string, unknown>>('stateMachine');\n","/**\n * @zh 状态机蓝图节点\n * @en State Machine Blueprint Nodes\n *\n * @zh 提供状态机功能的蓝图节点\n * @en Provides blueprint nodes for state machine functionality\n */\n\nimport type { BlueprintNodeTemplate, BlueprintNode, INodeExecutor, ExecutionResult } from '@esengine/blueprint';\nimport type { IStateMachine } from '../IStateMachine';\n\n// =============================================================================\n// 执行上下文接口 | Execution Context Interface\n// =============================================================================\n\n/**\n * @zh 状态机上下文\n * @en State machine context\n */\ninterface FSMContext {\n stateMachine: IStateMachine<string, unknown>;\n evaluateInput(nodeId: string, pinName: string, defaultValue?: unknown): unknown;\n setOutputs(nodeId: string, outputs: Record<string, unknown>): void;\n}\n\n// =============================================================================\n// GetCurrentState 节点 | GetCurrentState Node\n// =============================================================================\n\n/**\n * @zh GetCurrentState 节点模板\n * @en GetCurrentState node template\n */\nexport const GetCurrentStateTemplate: BlueprintNodeTemplate = {\n type: 'GetCurrentState',\n title: 'Get Current State',\n category: 'logic',\n description: 'Get current state of the state machine / 获取状态机当前状态',\n keywords: ['fsm', 'state', 'current', 'get'],\n menuPath: ['State Machine', 'Get Current State'],\n isPure: true,\n inputs: [],\n outputs: [\n {\n name: 'state',\n displayName: 'State',\n type: 'string'\n },\n {\n name: 'previous',\n displayName: 'Previous',\n type: 'string'\n },\n {\n name: 'duration',\n displayName: 'Duration (ms)',\n type: 'float'\n }\n ],\n color: '#8b5a8b'\n};\n\n/**\n * @zh GetCurrentState 节点执行器\n * @en GetCurrentState node executor\n */\nexport class GetCurrentStateExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: unknown): ExecutionResult {\n const ctx = context as FSMContext;\n const fsm = ctx.stateMachine;\n\n return {\n outputs: {\n state: fsm?.current ?? '',\n previous: fsm?.previous ?? '',\n duration: fsm?.currentStateDuration ?? 0\n }\n };\n }\n}\n\n// =============================================================================\n// TransitionTo 节点 | TransitionTo Node\n// =============================================================================\n\n/**\n * @zh TransitionTo 节点模板\n * @en TransitionTo node template\n */\nexport const TransitionToTemplate: BlueprintNodeTemplate = {\n type: 'TransitionTo',\n title: 'Transition To',\n category: 'logic',\n description: 'Transition to a new state / 转换到新状态',\n keywords: ['fsm', 'state', 'transition', 'change'],\n menuPath: ['State Machine', 'Transition To'],\n isPure: false,\n inputs: [\n {\n name: 'exec',\n displayName: '',\n type: 'exec'\n },\n {\n name: 'state',\n displayName: 'Target State',\n type: 'string',\n defaultValue: ''\n },\n {\n name: 'force',\n displayName: 'Force',\n type: 'bool',\n defaultValue: false\n }\n ],\n outputs: [\n {\n name: 'exec',\n displayName: '',\n type: 'exec'\n },\n {\n name: 'success',\n displayName: 'Success',\n type: 'bool'\n }\n ],\n color: '#8b5a8b'\n};\n\n/**\n * @zh TransitionTo 节点执行器\n * @en TransitionTo node executor\n */\nexport class TransitionToExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: unknown): ExecutionResult {\n const ctx = context as FSMContext;\n const state = ctx.evaluateInput(node.id, 'state', '') as string;\n const force = ctx.evaluateInput(node.id, 'force', false) as boolean;\n\n let success = false;\n if (state && ctx.stateMachine) {\n success = ctx.stateMachine.transition(state, force);\n }\n\n return {\n outputs: {\n success\n },\n nextExec: 'exec'\n };\n }\n}\n\n// =============================================================================\n// CanTransition 节点 | CanTransition Node\n// =============================================================================\n\n/**\n * @zh CanTransition 节点模板\n * @en CanTransition node template\n */\nexport const CanTransitionTemplate: BlueprintNodeTemplate = {\n type: 'CanTransition',\n title: 'Can Transition',\n category: 'logic',\n description: 'Check if can transition to state / 检查是否可以转换到状态',\n keywords: ['fsm', 'state', 'transition', 'can', 'check'],\n menuPath: ['State Machine', 'Can Transition'],\n isPure: true,\n inputs: [\n {\n name: 'state',\n displayName: 'Target State',\n type: 'string',\n defaultValue: ''\n }\n ],\n outputs: [\n {\n name: 'canTransition',\n displayName: 'Can Transition',\n type: 'bool'\n }\n ],\n color: '#8b5a8b'\n};\n\n/**\n * @zh CanTransition 节点执行器\n * @en CanTransition node executor\n */\nexport class CanTransitionExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: unknown): ExecutionResult {\n const ctx = context as FSMContext;\n const state = ctx.evaluateInput(node.id, 'state', '') as string;\n\n const canTransition = state ? ctx.stateMachine?.canTransition(state) ?? false : false;\n\n return {\n outputs: {\n canTransition\n }\n };\n }\n}\n\n// =============================================================================\n// IsInState 节点 | IsInState Node\n// =============================================================================\n\n/**\n * @zh IsInState 节点模板\n * @en IsInState node template\n */\nexport const IsInStateTemplate: BlueprintNodeTemplate = {\n type: 'IsInState',\n title: 'Is In State',\n category: 'logic',\n description: 'Check if currently in a specific state / 检查是否处于特定状态',\n keywords: ['fsm', 'state', 'is', 'check', 'current'],\n menuPath: ['State Machine', 'Is In State'],\n isPure: true,\n inputs: [\n {\n name: 'state',\n displayName: 'State',\n type: 'string',\n defaultValue: ''\n }\n ],\n outputs: [\n {\n name: 'isInState',\n displayName: 'Is In State',\n type: 'bool'\n }\n ],\n color: '#8b5a8b'\n};\n\n/**\n * @zh IsInState 节点执行器\n * @en IsInState node executor\n */\nexport class IsInStateExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: unknown): ExecutionResult {\n const ctx = context as FSMContext;\n const state = ctx.evaluateInput(node.id, 'state', '') as string;\n\n const isInState = state ? ctx.stateMachine?.current === state : false;\n\n return {\n outputs: {\n isInState\n }\n };\n }\n}\n\n// =============================================================================\n// WasInState 节点 | WasInState Node\n// =============================================================================\n\n/**\n * @zh WasInState 节点模板\n * @en WasInState node template\n */\nexport const WasInStateTemplate: BlueprintNodeTemplate = {\n type: 'WasInState',\n title: 'Was In State',\n category: 'logic',\n description: 'Check if was previously in a specific state / 检查之前是否处于特定状态',\n keywords: ['fsm', 'state', 'was', 'previous', 'check'],\n menuPath: ['State Machine', 'Was In State'],\n isPure: true,\n inputs: [\n {\n name: 'state',\n displayName: 'State',\n type: 'string',\n defaultValue: ''\n }\n ],\n outputs: [\n {\n name: 'wasInState',\n displayName: 'Was In State',\n type: 'bool'\n }\n ],\n color: '#8b5a8b'\n};\n\n/**\n * @zh WasInState 节点执行器\n * @en WasInState node executor\n */\nexport class WasInStateExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: unknown): ExecutionResult {\n const ctx = context as FSMContext;\n const state = ctx.evaluateInput(node.id, 'state', '') as string;\n\n const wasInState = state ? ctx.stateMachine?.previous === state : false;\n\n return {\n outputs: {\n wasInState\n }\n };\n }\n}\n\n// =============================================================================\n// GetStateDuration 节点 | GetStateDuration Node\n// =============================================================================\n\n/**\n * @zh GetStateDuration 节点模板\n * @en GetStateDuration node template\n */\nexport const GetStateDurationTemplate: BlueprintNodeTemplate = {\n type: 'GetStateDuration',\n title: 'Get State Duration',\n category: 'logic',\n description: 'Get how long current state has been active / 获取当前状态持续时间',\n keywords: ['fsm', 'state', 'duration', 'time'],\n menuPath: ['State Machine', 'Get State Duration'],\n isPure: true,\n inputs: [],\n outputs: [\n {\n name: 'duration',\n displayName: 'Duration (ms)',\n type: 'float'\n },\n {\n name: 'seconds',\n displayName: 'Seconds',\n type: 'float'\n }\n ],\n color: '#8b5a8b'\n};\n\n/**\n * @zh GetStateDuration 节点执行器\n * @en GetStateDuration node executor\n */\nexport class GetStateDurationExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: unknown): ExecutionResult {\n const ctx = context as FSMContext;\n const duration = ctx.stateMachine?.currentStateDuration ?? 0;\n\n return {\n outputs: {\n duration,\n seconds: duration / 1000\n }\n };\n }\n}\n\n// =============================================================================\n// EvaluateTransitions 节点 | EvaluateTransitions Node\n// =============================================================================\n\n/**\n * @zh EvaluateTransitions 节点模板\n * @en EvaluateTransitions node template\n */\nexport const EvaluateTransitionsTemplate: BlueprintNodeTemplate = {\n type: 'EvaluateTransitions',\n title: 'Evaluate Transitions',\n category: 'logic',\n description: 'Evaluate and execute automatic transitions / 评估并执行自动转换',\n keywords: ['fsm', 'state', 'transition', 'evaluate', 'auto'],\n menuPath: ['State Machine', 'Evaluate Transitions'],\n isPure: false,\n inputs: [\n {\n name: 'exec',\n displayName: '',\n type: 'exec'\n }\n ],\n outputs: [\n {\n name: 'exec',\n displayName: '',\n type: 'exec'\n },\n {\n name: 'transitioned',\n displayName: 'Transitioned',\n type: 'bool'\n }\n ],\n color: '#8b5a8b'\n};\n\n/**\n * @zh EvaluateTransitions 节点执行器\n * @en EvaluateTransitions node executor\n */\nexport class EvaluateTransitionsExecutor implements INodeExecutor {\n execute(_node: BlueprintNode, context: unknown): ExecutionResult {\n const ctx = context as FSMContext;\n const transitioned = ctx.stateMachine?.evaluateTransitions() ?? false;\n\n return {\n outputs: {\n transitioned\n },\n nextExec: 'exec'\n };\n }\n}\n\n// =============================================================================\n// ResetStateMachine 节点 | ResetStateMachine Node\n// =============================================================================\n\n/**\n * @zh ResetStateMachine 节点模板\n * @en ResetStateMachine node template\n */\nexport const ResetStateMachineTemplate: BlueprintNodeTemplate = {\n type: 'ResetStateMachine',\n title: 'Reset State Machine',\n category: 'logic',\n description: 'Reset state machine to initial state / 重置状态机到初始状态',\n keywords: ['fsm', 'state', 'reset', 'initial'],\n menuPath: ['State Machine', 'Reset'],\n isPure: false,\n inputs: [\n {\n name: 'exec',\n displayName: '',\n type: 'exec'\n },\n {\n name: 'state',\n displayName: 'Initial State',\n type: 'string',\n defaultValue: ''\n }\n ],\n outputs: [\n {\n name: 'exec',\n displayName: '',\n type: 'exec'\n }\n ],\n color: '#8b5a8b'\n};\n\n/**\n * @zh ResetStateMachine 节点执行器\n * @en ResetStateMachine node executor\n */\nexport class ResetStateMachineExecutor implements INodeExecutor {\n execute(node: BlueprintNode, context: unknown): ExecutionResult {\n const ctx = context as FSMContext;\n const state = ctx.evaluateInput(node.id, 'state', '') as string;\n\n if (ctx.stateMachine) {\n ctx.stateMachine.reset(state || undefined);\n }\n\n return {\n outputs: {},\n nextExec: 'exec'\n };\n }\n}\n\n// =============================================================================\n// 节点定义集合 | Node Definition Collection\n// =============================================================================\n\n/**\n * @zh 状态机节点定义\n * @en State machine node definitions\n */\nexport const StateMachineNodeDefinitions = [\n { template: GetCurrentStateTemplate, executor: new GetCurrentStateExecutor() },\n { template: TransitionToTemplate, executor: new TransitionToExecutor() },\n { template: CanTransitionTemplate, executor: new CanTransitionExecutor() },\n { template: IsInStateTemplate, executor: new IsInStateExecutor() },\n { template: WasInStateTemplate, executor: new WasInStateExecutor() },\n { template: GetStateDurationTemplate, executor: new GetStateDurationExecutor() },\n { template: EvaluateTransitionsTemplate, executor: new EvaluateTransitionsExecutor() },\n { template: ResetStateMachineTemplate, executor: new ResetStateMachineExecutor() }\n];\n"],"mappings":"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","names":["StateMachine","initialState","options","_current","_previous","_context","_isTransitioning","_stateStartTime","states","Map","transitions","enterListeners","exitListeners","changeListeners","Set","history","maxHistorySize","enableHistory","context","Date","now","defineState","current","previous","isTransitioning","currentStateDuration","state","config","stateConfig","name","set","hasState","has","getStateConfig","get","getStates","Array","from","keys","defineTransition","to","condition","priority","existingIndex","findIndex","t","splice","push","sort","a","b","removeTransition","index","getTransitionsFrom","canTransition","transition","find","force","console","warn","performTransition","evaluateTransitions","length","currentConfig","onExit","error","listener","event","timestamp","shift","newConfig","onEnter","update","deltaTime","onUpdate","reset","targetState","clearHistory","callback","add","delete","onChange","getHistory","getDebugInfo","transitionCount","values","duration","stateCount","size","historySize","createStateMachine","createServiceToken","StateMachineToken","GetCurrentStateTemplate","type","title","category","description","keywords","menuPath","isPure","inputs","outputs","name","displayName","color","GetCurrentStateExecutor","execute","node","context","ctx","fsm","stateMachine","state","current","previous","duration","currentStateDuration","TransitionToTemplate","defaultValue","TransitionToExecutor","evaluateInput","id","force","success","transition","nextExec","CanTransitionTemplate","CanTransitionExecutor","canTransition","IsInStateTemplate","IsInStateExecutor","isInState","WasInStateTemplate","WasInStateExecutor","wasInState","GetStateDurationTemplate","GetStateDurationExecutor","_node","seconds","EvaluateTransitionsTemplate","EvaluateTransitionsExecutor","transitioned","evaluateTransitions","ResetStateMachineTemplate","ResetStateMachineExecutor","reset","undefined","StateMachineNodeDefinitions","template","executor"]}
package/module.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "id": "fsm",
3
+ "name": "@esengine/fsm",
4
+ "globalKey": "fsm",
5
+ "displayName": "State Machine",
6
+ "description": "有限状态机 | Finite State Machine",
7
+ "version": "1.0.0",
8
+ "category": "AI",
9
+ "icon": "GitBranch",
10
+ "tags": ["fsm", "state", "machine", "ai"],
11
+ "isCore": false,
12
+ "defaultEnabled": true,
13
+ "isEngineModule": true,
14
+ "canContainContent": false,
15
+ "platforms": ["web", "desktop"],
16
+ "dependencies": ["core"],
17
+ "exports": {
18
+ "components": ["StateMachineComponent"],
19
+ "systems": []
20
+ },
21
+ "outputPath": "dist/index.js",
22
+ "pluginExport": "FSMPlugin"
23
+ }
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@esengine/fsm",
3
+ "version": "1.0.0",
4
+ "description": "Finite State Machine for ECS Framework / ECS 框架的有限状态机",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "module.json"
18
+ ],
19
+ "dependencies": {
20
+ "tslib": "^2.8.1"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^20.19.17",
24
+ "rimraf": "^5.0.0",
25
+ "tsup": "^8.0.0",
26
+ "typescript": "^5.8.3",
27
+ "@esengine/ecs-framework": "2.4.2",
28
+ "@esengine/blueprint": "1.0.0",
29
+ "@esengine/build-config": "1.0.0"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "scripts": {
35
+ "build": "tsup",
36
+ "build:watch": "tsup --watch",
37
+ "type-check": "tsc --noEmit",
38
+ "clean": "rimraf dist"
39
+ }
40
+ }