@typeonce/effect-machine 0.13.0 → 0.14.1

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.
Files changed (59) hide show
  1. package/README.md +74 -26
  2. package/dist/Machine.d.ts +379 -188
  3. package/dist/Machine.d.ts.map +1 -1
  4. package/dist/Machine.js +119 -53
  5. package/dist/Machine.js.map +1 -1
  6. package/dist/internal/machine/executionPlan.d.ts.map +1 -1
  7. package/dist/internal/machine/executionPlan.js +14 -6
  8. package/dist/internal/machine/executionPlan.js.map +1 -1
  9. package/dist/internal/machine/machine.d.ts +3 -1
  10. package/dist/internal/machine/machine.d.ts.map +1 -1
  11. package/dist/internal/machine/machine.js +318 -26
  12. package/dist/internal/machine/machine.js.map +1 -1
  13. package/dist/internal/machine/planner.d.ts +13 -0
  14. package/dist/internal/machine/planner.d.ts.map +1 -1
  15. package/dist/internal/machine/planner.js +15 -7
  16. package/dist/internal/machine/planner.js.map +1 -1
  17. package/dist/internal/machine/topology.d.ts +12 -0
  18. package/dist/internal/machine/topology.d.ts.map +1 -1
  19. package/dist/internal/machine/topology.js +17 -10
  20. package/dist/internal/machine/topology.js.map +1 -1
  21. package/dist/internal/testing/machine/exploration.d.ts.map +1 -1
  22. package/dist/internal/testing/machine/exploration.js +11 -2
  23. package/dist/internal/testing/machine/exploration.js.map +1 -1
  24. package/dist/internal/testing/machine/finiteModel.d.ts.map +1 -1
  25. package/dist/internal/testing/machine/finiteModel.js +72 -66
  26. package/dist/internal/testing/machine/finiteModel.js.map +1 -1
  27. package/dist/internal/testing/machine/transitionCoverage.d.ts +20 -0
  28. package/dist/internal/testing/machine/transitionCoverage.d.ts.map +1 -0
  29. package/dist/internal/testing/machine/transitionCoverage.js +80 -0
  30. package/dist/internal/testing/machine/transitionCoverage.js.map +1 -0
  31. package/dist/internal/testing/machine/verification.d.ts.map +1 -1
  32. package/dist/internal/testing/machine/verification.js +171 -33
  33. package/dist/internal/testing/machine/verification.js.map +1 -1
  34. package/dist/testing/MachineTest.d.ts +97 -22
  35. package/dist/testing/MachineTest.d.ts.map +1 -1
  36. package/dist/testing/MachineTest.js +58 -16
  37. package/dist/testing/MachineTest.js.map +1 -1
  38. package/dist/unstable/cluster/ClusterMachine.d.ts +4 -1
  39. package/dist/unstable/cluster/ClusterMachine.d.ts.map +1 -1
  40. package/dist/unstable/cluster/ClusterMachine.js +4 -1
  41. package/dist/unstable/cluster/ClusterMachine.js.map +1 -1
  42. package/dist/unstable/reactivity/AtomMachine.d.ts +12 -3
  43. package/dist/unstable/reactivity/AtomMachine.d.ts.map +1 -1
  44. package/dist/unstable/reactivity/AtomMachine.js +12 -3
  45. package/dist/unstable/reactivity/AtomMachine.js.map +1 -1
  46. package/docs/agent-guide.md +139 -57
  47. package/package.json +1 -1
  48. package/src/Machine.ts +750 -336
  49. package/src/internal/machine/executionPlan.ts +22 -7
  50. package/src/internal/machine/machine.ts +420 -33
  51. package/src/internal/machine/planner.ts +44 -13
  52. package/src/internal/machine/topology.ts +38 -12
  53. package/src/internal/testing/machine/exploration.ts +10 -2
  54. package/src/internal/testing/machine/finiteModel.ts +106 -73
  55. package/src/internal/testing/machine/transitionCoverage.ts +116 -0
  56. package/src/internal/testing/machine/verification.ts +216 -58
  57. package/src/testing/MachineTest.ts +118 -28
  58. package/src/unstable/cluster/ClusterMachine.ts +4 -1
  59. package/src/unstable/reactivity/AtomMachine.ts +12 -3
package/dist/Machine.d.ts CHANGED
@@ -41,6 +41,7 @@ declare const MachineTypeId: unique symbol;
41
41
  declare const EventConstructionTypeId: unique symbol;
42
42
  declare const EmittedEventConstructionTypeId: unique symbol;
43
43
  declare const EventProtocolTypeId: unique symbol;
44
+ declare const TransitionCaseTypeId: unique symbol;
44
45
  declare const ChildMachineLogicTypeId: typeof internal.ChildMachineLogicTypeId;
45
46
  /**
46
47
  * Type identifier used for the synthetic event passed to startup lifecycle
@@ -176,6 +177,8 @@ export interface Machine<States extends Machine.StateSchemas, Events extends Rea
176
177
  readonly invoke: Invoker<States, Events, Emits, InputEvents, ParentEvents>;
177
178
  /** @internal */
178
179
  readonly initial: (...args: [...Machine.InputArgs<Input>]) => Machine.InitialResult<States, InitialE, InitialR>;
180
+ /** @internal */
181
+ readonly initialDefinition: Machine.InitialDefinition;
179
182
  }
180
183
  export {
181
184
  /**
@@ -412,6 +415,7 @@ export declare namespace Runtime {
412
415
  type ExcludeCompatibleRuntime<Requirements, Events, Emits> = Requirements extends Runtime.Requirement<infer RequiredEvents, infer RequiredEmits> ? IsAny<Requirements> extends true ? Requirements : [RequiredEvents] extends [Events] ? [RequiredEmits] extends [Emits] ? never : Requirements : Requirements : Requirements;
413
416
  type IncompatibleRuntime<Requirements, Events, Emits> = Requirements extends Runtime.Requirement<infer RequiredEvents, infer RequiredEmits> ? IsAny<Requirements> extends true ? never : [RequiredEvents] extends [Events] ? [RequiredEmits] extends [Emits] ? never : Requirements : Requirements : never;
414
417
  declare const InvokeTypeId: typeof internal.InvokeTypeId;
418
+ declare const TransitionTypeId: typeof internal.TransitionTypeId;
415
419
  type StateDefinitionError<Message extends string, Path extends PropertyKey = never, Details extends PropertyKey = never> = {
416
420
  readonly "~effect/Machine/DefinitionError": Message;
417
421
  readonly path: Path;
@@ -1400,6 +1404,8 @@ export declare namespace Machine {
1400
1404
  readonly invoke: any;
1401
1405
  /** @internal */
1402
1406
  readonly initial: any;
1407
+ /** @internal */
1408
+ readonly initialDefinition: InitialDefinition;
1403
1409
  }
1404
1410
  /**
1405
1411
  * Extracts the state schema tree carried by a machine definition.
@@ -1784,12 +1790,12 @@ export declare namespace Machine {
1784
1790
  */
1785
1791
  type InitialBuilder<States extends StateSchemas> = InitialSnapshotBuilderWithPrefix<States>;
1786
1792
  /**
1787
- * State definitions and snapshot builders returned by `defineStates`.
1793
+ * State definitions and snapshot access helpers returned by `defineStates`.
1788
1794
  *
1789
1795
  * **Details**
1790
1796
  *
1791
1797
  * The `states` property is the original state tree and can be passed directly
1792
- * to `make`. The `initial` property builds path-safe snapshots for the same
1798
+ * to `make`. The remaining helpers match and read snapshots for the same
1793
1799
  * state tree.
1794
1800
  *
1795
1801
  * @category models
@@ -1798,8 +1804,6 @@ export declare namespace Machine {
1798
1804
  interface DefinedStates<States extends StateSchemas> {
1799
1805
  /** Original state tree supplied to {@link defineStates}. */
1800
1806
  readonly states: States;
1801
- /** Type-safe builders for constructing valid initial snapshots. */
1802
- readonly initial: InitialBuilder<States>;
1803
1807
  /**
1804
1808
  * Returns the decoded value for an active state path. The supplied
1805
1809
  * snapshot may be a complete root snapshot or a snapshot previously
@@ -1966,28 +1970,40 @@ export declare namespace Machine {
1966
1970
  readonly id: string;
1967
1971
  readonly outcome: "done" | "failure" | "snapshot";
1968
1972
  };
1969
- /**
1970
- * Statically inspectable destination paths for a transition handler.
1971
- * A declared parent path covers every descendant below that state.
1972
- *
1973
- * @category models
1974
- * @since 0.4.0
1975
- */
1976
- type TransitionTargets<Path extends string = string> = {
1977
- readonly type: "dynamic";
1973
+ /** Static topology selected by a transition branch. */
1974
+ interface TransitionTargetSelection<Path extends string | undefined = string | undefined, Kind extends Topology.TargetSelectionKind = Topology.TargetSelectionKind, Scope extends Topology.TargetSelectionScope | undefined = Topology.TargetSelectionScope | undefined> {
1975
+ readonly path: Path;
1976
+ readonly kind: Kind;
1977
+ readonly scope: Scope;
1978
+ }
1979
+ /** One statically captured branch of a transition definition. */
1980
+ type TransitionBranch<Path extends string = string> = {
1981
+ readonly type: "direct";
1982
+ readonly target: Path | undefined;
1983
+ readonly selection: TransitionTargetSelection<Path | undefined>;
1984
+ } | {
1985
+ readonly type: "case";
1986
+ readonly title: string;
1987
+ readonly target: Path | undefined;
1988
+ readonly selection: TransitionTargetSelection<Path | undefined>;
1978
1989
  } | {
1979
- readonly type: "declared";
1980
- readonly paths: ReadonlyArray<Path>;
1990
+ readonly type: "otherwise";
1991
+ readonly target: Path | undefined;
1992
+ readonly selection: TransitionTargetSelection<Path | undefined>;
1981
1993
  };
1994
+ /** The statically selected root entry for machine startup. */
1995
+ interface InitialDefinition<Path extends string = string> {
1996
+ readonly target: Path;
1997
+ readonly selection: TransitionTargetSelection<Path, "state" | "initial", "initial">;
1998
+ }
1982
1999
  /**
1983
2000
  * Inspectable registration for a transition handler.
1984
2001
  *
1985
2002
  * **Details**
1986
2003
  *
1987
- * Event, eventless, completion, and invocation lifecycle handlers may
1988
- * declare an upper bound of possible target paths. A handler without that
1989
- * declaration is explicitly reported as dynamic. The source, trigger, and
1990
- * reentry behavior are available without executing the handler.
2004
+ * Every branch exposes its selected target without executing its predicate
2005
+ * or resolver. A compound local or branch target covers its descendants;
2006
+ * `undefined` identifies an explicitly targetless branch.
1991
2007
  *
1992
2008
  * @category models
1993
2009
  * @since 0.4.0
@@ -1996,7 +2012,7 @@ export declare namespace Machine {
1996
2012
  readonly source: SourcePath;
1997
2013
  readonly trigger: TransitionTrigger<EventTag>;
1998
2014
  readonly reenter: boolean;
1999
- readonly targets: TransitionTargets<TargetPath>;
2015
+ readonly branches: ReadonlyArray<TransitionBranch<TargetPath>>;
2000
2016
  }
2001
2017
  /**
2002
2018
  * Serializable description of state-owned work.
@@ -2020,9 +2036,14 @@ export declare namespace Machine {
2020
2036
  readonly source: SourcePath;
2021
2037
  readonly trigger: TransitionTrigger<EventTag>;
2022
2038
  readonly reenter: boolean;
2023
- /** Path returned by the handler, including a history pseudo-state. */
2039
+ /** Zero-based index of the selected static branch. */
2040
+ readonly branchIndex: number;
2041
+ /** Path returned by the handler, including a choice or history pseudo-state. */
2024
2042
  readonly target: TargetPath | undefined;
2025
- /** Concrete path used after resolving history, otherwise equal to `target`. */
2043
+ /**
2044
+ * Concrete path used after resolving choice, initial, or history routing.
2045
+ * Choice microsteps retain each intermediate pseudo-state edge separately.
2046
+ */
2026
2047
  readonly resolvedTarget: TargetPath | undefined;
2027
2048
  }
2028
2049
  /**
@@ -2585,9 +2606,7 @@ export declare namespace Machine {
2585
2606
  * Opaque result returned by an explicitly targetless transition.
2586
2607
  *
2587
2608
  * The transition remains handled and retains its queued commands, raised
2588
- * events, and emitted events, but selects no concrete destination. Declared
2589
- * `targets` constrain only concrete destinations, so this result is always
2590
- * permitted from ordinary transition handlers.
2609
+ * events, and emitted events, but selects no concrete destination.
2591
2610
  *
2592
2611
  * @category models
2593
2612
  * @since 0.10.0
@@ -2707,8 +2726,7 @@ export declare namespace Machine {
2707
2726
  *
2708
2727
  * The event or lifecycle outcome is handled and queued operations are
2709
2728
  * retained, while the current state configuration remains the transition
2710
- * result. This remains valid when the handler declares concrete `targets`,
2711
- * because those paths are an upper bound rather than an exhaustive result.
2729
+ * result.
2712
2730
  *
2713
2731
  * @since 0.10.0
2714
2732
  */
@@ -2744,6 +2762,66 @@ export declare namespace Machine {
2744
2762
  /** Restores a declared shallow or deep history pseudo-state. */
2745
2763
  readonly history: HistoryTargetBuilder<States>;
2746
2764
  }
2765
+ /**
2766
+ * Opaque exact destination selected while a machine definition is captured.
2767
+ * The selection contains topology only; state values are constructed later
2768
+ * by the selected branch's resolver.
2769
+ *
2770
+ * @category models
2771
+ * @since 0.14.0
2772
+ */
2773
+ interface TargetSelection<out Result, out Path extends string | undefined = string | undefined, out Kind extends Topology.TargetSelectionKind = Topology.TargetSelectionKind> {
2774
+ readonly [Topology.TargetSelectionTypeId]: typeof Topology.TargetSelectionTypeId;
2775
+ readonly kind: Kind;
2776
+ readonly scope: Topology.TargetSelectionScope | undefined;
2777
+ readonly path: Path;
2778
+ readonly "~effect/Machine/TargetSelectionResult"?: Types.Covariant<Result>;
2779
+ }
2780
+ type SelectionMethod<Builder, Path extends string, Kind extends Topology.TargetSelectionKind = "state"> = () => TargetSelection<Builder, Path, Kind>;
2781
+ type InitialSelectionMethod<Builder, Path extends string> = Builder extends {
2782
+ readonly initial: infer Initial;
2783
+ } ? {
2784
+ readonly initial: SelectionMethod<Initial, Path, "initial">;
2785
+ } : {};
2786
+ type SelectionTreeWithPrefix<AllStates extends StateSchemas, States extends StateSchemas, Prefix extends string, Scope extends "local" | "branch", Builder> = {
2787
+ readonly [Key in Extract<ActiveStateKey<States> | ChoiceStateKey<States>, keyof Builder>]: SelectionNode<AllStates, States[Key], JoinPath<Prefix, Key>, Scope, Builder[Key]>;
2788
+ };
2789
+ type SelectionNode<AllStates extends StateSchemas, Node, Path extends string, Scope extends "local" | "branch", Builder> = Node extends ChoiceStateNodeConfig ? SelectionMethod<Builder, Path, "choice"> : Node extends {
2790
+ readonly states: infer Children extends StateSchemas;
2791
+ } ? SelectionMethod<Builder, Path> & InitialSelectionMethod<Builder, Path> & SelectionTreeWithPrefix<AllStates, Children, Path, Scope, Builder> : SelectionMethod<Builder, Path>;
2792
+ type FullSelectionNode<AllStates extends StateSchemas, Node, Path extends StateIdentifier<AllStates>, Builder> = Node extends {
2793
+ readonly states: StateSchemas;
2794
+ } ? SelectionMethod<Builder, Path> & InitialSelectionMethod<Builder, Path> : SelectionMethod<Builder, Path>;
2795
+ type FullTargetSelector<States extends StateSchemas> = {
2796
+ readonly [Key in Extract<ActiveStateKey<States>, keyof FullTargetBuilder<States>>]: FullSelectionNode<States, States[Key], Extract<Key, StateIdentifier<States>>, FullTargetBuilder<States>[Key]>;
2797
+ };
2798
+ type BranchTargetSelector<States extends StateSchemas, Source extends StateNodeIdentifier<States>, Root extends string = Source extends `${infer Head}.${string}` ? Head : Source> = Root extends ActiveStateKey<States> ? Root extends keyof BranchTargetBuilder<States, Source> ? {
2799
+ readonly [Key in Root]: SelectionNode<States, States[Key], Key, "branch", BranchTargetBuilder<States, Source>[Key]>;
2800
+ } : {} : {};
2801
+ type LocalTargetSelector<States extends StateSchemas, Source extends StateNodeIdentifier<States>> = NearestCompoundScope<States, Source> extends infer Scope extends StateIdentifier<States> ? ChildrenOf<States, Scope> extends infer Children extends StateSchemas ? LocalTargetBuilder<States, Source> extends infer Builder ? SelectionTreeWithPrefix<States, Children, Scope, "local", Builder> & ("with" extends keyof Builder ? {
2802
+ readonly with: SelectionMethod<Builder["with"], Scope>;
2803
+ } : {}) : {} : {} : {};
2804
+ type HistorySelectionTree<AllStates extends StateSchemas, States extends StateSchemas, Prefix extends string, Builder> = {
2805
+ readonly [Key in Extract<HistoryContainingKey<States>, keyof Builder>]: States[Key] extends HistoryStateNodeConfig ? SelectionMethod<Builder[Key], JoinPath<Prefix, Key>, "history"> : States[Key] extends {
2806
+ readonly states: infer Children extends StateSchemas;
2807
+ } ? HistorySelectionTree<AllStates, Children, JoinPath<Prefix, Key>, Builder[Key]> : never;
2808
+ };
2809
+ /** Definition-time topology selector available to an ordinary transition. */
2810
+ interface TargetSelector<States extends StateSchemas, Source extends StateNodeIdentifier<States>> {
2811
+ readonly none: SelectionMethod<TargetBuilder<States, Source>["none"], never, "none">;
2812
+ readonly local: LocalTargetSelector<States, Source>;
2813
+ readonly branch: BranchTargetSelector<States, Source>;
2814
+ readonly full: FullTargetSelector<States>;
2815
+ readonly history: HistorySelectionTree<States, States, "", HistoryTargetBuilder<States>>;
2816
+ }
2817
+ /** Definition-time selector that can choose only a valid top-level initial entry. */
2818
+ type InitialSelector<States extends StateSchemas> = {
2819
+ readonly [Key in Extract<ActiveStateKey<States>, keyof InitialBuilder<States>>]: States[Key] extends {
2820
+ readonly states: StateSchemas;
2821
+ } ? {
2822
+ readonly initial: SelectionMethod<InitialBuilder<States>[Key], Key, "initial">;
2823
+ } : SelectionMethod<InitialBuilder<States>[Key], Key>;
2824
+ };
2747
2825
  /**
2748
2826
  * Context passed to a state/event handler.
2749
2827
  *
@@ -2934,7 +3012,7 @@ export declare namespace Machine {
2934
3012
  * @category utility types
2935
3013
  * @since 0.4.0
2936
3014
  */
2937
- type InitialResult<States extends StateSchemas, E, R> = Snapshot<States> | InitialSnapshot<States> | StateConstruction<Snapshot<States> | InitialSnapshot<States>>;
3015
+ type InitialResult<States extends StateSchemas, E, R> = Snapshot<States> | InitialSnapshot<States> | InitialTarget<StateIdentifier<States>> | StateConstruction<Snapshot<States> | InitialSnapshot<States> | InitialTarget<StateIdentifier<States>>>;
2938
3016
  /** Initial snapshots may transiently terminate in a declared choice node. */
2939
3017
  type InitialSnapshot<States extends StateSchemas> = {
2940
3018
  readonly [StateId in ActiveStateKey<States>]: InitialSnapshotResult<States, StateId, "">;
@@ -3004,19 +3082,21 @@ export declare namespace Machine {
3004
3082
  }[keyof NonNullable<History>] : never;
3005
3083
  /** Extracts the return value from a choice resolver. */
3006
3084
  type ChoiceReturn<Config> = Config extends {
3007
- readonly choice: {
3008
- readonly transition: (...args: any) => infer Ret;
3009
- };
3010
- } ? Ret : never;
3085
+ readonly choice: infer Choice;
3086
+ } ? EventTransitionReturn<Choice> : never;
3011
3087
  /**
3012
3088
  * Extracts the return value from an event transition config.
3013
3089
  *
3014
3090
  * @category utility types
3015
3091
  * @since 0.4.0
3016
3092
  */
3017
- type EventTransitionReturn<Transition> = Transition extends (...args: any) => infer Ret ? Ret : Transition extends {
3018
- readonly transition: (...args: any) => infer Ret;
3019
- } ? Ret : never;
3093
+ type EventTransitionReturn<Transition> = (Transition extends {
3094
+ readonly resolve?: infer Resolve;
3095
+ } ? NonNullable<Resolve> extends (...args: any) => infer Ret ? Ret : never : never) | (Transition extends {
3096
+ readonly cases: infer Cases extends ReadonlyArray<unknown>;
3097
+ } ? EventTransitionReturn<Cases[number]> : never) | (Transition extends {
3098
+ readonly otherwise: infer Otherwise;
3099
+ } ? EventTransitionReturn<Otherwise> : never);
3020
3100
  /**
3021
3101
  * Extracts the return value from a state's event handlers.
3022
3102
  *
@@ -3176,16 +3256,61 @@ export declare namespace Machine {
3176
3256
  * @since 0.4.0
3177
3257
  */
3178
3258
  type ConfigServices<Config> = Effect.Services<EventHandlerReturn<Config>> | Effect.Services<AlwaysReturn<Config>> | Effect.Services<DoneReturn<Config>> | Effect.Services<StateActionReturn<Config, "entry">> | Effect.Services<StateActionReturn<Config, "exit">> | Effect.Services<HistoryDefaultReturn<Config>> | Effect.Services<ChoiceReturn<Config>> | InvokeRequirements<Config>;
3179
- type InvokeTransition<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, Context> = ((context: NoInfer<Context>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, any, any>) | {
3180
- readonly reenter?: boolean;
3181
- readonly targets?: ReadonlyArray<StateNodeIdentifier<States>>;
3182
- readonly transition: (context: NoInfer<Context>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, any, any>;
3259
+ type TransitionWhenContext<Context> = Omit<Context, "target">;
3260
+ /** Type evidence retained by {@link transition} without affecting runtime data. */
3261
+ interface TransitionTyped<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateNodeIdentifier<States>, Context, Reenter extends boolean> {
3262
+ readonly [TransitionTypeId]: {
3263
+ readonly owner: Types.Covariant<readonly [States, Events, Emits, StateId, Context]>;
3264
+ };
3265
+ }
3266
+ /** Type evidence for a targetless transition reusable in every owning context. */
3267
+ interface TargetlessTransitionTyped {
3268
+ readonly [TransitionTypeId]: {
3269
+ readonly targetless: true;
3270
+ };
3271
+ }
3272
+ /** The only transition value accepted by machine handler APIs. */
3273
+ type TransitionConfig<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateNodeIdentifier<States>, Context, Reenter extends boolean = false> = (TransitionTyped<States, Events, Emits, StateId, Context, Reenter> | TargetlessTransitionTyped) & {
3274
+ readonly reenter?: [Reenter] extends [true] ? boolean : never;
3275
+ };
3276
+ type SelectionBuilder<Selection> = Selection extends TargetSelection<infer Builder, any, any> ? Builder : never;
3277
+ type SelectionKind<Selection> = Selection extends TargetSelection<any, any, infer Kind> ? Kind : never;
3278
+ type SelectionPath<Selection> = Selection extends TargetSelection<any, infer Path, any> ? Path : never;
3279
+ type TargetBuilderResult<Builder> = (Builder extends (...args: any) => infer Result ? Result : never) | (Builder extends {
3280
+ readonly from: (...args: any) => infer Result;
3281
+ } ? Result : never);
3282
+ type SelectedTargetResult<Selection> = SelectionBuilder<Selection> extends infer Builder ? TargetBuilderResult<Builder> : never;
3283
+ type TransitionResolveContext<Context, Selection, Match = never> = Omit<Context, "target"> & ([Match] extends [never] ? {} : {
3284
+ readonly match: Match;
3285
+ }) & (SelectionKind<Selection> extends "none" ? {} : {
3286
+ readonly target: SelectionBuilder<Selection>;
3287
+ });
3288
+ type TransitionResolver<Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, Context, Selection, Match = never> = (context: TransitionResolveContext<Context, Selection, Match>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => SelectionKind<Selection> extends "none" ? undefined : SelectedTargetResult<Selection> | undefined;
3289
+ type TransitionDirectInput<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateNodeIdentifier<States>, Context, Reenter extends boolean, Selection extends TargetSelection<any, any, any>> = {
3290
+ readonly target: (to: TargetSelector<States, StateId>) => Selection;
3291
+ readonly resolve?: TransitionResolver<Events, Emits, Context, Selection>;
3292
+ readonly cases?: never;
3293
+ readonly otherwise?: never;
3294
+ readonly reenter?: Reenter;
3295
+ };
3296
+ type TransitionCaseInput<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateNodeIdentifier<States>, Context, Selection extends TargetSelection<any, any, any>, Match> = {
3297
+ readonly title: string;
3298
+ readonly when: (context: TransitionWhenContext<Context>) => Option.Option<Match>;
3299
+ readonly target: (to: TargetSelector<States, StateId>) => Selection;
3300
+ readonly resolve?: TransitionResolver<Events, Emits, Context, Selection, NoInfer<Match>>;
3301
+ readonly cases?: never;
3302
+ readonly otherwise?: never;
3303
+ readonly reenter?: never;
3183
3304
  };
3305
+ type TransitionConditionalInput<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateNodeIdentifier<States>, Context, Reenter extends boolean, Cases extends readonly [TransitionCaseTyped, ...ReadonlyArray<TransitionCaseTyped>], OtherwiseSelection extends TargetSelection<any, any, any>> = {
3306
+ readonly target?: never;
3307
+ readonly resolve?: never;
3308
+ readonly cases: (branch: TransitionCaseConstructor<States, Events, Emits, StateId, Context>) => Cases;
3309
+ readonly otherwise: TransitionDirectInput<States, Events, Emits, StateId, Context, never, OtherwiseSelection>;
3310
+ readonly reenter?: Reenter;
3311
+ };
3312
+ type InvokeTransition<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateNodeIdentifier<States>, Context> = TransitionConfig<States, Events, Emits, StateId, Context, true>;
3184
3313
  type InvokeSource<Value, Context> = Value | ((context: Context) => Value);
3185
- interface AnyLogicSource {
3186
- initial(...args: ReadonlyArray<any>): Effect.Effect<any, any, any>;
3187
- run(...args: ReadonlyArray<any>): Effect.Effect<any, any, any>;
3188
- }
3189
3314
  /** Inline state-owned work that runs for the lifetime of its active state. */
3190
3315
  interface InvokeOwned<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateIdentifier<States>> {
3191
3316
  readonly "~effect/Machine/InvokeOwner"?: Types.Covariant<readonly [States, Events, Emits, StateId]>;
@@ -3224,7 +3349,7 @@ export declare namespace Machine {
3224
3349
  } | {
3225
3350
  readonly id: string;
3226
3351
  readonly address: string;
3227
- readonly logic: InvokeSource<AnyLogicSource, InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>>;
3352
+ readonly logic: InvokeSource<Logic<any, any, any, any, any, any>, InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>>;
3228
3353
  readonly effect?: never;
3229
3354
  readonly after?: never;
3230
3355
  readonly child?: never;
@@ -3276,7 +3401,7 @@ export declare namespace Machine {
3276
3401
  readonly address?: never;
3277
3402
  readonly onFailure?: never;
3278
3403
  readonly onSnapshot?: never;
3279
- readonly onDone: InvokeTransition<States, Events, Emits, InvokeDoneContext<States, Events, Emits, StateId, void, InputEvents, ParentEvents>>;
3404
+ readonly onDone: InvokeTransition<States, Events, Emits, StateId, InvokeDoneContext<States, Events, Emits, StateId, void, InputEvents, ParentEvents>>;
3280
3405
  };
3281
3406
  type LogicInvokeArgs<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateIdentifier<States>, ChildState, ChildEvent, ChildError, ChildRequirements, ChildOutput, ChildInitialError, Address extends ChildAddress<never>, Source = Logic<ChildState, ChildEvent, ChildError, ChildRequirements, ChildOutput, ChildInitialError>, InputEvents extends ReadonlyArray<TaggedSchema> = Events, ParentEvents extends ReadonlyArray<TaggedSchema> = readonly []> = {
3282
3407
  readonly id: InvokeLifecycleId;
@@ -3285,8 +3410,8 @@ export declare namespace Machine {
3285
3410
  readonly effect?: never;
3286
3411
  readonly after?: never;
3287
3412
  readonly child?: never;
3288
- readonly onSnapshot?: InvokeTransition<States, Events, Emits, InvokeSnapshotContext<States, Events, Emits, StateId, ChildState, ChildError, ChildOutput, InputEvents, ParentEvents>>;
3289
- } & InvokeDoneRequirement<ChildOutput, InvokeTransition<States, Events, Emits, InvokeDoneContext<States, Events, Emits, StateId, ChildOutput, InputEvents, ParentEvents>>> & InvokeFailureRequirement<ChildError, InvokeTransition<States, Events, Emits, InvokeFailureContext<States, Events, Emits, StateId, ChildError, InputEvents, ParentEvents>>>;
3413
+ readonly onSnapshot?: InvokeTransition<States, Events, Emits, StateId, InvokeSnapshotContext<States, Events, Emits, StateId, NoInfer<ChildState>, NoInfer<ChildError>, NoInfer<ChildOutput>, InputEvents, ParentEvents>>;
3414
+ } & InvokeDoneRequirement<NoInfer<ChildOutput>, InvokeTransition<States, Events, Emits, StateId, InvokeDoneContext<States, Events, Emits, StateId, NoInfer<ChildOutput>, InputEvents, ParentEvents>>> & InvokeFailureRequirement<NoInfer<ChildError>, InvokeTransition<States, Events, Emits, StateId, InvokeFailureContext<States, Events, Emits, StateId, NoInfer<ChildError>, InputEvents, ParentEvents>>>;
3290
3415
  type ChildInvokeArgs<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateIdentifier<States>, ChildDefinition extends Machine.Any, Child extends ChildMachine<string, ChildDefinition>, InputEvents extends ReadonlyArray<TaggedSchema> = Events, ParentEvents extends ReadonlyArray<TaggedSchema> = readonly []> = {
3291
3416
  readonly child: Child & (ChildDefinition extends EnsureExecutable<Machine.States<ChildDefinition>, Machine.UnhandledStates<ChildDefinition>, Machine.OutputStates<ChildDefinition>> ? unknown : never);
3292
3417
  readonly id?: never;
@@ -3294,42 +3419,50 @@ export declare namespace Machine {
3294
3419
  readonly effect?: never;
3295
3420
  readonly after?: never;
3296
3421
  readonly logic?: never;
3297
- readonly onSnapshot?: InvokeTransition<States, Events, Emits, InvokeSnapshotContext<States, Events, Emits, StateId, Snapshot<Machine.States<ChildDefinition>>, Error<ChildDefinition>, Output<ChildDefinition>, InputEvents, ParentEvents>>;
3422
+ readonly onSnapshot?: InvokeTransition<States, Events, Emits, StateId, InvokeSnapshotContext<States, Events, Emits, StateId, Snapshot<Machine.States<ChildDefinition>>, Error<ChildDefinition>, Output<ChildDefinition>, InputEvents, ParentEvents>>;
3298
3423
  } & (Input<ChildDefinition> extends typeof Schema.Void ? {
3299
3424
  readonly input?: never;
3300
3425
  } : {
3301
3426
  readonly input: InvokeSource<Input<ChildDefinition>["Type"], InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>>;
3302
- }) & InvokeDoneRequirement<Output<ChildDefinition>, InvokeTransition<States, Events, Emits, InvokeDoneContext<States, Events, Emits, StateId, Output<ChildDefinition>, InputEvents, ParentEvents>>> & InvokeFailureRequirement<Error<ChildDefinition> | ActionError<Services<ChildDefinition>>, InvokeTransition<States, Events, Emits, InvokeFailureContext<States, Events, Emits, StateId, Error<ChildDefinition> | ActionError<Services<ChildDefinition>>, InputEvents, ParentEvents>>>;
3303
- type LogicStateOf<Value> = Value extends Logic<infer State, any, any, any, any, any> ? State : never;
3304
- type LogicEventOf<Value> = Value extends Logic<any, infer Event, any, any, any, any> ? Event : never;
3305
- type LogicErrorOf<Value> = Value extends Logic<any, any, infer Error, any, any, any> ? Error : never;
3306
- type LogicServicesOf<Value> = Value extends Logic<any, any, any, infer Services, any, any> ? Services : never;
3307
- type LogicOutputOf<Value> = Value extends Logic<any, any, any, any, infer Output, any> ? Output : never;
3308
- type LogicInitialErrorOf<Value> = Value extends Logic<any, any, any, any, any, infer Error> ? Error : never;
3427
+ }) & InvokeDoneRequirement<Output<ChildDefinition>, InvokeTransition<States, Events, Emits, StateId, InvokeDoneContext<States, Events, Emits, StateId, Output<ChildDefinition>, InputEvents, ParentEvents>>> & InvokeFailureRequirement<Error<ChildDefinition> | ActionError<Services<ChildDefinition>>, InvokeTransition<States, Events, Emits, StateId, InvokeFailureContext<States, Events, Emits, StateId, Error<ChildDefinition> | ActionError<Services<ChildDefinition>>, InputEvents, ParentEvents>>>;
3428
+ type LogicInitialEffectOf<Value> = Value extends {
3429
+ readonly initial: infer Initial;
3430
+ } ? Initial extends (...args: ReadonlyArray<any>) => infer Result ? Result : never : never;
3431
+ type LogicRunEffectOf<Value> = Value extends {
3432
+ readonly run: infer Run;
3433
+ } ? Run extends (...args: ReadonlyArray<any>) => infer Result ? Result : never : never;
3434
+ type LogicStateOf<Value> = Effect.Success<LogicInitialEffectOf<Value>>;
3435
+ type LogicEventOf<Value> = Value extends {
3436
+ readonly initial: infer Initial;
3437
+ } ? Initial extends (scope: infer LogicScope, ...args: ReadonlyArray<any>) => any ? LogicScope extends Logic.Scope<infer Event> ? Event : never : never : never;
3438
+ type LogicErrorOf<Value> = Effect.Error<LogicRunEffectOf<Value>>;
3439
+ type LogicServicesOf<Value> = Effect.Services<LogicInitialEffectOf<Value> | LogicRunEffectOf<Value>>;
3440
+ type LogicOutputOf<Value> = Effect.Success<LogicRunEffectOf<Value>>;
3441
+ type LogicInitialErrorOf<Value> = Effect.Error<LogicInitialEffectOf<Value>>;
3309
3442
  type ContextualInvokeConfig<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateIdentifier<States>, InputEvents extends ReadonlyArray<TaggedSchema>, ParentEvents extends ReadonlyArray<TaggedSchema>, Raw> = Raw extends InvokeTyped<any, any, any, any, any> ? unknown : Raw extends {
3310
3443
  readonly effect: infer Source;
3311
- } ? InvokeFactoryResult<Source> extends infer Fx extends Effect.Effect<any, any, any> ? InvokeDoneRequirement<Effect.Success<Fx>, InvokeTransition<States, Events, Emits, InvokeDoneContext<States, Events, Emits, StateId, Effect.Success<Fx>, InputEvents, ParentEvents>>> & InvokeFailureRequirement<Effect.Error<Fx>, InvokeTransition<States, Events, Emits, InvokeFailureContext<States, Events, Emits, StateId, Effect.Error<Fx>, InputEvents, ParentEvents>>> & {
3444
+ } ? InvokeFactoryResult<Source> extends infer Fx extends Effect.Effect<any, any, any> ? InvokeDoneRequirement<Effect.Success<Fx>, InvokeTransition<States, Events, Emits, StateId, InvokeDoneContext<States, Events, Emits, StateId, Effect.Success<Fx>, InputEvents, ParentEvents>>> & InvokeFailureRequirement<Effect.Error<Fx>, InvokeTransition<States, Events, Emits, StateId, InvokeFailureContext<States, Events, Emits, StateId, Effect.Error<Fx>, InputEvents, ParentEvents>>> & {
3312
3445
  readonly onSnapshot?: never;
3313
3446
  } : never : Raw extends {
3314
3447
  readonly after: unknown;
3315
3448
  } ? {
3316
- readonly onDone: InvokeTransition<States, Events, Emits, InvokeDoneContext<States, Events, Emits, StateId, void, InputEvents, ParentEvents>>;
3449
+ readonly onDone: InvokeTransition<States, Events, Emits, StateId, InvokeDoneContext<States, Events, Emits, StateId, void, InputEvents, ParentEvents>>;
3317
3450
  readonly onFailure?: never;
3318
3451
  readonly onSnapshot?: never;
3319
3452
  } : Raw extends {
3320
3453
  readonly logic: infer Source;
3321
3454
  readonly address: infer Address;
3322
- } ? InvokeResolvedSource<Source> extends infer ChildLogic extends Logic<any, any, any, any, any, any> ? InvokeDoneRequirement<InvokeOutput<Raw>, InvokeTransition<States, Events, Emits, InvokeDoneContext<States, Events, Emits, StateId, InvokeOutput<Raw>, InputEvents, ParentEvents>>> & InvokeFailureRequirement<InvokeRuntimeError<Raw>, InvokeTransition<States, Events, Emits, InvokeFailureContext<States, Events, Emits, StateId, InvokeRuntimeError<Raw>, InputEvents, ParentEvents>>> & {
3455
+ } ? InvokeResolvedSource<Source> extends infer ChildLogic extends Logic<any, any, any, any, any, any> ? InvokeDoneRequirement<InvokeOutput<Raw>, InvokeTransition<States, Events, Emits, StateId, InvokeDoneContext<States, Events, Emits, StateId, InvokeOutput<Raw>, InputEvents, ParentEvents>>> & InvokeFailureRequirement<InvokeRuntimeError<Raw>, InvokeTransition<States, Events, Emits, StateId, InvokeFailureContext<States, Events, Emits, StateId, InvokeRuntimeError<Raw>, InputEvents, ParentEvents>>> & {
3323
3456
  readonly address: ChildAddress<never> & ChildAddress.Compatibility<Address, ChildLogic extends Logic<any, infer ChildEvent, any, any, any, any> ? ChildEvent : never>;
3324
- readonly onSnapshot?: InvokeTransition<States, Events, Emits, InvokeSnapshotContext<States, Events, Emits, StateId, ChildLogic extends Logic<infer ChildState, any, any, any, any, any> ? ChildState : never, InvokeRuntimeError<Raw>, InvokeOutput<Raw>, InputEvents, ParentEvents>>;
3457
+ readonly onSnapshot?: InvokeTransition<States, Events, Emits, StateId, InvokeSnapshotContext<States, Events, Emits, StateId, ChildLogic extends Logic<infer ChildState, any, any, any, any, any> ? ChildState : never, InvokeRuntimeError<Raw>, InvokeOutput<Raw>, InputEvents, ParentEvents>>;
3325
3458
  } : never : Raw extends {
3326
3459
  readonly child: infer Child extends ChildMachine<string, infer ChildDefinition>;
3327
- } ? ChildMachineLogic<Child> extends infer ChildLogic extends Logic<any, any, any, any, any, any> ? InvokeDoneRequirement<Output<ChildDefinition>, InvokeTransition<States, Events, Emits, InvokeDoneContext<States, Events, Emits, StateId, Output<ChildDefinition>, InputEvents, ParentEvents>>> & InvokeFailureRequirement<Error<ChildDefinition> | ActionError<Services<ChildDefinition>>, InvokeTransition<States, Events, Emits, InvokeFailureContext<States, Events, Emits, StateId, Error<ChildDefinition> | ActionError<Services<ChildDefinition>>, InputEvents, ParentEvents>>> & (Input<ChildDefinition> extends typeof Schema.Void ? {
3460
+ } ? ChildMachineLogic<Child> extends infer ChildLogic extends Logic<any, any, any, any, any, any> ? InvokeDoneRequirement<Output<ChildDefinition>, InvokeTransition<States, Events, Emits, StateId, InvokeDoneContext<States, Events, Emits, StateId, Output<ChildDefinition>, InputEvents, ParentEvents>>> & InvokeFailureRequirement<Error<ChildDefinition> | ActionError<Services<ChildDefinition>>, InvokeTransition<States, Events, Emits, StateId, InvokeFailureContext<States, Events, Emits, StateId, Error<ChildDefinition> | ActionError<Services<ChildDefinition>>, InputEvents, ParentEvents>>> & (Input<ChildDefinition> extends typeof Schema.Void ? {
3328
3461
  readonly input?: never;
3329
3462
  } : {
3330
3463
  readonly input: InvokeSource<Input<ChildDefinition>["Type"], InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>>;
3331
3464
  }) & {
3332
- readonly onSnapshot?: InvokeTransition<States, Events, Emits, InvokeSnapshotContext<States, Events, Emits, StateId, Snapshot<Machine.States<ChildDefinition>>, Error<ChildDefinition>, Output<ChildDefinition>, InputEvents, ParentEvents>>;
3465
+ readonly onSnapshot?: InvokeTransition<States, Events, Emits, StateId, InvokeSnapshotContext<States, Events, Emits, StateId, Snapshot<Machine.States<ChildDefinition>>, Error<ChildDefinition>, Output<ChildDefinition>, InputEvents, ParentEvents>>;
3333
3466
  } : never : never;
3334
3467
  type ContextualInvokeDefinition<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateIdentifier<States>, InputEvents extends ReadonlyArray<TaggedSchema>, ParentEvents extends ReadonlyArray<TaggedSchema>, Raw> = Raw extends ReadonlyArray<any> ? {
3335
3468
  readonly [Index in keyof Raw]: ContextualInvokeConfig<States, Events, Emits, StateId, InputEvents, ParentEvents, Raw[Index]>;
@@ -3356,27 +3489,10 @@ export declare namespace Machine {
3356
3489
  readonly entry?: (context: StateActionContext<States, Events, Emits, StateId, InputEvents, ParentEvents>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => StateActionResult<any, any>;
3357
3490
  readonly exit?: (context: StateActionContext<States, Events, Emits, StateId, InputEvents, ParentEvents>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => StateActionResult<any, any>;
3358
3491
  readonly invoke?: InvokeDefinition<States, Events, Emits, StateId, InputEvents, ParentEvents> | TypedInvokeDefinition;
3359
- readonly always?: ((context: AlwaysContext<States, Events, Emits, StateId, InputEvents, ParentEvents>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, any, any>) | {
3360
- /** Statically declared upper bound of possible target paths. */
3361
- readonly targets?: ReadonlyArray<StateNodeIdentifier<States>>;
3362
- readonly transition: (context: AlwaysContext<States, Events, Emits, StateId, InputEvents, ParentEvents>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, any, any>;
3363
- };
3364
- readonly onDone?: ((context: DoneContext<States, Events, Emits, StateId, InputEvents, ParentEvents>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, any, any>) | {
3365
- /** Statically declared upper bound of possible target paths. */
3366
- readonly targets?: ReadonlyArray<StateNodeIdentifier<States>>;
3367
- readonly transition: (context: DoneContext<States, Events, Emits, StateId, InputEvents, ParentEvents>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, any, any>;
3368
- };
3492
+ readonly always?: TransitionConfig<States, Events, Emits, StateId, AlwaysContext<States, Events, Emits, StateId, InputEvents, ParentEvents>>;
3493
+ readonly onDone?: TransitionConfig<States, Events, Emits, StateId, DoneContext<States, Events, Emits, StateId, InputEvents, ParentEvents>>;
3369
3494
  readonly on?: {
3370
- readonly [EventTag in TagOf<Events[number]>]?: ((context: HandlerContext<States, Events, Emits, StateId, EventTag, E, R, InputEvents, ParentEvents>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, any, any>) | {
3371
- readonly reenter?: boolean;
3372
- /**
3373
- * Upper bound of state or history paths this handler may target.
3374
- * Returning `target.none()` is always permitted. Declaring a parent state also
3375
- * permits concrete descendant targets below it.
3376
- */
3377
- readonly targets?: ReadonlyArray<StateNodeIdentifier<States>>;
3378
- readonly transition: (context: HandlerContext<States, Events, Emits, StateId, EventTag, E, R, InputEvents, ParentEvents>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, any, any>;
3379
- };
3495
+ readonly [EventTag in TagOf<Events[number]>]?: TransitionConfig<States, Events, Emits, StateId, HandlerContext<States, Events, Emits, StateId, EventTag, E, R, InputEvents, ParentEvents>, true>;
3380
3496
  };
3381
3497
  readonly initialize?: StateInitializeHandler<States, Events, Emits, StateId, InputEvents, ParentEvents>;
3382
3498
  } & ActiveOutputHandlerConfig<States, Events, StateId>;
@@ -3463,11 +3579,7 @@ export declare namespace Machine {
3463
3579
  };
3464
3580
  /** Required implementation for a choice pseudo-state. */
3465
3581
  interface ChoiceStateConfig<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, ChoiceId extends ChoiceIdentifier<States>, InputEvents extends ReadonlyArray<TaggedSchema> = Events, ParentEvents extends ReadonlyArray<TaggedSchema> = readonly []> {
3466
- readonly choice: {
3467
- /** Statically inspectable upper bound of every possible target. */
3468
- readonly targets: readonly [StateNodeIdentifier<States>, ...ReadonlyArray<StateNodeIdentifier<States>>];
3469
- readonly transition: (context: ChoiceContext<States, Events, Emits, ChoiceId, InputEvents, ParentEvents>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => ChoiceResult<States, any, any>;
3470
- };
3582
+ readonly choice: TransitionConfig<States, Events, Emits, ChoiceId, ChoiceContext<States, Events, Emits, ChoiceId, InputEvents, ParentEvents>>;
3471
3583
  readonly entry?: never;
3472
3584
  readonly exit?: never;
3473
3585
  readonly invoke?: never;
@@ -3581,9 +3693,6 @@ export declare namespace Machine {
3581
3693
  readonly [Key in UnknownKeys]: HandlerValidationError<"Handler config contains an event key that does not exist", StateId, Key>;
3582
3694
  };
3583
3695
  } : unknown;
3584
- type TransitionResultTargetPath<Result> = IsAny<Result> extends true ? never : Result extends Effect.Effect<infer Success, any, any> ? TransitionResultTargetPath<Success> : Result extends StateConstruction<infer Constructed> ? TransitionResultTargetPath<Constructed> : Result extends {
3585
- readonly path: infer Path extends string;
3586
- } ? Path : never;
3587
3696
  type TransitionResultInitialTargetPath<Result> = IsAny<Result> extends true ? never : Result extends Effect.Effect<infer Success, any, any> ? TransitionResultInitialTargetPath<Success> : Result extends StateConstruction<infer Constructed> ? TransitionResultInitialTargetPath<Constructed> : Result extends {
3588
3697
  readonly [Topology.InitialTargetTypeId]: typeof Topology.InitialTargetTypeId;
3589
3698
  readonly _tag: "InitialTarget";
@@ -3604,24 +3713,6 @@ export declare namespace Machine {
3604
3713
  } ? HandlerTreeInitialTargetPath<Children> : never);
3605
3714
  }[keyof Config] : never;
3606
3715
  type HandlerInitialTargetValidation<AllStates extends StateSchemas, Config> = HandlerTreeInitialTargetPath<Config> extends infer TargetPath ? HandlerInitialTargetValidationForPaths<AllStates, Config, RequiredInitializersForTargetPath<AllStates, TargetPath>> : unknown;
3607
- type DeclaredTransitionTarget<Transition> = Transition extends {
3608
- readonly targets: infer Targets extends ReadonlyArray<string>;
3609
- } ? Targets[number] : never;
3610
- type ExcludeDeclaredTransitionTarget<Returned, Declared extends string> = Returned extends string ? Returned extends Declared | `${Declared}.${string}` ? never : Returned : never;
3611
- type UndeclaredTransitionTarget<Transition> = "targets" extends keyof Transition ? ExcludeDeclaredTransitionTarget<TransitionResultTargetPath<EventTransitionReturn<Transition>>, DeclaredTransitionTarget<Transition>> : never;
3612
- type HandlerOnTargetValidationErrors<StateId extends string, On> = {
3613
- readonly [EventTag in keyof On as [UndeclaredTransitionTarget<On[EventTag]>] extends [never] ? never : EventTag]: HandlerValidationError<"Transition returns a target not listed in targets", StateId, readonly [event: EventTag, target: UndeclaredTransitionTarget<On[EventTag]>]>;
3614
- };
3615
- type HandlerOnTargetValidation<StateId extends string, Config> = "on" extends keyof Config ? Config extends {
3616
- readonly on?: infer On;
3617
- } ? HandlerOnTargetValidationErrors<StateId, NonNullable<On>> extends infer Errors ? keyof Errors extends never ? unknown : {
3618
- readonly on: Errors;
3619
- } : never : unknown : unknown;
3620
- type HandlerDirectTargetValidation<StateId extends string, Config, Trigger extends "always" | "onDone", Transition = Config extends {
3621
- readonly [Key in Trigger]?: infer Value;
3622
- } ? NonNullable<Value> : never, Undeclared extends string = UndeclaredTransitionTarget<Transition>> = Trigger extends keyof Config ? [Undeclared] extends [never] ? unknown : {
3623
- readonly [Key in Trigger]: HandlerValidationError<"Transition returns a target not listed in targets", StateId, readonly [trigger: Trigger, target: Undeclared]>;
3624
- } : unknown;
3625
3716
  type HandlerChildrenValidation<Node, Prefix extends string, Config> = "states" extends keyof Config ? Config extends {
3626
3717
  readonly states?: infer ChildrenConfig;
3627
3718
  } ? HandlerChildren<Node> extends infer Children extends StateSchemas ? [Children] extends [never] ? {
@@ -3645,15 +3736,10 @@ export declare namespace Machine {
3645
3736
  type HandlerRequiredHistoryInitializeValidation<AllStates extends StateSchemas, StateId extends StateIdentifier<AllStates>, Config> = [HistoryIdentifier<AllStates>] extends [never] ? unknown : StateId extends RequiredHistoryInitializers<AllStates> ? "initialize" extends keyof Config ? unknown : {
3646
3737
  readonly initialize: HandlerValidationError<"State requires initialize for shallow history restoration", StateId>;
3647
3738
  } : unknown;
3648
- type HandlerNodeValidation<AllStates extends StateSchemas, Node, Events extends ReadonlyArray<TaggedSchema>, InputEvents extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateNodeIdentifier<AllStates>, Config, AvailableOutputStates extends StateIdentifier<AllStates>> = StateId extends ChoiceIdentifier<AllStates> ? HandlerChoiceUnknownConfigKeyValidation<StateId, Config> & HandlerChoiceTargetValidation<StateId, Config> & HandlerRuntimeValidation<Events, Emits, StateId, Config> : StateId extends StateIdentifier<AllStates> ? HandlerUnknownConfigKeyValidation<StateId, Config> & HandlerOnKeyValidation<Events, StateId, Config> & HandlerOnTargetValidation<StateId, Config> & HandlerDirectTargetValidation<StateId, Config, "always"> & HandlerDirectTargetValidation<StateId, Config, "onDone"> & HandlerInvokeParentEventsValidation<InputEvents, StateId, Config> & HandlerChildrenValidation<Node, StateId, Config> & HandlerOutputRequirementValidation<AllStates, StateId, AvailableOutputStates, Config> & HandlerRequiredHistoryInitializeValidation<AllStates, StateId, Config> & HandlerRuntimeValidation<Events, Emits, StateId, Config> : unknown;
3739
+ type HandlerNodeValidation<AllStates extends StateSchemas, Node, Events extends ReadonlyArray<TaggedSchema>, InputEvents extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateNodeIdentifier<AllStates>, Config, AvailableOutputStates extends StateIdentifier<AllStates>> = StateId extends ChoiceIdentifier<AllStates> ? HandlerChoiceUnknownConfigKeyValidation<StateId, Config> & HandlerRuntimeValidation<Events, Emits, StateId, Config> : StateId extends StateIdentifier<AllStates> ? HandlerUnknownConfigKeyValidation<StateId, Config> & HandlerOnKeyValidation<Events, StateId, Config> & HandlerInvokeParentEventsValidation<InputEvents, StateId, Config> & HandlerChildrenValidation<Node, StateId, Config> & HandlerOutputRequirementValidation<AllStates, StateId, AvailableOutputStates, Config> & HandlerRequiredHistoryInitializeValidation<AllStates, StateId, Config> & HandlerRuntimeValidation<Events, Emits, StateId, Config> : unknown;
3649
3740
  type HandlerChoiceUnknownConfigKeyValidation<StateId extends string, Config, UnknownKeys extends string = Exclude<Extract<keyof Config, string>, "choice">> = [UnknownKeys] extends [never] ? unknown : {
3650
3741
  readonly [Key in UnknownKeys]: HandlerValidationError<"Choice handler config contains an invalid key", StateId, Key>;
3651
3742
  };
3652
- type HandlerChoiceTargetValidation<StateId extends string, Config> = Config extends {
3653
- readonly choice: infer Choice;
3654
- } ? [UndeclaredTransitionTarget<Choice>] extends [never] ? unknown : {
3655
- readonly choice: HandlerValidationError<"Choice resolver returns a target not listed in targets", StateId, UndeclaredTransitionTarget<Choice>>;
3656
- } : unknown;
3657
3743
  type HandlerInvokeParentEventsValidation<Events extends ReadonlyArray<TaggedSchema>, StateId extends string, Config> = [InvokeReturn<Config>] extends [never] ? unknown : [Exclude<InvokeParentEvents<InvokeReturn<Config>>, EventOf<Events>>] extends [never] ? unknown : {
3658
3744
  readonly invoke: HandlerValidationError<"Invoked child expects parent events not accepted by this machine", StateId, Exclude<InvokeParentEvents<InvokeReturn<Config>>, EventOf<Events>>>;
3659
3745
  };
@@ -3708,12 +3794,7 @@ export declare namespace Machine {
3708
3794
  * @category models
3709
3795
  * @since 0.4.0
3710
3796
  */
3711
- type EventHandlerMap<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateIdentifier<States>, EventTag extends TagOf<Events[number]>, E, R> = Readonly<Record<PropertyKey, ((context: HandlerContext<States, Events, Emits, StateId, EventTag, E, R>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, E, R>) | {
3712
- readonly reenter?: boolean;
3713
- /** Statically declared upper bound of possible target paths. */
3714
- readonly targets?: ReadonlyArray<StateNodeIdentifier<States>>;
3715
- readonly transition: (context: HandlerContext<States, Events, Emits, StateId, EventTag, E, R>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, E, R>;
3716
- }>>;
3797
+ type EventHandlerMap<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateIdentifier<States>, EventTag extends TagOf<Events[number]>, E, R> = Readonly<Record<PropertyKey, TransitionConfig<States, Events, Emits, StateId, HandlerContext<States, Events, Emits, StateId, EventTag, E, R>, true>>>;
3717
3798
  /**
3718
3799
  * Runtime state config stored for a single state tag.
3719
3800
  *
@@ -3724,14 +3805,8 @@ export declare namespace Machine {
3724
3805
  readonly entry?: (context: StateActionContext<States, Events, Emits, StateId>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => StateActionResult<E, R>;
3725
3806
  readonly exit?: (context: StateActionContext<States, Events, Emits, StateId>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => StateActionResult<E, R>;
3726
3807
  readonly invoke?: InvokeDefinition<States, Events, Emits, StateId>;
3727
- readonly always?: ((context: AlwaysContext<States, Events, Emits, StateId>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, E, R>) | {
3728
- readonly targets?: ReadonlyArray<StateNodeIdentifier<States>>;
3729
- readonly transition: (context: AlwaysContext<States, Events, Emits, StateId>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, E, R>;
3730
- };
3731
- readonly onDone?: ((context: DoneContext<States, Events, Emits, StateId>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, E, R>) | {
3732
- readonly targets?: ReadonlyArray<StateNodeIdentifier<States>>;
3733
- readonly transition: (context: DoneContext<States, Events, Emits, StateId>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => HandlerResult<States, E, R>;
3734
- };
3808
+ readonly always?: TransitionConfig<States, Events, Emits, StateId, AlwaysContext<States, Events, Emits, StateId>>;
3809
+ readonly onDone?: TransitionConfig<States, Events, Emits, StateId, DoneContext<States, Events, Emits, StateId>>;
3735
3810
  readonly output?: ((context: FinalOutputContext<States, Events, StateId>) => unknown) | ((context: ParallelOutputContext<States, Events, StateId>) => unknown);
3736
3811
  readonly on?: EventHandlerMap<States, Events, Emits, StateId, EventTag, E, R>;
3737
3812
  }
@@ -3763,15 +3838,15 @@ export declare const isFinal: <const States extends Machine.StateSchemas, const
3763
3838
  * **When to use**
3764
3839
  *
3765
3840
  * Use when you want to pass a state tree to `make` and also get typed
3766
- * snapshot builders for initial states and tests.
3841
+ * snapshot matching and access helpers.
3767
3842
  *
3768
3843
  * **Details**
3769
3844
  *
3770
3845
  * The returned `states` property is the same object passed to `defineStates`.
3771
- * The returned `initial` builder creates snapshots without user-authored path
3772
- * strings and enforces compound and parallel initial-state rules. Active nodes
3773
- * may omit `schema` when they own no value; those builders expose `.from(...)`
3774
- * and still participate fully in targeting, matching, and snapshots.
3846
+ * `Machine.make` derives its initial target selector from that tree and
3847
+ * enforces compound and parallel initial-state rules. Active nodes may omit
3848
+ * `schema` when they own no value and still participate fully in targeting,
3849
+ * matching, and snapshots.
3775
3850
  *
3776
3851
  * **Example** (Atomic initial snapshot)
3777
3852
  *
@@ -3786,7 +3861,10 @@ export declare const isFinal: <const States extends Machine.StateSchemas, const
3786
3861
  * Machine.make({
3787
3862
  * states: States.states,
3788
3863
  * events: Machine.events(),
3789
- * initial: () => States.initial.idle.from()
3864
+ * initial: {
3865
+ * target: (to) => to.idle(),
3866
+ * resolve: ({ target }) => target.from()
3867
+ * }
3790
3868
  * })
3791
3869
  * ```
3792
3870
  *
@@ -3794,6 +3872,15 @@ export declare const isFinal: <const States extends Machine.StateSchemas, const
3794
3872
  * @since 0.4.0
3795
3873
  */
3796
3874
  export declare const defineStates: DefineStates;
3875
+ type InitialDirectInput<States extends Machine.StateSchemas, Input, Selection extends Machine.TargetSelection<any, any, any>> = {
3876
+ readonly target: (to: Machine.InitialSelector<States>) => Selection;
3877
+ readonly resolve?: (context: {
3878
+ readonly input: Input;
3879
+ readonly target: Machine.SelectionBuilder<Selection>;
3880
+ }) => Machine.SelectedTargetResult<Selection>;
3881
+ readonly cases?: never;
3882
+ readonly otherwise?: never;
3883
+ };
3797
3884
  type MakeConfig<States extends Machine.StateSchemas, InputEvents extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, Input extends Schema.Top, InitialE, InitialR, InternalEvents extends ReadonlyArray<Machine.TaggedSchema>, ParentEvents extends ReadonlyArray<Machine.TaggedSchema>> = {
3798
3885
  readonly id?: string;
3799
3886
  readonly states: States & DefineStateTreeInput<NoInfer<States>>;
@@ -3802,11 +3889,13 @@ type MakeConfig<States extends Machine.StateSchemas, InputEvents extends Readonl
3802
3889
  readonly emittedEvents?: Machine.EventProtocol<"emitted", Emits>;
3803
3890
  readonly parentEvents?: Machine.EventProtocol<"public", ParentEvents>;
3804
3891
  readonly input?: Input;
3805
- readonly initial: (...args: [...Machine.InputArgs<Input>]) => Machine.InitialResult<States, InitialE, InitialR>;
3892
+ readonly initial: unknown;
3806
3893
  };
3807
3894
  type MakeResult<States extends Machine.StateSchemas, InputEvents extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, Input extends Schema.Top, InitialE, InitialR, InternalEvents extends ReadonlyArray<Machine.TaggedSchema>, ParentEvents extends ReadonlyArray<Machine.TaggedSchema>> = Machine<States, readonly [...InputEvents, ...InternalEvents], Input, Machine.StateIdentifier<States>, never, never, InitialE, InitialR, Machine.FinalStateFromDefinition<States>, Machine.TerminalOutput<States>, Emits, never, InputEvents, ParentEvents>;
3808
3895
  interface Make {
3809
- <const States extends Machine.StateSchemas, const InputEvents extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const Input extends Schema.Top = typeof Schema.Void, InitialE = never, InitialR = never, const InternalEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const ParentEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly []>(config: MakeConfig<States, InputEvents, Emits, Input, InitialE, InitialR, InternalEvents, ParentEvents>, ..._validation: ValidateDefinedStates<NoInfer<States>>): MakeResult<States, InputEvents, Emits, Input, InitialE, InitialR, InternalEvents, ParentEvents>;
3896
+ <const States extends Machine.StateSchemas, const InputEvents extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const Input extends Schema.Top = typeof Schema.Void, InitialE = never, InitialR = never, const InternalEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const ParentEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const InitialSelection extends Machine.TargetSelection<any, any, any> = Machine.TargetSelection<any, any, any>>(config: Omit<MakeConfig<States, InputEvents, Emits, Input, InitialE, InitialR, InternalEvents, ParentEvents>, "initial"> & {
3897
+ readonly initial: InitialDirectInput<States, Input["Type"], InitialSelection>;
3898
+ }, ..._validation: ValidateDefinedStates<NoInfer<States>>): MakeResult<States, InputEvents, Emits, Input, InitialE, InitialR, InternalEvents, ParentEvents>;
3810
3899
  <const States extends Machine.StateSchemas, const InputEvents extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const Input extends Schema.Top = typeof Schema.Void, InitialE = never, InitialR = never, const InternalEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const ParentEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly []>(config: Omit<MakeConfig<States, InputEvents, Emits, Input, InitialE, InitialR, InternalEvents, ParentEvents>, "states"> & {
3811
3900
  readonly states: InvalidDefinedStateTreeInput<States>;
3812
3901
  }): never;
@@ -3850,18 +3939,24 @@ interface Make {
3850
3939
  * const counter = Machine.make({
3851
3940
  * states: States.states,
3852
3941
  * events: Events,
3853
- * initial: () => States.initial.Count(new Count({ value: 0 }))
3942
+ * initial: {
3943
+ * target: (to) => to.Count(),
3944
+ * resolve: ({ target }) => target(new Count({ value: 0 }))
3945
+ * }
3854
3946
  * }).handle({
3855
3947
  * Count: {
3856
3948
  * on: {
3857
- * Increment: ({ event, state }) =>
3858
- * States.initial.Count(new Count({ value: state.value + event.by }))
3949
+ * Increment: Machine.transition({
3950
+ * target: (to) => to.full.Count(),
3951
+ * resolve: ({ event, state, target }) =>
3952
+ * target(new Count({ value: state.value + event.by }))
3953
+ * })
3859
3954
  * }
3860
3955
  * }
3861
3956
  * })
3862
3957
  * ```
3863
3958
  *
3864
- * @see {@link defineStates} for typed initial snapshot builders.
3959
+ * @see {@link defineStates} for typed state-tree helpers.
3865
3960
  * @category constructors
3866
3961
  * @since 0.4.0
3867
3962
  */
@@ -3969,7 +4064,10 @@ export declare const emittedEvents: {
3969
4064
  * const machine = Machine.make({
3970
4065
  * states: States.states,
3971
4066
  * events: Machine.events(),
3972
- * initial: () => States.initial.Idle.from()
4067
+ * initial: {
4068
+ * target: (to) => to.Idle(),
4069
+ * resolve: ({ target }) => target.from()
4070
+ * }
3973
4071
  * }).handle({ Idle: {} })
3974
4072
  *
3975
4073
  * const encoded = Effect.gen(function*() {
@@ -4013,7 +4111,10 @@ export declare const encodeSnapshot: <const States extends Machine.StateSchemas,
4013
4111
  * const machine = Machine.make({
4014
4112
  * states: States.states,
4015
4113
  * events: Machine.events(),
4016
- * initial: () => States.initial.Idle.from()
4114
+ * initial: {
4115
+ * target: (to) => to.Idle(),
4116
+ * resolve: ({ target }) => target.from()
4117
+ * }
4017
4118
  * }).handle({ Idle: {} })
4018
4119
  *
4019
4120
  * const roundTrip = Effect.gen(function*() {
@@ -4037,8 +4138,8 @@ type EffectInvokeSource<States extends Machine.StateSchemas, Events extends Read
4037
4138
  readonly address?: never;
4038
4139
  readonly onSnapshot?: never;
4039
4140
  };
4040
- type EffectDoneHandler<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, Source extends (...args: ReadonlyArray<never>) => Effect.Effect<unknown, unknown, unknown>> = Machine.InvokeTransition<States, Events, Emits, Machine.InvokeDoneContext<States, Events, Emits, StateId, Effect.Success<ReturnType<NoInfer<Source>>>, readonly [], readonly []>>;
4041
- type EffectFailureHandler<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, Source extends (...args: ReadonlyArray<never>) => Effect.Effect<unknown, unknown, unknown>> = Machine.InvokeTransition<States, Events, Emits, Machine.InvokeFailureContext<States, Events, Emits, StateId, Effect.Error<ReturnType<NoInfer<Source>>>, readonly [], readonly []>>;
4141
+ type EffectDoneHandler<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, Source extends (...args: ReadonlyArray<never>) => Effect.Effect<unknown, unknown, unknown>> = Machine.InvokeTransition<States, Events, Emits, StateId, Machine.InvokeDoneContext<States, Events, Emits, StateId, Effect.Success<ReturnType<NoInfer<Source>>>, readonly [], readonly []>>;
4142
+ type EffectFailureHandler<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, Source extends (...args: ReadonlyArray<never>) => Effect.Effect<unknown, unknown, unknown>> = Machine.InvokeTransition<States, Events, Emits, StateId, Machine.InvokeFailureContext<States, Events, Emits, StateId, Effect.Error<ReturnType<NoInfer<Source>>>, readonly [], readonly []>>;
4042
4143
  type EffectInvokeResult<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, Source extends (...args: ReadonlyArray<never>) => Effect.Effect<unknown, unknown, unknown>> = Machine.InvokeConfig<States, Events, Emits, StateId, readonly [], readonly []> & Machine.InvokeTyped<Effect.Success<ReturnType<Source>>, Effect.Error<ReturnType<Source>>, Effect.Services<ReturnType<Source>>, never>;
4043
4144
  type InvokeChannelIsNever<Value> = IsAny<Value> extends true ? false : [Value] extends [never] ? true : false;
4044
4145
  type BoundEffectInvokeSource<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, InputEvents extends ReadonlyArray<Machine.TaggedSchema>, ParentEvents extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, Source extends (context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => Effect.Effect<unknown, unknown, unknown>> = {
@@ -4050,9 +4151,77 @@ type BoundEffectInvokeSource<States extends Machine.StateSchemas, Events extends
4050
4151
  readonly address?: never;
4051
4152
  readonly onSnapshot?: never;
4052
4153
  };
4053
- type BoundEffectDoneHandler<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, InputEvents extends ReadonlyArray<Machine.TaggedSchema>, ParentEvents extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, Source extends (...args: ReadonlyArray<never>) => Effect.Effect<unknown, unknown, unknown>> = Machine.InvokeTransition<States, Events, Emits, Machine.InvokeDoneContext<States, Events, Emits, StateId, Effect.Success<ReturnType<NoInfer<Source>>>, InputEvents, ParentEvents>>;
4054
- type BoundEffectFailureHandler<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, InputEvents extends ReadonlyArray<Machine.TaggedSchema>, ParentEvents extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, Source extends (...args: ReadonlyArray<never>) => Effect.Effect<unknown, unknown, unknown>> = Machine.InvokeTransition<States, Events, Emits, Machine.InvokeFailureContext<States, Events, Emits, StateId, Effect.Error<ReturnType<NoInfer<Source>>>, InputEvents, ParentEvents>>;
4154
+ type BoundEffectDoneHandler<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, InputEvents extends ReadonlyArray<Machine.TaggedSchema>, ParentEvents extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, Source extends (...args: ReadonlyArray<never>) => Effect.Effect<unknown, unknown, unknown>> = Machine.InvokeTransition<States, Events, Emits, StateId, Machine.InvokeDoneContext<States, Events, Emits, StateId, Effect.Success<ReturnType<NoInfer<Source>>>, InputEvents, ParentEvents>>;
4155
+ type BoundEffectFailureHandler<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, InputEvents extends ReadonlyArray<Machine.TaggedSchema>, ParentEvents extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, Source extends (...args: ReadonlyArray<never>) => Effect.Effect<unknown, unknown, unknown>> = Machine.InvokeTransition<States, Events, Emits, StateId, Machine.InvokeFailureContext<States, Events, Emits, StateId, Effect.Error<ReturnType<NoInfer<Source>>>, InputEvents, ParentEvents>>;
4055
4156
  type BoundEffectInvokeResult<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, InputEvents extends ReadonlyArray<Machine.TaggedSchema>, ParentEvents extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, Source extends (...args: ReadonlyArray<never>) => Effect.Effect<unknown, unknown, unknown>> = Machine.InvokeConfig<States, Events, Emits, StateId, InputEvents, ParentEvents> & Machine.InvokeTyped<Effect.Success<ReturnType<Source>>, Effect.Error<ReturnType<Source>>, Effect.Services<ReturnType<Source>>, never>;
4157
+ /** Type evidence retained for a case created by a conditional transition's local builder. */
4158
+ interface TransitionCaseTyped {
4159
+ readonly [TransitionCaseTypeId]: true;
4160
+ }
4161
+ /** Locally bound constructor that preserves each conditional transition case independently. */
4162
+ interface TransitionCaseConstructor<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateNodeIdentifier<States>, Context> {
4163
+ <const Selection extends Machine.TargetSelection<any, any, any>, const Match>(config: Machine.TransitionCaseInput<States, Events, Emits, StateId, Context, Selection, Match>): Machine.TransitionCaseInput<States, Events, Emits, StateId, Context, Selection, Match> & TransitionCaseTyped;
4164
+ }
4165
+ /**
4166
+ * Captures one exact transition topology while preserving handler inference.
4167
+ *
4168
+ * @category constructors
4169
+ * @since 0.14.0
4170
+ */
4171
+ type ConditionalTransitionResult<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateNodeIdentifier<States>, Context, Reenter extends boolean, Cases extends readonly [
4172
+ TransitionCaseTyped,
4173
+ ...ReadonlyArray<TransitionCaseTyped>
4174
+ ], OtherwiseSelection extends Machine.TargetSelection<any, any, any>> = Omit<Machine.TransitionConditionalInput<States, Events, Emits, StateId, Context, Reenter, Cases, OtherwiseSelection>, "cases"> & {
4175
+ readonly cases: Cases;
4176
+ } & Machine.TransitionTyped<States, Events, Emits, StateId, Context, Reenter>;
4177
+ /**
4178
+ * Contextually types direct and conditional transition definitions.
4179
+ *
4180
+ * @category constructors
4181
+ * @since 0.14.0
4182
+ */
4183
+ export interface TransitionConstructor {
4184
+ <const States extends Machine.StateSchemas, const Events extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateNodeIdentifier<States>, Context, const Selection extends Machine.TargetSelection<any, any, any>, Reenter extends boolean = never>(config: Machine.TransitionDirectInput<States, Events, Emits, StateId, Context, Reenter, Selection>): Machine.TransitionDirectInput<States, Events, Emits, StateId, Context, Reenter, Selection> & (Machine.SelectionKind<Selection> extends "none" ? Machine.TargetlessTransitionTyped : Machine.TransitionTyped<States, Events, Emits, StateId, Context, Reenter>);
4185
+ <const States extends Machine.StateSchemas, const Events extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateNodeIdentifier<States>, Context, const Cases extends readonly [
4186
+ TransitionCaseTyped,
4187
+ ...ReadonlyArray<TransitionCaseTyped>
4188
+ ], const OtherwiseSelection extends Machine.TargetSelection<any, any, any>, Reenter extends boolean = never>(config: Machine.TransitionConditionalInput<States, Events, Emits, StateId, Context, Reenter, Cases, OtherwiseSelection>): ConditionalTransitionResult<States, Events, Emits, StateId, Context, Reenter, Cases, OtherwiseSelection>;
4189
+ }
4190
+ /**
4191
+ * Defines a statically inspectable transition.
4192
+ *
4193
+ * It is required for every event, lifecycle, choice, and invocation transition
4194
+ * so the destination selected by `target` can contextually type the
4195
+ * corresponding resolver. Conditional transitions use the locally bound
4196
+ * `branch` constructor so every case independently infers its matched value and
4197
+ * selected destination, with no limit on the number of cases.
4198
+ *
4199
+ * ```ts
4200
+ * Machine.transition({
4201
+ * target: (to) => to.full.Ready(),
4202
+ * resolve: ({ target }) => target.from()
4203
+ * })
4204
+ *
4205
+ * Machine.transition({
4206
+ * cases: (branch) => [
4207
+ * branch({
4208
+ * title: "has cached data",
4209
+ * when: ({ event }) => event.cached,
4210
+ * target: (to) => to.full.Ready(),
4211
+ * resolve: ({ match, target }) => target.from({ data: match })
4212
+ * })
4213
+ * ],
4214
+ * otherwise: {
4215
+ * target: (to) => to.full.Loading(),
4216
+ * resolve: ({ target }) => target.from()
4217
+ * }
4218
+ * })
4219
+ * ```
4220
+ *
4221
+ * @category constructors
4222
+ * @since 0.14.0
4223
+ */
4224
+ export declare const transition: TransitionConstructor;
4056
4225
  /**
4057
4226
  * Machine-bound invocation constructor that preserves the owning machine's
4058
4227
  * public input and parent protocols in every invocation callback.
@@ -4086,8 +4255,22 @@ export interface Invoker<States extends Machine.StateSchemas, Events extends Rea
4086
4255
  readonly onFailure?: never;
4087
4256
  }): BoundEffectInvokeResult<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4088
4257
  <StateId extends Machine.StateIdentifier<States>, const Config extends object>(config: Config & Machine.TimerInvokeArgs<States, Events, Emits, StateId, InputEvents, ParentEvents>): Config & Machine.InvokeOwned<States, Events, Emits, StateId> & Machine.InvokeTyped<void, never, never, never>;
4089
- <StateId extends Machine.StateIdentifier<States>, ChildState, ChildEvent, ChildError, ChildRequirements, ChildOutput, ChildInitialError, Address extends ChildAddress<never>>(config: Machine.LogicInvokeArgs<States, Events, Emits, StateId, ChildState, ChildEvent, ChildError, ChildRequirements, ChildOutput, ChildInitialError, Address, (context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => Logic<ChildState, ChildEvent, ChildError, ChildRequirements, ChildOutput, ChildInitialError>, InputEvents, ParentEvents>): Machine.InvokeConfig<States, Events, Emits, StateId, InputEvents, ParentEvents> & Machine.InvokeTyped<ChildOutput, ChildError, ChildRequirements, ChildInitialError>;
4090
- <StateId extends Machine.StateIdentifier<States>, ChildState, ChildEvent, ChildError, ChildRequirements, ChildOutput, ChildInitialError, Address extends ChildAddress<never>, const Config extends object>(config: Config & Machine.LogicInvokeArgs<States, Events, Emits, StateId, ChildState, ChildEvent, ChildError, ChildRequirements, ChildOutput, ChildInitialError, Address, Logic<ChildState, ChildEvent, ChildError, ChildRequirements, ChildOutput, ChildInitialError>, InputEvents, ParentEvents>): Config & Machine.InvokeOwned<States, Events, Emits, StateId> & Machine.InvokeTyped<ChildOutput, ChildError, ChildRequirements, ChildInitialError>;
4258
+ <StateId extends Machine.StateIdentifier<States>, const Source extends (context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => unknown, Address extends ChildAddress<never>>(config: {
4259
+ readonly logic: Source;
4260
+ } & Machine.LogicInvokeArgs<States, Events, Emits, StateId, Machine.LogicStateOf<ReturnType<Source>>, Machine.LogicEventOf<ReturnType<Source>>, Machine.LogicErrorOf<ReturnType<Source>>, Machine.LogicServicesOf<ReturnType<Source>>, Machine.LogicOutputOf<ReturnType<Source>>, Machine.LogicInitialErrorOf<ReturnType<Source>>, Address, Source, InputEvents, ParentEvents>, ..._validation: ReturnType<Source> extends {
4261
+ readonly initial: unknown;
4262
+ readonly run: unknown;
4263
+ } ? [] : [
4264
+ "logic factory must return Machine.Logic"
4265
+ ]): Machine.InvokeConfig<States, Events, Emits, StateId, InputEvents, ParentEvents> & Machine.InvokeTyped<Machine.LogicOutputOf<ReturnType<Source>>, Machine.LogicErrorOf<ReturnType<Source>>, Machine.LogicServicesOf<ReturnType<Source>>, Machine.LogicInitialErrorOf<ReturnType<Source>>>;
4266
+ <StateId extends Machine.StateIdentifier<States>, const Source, Address extends ChildAddress<never>>(config: {
4267
+ readonly logic: Source;
4268
+ } & Machine.LogicInvokeArgs<States, Events, Emits, StateId, Machine.LogicStateOf<Source>, Machine.LogicEventOf<Source>, Machine.LogicErrorOf<Source>, Machine.LogicServicesOf<Source>, Machine.LogicOutputOf<Source>, Machine.LogicInitialErrorOf<Source>, Address, Source, InputEvents, ParentEvents>, ..._validation: Source extends {
4269
+ readonly initial: unknown;
4270
+ readonly run: unknown;
4271
+ } ? [] : [
4272
+ "logic must implement Machine.Logic"
4273
+ ]): Machine.InvokeConfig<States, Events, Emits, StateId, InputEvents, ParentEvents> & Machine.InvokeTyped<Machine.LogicOutputOf<Source>, Machine.LogicErrorOf<Source>, Machine.LogicServicesOf<Source>, Machine.LogicInitialErrorOf<Source>>;
4091
4274
  <StateId extends Machine.StateIdentifier<States>, const Child extends ChildMachine.Any, const Config extends object>(config: Config & Machine.ChildInvokeArgs<States, Events, Emits, StateId, Child["machine"], Child, InputEvents, ParentEvents>): Config & Machine.InvokeOwned<States, Events, Emits, StateId> & Machine.InvokeTyped<Machine.Output<Child["machine"]>, Machine.Error<Child["machine"]> | ActionError<Machine.Services<Child["machine"]>>, Machine.Services<Child["machine"]>, Machine.InitialError<Child["machine"]>, Machine.Emit<Child["machine"]>, Machine.EventOf<Machine.ParentEvents<Child["machine"]>>>;
4092
4275
  }
4093
4276
  /**
@@ -4121,8 +4304,14 @@ export interface Invoker<States extends Machine.StateSchemas, Events extends Rea
4121
4304
  * try: () => fetch("/api/data").then((response) => response.json()),
4122
4305
  * catch: (cause) => new LoadError({ cause })
4123
4306
  * }),
4124
- * onDone: ({ output, target }) => target.full.Ready({ data: output }),
4125
- * onFailure: ({ error, target }) => target.full.Failed({ error })
4307
+ * onDone: Machine.transition({
4308
+ * target: (to) => to.full.Ready(),
4309
+ * resolve: ({ output, target }) => target.from({ data: output })
4310
+ * }),
4311
+ * onFailure: Machine.transition({
4312
+ * target: (to) => to.full.Failed(),
4313
+ * resolve: ({ error, target }) => target.from({ error })
4314
+ * })
4126
4315
  * })
4127
4316
  * ```
4128
4317
  *
@@ -4188,7 +4377,10 @@ export declare const invoke: {
4188
4377
  * const machine = Machine.make({
4189
4378
  * states: States.states,
4190
4379
  * events: Machine.events(),
4191
- * initial: () => States.initial.Idle.from()
4380
+ * initial: {
4381
+ * target: (to) => to.Idle(),
4382
+ * resolve: ({ target }) => target.from()
4383
+ * }
4192
4384
  * }).handle({ Idle: {} })
4193
4385
  *
4194
4386
  * const initialState = Effect.map(Machine.planInitial(machine), (plan) => plan.state)
@@ -4238,6 +4430,17 @@ export declare const planInitial: <const States extends Machine.StateSchemas, co
4238
4430
  * @since 0.4.0
4239
4431
  */
4240
4432
  export declare const stateNodes: <M extends Machine.Any>(machine: M) => ReadonlyArray<Machine.StateNode<Machine.StateIdentifier<Machine.States<M>>, Machine.HistoryIdentifier<Machine.States<M>>, Machine.ChoiceIdentifier<Machine.States<M>>>>;
4433
+ /**
4434
+ * Returns the statically selected root entry used during machine startup.
4435
+ *
4436
+ * This function does not execute the initial resolver or require machine
4437
+ * input. `kind: "initial"` means that the selected root enters its declared
4438
+ * initial configuration.
4439
+ *
4440
+ * @category getters
4441
+ * @since 0.14.0
4442
+ */
4443
+ export declare const initialDefinition: <M extends Machine.Any>(machine: M) => Machine.InitialDefinition<Machine.RootStateIdentifier<Machine.StateIdentifier<Machine.States<M>>>>;
4241
4444
  /**
4242
4445
  * Returns every registered transition handler in state definition order.
4243
4446
  *
@@ -4245,9 +4448,9 @@ export declare const stateNodes: <M extends Machine.Any>(machine: M) => Readonly
4245
4448
  *
4246
4449
  * Event handlers retain their handler-key order within each source state and
4247
4450
  * are followed by eventless and completion handlers. This function does not
4248
- * execute handlers. Object-form event, eventless, and completion handlers with
4249
- * a `targets` declaration expose those possible paths; handlers without one
4250
- * remain dynamic.
4451
+ * execute predicates or resolvers. Every direct, conditional, fallback, and
4452
+ * targetless branch exposes the destination selected by its required static
4453
+ * `target` declaration.
4251
4454
  *
4252
4455
  * @category getters
4253
4456
  * @since 0.4.0
@@ -4316,8 +4519,21 @@ export declare const enabled: <const States extends Machine.StateSchemas, const
4316
4519
  * const machine = Machine.make({
4317
4520
  * states: States.states,
4318
4521
  * events: Machine.events(Toggle),
4319
- * initial: () => States.initial.Off.from()
4320
- * }).handle({ Off: { on: { Toggle: () => States.initial.On.from() } }, On: {} })
4522
+ * initial: {
4523
+ * target: (to) => to.Off(),
4524
+ * resolve: ({ target }) => target.from()
4525
+ * }
4526
+ * }).handle({
4527
+ * Off: {
4528
+ * on: {
4529
+ * Toggle: Machine.transition({
4530
+ * target: (to) => to.full.On(),
4531
+ * resolve: ({ target }) => target.from()
4532
+ * })
4533
+ * }
4534
+ * },
4535
+ * On: {}
4536
+ * })
4321
4537
  *
4322
4538
  * const nextState = Effect.gen(function*() {
4323
4539
  * const initial = yield* Machine.planInitial(machine)
@@ -4384,37 +4600,6 @@ export declare const logic: <State, Event = never, Output = void, Error = never,
4384
4600
  readonly initial: State | ((scope: Logic.Scope<Event>) => Effect.Effect<State, InitialError, InitialRequirements>);
4385
4601
  readonly run: (context: Logic.Context<State, Event>) => Effect.Effect<Output, Error, Requirements>;
4386
4602
  }) => Logic<State, Event, Error, Requirements | InitialRequirements, Output, InitialError>;
4387
- /**
4388
- * Creates child process logic from an initial state and a transition function.
4389
- *
4390
- * **When to use**
4391
- *
4392
- * Use when a child process only needs sequential event-driven state updates and
4393
- * does not need direct control over intermediate snapshots or child ownership.
4394
- *
4395
- * **Details**
4396
- *
4397
- * Each received event runs the transition Effect against the latest state. The
4398
- * resulting state is published before the next queued event is processed.
4399
- *
4400
- * **Example**
4401
- *
4402
- * ```ts
4403
- * import { Effect } from "effect"
4404
- * import { Machine } from "@typeonce/effect-machine"
4405
- *
4406
- * const counter = Machine.transition(
4407
- * 0,
4408
- * (count, event: { readonly by: number }) => Effect.succeed(count + event.by)
4409
- * )
4410
- * ```
4411
- *
4412
- * Use an inline `invoke` with an `effect` source for one-shot work.
4413
- * @see {@link logic} for direct process lifecycle control.
4414
- * @category constructors
4415
- * @since 0.4.0
4416
- */
4417
- export declare const transition: <State, Event, Error = never, Requirements = never>(initial: State, transition: (state: State, event: Event) => Effect.Effect<State, Error, Requirements>) => Logic<State, Event, Error, Requirements, never>;
4418
4603
  /**
4419
4604
  * Creates a typed descriptor for a complete child machine.
4420
4605
  *
@@ -4541,7 +4726,10 @@ export declare const prepare: <const States extends Machine.StateSchemas, const
4541
4726
  * const machine = Machine.make({
4542
4727
  * states: States.states,
4543
4728
  * events: Machine.events(),
4544
- * initial: () => States.initial.Idle.from()
4729
+ * initial: {
4730
+ * target: (to) => to.Idle(),
4731
+ * resolve: ({ target }) => target.from()
4732
+ * }
4545
4733
  * }).handle({ Idle: {} })
4546
4734
  *
4547
4735
  * const state = Effect.gen(function*() {
@@ -4591,7 +4779,10 @@ export declare const start: <const States extends Machine.StateSchemas, const Ev
4591
4779
  * const machine = Machine.make({
4592
4780
  * states: States.states,
4593
4781
  * events: Machine.events(),
4594
- * initial: () => States.initial.Idle.from()
4782
+ * initial: {
4783
+ * target: (to) => to.Idle(),
4784
+ * resolve: ({ target }) => target.from()
4785
+ * }
4595
4786
  * }).handle({ Idle: {} })
4596
4787
  *
4597
4788
  * const resumed = Effect.gen(function*() {