@moora/moorex
Version:
A generic asynchronous Moore machine for building persistent AI agents that survive crashes, restarts, or migrations
96 lines (90 loc) • 3.48 kB
text/typescript
import { type Immutable } from 'mutative';
/**
* 取消函数类型
*/
export type CancelFn = () => void;
/**
* Effect 初始化器
*/
export type EffectInitializer<Signal> = {
start: (dispatch: (signal: Immutable<Signal>) => void) => Promise<void>;
cancel: CancelFn;
};
/**
* 定义 Moore 机器的配置。
*
* Moorex 是一个通用的异步 Moore 机器,它跟踪状态,严格从当前状态驱动 effects,
* 并在状态改变时协调这些 effects。设计初衷是构建持久化的 AI agents,这些 agents
* 必须在崩溃、重启或迁移时存活,同时能够恢复未完成的工作。
*
* 所有函数参数和返回值都是 Immutable 的,确保不可修改。
*
* @template State - 机器的状态类型
* @template Signal - 信号类型,用于触发状态转换
* @template Effect - Effect 类型
*/
export type MoorexDefinition<State, Signal, Effect> = {
/** 初始化函数,返回初始状态 */
initiate: () => Immutable<State>;
/**
* 状态转换函数。
* 接收一个 Immutable 信号,返回一个函数,该函数接收 Immutable 状态并返回新的 Immutable 状态。
* 参数和返回值都是 Immutable 的,不允许修改。
*/
transition: (signal: Immutable<Signal>) => (state: Immutable<State>) => Immutable<State>;
/**
* 根据当前状态计算应该运行的 effects。
* 接收 Immutable 状态,返回 Effect Record,key 作为 Effect 的标识用于 reconciliation。
* 参数和返回值都是 Immutable 的,不允许修改。
* Record 的 key 用于在 reconciliation 时做一致性判定。
*/
effectsAt: (state: Immutable<State>) => Record<string, Immutable<Effect>>;
};
/**
* Moorex 机器发出的事件。
*
* 事件类型包括:
* - `signal-received`: 信号被接收并处理
* - `state-updated`: 状态已更新
* - `effect-started`: Effect 开始(根据 reconciliation 结果)
* - `effect-canceled`: Effect 被取消(根据 reconciliation 结果)
*
* @template State - 机器的状态类型
* @template Signal - 信号类型
* @template Effect - Effect 类型
*/
export type MoorexEvent<State, Signal, Effect> =
| { type: 'signal-received'; signal: Immutable<Signal> }
| { type: 'state-updated'; state: Immutable<State> }
| { type: 'effect-started'; effect: Immutable<Effect>; key: string }
| { type: 'effect-canceled'; effect: Immutable<Effect>; key: string };
/**
* Moorex 机器实例。
*
* 提供状态管理、信号分发和事件订阅功能。
*
* @template State - 机器的状态类型
* @template Signal - 信号类型
* @template Effect - Effect 类型
*/
export type Moorex<State, Signal, Effect> = {
/**
* 分发一个信号以触发状态转换。
* 信号会被加入队列,在下一个微任务中批量处理。
* 参数必须是 Immutable 的,不允许修改。
*/
dispatch(signal: Immutable<Signal>): void;
/**
* 订阅事件。
* 返回一个取消订阅的函数。
*
* @param handler - 事件处理函数,接收事件和 moorex 实例作为参数
* @returns 取消订阅的函数
*/
subscribe(handler: (event: MoorexEvent<State, Signal, Effect>, moorex: Moorex<State, Signal, Effect>) => void): CancelFn;
/**
* 获取当前状态。
* 返回的状态是 Immutable 的,不允许修改。
*/
getState(): Immutable<State>;
};