aifsmjs 0.5.2 → 0.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -164,13 +164,34 @@ aifsmjs follows the XState v5 two-phase pattern (`setup().createMachine()`): the
164
164
 
165
165
  ```typescript
166
166
  function defineMachine<
167
- Ctx,
168
- Evt extends { type: string },
169
- States extends string,
170
- >(def: MachineDef<Ctx, Evt, States>): MachineDef<Ctx, Evt, States>;
167
+ Ctx = Record<string, never>,
168
+ Evt extends { type: string } = { type: string },
169
+ States extends string = string,
170
+ >(def: MachineConfig<Ctx, Evt, States>): MachineDef<Ctx, Evt, States>;
171
171
  ```
172
172
 
173
- Pure data builder. Freezes the whole definition and validates that `initial` exists in the `states` map.
173
+ Pure data builder. Validates that `initial` exists in the `states` map and returns the (normalized) definition.
174
+
175
+ `context` is **optional** — omit it for stateless machines and it defaults to `{}` (the type parameter defaults to `Record<string, never>`). Existing definitions that pass `context` are unaffected.
176
+
177
+ ```typescript
178
+ // No context needed — defaults to {}
179
+ const toggle = defineMachine({
180
+ id: "toggle",
181
+ initial: "off",
182
+ states: {
183
+ off: { on: { TOGGLE: "on" } }, // string shorthand, see below
184
+ on: { on: { TOGGLE: "off" } },
185
+ },
186
+ });
187
+ ```
188
+
189
+ **String-shorthand transitions.** A transition value may be either the full object form or a bare target-state string (à la XState). The string is normalized to `{ target }` before processing — it carries no guard or actions:
190
+
191
+ ```typescript
192
+ on: { NEXT: "green" } // shorthand for { target: "green" }
193
+ on: { NEXT: [{ target: "a", guard: "g" }, "b"] } // mixes with the object form
194
+ ```
174
195
 
175
196
  ### `createRuntime(def, impl, opts?)`
176
197
 
@@ -417,6 +438,8 @@ aifsmjs ships a few opinionated calls that look different from the typical FSM l
417
438
  - **Guards and reducers are sync.** A non-deterministic guard would break the PBT determinism property (#1 in the generic suite). Move async predicates into events: send `FETCH_REQUEST`, then later `FETCH_DONE` with the resolved value as payload.
418
439
  - **Effects are descriptors, not inline callbacks.** Actions enqueue `{ type, payload }` via `enqueue.effect(...)`; the runtime collects them and the dispatcher invokes user handlers. This keeps machine definitions serializable (JSON round-trippable when no inline functions are used), enables `replay()` to fold an event log into the same snapshot, and lets `inspect/persist` middleware capture effects for audit logs.
419
440
  - **Two factory paths coexist.** `setup<Ctx, Evt>().defineMachine(...)` is the type-friendly form (States inferred from `keyof states`). `createMachine(def, impl, opts?)` is the spec-style single-factory shortcut from the ai*js ecosystem review. Plain `defineMachine<Ctx, Evt, States>(def)` remains for explicit generic control. Pick whichever reads best at the call site.
441
+ - **Transitions accept a string shorthand.** `on: { EVENT: "targetState" }` is sugar for `on: { EVENT: { target: "targetState" } }`, normalized in the resolver before any guard/action processing. The shorthand has no guard or actions; reach for the object form when you need them. It composes inside the array form too, so guard-fallthrough lists can mix `{ target, guard }` objects with bare target strings. The full object form is unchanged — this is purely additive.
442
+ - **`context` is optional.** Omit it for stateless machines and it defaults to `{}` (`Ctx` defaults to `Record<string, never>`). Definitions that already pass `context` keep their inferred type and behave identically.
420
443
  - **`subscribe(listener)` and `on(type, fn, { signal, once })` both exist.** The typed `on()` matches the platform `EventTarget` semantics (signal + once) and emits `'transition'`, `'error'`, `'dispose'`. The older `subscribe()` keeps the React `useSyncExternalStore` shape — pass it directly. They are not exclusive.
421
444
 
422
445
  ---
package/README_ZHTW.md CHANGED
@@ -163,13 +163,34 @@ aifsmjs 走 XState v5 `setup().createMachine()` 雙階段路線:definition 用
163
163
 
164
164
  ```typescript
165
165
  function defineMachine<
166
- Ctx,
167
- Evt extends { type: string },
168
- States extends string,
169
- >(def: MachineDef<Ctx, Evt, States>): MachineDef<Ctx, Evt, States>;
166
+ Ctx = Record<string, never>,
167
+ Evt extends { type: string } = { type: string },
168
+ States extends string = string,
169
+ >(def: MachineConfig<Ctx, Evt, States>): MachineDef<Ctx, Evt, States>;
170
170
  ```
171
171
 
172
- 純資料 builder。會 freeze 整個 def 並驗證 `initial` 在 `states` 集合內。
172
+ 純資料 builder。會驗證 `initial` 在 `states` 集合內並回傳(正規化後的)def。
173
+
174
+ `context` 為**選填**——無狀態機器可省略,會預設為 `{}`(型別參數預設為 `Record<string, never>`)。原本就有傳 `context` 的定義完全不受影響。
175
+
176
+ ```typescript
177
+ // 不需要 context——預設為 {}
178
+ const toggle = defineMachine({
179
+ id: "toggle",
180
+ initial: "off",
181
+ states: {
182
+ off: { on: { TOGGLE: "on" } }, // 字串簡寫,見下
183
+ on: { on: { TOGGLE: "off" } },
184
+ },
185
+ });
186
+ ```
187
+
188
+ **字串簡寫 transition。** transition 的值可以是完整物件形式,也可以是單純的目標 state 字串(仿 XState)。字串會在進入任何 guard/action 處理前被正規化成 `{ target }`——它不帶 guard 或 actions:
189
+
190
+ ```typescript
191
+ on: { NEXT: "green" } // 等同 { target: "green" }
192
+ on: { NEXT: [{ target: "a", guard: "g" }, "b"] } // 可與物件形式混用
193
+ ```
173
194
 
174
195
  ### `createRuntime(def, impl, opts?)`
175
196
 
@@ -411,6 +432,8 @@ aifsmjs 在幾個常見議題上做了刻意取捨,跟主流 FSM library 寫
411
432
  - **Guards / reducers 只能 sync**。非確定性 guard 會破壞 PBT determinism property (#1)。把 async 改寫成 event:先送 `FETCH_REQUEST`,handler 完成後送 `FETCH_DONE`,payload 帶結果。
412
433
  - **Effects 是描述子,不是 inline callback**。Action 透過 `enqueue.effect(type, payload?)` 排隊;runtime 收集後 dispatcher 才執行 user handler。好處:machine definition 可序列化(沒 inline fn 時 JSON round-trip)、`replay()` 可把 event log 摺成同樣 snapshot、`inspect/persist` middleware 抓得到 effects 做 audit log。
413
434
  - **兩種 factory 並存**。`setup<Ctx, Evt>().defineMachine(...)` 是型別友善版(States 從 `keyof states` 推導)。`createMachine(def, impl, opts?)` 是來自 ai*js 生態 spec 的 single-factory 捷徑。顯式 `defineMachine<Ctx, Evt, States>(def)` 仍保留作完全顯式控制。看 call site 哪個讀起來順手就用哪個。
435
+ - **transition 支援字串簡寫**。`on: { EVENT: "targetState" }` 是 `on: { EVENT: { target: "targetState" } }` 的語法糖,在 resolver 於任何 guard/action 處理前正規化。簡寫不帶 guard 或 actions;需要時改用物件形式。它也能在陣列形式中混用,所以 guard-fallthrough 清單可以同時放 `{ target, guard }` 物件與單純的目標字串。完整物件形式不變——此為純加法。
436
+ - **`context` 為選填**。無狀態機器可省略,預設為 `{}`(`Ctx` 預設為 `Record<string, never>`)。原本就傳 `context` 的定義型別推導與行為完全相同。
414
437
  - **`subscribe(listener)` 與 `on(type, fn, { signal, once })` 並存**。Typed `on()` 對齊平台 `EventTarget` 語意(signal + once),emit `'transition'`、`'error'`、`'dispose'`。原本的 `subscribe()` 保留 React `useSyncExternalStore` shape,可直接傳。兩者不互斥。
415
438
 
416
439
  ---
@@ -1,4 +1,4 @@
1
- import { c as Enqueuer, E as Effect, b as EffectHandler } from '../types-CGKk6Rur.cjs';
1
+ import { c as Enqueuer, E as Effect, b as EffectHandler } from '../types-DIM7QTtf.cjs';
2
2
 
3
3
  /**
4
4
  * Build a closure-based Enqueuer that pushes effects into the supplied sink.
@@ -1,4 +1,4 @@
1
- import { c as Enqueuer, E as Effect, b as EffectHandler } from '../types-CGKk6Rur.js';
1
+ import { c as Enqueuer, E as Effect, b as EffectHandler } from '../types-DIM7QTtf.js';
2
2
 
3
3
  /**
4
4
  * Build a closure-based Enqueuer that pushes effects into the supplied sink.
@@ -1,4 +1,4 @@
1
- import { e as GuardRef, G as Guard } from '../types-CGKk6Rur.cjs';
1
+ import { e as GuardRef, G as Guard } from '../types-DIM7QTtf.cjs';
2
2
 
3
3
  /** Logical AND over guards. Short-circuits on the first `false`. */
4
4
  declare function and<Ctx, Evt>(items: readonly GuardRef<Ctx, Evt>[]): Guard<Ctx, Evt>;
@@ -1,4 +1,4 @@
1
- import { e as GuardRef, G as Guard } from '../types-CGKk6Rur.js';
1
+ import { e as GuardRef, G as Guard } from '../types-DIM7QTtf.js';
2
2
 
3
3
  /** Logical AND over guards. Short-circuits on the first `false`. */
4
4
  declare function and<Ctx, Evt>(items: readonly GuardRef<Ctx, Evt>[]): Guard<Ctx, Evt>;
package/dist/index.cjs CHANGED
@@ -52,6 +52,23 @@ function evalGuard(ref, context, event, impl, value) {
52
52
  return result;
53
53
  }
54
54
 
55
+ // src/fsm/resolver.ts
56
+ function normalizeTransition(entry) {
57
+ return typeof entry === "string" ? { target: entry } : entry;
58
+ }
59
+ function normalizeTransitions(entry) {
60
+ if (entry === void 0) return [];
61
+ if (Array.isArray(entry)) {
62
+ return entry.some((t) => typeof t === "string") ? entry.map((t) => normalizeTransition(t)) : entry;
63
+ }
64
+ return [normalizeTransition(entry)];
65
+ }
66
+ function resolveTransitions(def, stateValue, eventType) {
67
+ const state = def.states[stateValue];
68
+ if (!state || !state.on) return [];
69
+ return normalizeTransitions(state.on[eventType]);
70
+ }
71
+
55
72
  // src/effects/enqueuer.ts
56
73
  function createEnqueuer(sink) {
57
74
  return Object.freeze({
@@ -154,8 +171,7 @@ function step(def, snapshot, event, impl) {
154
171
  if (!state) {
155
172
  return Object.freeze({ snapshot, effects: [], changed: false });
156
173
  }
157
- const candidates = state.on?.[event.type];
158
- const candidateList = candidates ? Array.isArray(candidates) ? candidates : [candidates] : [];
174
+ const candidateList = normalizeTransitions(state.on?.[event.type]);
159
175
  const chosen = pickTransition(candidateList, snapshot.context, event, impl, snapshot.value);
160
176
  if (!chosen) {
161
177
  return Object.freeze({ snapshot, effects: [], changed: false });
@@ -282,9 +298,8 @@ function createRuntime(def, impl, opts = {}) {
282
298
  function findChosenIsExternal(value, event, context) {
283
299
  const state = def.states[value];
284
300
  if (!state?.on) return false;
285
- const candidates = state.on[event.type];
286
- if (!candidates) return false;
287
- const list = Array.isArray(candidates) ? candidates : [candidates];
301
+ const list = normalizeTransitions(state.on[event.type]);
302
+ if (list.length === 0) return false;
288
303
  for (const t of list) {
289
304
  if (!t.guard || evalGuard(t.guard, context, event, impl, value)) {
290
305
  return t.target !== void 0;
@@ -385,9 +400,8 @@ function createRuntime(def, impl, opts = {}) {
385
400
  if (disposed || snapshot.status === "final") return false;
386
401
  const state = def.states[snapshot.value];
387
402
  if (!state) return false;
388
- const candidates = state.on?.[event.type];
389
- if (!candidates) return false;
390
- const list = Array.isArray(candidates) ? candidates : [candidates];
403
+ const list = normalizeTransitions(state.on?.[event.type]);
404
+ if (list.length === 0) return false;
391
405
  for (const t of list) {
392
406
  if (!t.guard) return true;
393
407
  if (evalGuard(t.guard, snapshot.context, event, impl, snapshot.value)) return true;
@@ -514,7 +528,7 @@ function validateDefinition(def) {
514
528
  }
515
529
  if (!stateDef.on) continue;
516
530
  for (const [evtType, entry] of Object.entries(stateDef.on)) {
517
- const transitions = Array.isArray(entry) ? entry : [entry];
531
+ const transitions = normalizeTransitions(entry);
518
532
  for (const t of transitions) {
519
533
  if (t.target !== void 0 && !stateKeys.includes(t.target)) {
520
534
  throw new InvalidDefinitionError(
@@ -531,13 +545,14 @@ function validateDefinition(def) {
531
545
  }
532
546
  }
533
547
  function defineMachine(def) {
534
- validateDefinition(def);
535
- return def;
548
+ const normalized = !("context" in def) ? { ...def, context: {} } : def;
549
+ validateDefinition(normalized);
550
+ return normalized;
536
551
  }
537
552
  function setup() {
538
553
  return {
539
554
  defineMachine: (def) => {
540
- const cast = def;
555
+ const cast = !("context" in def) ? { ...def, context: {} } : def;
541
556
  validateDefinition(cast);
542
557
  return cast;
543
558
  }
@@ -555,15 +570,6 @@ function createMachine(def, impl, opts) {
555
570
  return createRuntime(defineMachine(def), impl, opts ?? {});
556
571
  }
557
572
 
558
- // src/fsm/resolver.ts
559
- function resolveTransitions(def, stateValue, eventType) {
560
- const state = def.states[stateValue];
561
- if (!state || !state.on) return [];
562
- const entry = state.on[eventType];
563
- if (!entry) return [];
564
- return Array.isArray(entry) ? entry : [entry];
565
- }
566
-
567
573
  exports.AsyncGuardError = AsyncGuardError;
568
574
  exports.InvalidDefinitionError = InvalidDefinitionError;
569
575
  exports.RESET_EVENT_TYPE = RESET_EVENT_TYPE;
@@ -582,6 +588,8 @@ exports.freezeSnapshot = freezeSnapshot;
582
588
  exports.initialSnapshot = initialSnapshot;
583
589
  exports.isAsyncGuardFn = isAsyncGuardFn;
584
590
  exports.mergeContext = mergeContext;
591
+ exports.normalizeTransition = normalizeTransition;
592
+ exports.normalizeTransitions = normalizeTransitions;
585
593
  exports.resolveGuard = resolveGuard;
586
594
  exports.resolveTransitions = resolveTransitions;
587
595
  exports.setup = setup;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fsm/types.ts","../src/fsm/evaluator.ts","../src/effects/enqueuer.ts","../src/fsm/snapshot.ts","../src/fsm/updater.ts","../src/fsm/lifecycle.ts","../src/fsm/runtime.ts","../src/fsm/definition.ts","../src/fsm/resolver.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["// All public types live here so AI agents and humans can read the entire\n// public surface in one file.\n\nexport type Effect = Readonly<{ type: string; payload?: unknown }>;\n\nexport type Enqueuer = Readonly<{\n effect: (type: string, payload?: unknown) => void;\n}>;\n\nexport type GuardArgs<Ctx, Evt> = Readonly<{\n context: Ctx;\n event: Evt;\n /**\n * Optional guard registry, threaded by `evalGuard` so combinators can resolve\n * string refs nested inside `and / or / not`. Inline user guards may safely\n * ignore this field — it is `undefined` when guards are evaluated outside of\n * `evalGuard` (e.g. in unit tests calling the function directly).\n */\n guards?: Readonly<Record<string, Guard<Ctx, Evt>>>;\n /**\n * Current state value, threaded by `evalGuard` from the live snapshot. Used\n * by the `stateIn` combinator. `undefined` when guards are called outside of\n * a lifecycle evaluation.\n */\n value?: string;\n}>;\n\nexport type Guard<Ctx, Evt> = (args: GuardArgs<Ctx, Evt>) => boolean;\n\nexport type Action<Ctx, Evt> = (args: {\n context: Ctx;\n event: Evt;\n enqueue: Enqueuer;\n}) => Partial<Ctx> | void;\n\nexport type EffectHandler<Ctx, Evt> = (\n effect: Effect,\n args: { context: Ctx; event: Evt; signal: AbortSignal },\n) => void | Promise<void>;\n\nexport type GuardRef<Ctx, Evt> = string | Guard<Ctx, Evt>;\nexport type ActionRef<Ctx, Evt> = string | Action<Ctx, Evt>;\n\nexport type TransitionDef<Ctx, Evt, States extends string> = Readonly<{\n target?: States;\n guard?: GuardRef<Ctx, Evt>;\n actions?: readonly ActionRef<Ctx, Evt>[];\n}>;\n\n/**\n * @experimental v0.3.0\n *\n * A nested machine definition attachable to StateDef.sub. The type parameters\n * are independent from the parent machine's <Ctx, Evt, States>; sub-machines\n * may have entirely unrelated context and event shapes.\n *\n * This is an alias for MachineDef — sub-machines have the same definition\n * shape as top-level machines. The relationship is purely lifecycle:\n * a sub-machine instance is created when its parent state becomes active\n * and disposed when the parent state exits.\n */\nexport type SubMachineDef<\n SubCtx,\n SubEvt extends { type: string },\n SubStates extends string,\n> = MachineDef<SubCtx, SubEvt, SubStates>;\n\nexport type StateDef<Ctx, Evt, States extends string> = Readonly<{\n on?: Readonly<\n Record<string, TransitionDef<Ctx, Evt, States> | readonly TransitionDef<Ctx, Evt, States>[]>\n >;\n entry?: readonly ActionRef<Ctx, Evt>[];\n exit?: readonly ActionRef<Ctx, Evt>[];\n final?: boolean;\n /**\n * Optional sub-machine. When the runtime enters a state with `sub`,\n * the sub-machine is lazily instantiated; when it exits, the sub-machine\n * is disposed. See STABILITY.md for the experimental contract.\n *\n * The generic parameters are erased to `any` because sub-machine type\n * parameters are intentionally independent from the parent's `Ctx` / `Evt`\n * / `States`. `MachineDef`'s generics are invariant (guards / actions\n * consume them), so the storage position must use `any` rather than\n * `unknown`. Caller narrows via `runtime.subRuntime() as Runtime<...>`.\n *\n * @experimental since 0.3.0\n */\n // biome-ignore lint/suspicious/noExplicitAny: see JSDoc — invariant generic escape hatch\n sub?: MachineDef<any, any, any>;\n /**\n * Implementations for `sub`. Ignored if `sub` is absent. Defaults to `{}`\n * (sub-machine must rely on inline guards / actions / effects only).\n *\n * @experimental since 0.3.0\n */\n // biome-ignore lint/suspicious/noExplicitAny: same reason as `sub` above\n subImpl?: Implementations<any, any>;\n}>;\n\nexport type MachineDef<Ctx, Evt extends { type: string }, States extends string> = Readonly<{\n id: string;\n initial: States;\n context: Ctx;\n states: Readonly<Record<States, StateDef<Ctx, Evt, States>>>;\n}>;\n\nexport type Snapshot<Ctx, States extends string> = Readonly<{\n value: States;\n context: Ctx;\n status: \"active\" | \"final\";\n}>;\n\nexport type Implementations<Ctx, Evt> = Readonly<{\n guards?: Readonly<Record<string, Guard<Ctx, Evt>>>;\n actions?: Readonly<Record<string, Action<Ctx, Evt>>>;\n effects?: Readonly<Record<string, EffectHandler<Ctx, Evt>>>;\n}>;\n\nexport type StepResult<Ctx, States extends string> = Readonly<{\n snapshot: Snapshot<Ctx, States>;\n effects: readonly Effect[];\n changed: boolean;\n}>;\n\n/**\n * Sentinel event type that `Runtime.reset()` synthesises when the caller does\n * not pass an explicit event. Middleware receives it through\n * `MiddlewareContext.event`. Exposed so user code can discriminate.\n */\nexport const RESET_EVENT_TYPE = \"@@aifsmjs/RESET\" as const;\nexport type ResetEvent = Readonly<{ type: typeof RESET_EVENT_TYPE }>;\n\nexport type MiddlewareContext<Ctx, Evt, States extends string> = Readonly<{\n prev: Snapshot<Ctx, States>;\n next: Snapshot<Ctx, States>;\n /**\n * The triggering event. May be the user's `Evt` (from `send()` or an\n * explicit `reset(event)`) or the `ResetEvent` sentinel emitted by a\n * `reset()` with no event argument.\n */\n event: Evt | ResetEvent;\n effects: readonly Effect[];\n changed: boolean;\n}>;\n\nexport type Middleware<Ctx, Evt, States extends string> = (\n ctx: MiddlewareContext<Ctx, Evt, States>,\n next: () => void,\n) => void;\n\n/**\n * Payload of the `'transition'` runtime event — emitted after each `send()` or\n * `reset()` that actually changed the snapshot value.\n */\nexport type RuntimeTransitionEvent<Ctx, Evt, States extends string> = Readonly<{\n prev: Snapshot<Ctx, States>;\n next: Snapshot<Ctx, States>;\n event: Evt | ResetEvent;\n effects: readonly Effect[];\n changed: boolean;\n}>;\n\n/**\n * Payload of the `'error'` runtime event — currently emitted for async effect\n * handler rejections (which would otherwise become unhandled). Synchronous\n * throws from effect handlers and middleware still propagate to the caller of\n * `send()` / `reset()`.\n */\nexport type RuntimeErrorEvent<Evt> = Readonly<{\n error: unknown;\n event: Evt | ResetEvent | undefined;\n}>;\n\nexport type RuntimeEventMap<Ctx, Evt, States extends string> = {\n transition: RuntimeTransitionEvent<Ctx, Evt, States>;\n error: RuntimeErrorEvent<Evt>;\n dispose: void;\n};\n\nexport interface Runtime<Ctx, Evt extends { type: string }, States extends string> {\n getSnapshot(): Snapshot<Ctx, States>;\n /** Alias for `getSnapshot()`. */\n snapshot(): Snapshot<Ctx, States>;\n send(event: Evt): Snapshot<Ctx, States>;\n /**\n * Predict whether sending `event` would fire a transition. Reuses\n * `resolveTransitions` + `evalGuard` without applying any actions. Guards\n * are expected to be pure; `can` then matches `send` for the same input.\n */\n can(event: Evt): boolean;\n subscribe(listener: (snap: Snapshot<Ctx, States>) => void): () => void;\n /**\n * EventTarget-like typed listener API. Returns an unsubscribe function.\n * `options.signal` removes the listener when aborted; `options.once`\n * removes the listener after the first invocation. After `dispose()`,\n * `on()` is a no-op and returns a no-op unsubscribe.\n */\n on<K extends keyof RuntimeEventMap<Ctx, Evt, States>>(\n type: K,\n listener: (payload: RuntimeEventMap<Ctx, Evt, States>[K]) => void,\n options?: { signal?: AbortSignal; once?: boolean },\n ): () => void;\n /**\n * Re-initialise the runtime to the definition's initial snapshot. Triggers\n * subscribers but does NOT run entry actions (reset = re-birth, not\n * \"transition into initial\"). Throws RuntimeDisposedError if disposed.\n * If an `event` is supplied, middleware sees it as the trigger; otherwise\n * a sentinel `{ type: \"@@aifsmjs/RESET\" }` is synthesised.\n */\n reset(event?: Evt): Snapshot<Ctx, States>;\n /**\n * Tear down: abort the internal AbortController (effect handlers see signal\n * fire), clear listeners, and mark this runtime as disposed. Subsequent\n * send()/reset() calls throw RuntimeDisposedError. Idempotent.\n */\n dispose(): void;\n /**\n * True after `dispose()` has been called.\n */\n readonly disposed: boolean;\n /**\n * AbortSignal scoped to this runtime's lifetime. Fires once on dispose().\n * Threaded to every EffectHandler invocation; external integrations\n * (e.g. component teardown) can also attach `signal.addEventListener(\"abort\", ...)`.\n */\n readonly signal: AbortSignal;\n /**\n * @experimental v0.3.0\n *\n * Returns the currently active sub-Runtime for the current parent state,\n * or undefined if:\n * - the current state has no `sub` definition, OR\n * - the sub-Runtime failed to initialise (SubMachineError was thrown\n * from `send()` / `reset()` / `createRuntime` per the spec contract),\n * OR\n * - the parent runtime has been disposed.\n *\n * The returned Runtime is typed at the loosest sub-machine signature.\n * Caller casts to the concrete sub type.\n *\n * Re-entry: when the parent leaves and re-enters a state with `sub`, a\n * fresh sub-Runtime is constructed. Previous sub-Runtime references held\n * by the caller are stale and MUST NOT be used (disposed).\n */\n subRuntime(): Runtime<unknown, { type: string }, string> | undefined;\n /**\n * Semantic sugar for `runtime.on('transition', handler, opts)`. Returns\n * the same unsubscribe function. Sharing the same listener Set with\n * `on('transition', ...)` means registration order determines invocation\n * order across both APIs.\n *\n * @since 0.3.0\n */\n onTransition(\n handler: (payload: RuntimeTransitionEvent<Ctx, Evt, States>) => void,\n options?: { signal?: AbortSignal; once?: boolean },\n ): () => void;\n}\n\nexport type RuntimeOptions<Ctx, Evt, States extends string> = Readonly<{\n middleware?: readonly Middleware<Ctx, Evt, States>[];\n /**\n * If false, do not dispatch effects through the effect handler map.\n * Useful for replay / dry-run modes. Defaults to true.\n */\n dispatchEffects?: boolean;\n}>;\n","import type { Guard, GuardRef, Implementations } from \"./types.js\";\n\nexport class UnknownGuardError extends Error {\n readonly guardName: string;\n constructor(guardName: string) {\n super(`aifsmjs: guard \"${guardName}\" not found in implementations.guards`);\n this.name = \"UnknownGuardError\";\n this.guardName = guardName;\n }\n}\n\nexport class AsyncGuardError extends Error {\n readonly guardName: string;\n constructor(guardName: string) {\n super(\n `aifsmjs: guard \"${guardName}\" must be sync; received a Promise. Async guards break determinism and replay. Move I/O into an effect.`,\n );\n this.name = \"AsyncGuardError\";\n this.guardName = guardName;\n }\n}\n\n/**\n * Detect declared-async guards at definition time. Catches the common case of\n * `async (args) => ...` inline guards. Combinator builders or arrow returns of\n * a Promise still slip past — those are caught at `evalGuard` runtime via\n * the `isThenable` check.\n *\n * Caveat: this relies on `Function.prototype.constructor.name === \"AsyncFunction\"`,\n * which is reliable in ES2017+ runtimes. If your bundler transpiles `async`\n * to generator-based code (e.g. ES5 / very old TypeScript targets), this\n * check returns `false` for those forms — the runtime `evalGuard` thenable\n * check still catches them.\n */\nexport function isAsyncGuardFn(fn: unknown): boolean {\n if (typeof fn !== \"function\") return false;\n return fn.constructor?.name === \"AsyncFunction\";\n}\n\n/**\n * Detect a thenable (PromiseLike) — anything with a callable `then`. Used in\n * place of `instanceof Promise` so cross-realm Promises (iframe / worker /\n * vm context) and user-defined thenables are also rejected.\n */\nfunction isThenable(x: unknown): x is PromiseLike<unknown> {\n return (\n x !== null &&\n (typeof x === \"object\" || typeof x === \"function\") &&\n typeof (x as { then?: unknown }).then === \"function\"\n );\n}\n\n/**\n * Resolve a guard ref to a Guard function. String refs are looked up in the\n * implementations map; inline functions are returned as-is.\n */\nexport function resolveGuard<Ctx, Evt>(\n ref: GuardRef<Ctx, Evt>,\n impl: Implementations<Ctx, Evt>,\n): Guard<Ctx, Evt> {\n if (typeof ref === \"function\") return ref;\n const fn = impl.guards?.[ref];\n if (!fn) throw new UnknownGuardError(ref);\n return fn;\n}\n\n/**\n * Evaluate a guard ref against (context, event). Guards must be sync and pure;\n * TypeScript blocks declared-async signatures at compile time, but JS callers\n * or casts can still slip through. This function checks two ways:\n * 1. Inline AsyncFunction (declared `async`) → throw AsyncGuardError.\n * 2. Return value is a Promise → throw AsyncGuardError.\n * Both throws are user errors; they would otherwise silently pass the guard\n * (Promise is truthy) and break determinism.\n *\n * The optional `value` argument is the current state value, threaded so the\n * `stateIn` combinator and similar predicates can introspect it.\n */\nexport function evalGuard<Ctx, Evt>(\n ref: GuardRef<Ctx, Evt>,\n context: Ctx,\n event: Evt,\n impl: Implementations<Ctx, Evt>,\n value?: string,\n): boolean {\n const fn = resolveGuard(ref, impl);\n // Function.prototype.name is \"\" for anonymous arrows — use `||` not `??`\n // so the empty string falls back to \"<inline>\" for readable error messages.\n const guardName = typeof ref === \"string\" ? ref : fn.name || \"<inline>\";\n if (isAsyncGuardFn(fn)) {\n throw new AsyncGuardError(guardName);\n }\n // Build args while honouring exactOptionalPropertyTypes: omit fields that\n // would otherwise be assigned `undefined`.\n type Args = {\n context: Ctx;\n event: Evt;\n guards?: Readonly<Record<string, Guard<Ctx, Evt>>>;\n value?: string;\n };\n const args: Args = { context, event };\n const guardsMap = impl.guards;\n if (guardsMap) args.guards = guardsMap;\n if (value !== undefined) args.value = value;\n const result = fn(args);\n // TS narrows `result` to boolean from Guard's return type, but a JS caller\n // or a cast can slip a Promise / PromiseLike through. We accept anything\n // thenable (native Promise, cross-realm Promise, user-defined thenable),\n // not just same-realm `instanceof Promise`.\n if (isThenable(result)) {\n throw new AsyncGuardError(guardName);\n }\n return result;\n}\n","import type { Enqueuer } from \"../fsm/types.js\";\n\n/**\n * Build a closure-based Enqueuer that pushes effects into the supplied sink.\n * Each `step()` invocation creates one such enqueuer and discards it\n * afterwards; the sink is the effects array later returned to the caller.\n *\n * Lives in `effects/` because the Enqueuer concept is the effects-domain API\n * — `step()` imports it from here.\n */\nexport function createEnqueuer(sink: { type: string; payload?: unknown }[]): Enqueuer {\n return Object.freeze({\n effect(type: string, payload?: unknown) {\n if (payload === undefined) {\n sink.push(Object.freeze({ type }));\n } else {\n sink.push(Object.freeze({ type, payload }));\n }\n },\n });\n}\n","import type { Snapshot } from \"./types.js\";\n\nconst IS_DEV =\n typeof process !== \"undefined\" &&\n typeof process.env !== \"undefined\" &&\n process.env.NODE_ENV !== \"production\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nexport function deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== \"object\") return value;\n if (Object.isFrozen(value)) return value;\n Object.freeze(value);\n if (Array.isArray(value)) {\n for (const item of value) deepFreeze(item);\n } else if (isPlainObject(value)) {\n for (const key of Object.keys(value)) {\n deepFreeze((value as Record<string, unknown>)[key]);\n }\n }\n return value;\n}\n\n/**\n * Wrap a freshly built snapshot. In dev mode the whole tree is deep-frozen so\n * accidental mutation throws immediately. In production only the top object is\n * frozen, keeping the cost negligible.\n */\nexport function freezeSnapshot<C, S extends string>(snap: Snapshot<C, S>): Snapshot<C, S> {\n // IS_DEV is always true in vitest; the production branch (`Object.freeze`)\n // is exercised only when NODE_ENV === \"production\" and is intentionally\n // left out of the coverage threshold.\n return IS_DEV ? deepFreeze(snap) : Object.freeze(snap);\n}\n\nexport function createSnapshot<C, S extends string>(args: {\n value: S;\n context: C;\n status?: \"active\" | \"final\";\n}): Snapshot<C, S> {\n return freezeSnapshot({\n value: args.value,\n context: args.context,\n status: args.status ?? \"active\",\n });\n}\n","import type { Action } from \"./types.js\";\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Build an Action that returns a Partial<Ctx> from a pure updater.\n * The partial is merged into the current context by `step()`.\n */\nexport function assign<Ctx, Evt>(\n updater: (args: { context: Ctx; event: Evt }) => Partial<Ctx>,\n): Action<Ctx, Evt> {\n return ({ context, event }) => updater({ context, event });\n}\n\n/**\n * Merge a partial context update into the current context. Plain-object\n * contexts get a shallow merge; non-object contexts get replaced wholesale.\n *\n * The function never mutates either argument.\n */\nexport function mergeContext<Ctx>(current: Ctx, patch: Partial<Ctx> | void): Ctx {\n if (patch === undefined || patch === null) return current;\n if (isPlainRecord(current) && isPlainRecord(patch)) {\n return { ...current, ...patch } as Ctx;\n }\n return patch as Ctx;\n}\n","import { createEnqueuer } from \"../effects/enqueuer.js\";\nimport { evalGuard } from \"./evaluator.js\";\nimport { freezeSnapshot } from \"./snapshot.js\";\nimport type {\n Action,\n ActionRef,\n Effect,\n Implementations,\n MachineDef,\n Snapshot,\n StepResult,\n TransitionDef,\n} from \"./types.js\";\nimport { mergeContext } from \"./updater.js\";\n\nexport class UnknownActionError extends Error {\n readonly actionName: string;\n constructor(actionName: string) {\n super(`aifsmjs: action \"${actionName}\" not found in implementations.actions`);\n this.name = \"UnknownActionError\";\n this.actionName = actionName;\n }\n}\n\nfunction resolveAction<Ctx, Evt>(\n ref: ActionRef<Ctx, Evt>,\n impl: Implementations<Ctx, Evt>,\n): Action<Ctx, Evt> {\n if (typeof ref === \"function\") return ref;\n const fn = impl.actions?.[ref];\n if (!fn) throw new UnknownActionError(ref);\n return fn;\n}\n\nfunction runActions<Ctx, Evt>(\n refs: readonly ActionRef<Ctx, Evt>[] | undefined,\n ctx: Ctx,\n event: Evt,\n impl: Implementations<Ctx, Evt>,\n effectSink: Effect[],\n): Ctx {\n if (!refs || refs.length === 0) return ctx;\n const enqueue = createEnqueuer(effectSink as { type: string; payload?: unknown }[]);\n let current = ctx;\n for (const ref of refs) {\n const fn = resolveAction(ref, impl);\n const patch = fn({ context: current, event, enqueue });\n current = mergeContext(current, patch);\n }\n return current;\n}\n\nfunction pickTransition<Ctx, Evt, States extends string>(\n candidates: readonly TransitionDef<Ctx, Evt, States>[],\n ctx: Ctx,\n event: Evt,\n impl: Implementations<Ctx, Evt>,\n value: States,\n): TransitionDef<Ctx, Evt, States> | undefined {\n for (const t of candidates) {\n if (!t.guard) return t;\n if (evalGuard(t.guard, ctx, event, impl, value)) return t;\n }\n return undefined;\n}\n\n/**\n * Compute the next snapshot and collected effects from a single event.\n *\n * Order is fixed and uninterruptible:\n * 1. resolve candidate transitions for (state, event.type)\n * 2. evaluate guards in declaration order; pick the first passing one\n * 3. if external (target defined), run exit actions of the old state\n * 4. run transition.actions in declaration order\n * 5. if external, run entry actions of the new state\n * 6. return { snapshot, effects, changed }\n *\n * The function is pure: it never dispatches effects and never mutates inputs.\n */\nexport function step<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n snapshot: Snapshot<Ctx, States>,\n event: Evt,\n impl: Implementations<Ctx, Evt>,\n): StepResult<Ctx, States> {\n // Final state is inert: it never reacts to events.\n if (snapshot.status === \"final\") {\n return Object.freeze({ snapshot, effects: [] as readonly Effect[], changed: false });\n }\n\n const state = def.states[snapshot.value];\n /* v8 ignore next 3 — defensive: snapshot.value is always validated against def.states by defineMachine + initialSnapshot. */\n if (!state) {\n return Object.freeze({ snapshot, effects: [] as readonly Effect[], changed: false });\n }\n\n const candidates = state.on?.[event.type];\n const candidateList: readonly TransitionDef<Ctx, Evt, States>[] = candidates\n ? Array.isArray(candidates)\n ? candidates\n : [candidates as TransitionDef<Ctx, Evt, States>]\n : [];\n\n const chosen = pickTransition(candidateList, snapshot.context, event, impl, snapshot.value);\n if (!chosen) {\n return Object.freeze({ snapshot, effects: [] as readonly Effect[], changed: false });\n }\n\n const isExternal = chosen.target !== undefined;\n const nextStateValue = (chosen.target ?? snapshot.value) as States;\n const nextState = def.states[nextStateValue];\n\n const effectSink: Effect[] = [];\n let ctx = snapshot.context;\n\n if (isExternal) {\n ctx = runActions(state.exit, ctx, event, impl, effectSink);\n }\n ctx = runActions(chosen.actions, ctx, event, impl, effectSink);\n if (isExternal && nextState) {\n ctx = runActions(nextState.entry, ctx, event, impl, effectSink);\n }\n\n const status: \"active\" | \"final\" = nextState?.final === true ? \"final\" : \"active\";\n const nextSnapshot = freezeSnapshot({\n value: nextStateValue,\n context: ctx,\n status,\n });\n\n return Object.freeze({\n snapshot: nextSnapshot,\n effects: Object.freeze(effectSink.slice()) as readonly Effect[],\n changed: true,\n });\n}\n","import { initialSnapshot } from \"./definition.js\";\nimport { evalGuard } from \"./evaluator.js\";\nimport { step } from \"./lifecycle.js\";\nimport { deepFreeze } from \"./snapshot.js\";\nimport {\n type Effect,\n type Implementations,\n type MachineDef,\n type Middleware,\n RESET_EVENT_TYPE,\n type ResetEvent,\n type Runtime,\n type RuntimeEventMap,\n type RuntimeOptions,\n type RuntimeTransitionEvent,\n type Snapshot,\n type TransitionDef,\n} from \"./types.js\";\n\nexport class RuntimeDisposedError extends Error {\n constructor() {\n super(\"aifsmjs: runtime has been disposed; send()/reset() are not allowed\");\n this.name = \"RuntimeDisposedError\";\n }\n}\n\n/**\n * Thrown by `send()` / `reset()` when a sub-machine init or dispose throws.\n *\n * Invariants:\n * - `phase: \"init\"` — child constructor threw. Parent snapshot was rolled\n * back to `prev`; no middleware ran; no `'transition'` emitted; no effects.\n * - `phase: \"dispose\"` — previous child's `dispose()` threw during transition.\n * Parent snapshot was rolled back to `prev`; child reference is cleared.\n * - Never thrown from `runtime.dispose()` cascade (never-throws contract).\n *\n * @since 0.3.0\n */\nexport class SubMachineError extends Error {\n readonly parentState: string;\n readonly phase: \"init\" | \"dispose\";\n override readonly cause: unknown;\n\n constructor(parentState: string, phase: \"init\" | \"dispose\", cause: unknown) {\n super(`aifsmjs: sub-machine ${phase} failed at parent state \"${parentState}\"`, { cause });\n this.name = \"SubMachineError\";\n this.parentState = parentState;\n this.phase = phase;\n this.cause = cause; // belt-and-suspenders: legacy bundlers ignore ES2022 cause option\n }\n}\n\nconst RESET_EVENT: ResetEvent = Object.freeze({ type: RESET_EVENT_TYPE });\n\nfunction composeMiddleware<Ctx, Evt, States extends string>(\n middleware: readonly Middleware<Ctx, Evt, States>[],\n): Middleware<Ctx, Evt, States> {\n return (ctx, finalNext) => {\n let index = -1;\n const dispatch = (i: number): void => {\n if (i <= index) throw new Error(\"aifsmjs: next() called multiple times in middleware\");\n index = i;\n const fn = middleware[i];\n if (!fn) {\n finalNext();\n return;\n }\n fn(ctx, () => dispatch(i + 1));\n };\n dispatch(0);\n };\n}\n\n/**\n * Build a thin stateful runtime around a machine. `send()` calls `step()`,\n * runs the read-only middleware pipeline, dispatches effects, and notifies\n * subscribers. The runtime owns an `AbortController`; `dispose()` aborts it\n * and clears all state.\n */\nexport function createRuntime<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n impl: Implementations<Ctx, Evt>,\n opts: RuntimeOptions<Ctx, Evt, States> = {},\n): Runtime<Ctx, Evt, States> {\n let snapshot: Snapshot<Ctx, States> = initialSnapshot(def);\n const listeners = new Set<(snap: Snapshot<Ctx, States>) => void>();\n const middlewareChain =\n opts.middleware && opts.middleware.length > 0 ? composeMiddleware(opts.middleware) : undefined;\n const shouldDispatch = opts.dispatchEffects !== false;\n const controller = new AbortController();\n let disposed = false;\n // §3.1 sub-machine state. childRuntime is the live child; childAbortCleanup\n // detaches the parent-abort listener attached by wireChildAbort. Both are\n // cleared together whenever the child is replaced or disposed (P1-3 fix).\n let childRuntime: Runtime<unknown, { type: string }, string> | undefined;\n let childAbortCleanup: (() => void) | undefined;\n\n type EventListeners = {\n [K in keyof RuntimeEventMap<Ctx, Evt, States>]: Set<\n (payload: RuntimeEventMap<Ctx, Evt, States>[K]) => void\n >;\n };\n const eventListeners: EventListeners = {\n transition: new Set(),\n error: new Set(),\n dispose: new Set(),\n };\n const externalAbortCleanups = new Set<() => void>();\n\n function emit<K extends keyof RuntimeEventMap<Ctx, Evt, States>>(\n type: K,\n payload: RuntimeEventMap<Ctx, Evt, States>[K],\n ): void {\n for (const fn of eventListeners[type]) fn(payload);\n }\n\n function notify(committed?: Snapshot<Ctx, States>) {\n const captured = committed ?? snapshot;\n for (const l of listeners) l(captured);\n }\n\n function runMiddleware(\n prev: Snapshot<Ctx, States>,\n event: Evt | ResetEvent,\n effects: readonly Effect[],\n changed: boolean,\n ) {\n if (!middlewareChain) return;\n middlewareChain(deepFreeze({ prev, next: snapshot, event, effects, changed }), () => {});\n }\n\n function dispatchEffects(effects: readonly Effect[], context: Ctx, event: Evt): void {\n if (!impl.effects || effects.length === 0) return;\n for (const eff of effects) {\n const handler = impl.effects[eff.type];\n if (!handler) continue;\n const r = handler(eff, { context, event, signal: controller.signal });\n if (r instanceof Promise) {\n r.catch((err: unknown) => {\n emit(\"error\", { error: err, event });\n });\n }\n }\n }\n\n // §3.1 Attach one-shot abort listener: parent dispose → child.dispose().\n // Returns a cleanup fn that detaches the listener; caller stores it in\n // `childAbortCleanup` and invokes when the child is replaced/disposed\n // (P1-3 fix: prevent stale listeners accumulating on the parent signal).\n function wireChildAbort(child: Runtime<unknown, { type: string }, string>): () => void {\n /* v8 ignore next 7 — parent may already be aborted in edge cases; dispose still runs */\n if (controller.signal.aborted) {\n try {\n child.dispose();\n } catch {\n /* swallow */\n }\n return () => {};\n }\n /* v8 ignore next 7 — defensive: dispose() pre-cleans this listener and\n disposes the child manually before calling controller.abort(), so\n onAbort fires only if external code aborts the controller bypassing\n dispose(). Internal-only controller has no such external path today. */\n const onAbort = () => {\n try {\n child.dispose();\n } catch {\n /* swallow */\n }\n };\n controller.signal.addEventListener(\"abort\", onAbort, { once: true });\n return () => controller.signal.removeEventListener(\"abort\", onAbort);\n }\n\n // §3.3 Re-resolve guards to find the chosen transition and determine\n // whether it is external (has a `target`). Replaces the v0.3.0 dev\n // hasSelfTargetMarker heuristic that over-reported when an event had both\n // internal (no-target) and self-target (target === value) candidates\n // (P1-2 fix). Cost: one extra guard evaluation pass per same-value event.\n function findChosenIsExternal(value: States, event: Evt, context: Ctx): boolean {\n const state = def.states[value];\n if (!state?.on) return false;\n const candidates = state.on[event.type];\n if (!candidates) return false;\n const list: readonly TransitionDef<Ctx, Evt, States>[] = Array.isArray(candidates)\n ? candidates\n : [candidates as TransitionDef<Ctx, Evt, States>];\n for (const t of list) {\n if (!t.guard || evalGuard(t.guard, context, event, impl, value)) {\n return t.target !== undefined;\n }\n }\n /* v8 ignore next — defensive: caller only invokes when step() returned\n changed=true, which guarantees a matching guard exists in the same\n candidate list. The for-loop above always returns before this line. */\n return false;\n }\n\n // §3.1 Dispose old child and/or init new child. Throws SubMachineError on failure.\n // Caller must NOT commit snapshot on throw.\n function applySubLifecycle(prevValue: States, nextValue: States): void {\n const prevStateDef = def.states[prevValue];\n const nextStateDef = def.states[nextValue];\n if (prevStateDef?.sub !== undefined && childRuntime !== undefined) {\n const child = childRuntime;\n childRuntime = undefined;\n childAbortCleanup?.();\n childAbortCleanup = undefined;\n try {\n child.dispose();\n } catch (cause) {\n throw new SubMachineError(prevValue as string, \"dispose\", cause);\n }\n }\n if (nextStateDef?.sub !== undefined) {\n let newChild: Runtime<unknown, { type: string }, string>;\n try {\n newChild = createRuntime(nextStateDef.sub, nextStateDef.subImpl ?? {});\n } catch (cause) {\n throw new SubMachineError(nextValue as string, \"init\", cause);\n }\n childRuntime = newChild;\n childAbortCleanup = wireChildAbort(newChild);\n }\n }\n\n function send(event: Evt): Snapshot<Ctx, States> {\n if (disposed) throw new RuntimeDisposedError();\n const prev = snapshot;\n const result = step(def, prev, event, impl);\n const isExternal =\n result.changed &&\n (prev.value !== result.snapshot.value ||\n findChosenIsExternal(prev.value, event, prev.context));\n // Sub lifecycle BEFORE snapshot commit (§3.4); throws SubMachineError on failure → no commit\n if (result.changed && isExternal) applySubLifecycle(prev.value, result.snapshot.value);\n snapshot = result.snapshot;\n const committed = result.snapshot;\n runMiddleware(prev, event, result.effects, result.changed);\n if (shouldDispatch) dispatchEffects(result.effects, committed.context, event);\n if (result.changed) {\n notify(committed);\n emit(\"transition\", {\n prev,\n next: committed,\n event,\n effects: result.effects,\n changed: true,\n } as RuntimeTransitionEvent<Ctx, Evt, States>);\n }\n return snapshot;\n }\n\n function reset(event?: Evt): Snapshot<Ctx, States> {\n if (disposed) throw new RuntimeDisposedError();\n const prev = snapshot;\n const nextSnap = initialSnapshot(def);\n const changed = prev.value !== nextSnap.value;\n // Dispose current child (§3.5)\n if (childRuntime) {\n const child = childRuntime;\n childRuntime = undefined;\n childAbortCleanup?.();\n childAbortCleanup = undefined;\n try {\n child.dispose();\n } catch (cause) {\n throw new SubMachineError(prev.value as string, \"dispose\", cause);\n }\n }\n // Init child for new initial state if it has sub (§3.5)\n const initStateDef = def.states[nextSnap.value];\n if (initStateDef?.sub) {\n let newChild: Runtime<unknown, { type: string }, string>;\n try {\n newChild = createRuntime(initStateDef.sub, initStateDef.subImpl ?? {});\n } catch (cause) {\n /* v8 ignore next — reset() init failure: only reachable if frozen sub def somehow rejects post-bootstrap */\n throw new SubMachineError(nextSnap.value as string, \"init\", cause);\n }\n childRuntime = newChild;\n childAbortCleanup = wireChildAbort(newChild);\n }\n snapshot = nextSnap;\n const triggerEvent: Evt | ResetEvent = event ?? RESET_EVENT;\n runMiddleware(prev, triggerEvent, [], changed);\n if (changed) {\n notify();\n emit(\"transition\", {\n prev,\n next: snapshot,\n event: triggerEvent,\n effects: [],\n changed: true,\n } as RuntimeTransitionEvent<Ctx, Evt, States>);\n }\n return snapshot;\n }\n\n function can(event: Evt): boolean {\n if (disposed || snapshot.status === \"final\") return false;\n const state = def.states[snapshot.value];\n /* v8 ignore next — defensive: snapshot.value always corresponds to a declared state. */\n if (!state) return false;\n const candidates = state.on?.[event.type];\n if (!candidates) return false;\n const list: readonly TransitionDef<Ctx, Evt, States>[] = Array.isArray(candidates)\n ? candidates\n : [candidates as TransitionDef<Ctx, Evt, States>];\n for (const t of list) {\n if (!t.guard) return true;\n if (evalGuard(t.guard, snapshot.context, event, impl, snapshot.value)) return true;\n }\n return false;\n }\n\n function on<K extends keyof RuntimeEventMap<Ctx, Evt, States>>(\n type: K,\n listener: (payload: RuntimeEventMap<Ctx, Evt, States>[K]) => void,\n options?: { signal?: AbortSignal; once?: boolean },\n ): () => void {\n if (disposed || options?.signal?.aborted) return () => {};\n const target = eventListeners[type];\n let detachAbort: (() => void) | undefined;\n // Full teardown shared by the once-wrapper, the abort handler, and the\n // returned unsubscribe so every path detaches the abort listener too — a\n // once-handler that also passed a { signal } previously left the abort\n // listener attached until dispose()/abort (memory leak).\n const cleanup = (): void => {\n target.delete(wrapped);\n if (detachAbort) {\n detachAbort();\n externalAbortCleanups.delete(detachAbort);\n }\n };\n let wrapped: (payload: RuntimeEventMap<Ctx, Evt, States>[K]) => void = listener;\n if (options?.once) {\n wrapped = (payload) => {\n cleanup();\n listener(payload);\n };\n }\n target.add(wrapped);\n const signal = options?.signal;\n if (signal) {\n const onAbort = () => cleanup();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n detachAbort = () => signal.removeEventListener(\"abort\", onAbort);\n externalAbortCleanups.add(detachAbort);\n }\n return cleanup;\n }\n\n function dispose(): void {\n if (disposed) return;\n disposed = true;\n // Cascade child dispose; swallow exceptions (dispose contract) (§3.6)\n if (childRuntime) {\n childAbortCleanup?.();\n childAbortCleanup = undefined;\n try {\n childRuntime.dispose();\n } catch {\n /* swallow */\n }\n childRuntime = undefined;\n }\n controller.abort();\n listeners.clear();\n emit(\"dispose\", undefined as RuntimeEventMap<Ctx, Evt, States>[\"dispose\"]);\n for (const set of Object.values(eventListeners)) set.clear();\n for (const cleanup of externalAbortCleanups) cleanup();\n externalAbortCleanups.clear();\n }\n\n const runtime: Runtime<Ctx, Evt, States> = {\n getSnapshot: () => snapshot,\n snapshot: () => snapshot,\n send,\n can,\n reset,\n dispose,\n on,\n get disposed() {\n return disposed;\n },\n get signal() {\n return controller.signal;\n },\n subscribe(listener) {\n if (disposed) return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n subRuntime: () => childRuntime,\n onTransition: (handler, options) => on(\"transition\", handler, options),\n };\n\n // §2 Bootstrap: if initial state has sub, instantiate child BEFORE returning.\n // Failure throws SubMachineError(initialState, \"init\", cause) from createRuntime itself.\n const bootStateDef = def.states[snapshot.value];\n if (bootStateDef?.sub) {\n let newChild: Runtime<unknown, { type: string }, string>;\n try {\n newChild = createRuntime(bootStateDef.sub, bootStateDef.subImpl ?? {});\n } catch (cause) {\n throw new SubMachineError(snapshot.value as string, \"init\", cause);\n }\n childRuntime = newChild;\n childAbortCleanup = wireChildAbort(newChild);\n }\n\n return runtime;\n}\n","import { isAsyncGuardFn } from \"./evaluator.js\";\nimport { createRuntime } from \"./runtime.js\";\nimport { freezeSnapshot } from \"./snapshot.js\";\nimport type {\n Implementations,\n MachineDef,\n Runtime,\n RuntimeOptions,\n Snapshot,\n StateDef,\n} from \"./types.js\";\n\nexport class InvalidDefinitionError extends Error {\n constructor(message: string) {\n super(`aifsmjs: ${message}`);\n this.name = \"InvalidDefinitionError\";\n }\n}\n\nfunction validateDefinition<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n): void {\n if (!def.id || typeof def.id !== \"string\") {\n throw new InvalidDefinitionError(\"definition must have a non-empty string `id`\");\n }\n /* v8 ignore next 3 — additional safety: TS prevents non-object `states`; this guards untyped JS callers. */\n if (!def.states || typeof def.states !== \"object\") {\n throw new InvalidDefinitionError(\"definition must have a `states` object\");\n }\n const stateKeys = Object.keys(def.states) as States[];\n if (stateKeys.length === 0) {\n throw new InvalidDefinitionError(\"`states` must declare at least one state\");\n }\n if (!def.initial || !stateKeys.includes(def.initial)) {\n throw new InvalidDefinitionError(\n `\\`initial\\` \"${String(def.initial)}\" is not declared in states (${stateKeys.join(\", \")})`,\n );\n }\n for (const [stateName, stateDef] of Object.entries(def.states) as [\n States,\n (typeof def.states)[States],\n ][]) {\n // §4 shallow sub-shape check (~35 B gzip)\n if (stateDef.sub !== undefined) {\n const sub = stateDef.sub;\n const subStates = (sub as { states?: unknown }).states;\n if (\n typeof sub !== \"object\" ||\n sub === null ||\n typeof subStates !== \"object\" ||\n subStates === null ||\n typeof (sub as { initial?: unknown }).initial !== \"string\"\n ) {\n throw new InvalidDefinitionError(\n `state \"${stateName}\".sub is not a valid sub-machine definition (missing states or initial)`,\n );\n }\n }\n if (!stateDef.on) continue;\n for (const [evtType, entry] of Object.entries(stateDef.on)) {\n const transitions = Array.isArray(entry) ? entry : [entry];\n for (const t of transitions) {\n if (t.target !== undefined && !stateKeys.includes(t.target)) {\n throw new InvalidDefinitionError(\n `transition ${stateName} -[${evtType}]-> \"${String(t.target)}\" targets an unknown state`,\n );\n }\n if (t.guard !== undefined && isAsyncGuardFn(t.guard)) {\n throw new InvalidDefinitionError(\n `transition ${stateName} -[${evtType}]-> uses an async guard. Guards must be sync; move I/O into an effect.`,\n );\n }\n }\n }\n }\n}\n\n/**\n * Validate a machine definition shape and return it. Same reference is\n * returned; no cloning happens. Validation is intentionally shallow.\n *\n * Two call forms:\n *\n * defineMachine<Ctx, Evt, States>({ ... })\n * Explicit generics. Use when you need full control (e.g. union event\n * types). Required because TypeScript cannot otherwise infer `Evt`.\n *\n * setup<Ctx, Evt>().defineMachine({ ... })\n * Curried form. Lets `States` be inferred from `keyof states`, so you\n * can omit it. Recommended for typical usage.\n */\nexport function defineMachine<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n): MachineDef<Ctx, Evt, States> {\n validateDefinition(def);\n return def;\n}\n\n/**\n * Curried builder so `States` can be inferred from `keyof states` without\n * `initial` collapsing it to a single literal. Pass `Ctx` and `Evt` as the\n * type arguments; pass the def to the returned `defineMachine`.\n *\n * const machine = setup<MyCtx, MyEvt>().defineMachine({\n * id: \"m\",\n * initial: \"a\",\n * context: { ... },\n * states: { a: {...}, b: {...} }, // States inferred as \"a\" | \"b\"\n * });\n */\nexport function setup<Ctx, Evt extends { type: string }>(): {\n defineMachine: <const States extends string>(def: {\n readonly id: string;\n readonly initial: NoInfer<States>;\n readonly context: Ctx;\n readonly states: Readonly<Record<States, StateDef<Ctx, Evt, States>>>;\n }) => MachineDef<Ctx, Evt, States>;\n} {\n return {\n defineMachine: <const States extends string>(def: {\n readonly id: string;\n readonly initial: NoInfer<States>;\n readonly context: Ctx;\n readonly states: Readonly<Record<States, StateDef<Ctx, Evt, States>>>;\n }) => {\n const cast = def as unknown as MachineDef<Ctx, Evt, States>;\n validateDefinition(cast);\n return cast;\n },\n };\n}\n\n/**\n * Build the initial snapshot for a machine.\n */\nexport function initialSnapshot<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n): Snapshot<Ctx, States> {\n const isFinal = def.states[def.initial]?.final === true;\n return freezeSnapshot({\n value: def.initial,\n context: def.context,\n status: isFinal ? (\"final\" as const) : (\"active\" as const),\n });\n}\n\n/**\n * Convenience factory that composes `defineMachine` and `createRuntime` in\n * one call for the common case where you do not need to keep the machine\n * definition around for serialization or sharing.\n *\n * For type inference over `States` from `keyof states`, prefer\n * `setup<Ctx, Evt>().defineMachine(...)` then pass the result to\n * `createRuntime` separately. `createMachine` is the spec-style entry point\n * documented in the ai*js ecosystem review.\n */\nexport function createMachine<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n impl: Implementations<Ctx, Evt>,\n opts?: RuntimeOptions<Ctx, Evt, States>,\n): Runtime<Ctx, Evt, States> {\n return createRuntime(defineMachine(def), impl, opts ?? {});\n}\n","import type { MachineDef, TransitionDef } from \"./types.js\";\n\n/**\n * Return all transition candidates for (state, eventType). Order is preserved\n * from the declaration so that guard fallthrough behaves predictably.\n *\n * If the event has no entry under the given state, an empty array is returned.\n */\nexport function resolveTransitions<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n stateValue: States,\n eventType: string,\n): readonly TransitionDef<Ctx, Evt, States>[] {\n const state = def.states[stateValue];\n if (!state || !state.on) return [];\n const entry = state.on[eventType];\n if (!entry) return [];\n return Array.isArray(entry) ? entry : [entry as TransitionDef<Ctx, Evt, States>];\n}\n"]}
1
+ {"version":3,"sources":["../src/fsm/types.ts","../src/fsm/evaluator.ts","../src/fsm/resolver.ts","../src/effects/enqueuer.ts","../src/fsm/snapshot.ts","../src/fsm/updater.ts","../src/fsm/lifecycle.ts","../src/fsm/runtime.ts","../src/fsm/definition.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["// All public types live here so AI agents and humans can read the entire\n// public surface in one file.\n\nexport type Effect = Readonly<{ type: string; payload?: unknown }>;\n\nexport type Enqueuer = Readonly<{\n effect: (type: string, payload?: unknown) => void;\n}>;\n\nexport type GuardArgs<Ctx, Evt> = Readonly<{\n context: Ctx;\n event: Evt;\n /**\n * Optional guard registry, threaded by `evalGuard` so combinators can resolve\n * string refs nested inside `and / or / not`. Inline user guards may safely\n * ignore this field — it is `undefined` when guards are evaluated outside of\n * `evalGuard` (e.g. in unit tests calling the function directly).\n */\n guards?: Readonly<Record<string, Guard<Ctx, Evt>>>;\n /**\n * Current state value, threaded by `evalGuard` from the live snapshot. Used\n * by the `stateIn` combinator. `undefined` when guards are called outside of\n * a lifecycle evaluation.\n */\n value?: string;\n}>;\n\nexport type Guard<Ctx, Evt> = (args: GuardArgs<Ctx, Evt>) => boolean;\n\nexport type Action<Ctx, Evt> = (args: {\n context: Ctx;\n event: Evt;\n enqueue: Enqueuer;\n}) => Partial<Ctx> | void;\n\nexport type EffectHandler<Ctx, Evt> = (\n effect: Effect,\n args: { context: Ctx; event: Evt; signal: AbortSignal },\n) => void | Promise<void>;\n\nexport type GuardRef<Ctx, Evt> = string | Guard<Ctx, Evt>;\nexport type ActionRef<Ctx, Evt> = string | Action<Ctx, Evt>;\n\nexport type TransitionDef<Ctx, Evt, States extends string> = Readonly<{\n target?: States;\n guard?: GuardRef<Ctx, Evt>;\n actions?: readonly ActionRef<Ctx, Evt>[];\n}>;\n\n/**\n * A single transition as written in a `StateDef.on` map. Either the full\n * {@link TransitionDef} object form, or the string shorthand `\"targetState\"`\n * (à la XState) which the resolver normalizes to `{ target: \"targetState\" }`\n * before processing. The shorthand carries no guard or actions.\n *\n * @since 0.5.3\n */\nexport type TransitionConfig<Ctx, Evt, States extends string> =\n | States\n | TransitionDef<Ctx, Evt, States>;\n\n/**\n * @experimental v0.3.0\n *\n * A nested machine definition attachable to StateDef.sub. The type parameters\n * are independent from the parent machine's <Ctx, Evt, States>; sub-machines\n * may have entirely unrelated context and event shapes.\n *\n * This is an alias for MachineDef — sub-machines have the same definition\n * shape as top-level machines. The relationship is purely lifecycle:\n * a sub-machine instance is created when its parent state becomes active\n * and disposed when the parent state exits.\n */\nexport type SubMachineDef<\n SubCtx,\n SubEvt extends { type: string },\n SubStates extends string,\n> = MachineDef<SubCtx, SubEvt, SubStates>;\n\nexport type StateDef<Ctx, Evt, States extends string> = Readonly<{\n on?: Readonly<\n Record<\n string,\n TransitionConfig<Ctx, Evt, States> | readonly TransitionConfig<Ctx, Evt, States>[]\n >\n >;\n entry?: readonly ActionRef<Ctx, Evt>[];\n exit?: readonly ActionRef<Ctx, Evt>[];\n final?: boolean;\n /**\n * Optional sub-machine. When the runtime enters a state with `sub`,\n * the sub-machine is lazily instantiated; when it exits, the sub-machine\n * is disposed. See STABILITY.md for the experimental contract.\n *\n * The generic parameters are erased to `any` because sub-machine type\n * parameters are intentionally independent from the parent's `Ctx` / `Evt`\n * / `States`. `MachineDef`'s generics are invariant (guards / actions\n * consume them), so the storage position must use `any` rather than\n * `unknown`. Caller narrows via `runtime.subRuntime() as Runtime<...>`.\n *\n * @experimental since 0.3.0\n */\n // biome-ignore lint/suspicious/noExplicitAny: see JSDoc — invariant generic escape hatch\n sub?: MachineDef<any, any, any>;\n /**\n * Implementations for `sub`. Ignored if `sub` is absent. Defaults to `{}`\n * (sub-machine must rely on inline guards / actions / effects only).\n *\n * @experimental since 0.3.0\n */\n // biome-ignore lint/suspicious/noExplicitAny: same reason as `sub` above\n subImpl?: Implementations<any, any>;\n}>;\n\nexport type MachineDef<Ctx, Evt extends { type: string }, States extends string> = Readonly<{\n id: string;\n initial: States;\n context: Ctx;\n states: Readonly<Record<States, StateDef<Ctx, Evt, States>>>;\n}>;\n\n/**\n * Input shape accepted by `defineMachine` / `setup().defineMachine`. Identical\n * to {@link MachineDef} except `context` is **optional** — when omitted it\n * defaults to `{}` (paired with the `Ctx = Record<string, never>` default type\n * parameter). The returned value is always a fully-normalized\n * {@link MachineDef} with `context` present, so downstream consumers are\n * unaffected.\n *\n * @since 0.5.3\n */\nexport type MachineConfig<Ctx, Evt extends { type: string }, States extends string> = Readonly<{\n id: string;\n initial: States;\n states: Readonly<Record<States, StateDef<Ctx, Evt, States>>>;\n}> &\n // `context` may be omitted only when `Ctx` has no required properties (e.g. the\n // default `Record<string, never>`). If `Ctx` has required fields it must be\n // supplied, so omitting it can't silently default to `{}` and crash at runtime.\n (Record<string, never> extends Ctx ? { readonly context?: Ctx } : { readonly context: Ctx });\n\nexport type Snapshot<Ctx, States extends string> = Readonly<{\n value: States;\n context: Ctx;\n status: \"active\" | \"final\";\n}>;\n\nexport type Implementations<Ctx, Evt> = Readonly<{\n guards?: Readonly<Record<string, Guard<Ctx, Evt>>>;\n actions?: Readonly<Record<string, Action<Ctx, Evt>>>;\n effects?: Readonly<Record<string, EffectHandler<Ctx, Evt>>>;\n}>;\n\nexport type StepResult<Ctx, States extends string> = Readonly<{\n snapshot: Snapshot<Ctx, States>;\n effects: readonly Effect[];\n changed: boolean;\n}>;\n\n/**\n * Sentinel event type that `Runtime.reset()` synthesises when the caller does\n * not pass an explicit event. Middleware receives it through\n * `MiddlewareContext.event`. Exposed so user code can discriminate.\n */\nexport const RESET_EVENT_TYPE = \"@@aifsmjs/RESET\" as const;\nexport type ResetEvent = Readonly<{ type: typeof RESET_EVENT_TYPE }>;\n\nexport type MiddlewareContext<Ctx, Evt, States extends string> = Readonly<{\n prev: Snapshot<Ctx, States>;\n next: Snapshot<Ctx, States>;\n /**\n * The triggering event. May be the user's `Evt` (from `send()` or an\n * explicit `reset(event)`) or the `ResetEvent` sentinel emitted by a\n * `reset()` with no event argument.\n */\n event: Evt | ResetEvent;\n effects: readonly Effect[];\n changed: boolean;\n}>;\n\nexport type Middleware<Ctx, Evt, States extends string> = (\n ctx: MiddlewareContext<Ctx, Evt, States>,\n next: () => void,\n) => void;\n\n/**\n * Payload of the `'transition'` runtime event — emitted after each `send()` or\n * `reset()` that actually changed the snapshot value.\n */\nexport type RuntimeTransitionEvent<Ctx, Evt, States extends string> = Readonly<{\n prev: Snapshot<Ctx, States>;\n next: Snapshot<Ctx, States>;\n event: Evt | ResetEvent;\n effects: readonly Effect[];\n changed: boolean;\n}>;\n\n/**\n * Payload of the `'error'` runtime event — currently emitted for async effect\n * handler rejections (which would otherwise become unhandled). Synchronous\n * throws from effect handlers and middleware still propagate to the caller of\n * `send()` / `reset()`.\n */\nexport type RuntimeErrorEvent<Evt> = Readonly<{\n error: unknown;\n event: Evt | ResetEvent | undefined;\n}>;\n\nexport type RuntimeEventMap<Ctx, Evt, States extends string> = {\n transition: RuntimeTransitionEvent<Ctx, Evt, States>;\n error: RuntimeErrorEvent<Evt>;\n dispose: void;\n};\n\nexport interface Runtime<Ctx, Evt extends { type: string }, States extends string> {\n getSnapshot(): Snapshot<Ctx, States>;\n /** Alias for `getSnapshot()`. */\n snapshot(): Snapshot<Ctx, States>;\n send(event: Evt): Snapshot<Ctx, States>;\n /**\n * Predict whether sending `event` would fire a transition. Reuses\n * `resolveTransitions` + `evalGuard` without applying any actions. Guards\n * are expected to be pure; `can` then matches `send` for the same input.\n */\n can(event: Evt): boolean;\n subscribe(listener: (snap: Snapshot<Ctx, States>) => void): () => void;\n /**\n * EventTarget-like typed listener API. Returns an unsubscribe function.\n * `options.signal` removes the listener when aborted; `options.once`\n * removes the listener after the first invocation. After `dispose()`,\n * `on()` is a no-op and returns a no-op unsubscribe.\n */\n on<K extends keyof RuntimeEventMap<Ctx, Evt, States>>(\n type: K,\n listener: (payload: RuntimeEventMap<Ctx, Evt, States>[K]) => void,\n options?: { signal?: AbortSignal; once?: boolean },\n ): () => void;\n /**\n * Re-initialise the runtime to the definition's initial snapshot. Triggers\n * subscribers but does NOT run entry actions (reset = re-birth, not\n * \"transition into initial\"). Throws RuntimeDisposedError if disposed.\n * If an `event` is supplied, middleware sees it as the trigger; otherwise\n * a sentinel `{ type: \"@@aifsmjs/RESET\" }` is synthesised.\n */\n reset(event?: Evt): Snapshot<Ctx, States>;\n /**\n * Tear down: abort the internal AbortController (effect handlers see signal\n * fire), clear listeners, and mark this runtime as disposed. Subsequent\n * send()/reset() calls throw RuntimeDisposedError. Idempotent.\n */\n dispose(): void;\n /**\n * True after `dispose()` has been called.\n */\n readonly disposed: boolean;\n /**\n * AbortSignal scoped to this runtime's lifetime. Fires once on dispose().\n * Threaded to every EffectHandler invocation; external integrations\n * (e.g. component teardown) can also attach `signal.addEventListener(\"abort\", ...)`.\n */\n readonly signal: AbortSignal;\n /**\n * @experimental v0.3.0\n *\n * Returns the currently active sub-Runtime for the current parent state,\n * or undefined if:\n * - the current state has no `sub` definition, OR\n * - the sub-Runtime failed to initialise (SubMachineError was thrown\n * from `send()` / `reset()` / `createRuntime` per the spec contract),\n * OR\n * - the parent runtime has been disposed.\n *\n * The returned Runtime is typed at the loosest sub-machine signature.\n * Caller casts to the concrete sub type.\n *\n * Re-entry: when the parent leaves and re-enters a state with `sub`, a\n * fresh sub-Runtime is constructed. Previous sub-Runtime references held\n * by the caller are stale and MUST NOT be used (disposed).\n */\n subRuntime(): Runtime<unknown, { type: string }, string> | undefined;\n /**\n * Semantic sugar for `runtime.on('transition', handler, opts)`. Returns\n * the same unsubscribe function. Sharing the same listener Set with\n * `on('transition', ...)` means registration order determines invocation\n * order across both APIs.\n *\n * @since 0.3.0\n */\n onTransition(\n handler: (payload: RuntimeTransitionEvent<Ctx, Evt, States>) => void,\n options?: { signal?: AbortSignal; once?: boolean },\n ): () => void;\n}\n\nexport type RuntimeOptions<Ctx, Evt, States extends string> = Readonly<{\n middleware?: readonly Middleware<Ctx, Evt, States>[];\n /**\n * If false, do not dispatch effects through the effect handler map.\n * Useful for replay / dry-run modes. Defaults to true.\n */\n dispatchEffects?: boolean;\n}>;\n","import type { Guard, GuardRef, Implementations } from \"./types.js\";\n\nexport class UnknownGuardError extends Error {\n readonly guardName: string;\n constructor(guardName: string) {\n super(`aifsmjs: guard \"${guardName}\" not found in implementations.guards`);\n this.name = \"UnknownGuardError\";\n this.guardName = guardName;\n }\n}\n\nexport class AsyncGuardError extends Error {\n readonly guardName: string;\n constructor(guardName: string) {\n super(\n `aifsmjs: guard \"${guardName}\" must be sync; received a Promise. Async guards break determinism and replay. Move I/O into an effect.`,\n );\n this.name = \"AsyncGuardError\";\n this.guardName = guardName;\n }\n}\n\n/**\n * Detect declared-async guards at definition time. Catches the common case of\n * `async (args) => ...` inline guards. Combinator builders or arrow returns of\n * a Promise still slip past — those are caught at `evalGuard` runtime via\n * the `isThenable` check.\n *\n * Caveat: this relies on `Function.prototype.constructor.name === \"AsyncFunction\"`,\n * which is reliable in ES2017+ runtimes. If your bundler transpiles `async`\n * to generator-based code (e.g. ES5 / very old TypeScript targets), this\n * check returns `false` for those forms — the runtime `evalGuard` thenable\n * check still catches them.\n */\nexport function isAsyncGuardFn(fn: unknown): boolean {\n if (typeof fn !== \"function\") return false;\n return fn.constructor?.name === \"AsyncFunction\";\n}\n\n/**\n * Detect a thenable (PromiseLike) — anything with a callable `then`. Used in\n * place of `instanceof Promise` so cross-realm Promises (iframe / worker /\n * vm context) and user-defined thenables are also rejected.\n */\nfunction isThenable(x: unknown): x is PromiseLike<unknown> {\n return (\n x !== null &&\n (typeof x === \"object\" || typeof x === \"function\") &&\n typeof (x as { then?: unknown }).then === \"function\"\n );\n}\n\n/**\n * Resolve a guard ref to a Guard function. String refs are looked up in the\n * implementations map; inline functions are returned as-is.\n */\nexport function resolveGuard<Ctx, Evt>(\n ref: GuardRef<Ctx, Evt>,\n impl: Implementations<Ctx, Evt>,\n): Guard<Ctx, Evt> {\n if (typeof ref === \"function\") return ref;\n const fn = impl.guards?.[ref];\n if (!fn) throw new UnknownGuardError(ref);\n return fn;\n}\n\n/**\n * Evaluate a guard ref against (context, event). Guards must be sync and pure;\n * TypeScript blocks declared-async signatures at compile time, but JS callers\n * or casts can still slip through. This function checks two ways:\n * 1. Inline AsyncFunction (declared `async`) → throw AsyncGuardError.\n * 2. Return value is a Promise → throw AsyncGuardError.\n * Both throws are user errors; they would otherwise silently pass the guard\n * (Promise is truthy) and break determinism.\n *\n * The optional `value` argument is the current state value, threaded so the\n * `stateIn` combinator and similar predicates can introspect it.\n */\nexport function evalGuard<Ctx, Evt>(\n ref: GuardRef<Ctx, Evt>,\n context: Ctx,\n event: Evt,\n impl: Implementations<Ctx, Evt>,\n value?: string,\n): boolean {\n const fn = resolveGuard(ref, impl);\n // Function.prototype.name is \"\" for anonymous arrows — use `||` not `??`\n // so the empty string falls back to \"<inline>\" for readable error messages.\n const guardName = typeof ref === \"string\" ? ref : fn.name || \"<inline>\";\n if (isAsyncGuardFn(fn)) {\n throw new AsyncGuardError(guardName);\n }\n // Build args while honouring exactOptionalPropertyTypes: omit fields that\n // would otherwise be assigned `undefined`.\n type Args = {\n context: Ctx;\n event: Evt;\n guards?: Readonly<Record<string, Guard<Ctx, Evt>>>;\n value?: string;\n };\n const args: Args = { context, event };\n const guardsMap = impl.guards;\n if (guardsMap) args.guards = guardsMap;\n if (value !== undefined) args.value = value;\n const result = fn(args);\n // TS narrows `result` to boolean from Guard's return type, but a JS caller\n // or a cast can slip a Promise / PromiseLike through. We accept anything\n // thenable (native Promise, cross-realm Promise, user-defined thenable),\n // not just same-realm `instanceof Promise`.\n if (isThenable(result)) {\n throw new AsyncGuardError(guardName);\n }\n return result;\n}\n","import type { MachineDef, TransitionConfig, TransitionDef } from \"./types.js\";\n\n/**\n * Normalize a single transition config into its object form. The string\n * shorthand `\"targetState\"` (à la XState) becomes `{ target: \"targetState\" }`;\n * the object form is returned unchanged. Centralised here so every consumer\n * (`step`, `resolveTransitions`, `can`, validation) sees the same shape.\n *\n * @since 0.5.3\n */\nexport function normalizeTransition<Ctx, Evt, States extends string>(\n entry: TransitionConfig<Ctx, Evt, States>,\n): TransitionDef<Ctx, Evt, States> {\n return typeof entry === \"string\" ? ({ target: entry } as TransitionDef<Ctx, Evt, States>) : entry;\n}\n\n/**\n * Normalize the raw `state.on[eventType]` value (object, string shorthand, or\n * an array mixing both) into an ordered list of {@link TransitionDef} objects.\n * Declaration order is preserved.\n *\n * @since 0.5.3\n */\nexport function normalizeTransitions<Ctx, Evt, States extends string>(\n entry:\n | TransitionConfig<Ctx, Evt, States>\n | readonly TransitionConfig<Ctx, Evt, States>[]\n | undefined,\n): readonly TransitionDef<Ctx, Evt, States>[] {\n if (entry === undefined) return [];\n if (Array.isArray(entry)) {\n // Hot path (send/step/can run this per event): when no string shorthand is\n // present, return the original array instead of allocating a normalized copy.\n return entry.some((t) => typeof t === \"string\")\n ? entry.map((t) => normalizeTransition(t))\n : (entry as readonly TransitionDef<Ctx, Evt, States>[]);\n }\n return [normalizeTransition(entry as TransitionConfig<Ctx, Evt, States>)];\n}\n\n/**\n * Return all transition candidates for (state, eventType). Order is preserved\n * from the declaration so that guard fallthrough behaves predictably. String\n * shorthands are normalized to `{ target }` objects.\n *\n * If the event has no entry under the given state, an empty array is returned.\n */\nexport function resolveTransitions<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n stateValue: States,\n eventType: string,\n): readonly TransitionDef<Ctx, Evt, States>[] {\n const state = def.states[stateValue];\n if (!state || !state.on) return [];\n return normalizeTransitions(state.on[eventType]);\n}\n","import type { Enqueuer } from \"../fsm/types.js\";\n\n/**\n * Build a closure-based Enqueuer that pushes effects into the supplied sink.\n * Each `step()` invocation creates one such enqueuer and discards it\n * afterwards; the sink is the effects array later returned to the caller.\n *\n * Lives in `effects/` because the Enqueuer concept is the effects-domain API\n * — `step()` imports it from here.\n */\nexport function createEnqueuer(sink: { type: string; payload?: unknown }[]): Enqueuer {\n return Object.freeze({\n effect(type: string, payload?: unknown) {\n if (payload === undefined) {\n sink.push(Object.freeze({ type }));\n } else {\n sink.push(Object.freeze({ type, payload }));\n }\n },\n });\n}\n","import type { Snapshot } from \"./types.js\";\n\nconst IS_DEV =\n typeof process !== \"undefined\" &&\n typeof process.env !== \"undefined\" &&\n process.env.NODE_ENV !== \"production\";\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nexport function deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== \"object\") return value;\n if (Object.isFrozen(value)) return value;\n Object.freeze(value);\n if (Array.isArray(value)) {\n for (const item of value) deepFreeze(item);\n } else if (isPlainObject(value)) {\n for (const key of Object.keys(value)) {\n deepFreeze((value as Record<string, unknown>)[key]);\n }\n }\n return value;\n}\n\n/**\n * Wrap a freshly built snapshot. In dev mode the whole tree is deep-frozen so\n * accidental mutation throws immediately. In production only the top object is\n * frozen, keeping the cost negligible.\n */\nexport function freezeSnapshot<C, S extends string>(snap: Snapshot<C, S>): Snapshot<C, S> {\n // IS_DEV is always true in vitest; the production branch (`Object.freeze`)\n // is exercised only when NODE_ENV === \"production\" and is intentionally\n // left out of the coverage threshold.\n return IS_DEV ? deepFreeze(snap) : Object.freeze(snap);\n}\n\nexport function createSnapshot<C, S extends string>(args: {\n value: S;\n context: C;\n status?: \"active\" | \"final\";\n}): Snapshot<C, S> {\n return freezeSnapshot({\n value: args.value,\n context: args.context,\n status: args.status ?? \"active\",\n });\n}\n","import type { Action } from \"./types.js\";\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Build an Action that returns a Partial<Ctx> from a pure updater.\n * The partial is merged into the current context by `step()`.\n */\nexport function assign<Ctx, Evt>(\n updater: (args: { context: Ctx; event: Evt }) => Partial<Ctx>,\n): Action<Ctx, Evt> {\n return ({ context, event }) => updater({ context, event });\n}\n\n/**\n * Merge a partial context update into the current context. Plain-object\n * contexts get a shallow merge; non-object contexts get replaced wholesale.\n *\n * The function never mutates either argument.\n */\nexport function mergeContext<Ctx>(current: Ctx, patch: Partial<Ctx> | void): Ctx {\n if (patch === undefined || patch === null) return current;\n if (isPlainRecord(current) && isPlainRecord(patch)) {\n return { ...current, ...patch } as Ctx;\n }\n return patch as Ctx;\n}\n","import { createEnqueuer } from \"../effects/enqueuer.js\";\nimport { evalGuard } from \"./evaluator.js\";\nimport { normalizeTransitions } from \"./resolver.js\";\nimport { freezeSnapshot } from \"./snapshot.js\";\nimport type {\n Action,\n ActionRef,\n Effect,\n Implementations,\n MachineDef,\n Snapshot,\n StepResult,\n TransitionDef,\n} from \"./types.js\";\nimport { mergeContext } from \"./updater.js\";\n\nexport class UnknownActionError extends Error {\n readonly actionName: string;\n constructor(actionName: string) {\n super(`aifsmjs: action \"${actionName}\" not found in implementations.actions`);\n this.name = \"UnknownActionError\";\n this.actionName = actionName;\n }\n}\n\nfunction resolveAction<Ctx, Evt>(\n ref: ActionRef<Ctx, Evt>,\n impl: Implementations<Ctx, Evt>,\n): Action<Ctx, Evt> {\n if (typeof ref === \"function\") return ref;\n const fn = impl.actions?.[ref];\n if (!fn) throw new UnknownActionError(ref);\n return fn;\n}\n\nfunction runActions<Ctx, Evt>(\n refs: readonly ActionRef<Ctx, Evt>[] | undefined,\n ctx: Ctx,\n event: Evt,\n impl: Implementations<Ctx, Evt>,\n effectSink: Effect[],\n): Ctx {\n if (!refs || refs.length === 0) return ctx;\n const enqueue = createEnqueuer(effectSink as { type: string; payload?: unknown }[]);\n let current = ctx;\n for (const ref of refs) {\n const fn = resolveAction(ref, impl);\n const patch = fn({ context: current, event, enqueue });\n current = mergeContext(current, patch);\n }\n return current;\n}\n\nfunction pickTransition<Ctx, Evt, States extends string>(\n candidates: readonly TransitionDef<Ctx, Evt, States>[],\n ctx: Ctx,\n event: Evt,\n impl: Implementations<Ctx, Evt>,\n value: States,\n): TransitionDef<Ctx, Evt, States> | undefined {\n for (const t of candidates) {\n if (!t.guard) return t;\n if (evalGuard(t.guard, ctx, event, impl, value)) return t;\n }\n return undefined;\n}\n\n/**\n * Compute the next snapshot and collected effects from a single event.\n *\n * Order is fixed and uninterruptible:\n * 1. resolve candidate transitions for (state, event.type)\n * 2. evaluate guards in declaration order; pick the first passing one\n * 3. if external (target defined), run exit actions of the old state\n * 4. run transition.actions in declaration order\n * 5. if external, run entry actions of the new state\n * 6. return { snapshot, effects, changed }\n *\n * The function is pure: it never dispatches effects and never mutates inputs.\n */\nexport function step<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n snapshot: Snapshot<Ctx, States>,\n event: Evt,\n impl: Implementations<Ctx, Evt>,\n): StepResult<Ctx, States> {\n // Final state is inert: it never reacts to events.\n if (snapshot.status === \"final\") {\n return Object.freeze({ snapshot, effects: [] as readonly Effect[], changed: false });\n }\n\n const state = def.states[snapshot.value];\n /* v8 ignore next 3 — defensive: snapshot.value is always validated against def.states by defineMachine + initialSnapshot. */\n if (!state) {\n return Object.freeze({ snapshot, effects: [] as readonly Effect[], changed: false });\n }\n\n const candidateList = normalizeTransitions(state.on?.[event.type]);\n\n const chosen = pickTransition(candidateList, snapshot.context, event, impl, snapshot.value);\n if (!chosen) {\n return Object.freeze({ snapshot, effects: [] as readonly Effect[], changed: false });\n }\n\n const isExternal = chosen.target !== undefined;\n const nextStateValue = (chosen.target ?? snapshot.value) as States;\n const nextState = def.states[nextStateValue];\n\n const effectSink: Effect[] = [];\n let ctx = snapshot.context;\n\n if (isExternal) {\n ctx = runActions(state.exit, ctx, event, impl, effectSink);\n }\n ctx = runActions(chosen.actions, ctx, event, impl, effectSink);\n if (isExternal && nextState) {\n ctx = runActions(nextState.entry, ctx, event, impl, effectSink);\n }\n\n const status: \"active\" | \"final\" = nextState?.final === true ? \"final\" : \"active\";\n const nextSnapshot = freezeSnapshot({\n value: nextStateValue,\n context: ctx,\n status,\n });\n\n return Object.freeze({\n snapshot: nextSnapshot,\n effects: Object.freeze(effectSink.slice()) as readonly Effect[],\n changed: true,\n });\n}\n","import { initialSnapshot } from \"./definition.js\";\nimport { evalGuard } from \"./evaluator.js\";\nimport { step } from \"./lifecycle.js\";\nimport { normalizeTransitions } from \"./resolver.js\";\nimport { deepFreeze } from \"./snapshot.js\";\nimport {\n type Effect,\n type Implementations,\n type MachineDef,\n type Middleware,\n RESET_EVENT_TYPE,\n type ResetEvent,\n type Runtime,\n type RuntimeEventMap,\n type RuntimeOptions,\n type RuntimeTransitionEvent,\n type Snapshot,\n} from \"./types.js\";\n\nexport class RuntimeDisposedError extends Error {\n constructor() {\n super(\"aifsmjs: runtime has been disposed; send()/reset() are not allowed\");\n this.name = \"RuntimeDisposedError\";\n }\n}\n\n/**\n * Thrown by `send()` / `reset()` when a sub-machine init or dispose throws.\n *\n * Invariants:\n * - `phase: \"init\"` — child constructor threw. Parent snapshot was rolled\n * back to `prev`; no middleware ran; no `'transition'` emitted; no effects.\n * - `phase: \"dispose\"` — previous child's `dispose()` threw during transition.\n * Parent snapshot was rolled back to `prev`; child reference is cleared.\n * - Never thrown from `runtime.dispose()` cascade (never-throws contract).\n *\n * @since 0.3.0\n */\nexport class SubMachineError extends Error {\n readonly parentState: string;\n readonly phase: \"init\" | \"dispose\";\n override readonly cause: unknown;\n\n constructor(parentState: string, phase: \"init\" | \"dispose\", cause: unknown) {\n super(`aifsmjs: sub-machine ${phase} failed at parent state \"${parentState}\"`, { cause });\n this.name = \"SubMachineError\";\n this.parentState = parentState;\n this.phase = phase;\n this.cause = cause; // belt-and-suspenders: legacy bundlers ignore ES2022 cause option\n }\n}\n\nconst RESET_EVENT: ResetEvent = Object.freeze({ type: RESET_EVENT_TYPE });\n\nfunction composeMiddleware<Ctx, Evt, States extends string>(\n middleware: readonly Middleware<Ctx, Evt, States>[],\n): Middleware<Ctx, Evt, States> {\n return (ctx, finalNext) => {\n let index = -1;\n const dispatch = (i: number): void => {\n if (i <= index) throw new Error(\"aifsmjs: next() called multiple times in middleware\");\n index = i;\n const fn = middleware[i];\n if (!fn) {\n finalNext();\n return;\n }\n fn(ctx, () => dispatch(i + 1));\n };\n dispatch(0);\n };\n}\n\n/**\n * Build a thin stateful runtime around a machine. `send()` calls `step()`,\n * runs the read-only middleware pipeline, dispatches effects, and notifies\n * subscribers. The runtime owns an `AbortController`; `dispose()` aborts it\n * and clears all state.\n */\nexport function createRuntime<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n impl: Implementations<Ctx, Evt>,\n opts: RuntimeOptions<Ctx, Evt, States> = {},\n): Runtime<Ctx, Evt, States> {\n let snapshot: Snapshot<Ctx, States> = initialSnapshot(def);\n const listeners = new Set<(snap: Snapshot<Ctx, States>) => void>();\n const middlewareChain =\n opts.middleware && opts.middleware.length > 0 ? composeMiddleware(opts.middleware) : undefined;\n const shouldDispatch = opts.dispatchEffects !== false;\n const controller = new AbortController();\n let disposed = false;\n // §3.1 sub-machine state. childRuntime is the live child; childAbortCleanup\n // detaches the parent-abort listener attached by wireChildAbort. Both are\n // cleared together whenever the child is replaced or disposed (P1-3 fix).\n let childRuntime: Runtime<unknown, { type: string }, string> | undefined;\n let childAbortCleanup: (() => void) | undefined;\n\n type EventListeners = {\n [K in keyof RuntimeEventMap<Ctx, Evt, States>]: Set<\n (payload: RuntimeEventMap<Ctx, Evt, States>[K]) => void\n >;\n };\n const eventListeners: EventListeners = {\n transition: new Set(),\n error: new Set(),\n dispose: new Set(),\n };\n const externalAbortCleanups = new Set<() => void>();\n\n function emit<K extends keyof RuntimeEventMap<Ctx, Evt, States>>(\n type: K,\n payload: RuntimeEventMap<Ctx, Evt, States>[K],\n ): void {\n for (const fn of eventListeners[type]) fn(payload);\n }\n\n function notify(committed?: Snapshot<Ctx, States>) {\n const captured = committed ?? snapshot;\n for (const l of listeners) l(captured);\n }\n\n function runMiddleware(\n prev: Snapshot<Ctx, States>,\n event: Evt | ResetEvent,\n effects: readonly Effect[],\n changed: boolean,\n ) {\n if (!middlewareChain) return;\n middlewareChain(deepFreeze({ prev, next: snapshot, event, effects, changed }), () => {});\n }\n\n function dispatchEffects(effects: readonly Effect[], context: Ctx, event: Evt): void {\n if (!impl.effects || effects.length === 0) return;\n for (const eff of effects) {\n const handler = impl.effects[eff.type];\n if (!handler) continue;\n const r = handler(eff, { context, event, signal: controller.signal });\n if (r instanceof Promise) {\n r.catch((err: unknown) => {\n emit(\"error\", { error: err, event });\n });\n }\n }\n }\n\n // §3.1 Attach one-shot abort listener: parent dispose → child.dispose().\n // Returns a cleanup fn that detaches the listener; caller stores it in\n // `childAbortCleanup` and invokes when the child is replaced/disposed\n // (P1-3 fix: prevent stale listeners accumulating on the parent signal).\n function wireChildAbort(child: Runtime<unknown, { type: string }, string>): () => void {\n /* v8 ignore next 7 — parent may already be aborted in edge cases; dispose still runs */\n if (controller.signal.aborted) {\n try {\n child.dispose();\n } catch {\n /* swallow */\n }\n return () => {};\n }\n /* v8 ignore next 7 — defensive: dispose() pre-cleans this listener and\n disposes the child manually before calling controller.abort(), so\n onAbort fires only if external code aborts the controller bypassing\n dispose(). Internal-only controller has no such external path today. */\n const onAbort = () => {\n try {\n child.dispose();\n } catch {\n /* swallow */\n }\n };\n controller.signal.addEventListener(\"abort\", onAbort, { once: true });\n return () => controller.signal.removeEventListener(\"abort\", onAbort);\n }\n\n // §3.3 Re-resolve guards to find the chosen transition and determine\n // whether it is external (has a `target`). Replaces the v0.3.0 dev\n // hasSelfTargetMarker heuristic that over-reported when an event had both\n // internal (no-target) and self-target (target === value) candidates\n // (P1-2 fix). Cost: one extra guard evaluation pass per same-value event.\n function findChosenIsExternal(value: States, event: Evt, context: Ctx): boolean {\n const state = def.states[value];\n if (!state?.on) return false;\n const list = normalizeTransitions(state.on[event.type]);\n if (list.length === 0) return false;\n for (const t of list) {\n if (!t.guard || evalGuard(t.guard, context, event, impl, value)) {\n return t.target !== undefined;\n }\n }\n /* v8 ignore next — defensive: caller only invokes when step() returned\n changed=true, which guarantees a matching guard exists in the same\n candidate list. The for-loop above always returns before this line. */\n return false;\n }\n\n // §3.1 Dispose old child and/or init new child. Throws SubMachineError on failure.\n // Caller must NOT commit snapshot on throw.\n function applySubLifecycle(prevValue: States, nextValue: States): void {\n const prevStateDef = def.states[prevValue];\n const nextStateDef = def.states[nextValue];\n if (prevStateDef?.sub !== undefined && childRuntime !== undefined) {\n const child = childRuntime;\n childRuntime = undefined;\n childAbortCleanup?.();\n childAbortCleanup = undefined;\n try {\n child.dispose();\n } catch (cause) {\n throw new SubMachineError(prevValue as string, \"dispose\", cause);\n }\n }\n if (nextStateDef?.sub !== undefined) {\n let newChild: Runtime<unknown, { type: string }, string>;\n try {\n newChild = createRuntime(nextStateDef.sub, nextStateDef.subImpl ?? {});\n } catch (cause) {\n throw new SubMachineError(nextValue as string, \"init\", cause);\n }\n childRuntime = newChild;\n childAbortCleanup = wireChildAbort(newChild);\n }\n }\n\n function send(event: Evt): Snapshot<Ctx, States> {\n if (disposed) throw new RuntimeDisposedError();\n const prev = snapshot;\n const result = step(def, prev, event, impl);\n const isExternal =\n result.changed &&\n (prev.value !== result.snapshot.value ||\n findChosenIsExternal(prev.value, event, prev.context));\n // Sub lifecycle BEFORE snapshot commit (§3.4); throws SubMachineError on failure → no commit\n if (result.changed && isExternal) applySubLifecycle(prev.value, result.snapshot.value);\n snapshot = result.snapshot;\n const committed = result.snapshot;\n runMiddleware(prev, event, result.effects, result.changed);\n if (shouldDispatch) dispatchEffects(result.effects, committed.context, event);\n if (result.changed) {\n notify(committed);\n emit(\"transition\", {\n prev,\n next: committed,\n event,\n effects: result.effects,\n changed: true,\n } as RuntimeTransitionEvent<Ctx, Evt, States>);\n }\n return snapshot;\n }\n\n function reset(event?: Evt): Snapshot<Ctx, States> {\n if (disposed) throw new RuntimeDisposedError();\n const prev = snapshot;\n const nextSnap = initialSnapshot(def);\n const changed = prev.value !== nextSnap.value;\n // Dispose current child (§3.5)\n if (childRuntime) {\n const child = childRuntime;\n childRuntime = undefined;\n childAbortCleanup?.();\n childAbortCleanup = undefined;\n try {\n child.dispose();\n } catch (cause) {\n throw new SubMachineError(prev.value as string, \"dispose\", cause);\n }\n }\n // Init child for new initial state if it has sub (§3.5)\n const initStateDef = def.states[nextSnap.value];\n if (initStateDef?.sub) {\n let newChild: Runtime<unknown, { type: string }, string>;\n try {\n newChild = createRuntime(initStateDef.sub, initStateDef.subImpl ?? {});\n } catch (cause) {\n /* v8 ignore next — reset() init failure: only reachable if frozen sub def somehow rejects post-bootstrap */\n throw new SubMachineError(nextSnap.value as string, \"init\", cause);\n }\n childRuntime = newChild;\n childAbortCleanup = wireChildAbort(newChild);\n }\n snapshot = nextSnap;\n const triggerEvent: Evt | ResetEvent = event ?? RESET_EVENT;\n runMiddleware(prev, triggerEvent, [], changed);\n if (changed) {\n notify();\n emit(\"transition\", {\n prev,\n next: snapshot,\n event: triggerEvent,\n effects: [],\n changed: true,\n } as RuntimeTransitionEvent<Ctx, Evt, States>);\n }\n return snapshot;\n }\n\n function can(event: Evt): boolean {\n if (disposed || snapshot.status === \"final\") return false;\n const state = def.states[snapshot.value];\n /* v8 ignore next — defensive: snapshot.value always corresponds to a declared state. */\n if (!state) return false;\n const list = normalizeTransitions(state.on?.[event.type]);\n if (list.length === 0) return false;\n for (const t of list) {\n if (!t.guard) return true;\n if (evalGuard(t.guard, snapshot.context, event, impl, snapshot.value)) return true;\n }\n return false;\n }\n\n function on<K extends keyof RuntimeEventMap<Ctx, Evt, States>>(\n type: K,\n listener: (payload: RuntimeEventMap<Ctx, Evt, States>[K]) => void,\n options?: { signal?: AbortSignal; once?: boolean },\n ): () => void {\n if (disposed || options?.signal?.aborted) return () => {};\n const target = eventListeners[type];\n let detachAbort: (() => void) | undefined;\n // Full teardown shared by the once-wrapper, the abort handler, and the\n // returned unsubscribe so every path detaches the abort listener too — a\n // once-handler that also passed a { signal } previously left the abort\n // listener attached until dispose()/abort (memory leak).\n const cleanup = (): void => {\n target.delete(wrapped);\n if (detachAbort) {\n detachAbort();\n externalAbortCleanups.delete(detachAbort);\n }\n };\n let wrapped: (payload: RuntimeEventMap<Ctx, Evt, States>[K]) => void = listener;\n if (options?.once) {\n wrapped = (payload) => {\n cleanup();\n listener(payload);\n };\n }\n target.add(wrapped);\n const signal = options?.signal;\n if (signal) {\n const onAbort = () => cleanup();\n signal.addEventListener(\"abort\", onAbort, { once: true });\n detachAbort = () => signal.removeEventListener(\"abort\", onAbort);\n externalAbortCleanups.add(detachAbort);\n }\n return cleanup;\n }\n\n function dispose(): void {\n if (disposed) return;\n disposed = true;\n // Cascade child dispose; swallow exceptions (dispose contract) (§3.6)\n if (childRuntime) {\n childAbortCleanup?.();\n childAbortCleanup = undefined;\n try {\n childRuntime.dispose();\n } catch {\n /* swallow */\n }\n childRuntime = undefined;\n }\n controller.abort();\n listeners.clear();\n emit(\"dispose\", undefined as RuntimeEventMap<Ctx, Evt, States>[\"dispose\"]);\n for (const set of Object.values(eventListeners)) set.clear();\n for (const cleanup of externalAbortCleanups) cleanup();\n externalAbortCleanups.clear();\n }\n\n const runtime: Runtime<Ctx, Evt, States> = {\n getSnapshot: () => snapshot,\n snapshot: () => snapshot,\n send,\n can,\n reset,\n dispose,\n on,\n get disposed() {\n return disposed;\n },\n get signal() {\n return controller.signal;\n },\n subscribe(listener) {\n if (disposed) return () => {};\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n subRuntime: () => childRuntime,\n onTransition: (handler, options) => on(\"transition\", handler, options),\n };\n\n // §2 Bootstrap: if initial state has sub, instantiate child BEFORE returning.\n // Failure throws SubMachineError(initialState, \"init\", cause) from createRuntime itself.\n const bootStateDef = def.states[snapshot.value];\n if (bootStateDef?.sub) {\n let newChild: Runtime<unknown, { type: string }, string>;\n try {\n newChild = createRuntime(bootStateDef.sub, bootStateDef.subImpl ?? {});\n } catch (cause) {\n throw new SubMachineError(snapshot.value as string, \"init\", cause);\n }\n childRuntime = newChild;\n childAbortCleanup = wireChildAbort(newChild);\n }\n\n return runtime;\n}\n","import { isAsyncGuardFn } from \"./evaluator.js\";\nimport { normalizeTransitions } from \"./resolver.js\";\nimport { createRuntime } from \"./runtime.js\";\nimport { freezeSnapshot } from \"./snapshot.js\";\nimport type {\n Implementations,\n MachineConfig,\n MachineDef,\n Runtime,\n RuntimeOptions,\n Snapshot,\n StateDef,\n} from \"./types.js\";\n\nexport class InvalidDefinitionError extends Error {\n constructor(message: string) {\n super(`aifsmjs: ${message}`);\n this.name = \"InvalidDefinitionError\";\n }\n}\n\nfunction validateDefinition<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n): void {\n if (!def.id || typeof def.id !== \"string\") {\n throw new InvalidDefinitionError(\"definition must have a non-empty string `id`\");\n }\n /* v8 ignore next 3 — additional safety: TS prevents non-object `states`; this guards untyped JS callers. */\n if (!def.states || typeof def.states !== \"object\") {\n throw new InvalidDefinitionError(\"definition must have a `states` object\");\n }\n const stateKeys = Object.keys(def.states) as States[];\n if (stateKeys.length === 0) {\n throw new InvalidDefinitionError(\"`states` must declare at least one state\");\n }\n if (!def.initial || !stateKeys.includes(def.initial)) {\n throw new InvalidDefinitionError(\n `\\`initial\\` \"${String(def.initial)}\" is not declared in states (${stateKeys.join(\", \")})`,\n );\n }\n for (const [stateName, stateDef] of Object.entries(def.states) as [\n States,\n (typeof def.states)[States],\n ][]) {\n // §4 shallow sub-shape check (~35 B gzip)\n if (stateDef.sub !== undefined) {\n const sub = stateDef.sub;\n const subStates = (sub as { states?: unknown }).states;\n if (\n typeof sub !== \"object\" ||\n sub === null ||\n typeof subStates !== \"object\" ||\n subStates === null ||\n typeof (sub as { initial?: unknown }).initial !== \"string\"\n ) {\n throw new InvalidDefinitionError(\n `state \"${stateName}\".sub is not a valid sub-machine definition (missing states or initial)`,\n );\n }\n }\n if (!stateDef.on) continue;\n for (const [evtType, entry] of Object.entries(stateDef.on)) {\n const transitions = normalizeTransitions(entry);\n for (const t of transitions) {\n if (t.target !== undefined && !stateKeys.includes(t.target)) {\n throw new InvalidDefinitionError(\n `transition ${stateName} -[${evtType}]-> \"${String(t.target)}\" targets an unknown state`,\n );\n }\n if (t.guard !== undefined && isAsyncGuardFn(t.guard)) {\n throw new InvalidDefinitionError(\n `transition ${stateName} -[${evtType}]-> uses an async guard. Guards must be sync; move I/O into an effect.`,\n );\n }\n }\n }\n }\n}\n\n/**\n * Validate a machine definition shape and return it. When `context` is\n * provided the same reference is returned; when it is omitted a shallow copy\n * with `context: {}` is returned. Validation is intentionally shallow.\n *\n * Two call forms:\n *\n * defineMachine<Ctx, Evt, States>({ ... })\n * Explicit generics. Use when you need full control (e.g. union event\n * types). Required because TypeScript cannot otherwise infer `Evt`.\n *\n * setup<Ctx, Evt>().defineMachine({ ... })\n * Curried form. Lets `States` be inferred from `keyof states`, so you\n * can omit it. Recommended for typical usage.\n */\nexport function defineMachine<\n Ctx = Record<string, never>,\n Evt extends { type: string } = { type: string },\n States extends string = string,\n>(def: MachineConfig<Ctx, Evt, States>): MachineDef<Ctx, Evt, States> {\n const normalized = (!(\"context\" in def) ? { ...def, context: {} as Ctx } : def) as MachineDef<\n Ctx,\n Evt,\n States\n >;\n validateDefinition(normalized);\n return normalized;\n}\n\n/**\n * Curried builder so `States` can be inferred from `keyof states` without\n * `initial` collapsing it to a single literal. Pass `Ctx` and `Evt` as the\n * type arguments; pass the def to the returned `defineMachine`.\n *\n * const machine = setup<MyCtx, MyEvt>().defineMachine({\n * id: \"m\",\n * initial: \"a\",\n * context: { ... },\n * states: { a: {...}, b: {...} }, // States inferred as \"a\" | \"b\"\n * });\n */\nexport function setup<\n Ctx = Record<string, never>,\n Evt extends { type: string } = { type: string },\n>(): {\n defineMachine: <const States extends string>(\n def: Readonly<{\n id: string;\n initial: NoInfer<States>;\n states: Readonly<Record<States, StateDef<Ctx, Evt, States>>>;\n }> &\n (Record<string, never> extends Ctx ? { readonly context?: Ctx } : { readonly context: Ctx }),\n ) => MachineDef<Ctx, Evt, States>;\n} {\n return {\n defineMachine: <const States extends string>(\n def: Readonly<{\n id: string;\n initial: NoInfer<States>;\n states: Readonly<Record<States, StateDef<Ctx, Evt, States>>>;\n }> &\n (Record<string, never> extends Ctx\n ? { readonly context?: Ctx }\n : { readonly context: Ctx }),\n ) => {\n const cast = (!(\"context\" in def)\n ? { ...def, context: {} as Ctx }\n : def) as unknown as MachineDef<Ctx, Evt, States>;\n validateDefinition(cast);\n return cast;\n },\n };\n}\n\n/**\n * Build the initial snapshot for a machine.\n */\nexport function initialSnapshot<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n): Snapshot<Ctx, States> {\n const isFinal = def.states[def.initial]?.final === true;\n return freezeSnapshot({\n value: def.initial,\n context: def.context,\n status: isFinal ? (\"final\" as const) : (\"active\" as const),\n });\n}\n\n/**\n * Convenience factory that composes `defineMachine` and `createRuntime` in\n * one call for the common case where you do not need to keep the machine\n * definition around for serialization or sharing.\n *\n * For type inference over `States` from `keyof states`, prefer\n * `setup<Ctx, Evt>().defineMachine(...)` then pass the result to\n * `createRuntime` separately. `createMachine` is the spec-style entry point\n * documented in the ai*js ecosystem review.\n */\nexport function createMachine<Ctx, Evt extends { type: string }, States extends string>(\n def: MachineDef<Ctx, Evt, States>,\n impl: Implementations<Ctx, Evt>,\n opts?: RuntimeOptions<Ctx, Evt, States>,\n): Runtime<Ctx, Evt, States> {\n return createRuntime(defineMachine(def), impl, opts ?? {});\n}\n"]}