effect-machine 0.18.0 → 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/machine.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import { DeferReplyResult, ReplyResult, TransitionResult, makeDeferReply, makeReply } from "./internal/utils.js";
2
2
  import { BrandedEvent, BrandedState, ExtractReply, TaggedOrConstructor } from "./internal/brands.js";
3
3
  import { MachineEventSchema, MachineStateSchema, VariantsUnion } from "./schema.js";
4
- import { DuplicateActorError } from "./errors.js";
4
+ import { ActorStoppedError, DuplicateActorError } from "./errors.js";
5
5
  import { Supervision } from "./supervision.js";
6
6
  import { ActorRef, ActorSystemService } from "./actor.js";
7
- import { Cause, Duration, Effect, Option, Schema, Scope } from "effect";
7
+ import { Duration, Effect, Option, Schema, Scope } from "effect";
8
8
  declare namespace machine_d_exports {
9
- export { DeferReplyResult, Durability, DurabilityCommit, HandlerContext, Lifecycle, Machine, MachineRef, MakeConfig, Recovery, RecoveryContext, ReplyResult, StateEffectHandler, StateHandlerContext, TaskOptions, TimeoutConfig, TransitionHandler, deferReply, make, replay, reply, scoped, spawn };
9
+ export { DeferReplyResult, Durability, DurabilityCommit, FinalContext, GuardPredicate, HandlerContext, InputMakeConfig, Lifecycle, Machine, MachineRef, MakeConfig, Recovery, RecoveryContext, ReplayOptions, ReplyResult, SpawnOptions, StateEffectHandler, StateHandlerContext, TaskOptions, TimeoutConfig, TransitionHandler, deferReply, make, replay, reply, run, scoped, spawn };
10
10
  }
11
11
  /**
12
12
  * Self reference for sending events back to the machine
@@ -37,6 +37,7 @@ interface HandlerContext<State, Event> {
37
37
  */
38
38
  interface StateHandlerContext<State, Event> {
39
39
  readonly actorId: string;
40
+ readonly generation: number;
40
41
  readonly state: State;
41
42
  readonly event: Event;
42
43
  readonly self: MachineRef<Event>;
@@ -52,9 +53,11 @@ type TransitionHandler<S, E, NewState, R, Reply = never> = (ctx: HandlerContext<
52
53
  * State effect handler function
53
54
  */
54
55
  type StateEffectHandler<S, E, R> = (ctx: StateHandlerContext<S, E>) => Effect.Effect<void, never, R>;
56
+ /** A condition for a transition candidate. Its error channel must be `never`. */
57
+ type GuardPredicate<State, Event, R = never> = (ctx: HandlerContext<State, Event>) => boolean | Effect.Effect<boolean, never, R>;
55
58
  interface TaskOptions<State, Event, A, E1, ES, EF> {
56
59
  readonly onSuccess?: (value: A, ctx: StateHandlerContext<State, Event>) => ES;
57
- readonly onFailure?: (cause: Cause.Cause<E1>, ctx: StateHandlerContext<State, Event>) => EF;
60
+ readonly onFailure?: (error: E1, ctx: StateHandlerContext<State, Event>) => EF;
58
61
  readonly name?: string;
59
62
  }
60
63
  /**
@@ -113,6 +116,23 @@ interface MakeConfig<SD extends Record<string, Schema.Struct.Fields>, ED extends
113
116
  };
114
117
  readonly initial: S;
115
118
  }
119
+ interface InputMakeConfig<SD extends Record<string, Schema.Struct.Fields>, ED extends Record<string, Schema.Struct.Fields>, S extends BrandedState, E extends BrandedEvent, Input> {
120
+ readonly state: MachineStateSchema<SD> & {
121
+ Type: S;
122
+ };
123
+ readonly event: MachineEventSchema<ED> & {
124
+ Type: E;
125
+ };
126
+ readonly initial: (input: Input) => S;
127
+ }
128
+ interface FinalContext<State> {
129
+ readonly state: State;
130
+ }
131
+ type TaggedValue<Union, Tagged> = Tagged extends ((...args: never[]) => infer Value) ? Value : Tagged extends {
132
+ readonly _tag: infer Tag;
133
+ } ? Extract<Union, {
134
+ readonly _tag: Tag;
135
+ }> : never;
116
136
  /**
117
137
  * Machine definition with fluent builder API.
118
138
  *
@@ -123,34 +143,54 @@ interface MakeConfig<SD extends Record<string, Schema.Struct.Fields>, ED extends
123
143
  * - `_SD`: State schema definition (for compile-time validation)
124
144
  * - `_ED`: Event schema definition (for compile-time validation)
125
145
  */
126
- declare class Machine<State, Event, R = never, _SD extends Record<string, Schema.Struct.Fields> = Record<string, Schema.Struct.Fields>, _ED extends Record<string, Schema.Struct.Fields> = Record<string, Schema.Struct.Fields>> {
146
+ declare class Machine<State, Event, R = never, _SD extends Record<string, Schema.Struct.Fields> = Record<string, Schema.Struct.Fields>, _ED extends Record<string, Schema.Struct.Fields> = Record<string, Schema.Struct.Fields>, Input = void, Output = State> {
127
147
  #private;
128
- readonly initial: State;
148
+ readonly initial: Input extends void ? State : undefined;
129
149
  readonly stateSchema: MachineStateSchema<_SD> & {
130
150
  readonly Type: State;
131
151
  };
132
152
  readonly eventSchema: MachineEventSchema<_ED> & {
133
153
  readonly Type: Event;
134
154
  };
135
- from<NS extends VariantsUnion<_SD> & BrandedState, R1>(state: TaggedOrConstructor<NS>, build: (scope: TransitionScope<State, Event, R, _SD, _ED, NS>) => R1): Machine<State, Event, R, _SD, _ED>;
136
- from<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, R1>(states: NS, build: (scope: TransitionScope<State, Event, R, _SD, _ED, NS[number] extends TaggedOrConstructor<infer S extends VariantsUnion<_SD> & BrandedState> ? S : never>) => R1): Machine<State, Event, R, _SD, _ED>;
155
+ from<NS extends VariantsUnion<_SD> & BrandedState, R1>(state: TaggedOrConstructor<NS>, build: (scope: TransitionScope<State, Event, R, _SD, _ED, NS, Input, Output>) => TransitionScope<State, Event, R, _SD, _ED, NS, Input, Output, R1>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
156
+ from<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, R1>(states: NS, build: (scope: TransitionScope<State, Event, R, _SD, _ED, NS[number] extends TaggedOrConstructor<infer S extends VariantsUnion<_SD> & BrandedState> ? S : never, Input, Output>) => TransitionScope<State, Event, R, _SD, _ED, NS[number] extends TaggedOrConstructor<infer S extends VariantsUnion<_SD> & BrandedState> ? S : never, Input, Output, R1>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
137
157
  /** Register transition for a single state */
138
- on<NS extends VariantsUnion<_SD> & BrandedState, NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState>(state: TaggedOrConstructor<NS>, event: TaggedOrConstructor<NE>, handler: TransitionHandler<NS, NE, RS, never, ExtractReply<NE>>): Machine<State, Event, R, _SD, _ED>;
158
+ on<NS extends VariantsUnion<_SD> & BrandedState, NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, R1 = never>(state: TaggedOrConstructor<NS>, event: TaggedOrConstructor<NE>, handler: TransitionHandler<NS, NE, RS, R1, ExtractReply<NE>>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
139
159
  /** Register transition for multiple states (handler receives union of state types) */
140
- on<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState>(states: NS, event: TaggedOrConstructor<NE>, handler: TransitionHandler<NS[number] extends TaggedOrConstructor<infer S> ? S : never, NE, RS, never, ExtractReply<NE>>): Machine<State, Event, R, _SD, _ED>;
160
+ on<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, R1 = never>(states: NS, event: TaggedOrConstructor<NE>, handler: TransitionHandler<NS[number] extends TaggedOrConstructor<infer S> ? S : never, NE, RS, R1, ExtractReply<NE>>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
161
+ /** Register a conditional transition for a single state. */
162
+ when<NS extends VariantsUnion<_SD> & BrandedState, NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, RG = never, R1 = never>(state: TaggedOrConstructor<NS>, event: TaggedOrConstructor<NE>, predicate: GuardPredicate<NS, NE, RG>, handler: TransitionHandler<NS, NE, RS, R1, ExtractReply<NE>>): Machine<State, Event, R | RG | R1, _SD, _ED, Input, Output>;
163
+ /** Register a conditional transition for multiple states. */
164
+ when<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, RG = never, R1 = never>(states: NS, event: TaggedOrConstructor<NE>, predicate: GuardPredicate<NS[number] extends TaggedOrConstructor<infer S> ? S : never, NE, RG>, handler: TransitionHandler<NS[number] extends TaggedOrConstructor<infer S> ? S : never, NE, RS, R1, ExtractReply<NE>>): Machine<State, Event, R | RG | R1, _SD, _ED, Input, Output>;
141
165
  /**
142
166
  * Like `on()`, but forces onEnter/spawn to run even when transitioning to the same state tag.
143
167
  * Use this to restart timers, re-run spawned effects, or reset state-scoped effects.
144
168
  */
145
169
  /** Single state */
146
- reenter<NS extends VariantsUnion<_SD> & BrandedState, NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState>(state: TaggedOrConstructor<NS>, event: TaggedOrConstructor<NE>, handler: TransitionHandler<NS, NE, RS, never, ExtractReply<NE>>): Machine<State, Event, R, _SD, _ED>;
170
+ reenter<NS extends VariantsUnion<_SD> & BrandedState, NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, R1 = never>(state: TaggedOrConstructor<NS>, event: TaggedOrConstructor<NE>, handler: TransitionHandler<NS, NE, RS, R1, ExtractReply<NE>>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
147
171
  /** Multiple states */
148
- reenter<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState>(states: NS, event: TaggedOrConstructor<NE>, handler: TransitionHandler<NS[number] extends TaggedOrConstructor<infer S> ? S : never, NE, RS, never, ExtractReply<NE>>): Machine<State, Event, R, _SD, _ED>;
172
+ reenter<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, R1 = never>(states: NS, event: TaggedOrConstructor<NE>, handler: TransitionHandler<NS[number] extends TaggedOrConstructor<infer S> ? S : never, NE, RS, R1, ExtractReply<NE>>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
173
+ /** Register a conditional reenter transition for a single state. */
174
+ reenterWhen<NS extends VariantsUnion<_SD> & BrandedState, NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, RG = never, R1 = never>(state: TaggedOrConstructor<NS>, event: TaggedOrConstructor<NE>, predicate: GuardPredicate<NS, NE, RG>, handler: TransitionHandler<NS, NE, RS, R1, ExtractReply<NE>>): Machine<State, Event, R | RG | R1, _SD, _ED, Input, Output>;
175
+ /** Register a conditional reenter transition for multiple states. */
176
+ reenterWhen<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, RG = never, R1 = never>(states: NS, event: TaggedOrConstructor<NE>, predicate: GuardPredicate<NS[number] extends TaggedOrConstructor<infer S> ? S : never, NE, RG>, handler: TransitionHandler<NS[number] extends TaggedOrConstructor<infer S> ? S : never, NE, RS, R1, ExtractReply<NE>>): Machine<State, Event, R | RG | R1, _SD, _ED, Input, Output>;
149
177
  /**
150
178
  * Register a wildcard transition that fires from any state when no specific transition matches.
151
179
  * Specific `.on()` transitions always take priority over `.onAny()`.
152
180
  */
153
- onAny<NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState>(event: TaggedOrConstructor<NE>, handler: TransitionHandler<VariantsUnion<_SD> & BrandedState, NE, RS, never>): Machine<State, Event, R, _SD, _ED>;
181
+ onAny<NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, R1 = never>(event: TaggedOrConstructor<NE>, handler: TransitionHandler<VariantsUnion<_SD> & BrandedState, NE, RS, R1>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
182
+ /** Register a conditional wildcard transition. */
183
+ whenAny<NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, RG = never, R1 = never>(event: TaggedOrConstructor<NE>, predicate: GuardPredicate<VariantsUnion<_SD> & BrandedState, NE, RG>, handler: TransitionHandler<VariantsUnion<_SD> & BrandedState, NE, RS, R1>): Machine<State, Event, R | RG | R1, _SD, _ED, Input, Output>;
184
+ /**
185
+ * Register an eventless transition. The actor runs immediate transitions until stable.
186
+ * UI observers see only the stable state.
187
+ */
188
+ immediate<NS extends VariantsUnion<_SD> & BrandedState, RS extends VariantsUnion<_SD> & BrandedState, R1 = never>(state: TaggedOrConstructor<NS>, handler: TransitionHandler<NS, VariantsUnion<_ED> & BrandedEvent, RS, R1>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
189
+ immediate<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, RS extends VariantsUnion<_SD> & BrandedState, R1 = never>(states: NS, handler: TransitionHandler<NS[number] extends TaggedOrConstructor<infer S> ? S : never, VariantsUnion<_ED> & BrandedEvent, RS, R1>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
190
+ /** Register a conditional eventless transition for a single state. */
191
+ immediateWhen<NS extends VariantsUnion<_SD> & BrandedState, RS extends VariantsUnion<_SD> & BrandedState, RG = never, R1 = never>(state: TaggedOrConstructor<NS>, predicate: GuardPredicate<NS, VariantsUnion<_ED> & BrandedEvent, RG>, handler: TransitionHandler<NS, VariantsUnion<_ED> & BrandedEvent, RS, R1>): Machine<State, Event, R | RG | R1, _SD, _ED, Input, Output>;
192
+ /** Register a conditional eventless transition for multiple states. */
193
+ immediateWhen<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, RS extends VariantsUnion<_SD> & BrandedState, RG = never, R1 = never>(states: NS, predicate: GuardPredicate<NS[number] extends TaggedOrConstructor<infer S> ? S : never, VariantsUnion<_ED> & BrandedEvent, RG>, handler: TransitionHandler<NS[number] extends TaggedOrConstructor<infer S> ? S : never, VariantsUnion<_ED> & BrandedEvent, RS, R1>): Machine<State, Event, R | RG | R1, _SD, _ED, Input, Output>;
154
194
  /**
155
195
  * State-scoped effect that is forked on state entry and automatically cancelled on state exit.
156
196
  *
@@ -166,9 +206,9 @@ declare class Machine<State, Event, R = never, _SD extends Record<string, Schema
166
206
  * ```
167
207
  */
168
208
  /** Single state */
169
- spawn<NS extends VariantsUnion<_SD> & BrandedState, R1>(state: TaggedOrConstructor<NS>, handler: StateEffectHandler<NS, VariantsUnion<_ED> & BrandedEvent, Scope.Scope | R1>): Machine<State, Event, R | R1, _SD, _ED>;
209
+ spawn<NS extends VariantsUnion<_SD> & BrandedState, R1>(state: TaggedOrConstructor<NS>, handler: StateEffectHandler<NS, VariantsUnion<_ED> & BrandedEvent, Scope.Scope | R1>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
170
210
  /** Multiple states */
171
- spawn<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, R1>(states: NS, handler: StateEffectHandler<NS[number] extends TaggedOrConstructor<infer S> ? S : never, VariantsUnion<_ED> & BrandedEvent, Scope.Scope | R1>): Machine<State, Event, R | R1, _SD, _ED>;
211
+ spawn<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, R1>(states: NS, handler: StateEffectHandler<NS[number] extends TaggedOrConstructor<infer S> ? S : never, VariantsUnion<_ED> & BrandedEvent, Scope.Scope | R1>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
172
212
  private registerTransition;
173
213
  /**
174
214
  * State-scoped task that runs on entry and sends success/failure events.
@@ -180,9 +220,9 @@ declare class Machine<State, Event, R = never, _SD extends Record<string, Schema
180
220
  * - `.task([State.X, State.Y], run, opts)` — multi-state
181
221
  */
182
222
  /** Single state — onSuccess optional (defaults to identity when task returns Event) */
183
- task<NS extends VariantsUnion<_SD> & BrandedState, A, E1, R1, ES extends VariantsUnion<_ED> & BrandedEvent, EF extends VariantsUnion<_ED> & BrandedEvent>(state: TaggedOrConstructor<NS>, run: (ctx: StateHandlerContext<NS, VariantsUnion<_ED> & BrandedEvent>) => Effect.Effect<A, E1, Scope.Scope | R1>, options: TaskOptions<NS, VariantsUnion<_ED> & BrandedEvent, A, E1, ES, EF>): Machine<State, Event, R | R1, _SD, _ED>;
223
+ task<NS extends VariantsUnion<_SD> & BrandedState, A, E1, R1, ES extends VariantsUnion<_ED> & BrandedEvent, EF extends VariantsUnion<_ED> & BrandedEvent>(state: TaggedOrConstructor<NS>, run: (ctx: StateHandlerContext<NS, VariantsUnion<_ED> & BrandedEvent>) => Effect.Effect<A, E1, Scope.Scope | R1>, options: TaskOptions<NS, VariantsUnion<_ED> & BrandedEvent, A, E1, ES, EF>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
184
224
  /** Multiple states, explicit onSuccess */
185
- task<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, A, E1, R1, ES extends VariantsUnion<_ED> & BrandedEvent, EF extends VariantsUnion<_ED> & BrandedEvent>(states: NS, run: (ctx: StateHandlerContext<NS[number] extends TaggedOrConstructor<infer S> ? S : never, VariantsUnion<_ED> & BrandedEvent>) => Effect.Effect<A, E1, Scope.Scope | R1>, options: TaskOptions<NS[number] extends TaggedOrConstructor<infer S> ? S : never, VariantsUnion<_ED> & BrandedEvent, A, E1, ES, EF>): Machine<State, Event, R | R1, _SD, _ED>;
225
+ task<NS extends ReadonlyArray<TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>, A, E1, R1, ES extends VariantsUnion<_ED> & BrandedEvent, EF extends VariantsUnion<_ED> & BrandedEvent>(states: NS, run: (ctx: StateHandlerContext<NS[number] extends TaggedOrConstructor<infer S> ? S : never, VariantsUnion<_ED> & BrandedEvent>) => Effect.Effect<A, E1, Scope.Scope | R1>, options: TaskOptions<NS[number] extends TaggedOrConstructor<infer S> ? S : never, VariantsUnion<_ED> & BrandedEvent, A, E1, ES, EF>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
186
226
  /**
187
227
  * State timeout — gen_statem's `state_timeout`.
188
228
  *
@@ -204,7 +244,7 @@ declare class Machine<State, Event, R = never, _SD extends Record<string, Schema
204
244
  * })
205
245
  * ```
206
246
  */
207
- timeout<NS extends VariantsUnion<_SD> & BrandedState>(state: TaggedOrConstructor<NS>, config: TimeoutConfig<NS, VariantsUnion<_ED> & BrandedEvent>): Machine<State, Event, R, _SD, _ED>;
247
+ timeout<NS extends VariantsUnion<_SD> & BrandedState>(state: TaggedOrConstructor<NS>, config: TimeoutConfig<NS, VariantsUnion<_ED> & BrandedEvent>): Machine<State, Event, R, _SD, _ED, Input, Output>;
208
248
  /**
209
249
  * Machine-lifetime effect that is forked on actor spawn and runs until the actor stops.
210
250
  *
@@ -217,7 +257,7 @@ declare class Machine<State, Event, R = never, _SD extends Record<string, Schema
217
257
  * );
218
258
  * ```
219
259
  */
220
- background<R1>(handler: StateEffectHandler<State, Event, Scope.Scope | R1>): Machine<State, Event, R | R1, _SD, _ED>;
260
+ background<R1>(handler: StateEffectHandler<State, Event, Scope.Scope | R1>): Machine<State, Event, R | R1, _SD, _ED, Input, Output>;
221
261
  /**
222
262
  * Postpone events — gen_statem's event postpone.
223
263
  *
@@ -235,18 +275,61 @@ declare class Machine<State, Event, R = never, _SD extends Record<string, Schema
235
275
  * .postpone(State.Connecting, [Event.Data, Event.Cmd]) // multiple events
236
276
  * ```
237
277
  */
238
- postpone<NS extends VariantsUnion<_SD> & BrandedState>(state: TaggedOrConstructor<NS>, events: TaggedOrConstructor<VariantsUnion<_ED> & BrandedEvent> | ReadonlyArray<TaggedOrConstructor<VariantsUnion<_ED> & BrandedEvent>>): Machine<State, Event, R, _SD, _ED>;
239
- final<NS extends VariantsUnion<_SD> & BrandedState>(state: TaggedOrConstructor<NS>): Machine<State, Event, R, _SD, _ED>;
240
- static make<SD extends Record<string, Schema.Struct.Fields>, ED extends Record<string, Schema.Struct.Fields>, S extends BrandedState, E extends BrandedEvent>(config: MakeConfig<SD, ED, S, E>): Machine<S, E, never, SD, ED>;
278
+ postpone<NS extends VariantsUnion<_SD> & BrandedState>(state: TaggedOrConstructor<NS>, events: TaggedOrConstructor<VariantsUnion<_ED> & BrandedEvent> | ReadonlyArray<TaggedOrConstructor<VariantsUnion<_ED> & BrandedEvent>>): Machine<State, Event, R, _SD, _ED, Input, Output>;
279
+ final<Tagged extends TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>>(state: Tagged): Machine<State, Event, R, _SD, _ED, Input, Output | TaggedValue<State, Tagged>>;
280
+ final<Tagged extends TaggedOrConstructor<VariantsUnion<_SD> & BrandedState>, O>(state: Tagged, output: (ctx: FinalContext<TaggedValue<State, Tagged>>) => O): Machine<State, Event, R, _SD, _ED, Input, Output | O>;
281
+ static make<SD extends Record<string, Schema.Struct.Fields>, ED extends Record<string, Schema.Struct.Fields>, S extends BrandedState, E extends BrandedEvent>(config: MakeConfig<SD, ED, S, E>): Machine<S, E, never, SD, ED, void, never>;
282
+ static make<SD extends Record<string, Schema.Struct.Fields>, ED extends Record<string, Schema.Struct.Fields>, S extends BrandedState, E extends BrandedEvent, Input>(config: InputMakeConfig<SD, ED, S, E, Input>): Machine<S, E, never, SD, ED, Input, never>;
241
283
  }
242
- declare class TransitionScope<State, Event, R, _SD extends Record<string, Schema.Struct.Fields>, _ED extends Record<string, Schema.Struct.Fields>, SelectedState extends VariantsUnion<_SD> & BrandedState> {
284
+ declare class TransitionScope<State, Event, R, _SD extends Record<string, Schema.Struct.Fields>, _ED extends Record<string, Schema.Struct.Fields>, SelectedState extends VariantsUnion<_SD> & BrandedState, Input, Output, RAdded = never> {
243
285
  private readonly machine;
244
286
  private readonly states;
245
- constructor(machine: Machine<State, Event, R, _SD, _ED>, states: ReadonlyArray<TaggedOrConstructor<SelectedState>>);
246
- on<NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState>(event: TaggedOrConstructor<NE>, handler: TransitionHandler<SelectedState, NE, RS, never, ExtractReply<NE>>): TransitionScope<State, Event, R, _SD, _ED, SelectedState>;
247
- reenter<NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState>(event: TaggedOrConstructor<NE>, handler: TransitionHandler<SelectedState, NE, RS, never, ExtractReply<NE>>): TransitionScope<State, Event, R, _SD, _ED, SelectedState>;
287
+ constructor(machine: Machine<State, Event, R, _SD, _ED, Input, Output>, states: ReadonlyArray<TaggedOrConstructor<SelectedState>>);
288
+ on<NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, R1 = never>(event: TaggedOrConstructor<NE>, handler: TransitionHandler<SelectedState, NE, RS, R1, ExtractReply<NE>>): TransitionScope<State, Event, R, _SD, _ED, SelectedState, Input, Output, RAdded | R1>;
289
+ reenter<NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, R1 = never>(event: TaggedOrConstructor<NE>, handler: TransitionHandler<SelectedState, NE, RS, R1, ExtractReply<NE>>): TransitionScope<State, Event, R, _SD, _ED, SelectedState, Input, Output, RAdded | R1>;
290
+ when<NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, RG = never, R1 = never>(event: TaggedOrConstructor<NE>, predicate: GuardPredicate<SelectedState, NE, RG>, handler: TransitionHandler<SelectedState, NE, RS, R1, ExtractReply<NE>>): TransitionScope<State, Event, R, _SD, _ED, SelectedState, Input, Output, RAdded | RG | R1>;
291
+ reenterWhen<NE extends VariantsUnion<_ED> & BrandedEvent, RS extends VariantsUnion<_SD> & BrandedState, RG = never, R1 = never>(event: TaggedOrConstructor<NE>, predicate: GuardPredicate<SelectedState, NE, RG>, handler: TransitionHandler<SelectedState, NE, RS, R1, ExtractReply<NE>>): TransitionScope<State, Event, R, _SD, _ED, SelectedState, Input, Output, RAdded | RG | R1>;
248
292
  }
249
293
  declare const make: typeof Machine.make;
294
+ /**
295
+ * Spawn an actor directly without ActorSystem ceremony.
296
+ *
297
+ * **Single actor, no registry.** Caller manages lifetime via `actor.stop`.
298
+ * If an `ActorScope` exists in context, cleanup attaches automatically on scope close.
299
+ * Use `Machine.scoped` to bridge from `Scope` to `ActorScope`.
300
+ *
301
+ * For registry, lookup by ID, persistence, or multi-actor coordination,
302
+ * use `ActorSystem` / `system.spawn` instead.
303
+ *
304
+ * @example
305
+ * ```ts
306
+ * // Fire-and-forget — caller manages lifetime
307
+ * const actor = yield* Machine.spawn(machine);
308
+ * yield* actor.start;
309
+ * yield* actor.send(Event.Start);
310
+ * yield* actor.awaitFinal;
311
+ * yield* actor.stop;
312
+ *
313
+ * // Scope-aware — auto-cleans up on scope close
314
+ * yield* Effect.scoped(Machine.scoped(Effect.gen(function* () {
315
+ * const actor = yield* Machine.spawn(machine);
316
+ * yield* actor.start;
317
+ * yield* actor.send(Event.Start);
318
+ * // actor.stop called automatically when scope closes
319
+ * })));
320
+ * ```
321
+ */
322
+ type AnyMachine<S, E, R, Input = void, Output = S> = Machine<S, E, R, any, any, Input, Output>;
323
+ type SpawnOptions<S, E, Input> = {
324
+ readonly id?: string;
325
+ readonly hydrate?: S;
326
+ readonly supervision?: Supervision.Policy;
327
+ readonly lifecycle?: Lifecycle<S, E>;
328
+ } & ([Input] extends [void] ? {
329
+ readonly input?: never;
330
+ } : {
331
+ readonly input: Input;
332
+ });
250
333
  /**
251
334
  * Spawn an actor from a machine.
252
335
  *
@@ -263,16 +346,31 @@ declare const make: typeof Machine.make;
263
346
  * });
264
347
  * ```
265
348
  */
266
- declare const spawn: <S extends {
267
- readonly _tag: string;
268
- }, E extends {
269
- readonly _tag: string;
270
- }, R>(machine: Machine<S, E, R, any, any>, options?: string | {
271
- id?: string;
272
- hydrate?: S;
273
- supervision?: Supervision.Policy;
274
- lifecycle?: Lifecycle<S, E>;
275
- }) => Effect.Effect<ActorRef<S, E>, never, R>;
349
+ declare const spawn: {
350
+ <S extends {
351
+ readonly _tag: string;
352
+ }, E extends {
353
+ readonly _tag: string;
354
+ }, R, Output>(machine: AnyMachine<S, E, R, void, Output>, options?: string | SpawnOptions<S, E, void>): Effect.Effect<ActorRef<S, E, Output>, never, R>;
355
+ <S extends {
356
+ readonly _tag: string;
357
+ }, E extends {
358
+ readonly _tag: string;
359
+ }, R, Input, Output>(machine: AnyMachine<S, E, R, Input, Output>, options: SpawnOptions<S, E, Input>): Effect.Effect<ActorRef<S, E, Output>, never, R>;
360
+ };
361
+ /** Run one actor to final output and always release its resources. */
362
+ declare const run: {
363
+ <S extends {
364
+ readonly _tag: string;
365
+ }, E extends {
366
+ readonly _tag: string;
367
+ }, R, Output>(machine: AnyMachine<S, E, R, void, Output>, options?: string | SpawnOptions<S, E, void>): Effect.Effect<Output, ActorStoppedError, R>;
368
+ <S extends {
369
+ readonly _tag: string;
370
+ }, E extends {
371
+ readonly _tag: string;
372
+ }, R, Input, Output>(machine: AnyMachine<S, E, R, Input, Output>, options: SpawnOptions<S, E, Input>): Effect.Effect<Output, ActorStoppedError, R>;
373
+ };
276
374
  /**
277
375
  * Wrap an effect to provide an `ActorScope` from the current `Scope`.
278
376
  *
@@ -293,16 +391,29 @@ declare const spawn: <S extends {
293
391
  * ```
294
392
  */
295
393
  declare const scoped: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R | Scope.Scope>;
394
+ type ReplayOptions<S, Input> = {
395
+ readonly from: S;
396
+ readonly input?: never;
397
+ } | ([Input] extends [void] ? {
398
+ readonly from?: never;
399
+ readonly input?: never;
400
+ } : {
401
+ readonly from?: never;
402
+ readonly input: Input;
403
+ });
296
404
  declare const replay: {
297
405
  <S extends {
298
406
  readonly _tag: string;
299
407
  }, E extends {
300
408
  readonly _tag: string;
301
- }, R>(machine: Machine<S, E, R, any, any>, events: ReadonlyArray<E>, options?: {
302
- from?: S;
303
- }): Effect.Effect<S, never, R>;
409
+ }, R>(machine: Machine<S, E, R, any, any, void, any>, events: ReadonlyArray<E>, options?: ReplayOptions<S, void>): Effect.Effect<S, never, R>;
410
+ <S extends {
411
+ readonly _tag: string;
412
+ }, E extends {
413
+ readonly _tag: string;
414
+ }, R, Input>(machine: Machine<S, E, R, any, any, Input, any>, events: ReadonlyArray<E>, options: ReplayOptions<S, Input>): Effect.Effect<S, never, R>;
304
415
  };
305
416
  declare const reply: typeof makeReply;
306
417
  declare const deferReply: typeof makeDeferReply;
307
418
  //#endregion
308
- export { type DeferReplyResult, Durability, DurabilityCommit, HandlerContext, Lifecycle, Machine, MachineRef, MakeConfig, Recovery, RecoveryContext, type ReplyResult, StateEffectHandler, StateHandlerContext, TaskOptions, TimeoutConfig, TransitionHandler, deferReply, machine_d_exports, make, replay, reply, scoped, spawn };
419
+ export { type DeferReplyResult, Durability, DurabilityCommit, FinalContext, GuardPredicate, HandlerContext, InputMakeConfig, Lifecycle, Machine, MachineRef, MakeConfig, Recovery, RecoveryContext, ReplayOptions, type ReplyResult, SpawnOptions, StateEffectHandler, StateHandlerContext, TaskOptions, TimeoutConfig, TransitionHandler, deferReply, machine_d_exports, make, replay, reply, run, scoped, spawn };