@typeonce/effect-machine 0.15.0 → 0.16.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.
Files changed (58) hide show
  1. package/README.md +31 -3
  2. package/dist/Machine.d.ts +258 -88
  3. package/dist/Machine.d.ts.map +1 -1
  4. package/dist/Machine.js +33 -33
  5. package/dist/Machine.js.map +1 -1
  6. package/dist/internal/machine/activities.d.ts +2 -0
  7. package/dist/internal/machine/activities.d.ts.map +1 -1
  8. package/dist/internal/machine/activities.js +4 -0
  9. package/dist/internal/machine/activities.js.map +1 -1
  10. package/dist/internal/machine/executionPlan.d.ts.map +1 -1
  11. package/dist/internal/machine/executionPlan.js +6 -1
  12. package/dist/internal/machine/executionPlan.js.map +1 -1
  13. package/dist/internal/machine/invocation.d.ts +1 -1
  14. package/dist/internal/machine/invocation.d.ts.map +1 -1
  15. package/dist/internal/machine/invocation.js +25 -3
  16. package/dist/internal/machine/invocation.js.map +1 -1
  17. package/dist/internal/machine/invocationEvent.d.ts +8 -0
  18. package/dist/internal/machine/invocationEvent.d.ts.map +1 -1
  19. package/dist/internal/machine/invocationEvent.js +8 -0
  20. package/dist/internal/machine/invocationEvent.js.map +1 -1
  21. package/dist/internal/machine/machine.d.ts.map +1 -1
  22. package/dist/internal/machine/machine.js +119 -48
  23. package/dist/internal/machine/machine.js.map +1 -1
  24. package/dist/internal/machine/planner.d.ts +7 -0
  25. package/dist/internal/machine/planner.d.ts.map +1 -1
  26. package/dist/internal/machine/planner.js +20 -11
  27. package/dist/internal/machine/planner.js.map +1 -1
  28. package/dist/internal/machine/runtime.d.ts +1 -0
  29. package/dist/internal/machine/runtime.d.ts.map +1 -1
  30. package/dist/internal/machine/runtime.js +25 -16
  31. package/dist/internal/machine/runtime.js.map +1 -1
  32. package/dist/internal/machine/topology.d.ts +11 -0
  33. package/dist/internal/machine/topology.d.ts.map +1 -1
  34. package/dist/internal/machine/topology.js +17 -6
  35. package/dist/internal/machine/topology.js.map +1 -1
  36. package/dist/internal/testing/machine/transitionCoverage.d.ts.map +1 -1
  37. package/dist/internal/testing/machine/transitionCoverage.js +6 -2
  38. package/dist/internal/testing/machine/transitionCoverage.js.map +1 -1
  39. package/dist/internal/testing/machine/verification.d.ts.map +1 -1
  40. package/dist/internal/testing/machine/verification.js +6 -0
  41. package/dist/internal/testing/machine/verification.js.map +1 -1
  42. package/dist/testing/MachineTest.d.ts +2 -1
  43. package/dist/testing/MachineTest.d.ts.map +1 -1
  44. package/dist/testing/MachineTest.js.map +1 -1
  45. package/docs/agent-guide.md +63 -37
  46. package/package.json +1 -1
  47. package/src/Machine.ts +592 -159
  48. package/src/internal/machine/activities.ts +7 -0
  49. package/src/internal/machine/executionPlan.ts +6 -1
  50. package/src/internal/machine/invocation.ts +39 -4
  51. package/src/internal/machine/invocationEvent.ts +16 -0
  52. package/src/internal/machine/machine.ts +160 -47
  53. package/src/internal/machine/planner.ts +17 -3
  54. package/src/internal/machine/runtime.ts +61 -25
  55. package/src/internal/machine/topology.ts +31 -2
  56. package/src/internal/testing/machine/transitionCoverage.ts +6 -2
  57. package/src/internal/testing/machine/verification.ts +11 -0
  58. package/src/testing/MachineTest.ts +2 -0
package/dist/Machine.d.ts CHANGED
@@ -41,7 +41,6 @@ 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;
45
44
  declare const ChildMachineLogicTypeId: typeof internal.ChildMachineLogicTypeId;
46
45
  /**
47
46
  * Type identifier used for the synthetic event passed to startup lifecycle
@@ -1020,9 +1019,9 @@ export declare namespace Inspection {
1020
1019
  readonly sessionId: string;
1021
1020
  readonly owner: Subject;
1022
1021
  readonly ownerPath: string;
1023
- readonly kind: "Effect" | "Timer";
1022
+ readonly kind: "Effect" | "Stream" | "Timer";
1024
1023
  }
1025
- /** Announces an Effect or timer invocation starting. */
1024
+ /** Announces an Effect, Stream, or timer invocation starting. */
1026
1025
  interface ActivityStarted extends Base {
1027
1026
  readonly _tag: "ActivityStarted";
1028
1027
  readonly activity: Activity;
@@ -2014,7 +2013,7 @@ export declare namespace Machine {
2014
2013
  } | {
2015
2014
  readonly type: "invoke";
2016
2015
  readonly id: string;
2017
- readonly outcome: "done" | "failure" | "snapshot";
2016
+ readonly outcome: "element" | "done" | "failure" | "snapshot";
2018
2017
  };
2019
2018
  /** Static topology selected by a transition branch. */
2020
2019
  interface TransitionTargetSelection<Path extends string | undefined = string | undefined, Kind extends Topology.TargetSelectionKind = Topology.TargetSelectionKind, Scope extends Topology.TargetSelectionScope | undefined = Topology.TargetSelectionScope | undefined> {
@@ -2028,14 +2027,11 @@ export declare namespace Machine {
2028
2027
  readonly target: Path | undefined;
2029
2028
  readonly selection: TransitionTargetSelection<Path | undefined>;
2030
2029
  } | {
2031
- readonly type: "case";
2030
+ readonly type: "branch";
2031
+ readonly key: string;
2032
2032
  readonly title: string;
2033
2033
  readonly target: Path | undefined;
2034
2034
  readonly selection: TransitionTargetSelection<Path | undefined>;
2035
- } | {
2036
- readonly type: "otherwise";
2037
- readonly target: Path | undefined;
2038
- readonly selection: TransitionTargetSelection<Path | undefined>;
2039
2035
  };
2040
2036
  /** The statically selected root entry for machine startup. */
2041
2037
  interface InitialDefinition<Path extends string = string> {
@@ -2047,8 +2043,8 @@ export declare namespace Machine {
2047
2043
  *
2048
2044
  * **Details**
2049
2045
  *
2050
- * Every branch exposes its selected target without executing its predicate
2051
- * or resolver. A compound local or branch target covers its descendants;
2046
+ * Every branch exposes its selected target without executing its resolver.
2047
+ * A compound local or branch target covers its descendants;
2052
2048
  * `undefined` identifies an explicitly targetless branch.
2053
2049
  *
2054
2050
  * @category models
@@ -2084,6 +2080,8 @@ export declare namespace Machine {
2084
2080
  readonly reenter: boolean;
2085
2081
  /** Zero-based index of the selected static branch. */
2086
2082
  readonly branchIndex: number;
2083
+ /** Stable key of a named branch, or `undefined` for a direct transition. */
2084
+ readonly branchKey: string | undefined;
2087
2085
  /** Path returned by the handler, including a choice or history pseudo-state. */
2088
2086
  readonly target: TargetPath | undefined;
2089
2087
  /**
@@ -2944,6 +2942,16 @@ export declare namespace Machine {
2944
2942
  readonly target: TargetBuilder<States, StateId>;
2945
2943
  readonly output: Output;
2946
2944
  }
2945
+ /** Context passed to a Stream invocation's element transition. */
2946
+ interface InvokeElementContext<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateIdentifier<States>, Element, InputEvents extends ReadonlyArray<TaggedSchema> = Events, ParentEvents extends ReadonlyArray<TaggedSchema> = readonly []> extends MachineReferences<InputEvents, ParentEvents> {
2947
+ readonly id: string;
2948
+ readonly state: StateByIdentifier<States, StateId>;
2949
+ readonly containingState: ParentStateValue<States, StateId>;
2950
+ readonly ancestors: ParentStateValues<States, StateId>;
2951
+ readonly snapshot: Snapshot<States>;
2952
+ readonly target: TargetBuilder<States, StateId>;
2953
+ readonly element: Element;
2954
+ }
2947
2955
  /** Context passed to an invocation typed-failure transition. */
2948
2956
  interface InvokeFailureContext<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateIdentifier<States>, Error, InputEvents extends ReadonlyArray<TaggedSchema> = Events, ParentEvents extends ReadonlyArray<TaggedSchema> = readonly []> extends MachineReferences<InputEvents, ParentEvents> {
2949
2957
  readonly id: string;
@@ -3136,13 +3144,9 @@ export declare namespace Machine {
3136
3144
  * @category utility types
3137
3145
  * @since 0.4.0
3138
3146
  */
3139
- type EventTransitionReturn<Transition> = (Transition extends {
3147
+ type EventTransitionReturn<Transition> = Transition extends {
3140
3148
  readonly resolve?: infer Resolve;
3141
- } ? NonNullable<Resolve> extends (...args: any) => infer Ret ? Ret : never : never) | (Transition extends {
3142
- readonly cases: infer Cases extends ReadonlyArray<unknown>;
3143
- } ? EventTransitionReturn<Cases[number]> : never) | (Transition extends {
3144
- readonly otherwise: infer Otherwise;
3145
- } ? EventTransitionReturn<Otherwise> : never);
3149
+ } ? NonNullable<Resolve> extends (...args: any) => infer Ret ? Ret : never : never;
3146
3150
  /**
3147
3151
  * Extracts the return value from a state's event handlers.
3148
3152
  *
@@ -3175,6 +3179,8 @@ export declare namespace Machine {
3175
3179
  type InvokeLogic<Invoke> = Invoke extends {
3176
3180
  readonly effect: infer Source;
3177
3181
  } ? InvokeFactoryResult<Source> extends infer Fx extends Effect.Effect<any, any, any> ? Logic<void, never, Effect.Error<Fx>, Effect.Services<Fx>, Effect.Success<Fx>> : never : Invoke extends {
3182
+ readonly stream: infer Source;
3183
+ } ? InvokeFactoryResult<Source> extends infer SourceStream extends Stream.Stream<any, any, any> ? Logic<void, never, Stream.Error<SourceStream>, Stream.Services<SourceStream>, void> : never : Invoke extends {
3178
3184
  readonly after: unknown;
3179
3185
  } ? Logic<void, never, never, never, void> : Invoke extends {
3180
3186
  readonly logic: infer Source;
@@ -3251,6 +3257,8 @@ export declare namespace Machine {
3251
3257
  readonly onDone?: infer Handler;
3252
3258
  } ? EventTransitionReturn<NonNullable<Handler>> : never) | (Invoke extends {
3253
3259
  readonly onFailure?: infer Handler;
3260
+ } ? EventTransitionReturn<NonNullable<Handler>> : never) | (Invoke extends {
3261
+ readonly onElement?: infer Handler;
3254
3262
  } ? EventTransitionReturn<NonNullable<Handler>> : never) | (Invoke extends {
3255
3263
  readonly onSnapshot?: infer Handler;
3256
3264
  } ? EventTransitionReturn<NonNullable<Handler>> : never) : never;
@@ -3302,7 +3310,6 @@ export declare namespace Machine {
3302
3310
  * @since 0.4.0
3303
3311
  */
3304
3312
  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>;
3305
- type TransitionWhenContext<Context> = Omit<Context, "target">;
3306
3313
  /** Type evidence retained by {@link transition} without affecting runtime data. */
3307
3314
  interface TransitionTyped<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateNodeIdentifier<States>, Context, Reenter extends boolean> {
3308
3315
  readonly [TransitionTypeId]: {
@@ -3316,9 +3323,19 @@ export declare namespace Machine {
3316
3323
  };
3317
3324
  }
3318
3325
  /** The only transition value accepted by machine handler APIs. */
3319
- 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) & {
3326
+ 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 | TargetlessTransitionInput<Events, Emits, Context>) & {
3320
3327
  readonly reenter?: [Reenter] extends [true] ? boolean : never;
3321
3328
  };
3329
+ /** Direct shorthand for a non-reentering targetless transition. */
3330
+ interface TargetlessTransitionResolver<Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, Context> {
3331
+ <ResolvedContext extends Omit<Context, "target">>(context: ResolvedContext, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>): undefined;
3332
+ }
3333
+ type TargetlessTransitionInput<Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, Context> = {
3334
+ readonly target: TargetlessSelector;
3335
+ readonly resolve?: TargetlessTransitionResolver<Events, Emits, Context>;
3336
+ readonly branches?: never;
3337
+ readonly reenter?: never;
3338
+ };
3322
3339
  type SelectionBuilder<Selection> = Selection extends TargetSelection<infer Builder, any, any> ? Builder : never;
3323
3340
  type SelectionKind<Selection> = Selection extends TargetSelection<any, any, infer Kind> ? Kind : never;
3324
3341
  type SelectionPath<Selection> = Selection extends TargetSelection<any, infer Path, any> ? Path : never;
@@ -3326,33 +3343,61 @@ export declare namespace Machine {
3326
3343
  readonly from: (...args: any) => infer Result;
3327
3344
  } ? Result : never);
3328
3345
  type SelectedTargetResult<Selection> = SelectionBuilder<Selection> extends infer Builder ? TargetBuilderResult<Builder> : never;
3329
- type TransitionResolveContext<Context, Selection, Match = never> = Omit<Context, "target"> & ([Match] extends [never] ? {} : {
3330
- readonly match: Match;
3331
- }) & (SelectionKind<Selection> extends "none" ? {} : {
3346
+ type TransitionResolveContext<Context, Selection> = Omit<Context, "target"> & (SelectionKind<Selection> extends "none" ? {} : {
3332
3347
  readonly target: SelectionBuilder<Selection>;
3333
3348
  });
3334
- 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;
3349
+ type TransitionResolver<Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, Context, Selection> = (context: TransitionResolveContext<Context, Selection>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => SelectionKind<Selection> extends "none" ? undefined : SelectedTargetResult<Selection> | undefined;
3335
3350
  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>> = {
3336
3351
  readonly target: (to: TargetSelector<States, StateId>) => Selection;
3337
3352
  readonly resolve?: TransitionResolver<Events, Emits, Context, Selection>;
3338
- readonly cases?: never;
3339
- readonly otherwise?: never;
3353
+ readonly branches?: never;
3340
3354
  readonly reenter?: Reenter;
3341
3355
  };
3342
- 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> = {
3343
- readonly title: string;
3344
- readonly when: (context: TransitionWhenContext<Context>) => Option.Option<Match>;
3345
- readonly target: (to: TargetSelector<States, StateId>) => Selection;
3346
- readonly resolve?: TransitionResolver<Events, Emits, Context, Selection, NoInfer<Match>>;
3347
- readonly cases?: never;
3348
- readonly otherwise?: never;
3349
- readonly reenter?: never;
3356
+ /** One named destination declared by a branching transition. */
3357
+ interface TransitionBranchInput<Selection extends TargetSelection<any, any, any> = TargetSelection<any, any, any>> {
3358
+ readonly target: Selection;
3359
+ readonly title?: string;
3360
+ }
3361
+ /** Opaque evidence that a branching resolver selected one declared branch. */
3362
+ interface SelectedBranch<out Key extends string, out Result> {
3363
+ readonly [Topology.SelectedBranchTypeId]: {
3364
+ readonly key: Types.Covariant<Key>;
3365
+ readonly result: Types.Covariant<Result>;
3366
+ };
3367
+ }
3368
+ type SelectedBranchCallable<Callable, Key extends string> = Callable extends {
3369
+ (...args: infer Arguments1): infer Result1;
3370
+ (...args: infer Arguments2): infer Result2;
3371
+ } ? {
3372
+ (...args: Arguments1): SelectedBranch<Key, Result1>;
3373
+ (...args: Arguments2): SelectedBranch<Key, Result2>;
3374
+ } : Callable extends (...args: infer Arguments) => infer Result ? (...args: Arguments) => SelectedBranch<Key, Result> : {};
3375
+ type SelectedBranchBuilderProperties<Builder, Key extends string> = {
3376
+ readonly [Property in keyof Builder]: Builder[Property] extends (...args: any) => any ? SelectedBranchCallable<Builder[Property], Key> : Builder[Property];
3377
+ };
3378
+ /** Target-specific builder that brands every construction with its branch key. */
3379
+ type SelectedBranchBuilder<Builder, Key extends string> = SelectedBranchCallable<Builder, Key> & SelectedBranchBuilderProperties<Builder, Key>;
3380
+ type BranchSelectors<Branches extends Readonly<Record<string, TransitionBranchInput>>> = {
3381
+ readonly [Key in Extract<keyof Branches, string>]: SelectedBranchBuilder<SelectionBuilder<Branches[Key]["target"]>, Key>;
3382
+ };
3383
+ type BranchSelectionResult<Branches extends Readonly<Record<string, TransitionBranchInput>>> = {
3384
+ readonly [Key in Extract<keyof Branches, string>]: SelectedBranch<Key, SelectedTargetResult<Branches[Key]["target"]>>;
3385
+ }[Extract<keyof Branches, string>];
3386
+ type TransitionBranchesResolveContext<Context, Branches extends Readonly<Record<string, TransitionBranchInput>>> = Omit<Context, "target"> & {
3387
+ readonly select: BranchSelectors<Branches>;
3350
3388
  };
3351
- 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>> = {
3389
+ type TransitionBranchesResolver<Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, Context, Branches extends Readonly<Record<string, TransitionBranchInput>>> = (context: TransitionBranchesResolveContext<Context, Branches>, enqueue: Enqueue<EventOf<Events>, EmitOf<Emits>>) => BranchSelectionResult<Branches>;
3390
+ type TransitionBranchesInput<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateNodeIdentifier<States>, Context, Reenter extends boolean, Branches extends Readonly<Record<string, TransitionBranchInput>>> = {
3352
3391
  readonly target?: never;
3353
- readonly resolve?: never;
3354
- readonly cases: (branch: TransitionCaseConstructor<States, Events, Emits, StateId, Context>) => Cases;
3355
- readonly otherwise: TransitionDirectInput<States, Events, Emits, StateId, Context, never, OtherwiseSelection>;
3392
+ /**
3393
+ * Declares every possible destination under a stable semantic key.
3394
+ *
3395
+ * Branches are captured once in ECMAScript property order. Array-index
3396
+ * keys are rejected so reordering ordinary named properties affects only
3397
+ * presentation order; the key remains the testing and inspection identity.
3398
+ */
3399
+ readonly branches: (to: TargetSelector<States, StateId>) => Branches;
3400
+ readonly resolve: TransitionBranchesResolver<Events, Emits, Context, Branches>;
3356
3401
  readonly reenter?: Reenter;
3357
3402
  };
3358
3403
  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>;
@@ -3375,32 +3420,50 @@ export declare namespace Machine {
3375
3420
  type InvokeConfig<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateIdentifier<States>, InputEvents extends ReadonlyArray<TaggedSchema> = Events, ParentEvents extends ReadonlyArray<TaggedSchema> = readonly []> = InvokeOwned<States, Events, Emits, StateId> & ({
3376
3421
  readonly id: string;
3377
3422
  readonly effect: (context: InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => Effect.Effect<any, any, any>;
3423
+ readonly stream?: never;
3378
3424
  readonly after?: never;
3379
3425
  readonly logic?: never;
3380
3426
  readonly child?: never;
3381
3427
  readonly address?: never;
3382
3428
  readonly onDone?: unknown;
3383
3429
  readonly onFailure?: unknown;
3430
+ readonly onElement?: never;
3431
+ readonly onSnapshot?: never;
3432
+ } | {
3433
+ readonly id: string;
3434
+ readonly stream: (context: InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => Stream.Stream<any, any, any>;
3435
+ readonly effect?: never;
3436
+ readonly after?: never;
3437
+ readonly logic?: never;
3438
+ readonly child?: never;
3439
+ readonly address?: never;
3440
+ readonly onElement?: unknown;
3441
+ readonly onDone: unknown;
3442
+ readonly onFailure?: unknown;
3384
3443
  readonly onSnapshot?: never;
3385
3444
  } | {
3386
3445
  readonly id: string;
3387
3446
  readonly after: InvokeSource<Duration.Input, InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>>;
3388
3447
  readonly effect?: never;
3448
+ readonly stream?: never;
3389
3449
  readonly logic?: never;
3390
3450
  readonly child?: never;
3391
3451
  readonly address?: never;
3392
3452
  readonly onDone: unknown;
3393
3453
  readonly onFailure?: never;
3454
+ readonly onElement?: never;
3394
3455
  readonly onSnapshot?: never;
3395
3456
  } | {
3396
3457
  readonly id: string;
3397
3458
  readonly address: string;
3398
3459
  readonly logic: InvokeSource<Logic<any, any, any, any, any, any>, InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>>;
3399
3460
  readonly effect?: never;
3461
+ readonly stream?: never;
3400
3462
  readonly after?: never;
3401
3463
  readonly child?: never;
3402
3464
  readonly onDone?: unknown;
3403
3465
  readonly onFailure?: unknown;
3466
+ readonly onElement?: never;
3404
3467
  readonly onSnapshot?: unknown;
3405
3468
  } | {
3406
3469
  readonly child: ChildMachine.Any;
@@ -3408,10 +3471,12 @@ export declare namespace Machine {
3408
3471
  readonly id?: never;
3409
3472
  readonly address?: never;
3410
3473
  readonly effect?: never;
3474
+ readonly stream?: never;
3411
3475
  readonly after?: never;
3412
3476
  readonly logic?: never;
3413
3477
  readonly onDone?: unknown;
3414
3478
  readonly onFailure?: unknown;
3479
+ readonly onElement?: never;
3415
3480
  readonly onSnapshot?: unknown;
3416
3481
  });
3417
3482
  /** State-bound inline invocation configuration. */
@@ -3438,14 +3503,23 @@ export declare namespace Machine {
3438
3503
  } : {
3439
3504
  readonly onFailure?: never;
3440
3505
  } : never;
3506
+ type InvokeElementRequirement<Value, Handler> = InvokeHandlerRequirement<Value, Handler> extends infer Requirement ? Requirement extends {
3507
+ readonly handler: infer Required;
3508
+ } ? {
3509
+ readonly onElement: Required;
3510
+ } : {
3511
+ readonly onElement?: never;
3512
+ } : never;
3441
3513
  type TimerInvokeArgs<States extends StateSchemas, Events extends ReadonlyArray<TaggedSchema>, Emits extends ReadonlyArray<TaggedSchema>, StateId extends StateIdentifier<States>, InputEvents extends ReadonlyArray<TaggedSchema> = Events, ParentEvents extends ReadonlyArray<TaggedSchema> = readonly []> = {
3442
3514
  readonly id: InvokeLifecycleId;
3443
3515
  readonly after: InvokeSource<Duration.Input, InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>>;
3444
3516
  readonly effect?: never;
3517
+ readonly stream?: never;
3445
3518
  readonly logic?: never;
3446
3519
  readonly child?: never;
3447
3520
  readonly address?: never;
3448
3521
  readonly onFailure?: never;
3522
+ readonly onElement?: never;
3449
3523
  readonly onSnapshot?: never;
3450
3524
  readonly onDone: InvokeTransition<States, Events, Emits, StateId, InvokeDoneContext<States, Events, Emits, StateId, void, InputEvents, ParentEvents>>;
3451
3525
  };
@@ -3454,8 +3528,10 @@ export declare namespace Machine {
3454
3528
  readonly address: Address & ChildAddress.Compatibility<Address, ChildEvent>;
3455
3529
  readonly logic: Source;
3456
3530
  readonly effect?: never;
3531
+ readonly stream?: never;
3457
3532
  readonly after?: never;
3458
3533
  readonly child?: never;
3534
+ readonly onElement?: never;
3459
3535
  readonly onSnapshot?: InvokeTransition<States, Events, Emits, StateId, InvokeSnapshotContext<States, Events, Emits, StateId, NoInfer<ChildState>, NoInfer<ChildError>, NoInfer<ChildOutput>, InputEvents, ParentEvents>>;
3460
3536
  } & 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>>>;
3461
3537
  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 []> = {
@@ -3463,8 +3539,10 @@ export declare namespace Machine {
3463
3539
  readonly id?: never;
3464
3540
  readonly address?: never;
3465
3541
  readonly effect?: never;
3542
+ readonly stream?: never;
3466
3543
  readonly after?: never;
3467
3544
  readonly logic?: never;
3545
+ readonly onElement?: never;
3468
3546
  readonly onSnapshot?: InvokeTransition<States, Events, Emits, StateId, InvokeSnapshotContext<States, Events, Emits, StateId, Snapshot<Machine.States<ChildDefinition>>, Error<ChildDefinition>, Output<ChildDefinition>, InputEvents, ParentEvents>>;
3469
3547
  } & (Input<ChildDefinition> extends typeof Schema.Void ? {
3470
3548
  readonly input?: never;
@@ -3489,6 +3567,12 @@ export declare namespace Machine {
3489
3567
  readonly effect: infer Source;
3490
3568
  } ? 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>>> & {
3491
3569
  readonly onSnapshot?: never;
3570
+ } : never : Raw extends {
3571
+ readonly stream: infer Source;
3572
+ } ? InvokeFactoryResult<Source> extends infer SourceStream extends Stream.Stream<any, any, any> ? InvokeElementRequirement<Stream.Success<SourceStream>, InvokeTransition<States, Events, Emits, StateId, InvokeElementContext<States, Events, Emits, StateId, Stream.Success<SourceStream>, InputEvents, ParentEvents>>> & {
3573
+ readonly onDone: InvokeTransition<States, Events, Emits, StateId, InvokeDoneContext<States, Events, Emits, StateId, void, InputEvents, ParentEvents>>;
3574
+ } & InvokeFailureRequirement<Stream.Error<SourceStream>, InvokeTransition<States, Events, Emits, StateId, InvokeFailureContext<States, Events, Emits, StateId, Stream.Error<SourceStream>, InputEvents, ParentEvents>>> & {
3575
+ readonly onSnapshot?: never;
3492
3576
  } : never : Raw extends {
3493
3577
  readonly after: unknown;
3494
3578
  } ? {
@@ -3739,7 +3823,7 @@ export declare namespace Machine {
3739
3823
  readonly [Key in UnknownKeys]: HandlerValidationError<"Handler config contains an event key that does not exist", StateId, Key>;
3740
3824
  };
3741
3825
  } : unknown;
3742
- 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 {
3826
+ type TransitionResultInitialTargetPath<Result> = IsAny<Result> extends true ? never : Result extends Effect.Effect<infer Success, any, any> ? TransitionResultInitialTargetPath<Success> : Result extends SelectedBranch<any, infer Selected> ? TransitionResultInitialTargetPath<Selected> : Result extends StateConstruction<infer Constructed> ? TransitionResultInitialTargetPath<Constructed> : Result extends {
3743
3827
  readonly [Topology.InitialTargetTypeId]: typeof Topology.InitialTargetTypeId;
3744
3828
  readonly _tag: "InitialTarget";
3745
3829
  } ? Result extends {
@@ -4243,69 +4327,73 @@ export declare const decodeSnapshot: <const States extends Machine.StateSchemas,
4243
4327
  type EffectInvokeSource<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>> = {
4244
4328
  readonly id: InvokeLifecycleId;
4245
4329
  readonly effect: Source;
4330
+ readonly stream?: never;
4246
4331
  readonly after?: never;
4247
4332
  readonly logic?: never;
4248
4333
  readonly child?: never;
4249
4334
  readonly address?: never;
4335
+ readonly onElement?: never;
4250
4336
  readonly onSnapshot?: never;
4251
4337
  };
4252
4338
  type EffectDoneHandler<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>>;
4253
4339
  type EffectFailureHandler<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>>;
4254
4340
  type EffectInvokeResult<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>;
4341
+ type StreamInvokeSource<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<any>) => unknown> = {
4342
+ readonly id: InvokeLifecycleId;
4343
+ readonly stream: Source & ((context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => unknown);
4344
+ readonly effect?: never;
4345
+ readonly after?: never;
4346
+ readonly logic?: never;
4347
+ readonly child?: never;
4348
+ readonly address?: never;
4349
+ readonly onSnapshot?: never;
4350
+ };
4351
+ type StreamSourceResult<Source extends (...args: ReadonlyArray<any>) => unknown> = ReturnType<Source> extends infer Result extends Stream.Stream<any, any, any> ? Result : never;
4352
+ type StreamElementHandler<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<any>) => unknown> = Machine.InvokeTransition<States, Events, Emits, StateId, Machine.InvokeElementContext<States, Events, Emits, StateId, Stream.Success<StreamSourceResult<NoInfer<Source>>>, InputEvents, ParentEvents>>;
4353
+ type StreamDoneHandler<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>> = Machine.InvokeTransition<States, Events, Emits, StateId, Machine.InvokeDoneContext<States, Events, Emits, StateId, void, InputEvents, ParentEvents>>;
4354
+ type StreamFailureHandler<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<any>) => unknown> = Machine.InvokeTransition<States, Events, Emits, StateId, Machine.InvokeFailureContext<States, Events, Emits, StateId, Stream.Error<StreamSourceResult<NoInfer<Source>>>, InputEvents, ParentEvents>>;
4355
+ type StreamInvokeResult<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<any>) => unknown> = Machine.InvokeConfig<States, Events, Emits, StateId, InputEvents, ParentEvents> & Machine.InvokeTyped<void, Stream.Error<StreamSourceResult<Source>>, Stream.Services<StreamSourceResult<Source>>, never>;
4255
4356
  type InvokeChannelIsNever<Value> = IsAny<Value> extends true ? false : [Value] extends [never] ? true : false;
4256
4357
  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>> = {
4257
4358
  readonly id: InvokeLifecycleId;
4258
4359
  readonly effect: Source;
4360
+ readonly stream?: never;
4259
4361
  readonly after?: never;
4260
4362
  readonly logic?: never;
4261
4363
  readonly child?: never;
4262
4364
  readonly address?: never;
4365
+ readonly onElement?: never;
4263
4366
  readonly onSnapshot?: never;
4264
4367
  };
4265
4368
  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>>;
4266
4369
  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>>;
4267
4370
  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>;
4268
- /** Type evidence retained for a case created by a conditional transition's local builder. */
4269
- interface TransitionCaseTyped {
4270
- readonly [TransitionCaseTypeId]: true;
4271
- }
4272
- /** Locally bound constructor that preserves each conditional transition case independently. */
4273
- interface TransitionCaseConstructor<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateNodeIdentifier<States>, Context> {
4274
- <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;
4275
- }
4276
- /**
4277
- * Captures one exact transition topology while preserving handler inference.
4278
- *
4279
- * @category constructors
4280
- * @since 0.14.0
4281
- */
4282
- 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 [
4283
- TransitionCaseTyped,
4284
- ...ReadonlyArray<TransitionCaseTyped>
4285
- ], OtherwiseSelection extends Machine.TargetSelection<any, any, any>> = Omit<Machine.TransitionConditionalInput<States, Events, Emits, StateId, Context, Reenter, Cases, OtherwiseSelection>, "cases"> & {
4286
- readonly cases: Cases;
4287
- } & Machine.TransitionTyped<States, Events, Emits, StateId, Context, Reenter>;
4371
+ /** Captures one exact named-branch topology while preserving handler inference. */
4372
+ type BranchingTransitionResult<States extends Machine.StateSchemas, Events extends ReadonlyArray<Machine.TaggedSchema>, Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateNodeIdentifier<States>, Context, Reenter extends boolean, Branches extends Readonly<Record<string, Machine.TransitionBranchInput>>> = Machine.TransitionBranchesInput<States, Events, Emits, StateId, Context, Reenter, Branches> & Machine.TransitionTyped<States, Events, Emits, StateId, Context, Reenter>;
4373
+ type TransitionBranchRecordError<Message extends string, Key extends PropertyKey = never> = {
4374
+ readonly "~effect/Machine/TransitionBranchRecordError": Message;
4375
+ readonly key: Key;
4376
+ };
4377
+ type InvalidStaticTransitionBranchKey<Branches> = Extract<keyof Branches, "" | number | symbol>;
4378
+ type ValidateTransitionBranchRecord<Branches> = [keyof Branches] extends [never] ? TransitionBranchRecordError<"Branch records must contain at least one branch"> : [InvalidStaticTransitionBranchKey<Branches>] extends [never] ? unknown : TransitionBranchRecordError<"Branch keys must be non-empty, non-index strings", InvalidStaticTransitionBranchKey<Branches>>;
4288
4379
  /**
4289
- * Contextually types direct and conditional transition definitions.
4380
+ * Contextually types direct and branching transition definitions.
4290
4381
  *
4291
4382
  * @category constructors
4292
4383
  * @since 0.14.0
4293
4384
  */
4294
4385
  export interface TransitionConstructor {
4295
4386
  <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>);
4296
- <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 [
4297
- TransitionCaseTyped,
4298
- ...ReadonlyArray<TransitionCaseTyped>
4299
- ], 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>;
4387
+ <const States extends Machine.StateSchemas, const Events extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateNodeIdentifier<States>, Context, const Branches extends Readonly<Record<string, Machine.TransitionBranchInput>>, Reenter extends boolean = never>(config: Machine.TransitionBranchesInput<States, Events, Emits, StateId, Context, Reenter, Branches> & ValidateTransitionBranchRecord<NoInfer<Branches>>): BranchingTransitionResult<States, Events, Emits, StateId, Context, Reenter, Branches>;
4300
4388
  }
4301
4389
  /**
4302
4390
  * Defines a statically inspectable transition.
4303
4391
  *
4304
4392
  * It is required for every event, lifecycle, choice, and invocation transition
4305
4393
  * so the destination selected by `target` can contextually type the
4306
- * corresponding resolver. Conditional transitions use the locally bound
4307
- * `branch` constructor so every case independently infers its matched value and
4308
- * selected destination, with no limit on the number of cases.
4394
+ * corresponding resolver. Branching transitions declare every possible
4395
+ * destination up front, then select one through ordinary TypeScript control
4396
+ * flow in `resolve`.
4309
4397
  *
4310
4398
  * ```ts
4311
4399
  * Machine.transition({
@@ -4314,18 +4402,13 @@ export interface TransitionConstructor {
4314
4402
  * })
4315
4403
  *
4316
4404
  * Machine.transition({
4317
- * cases: (branch) => [
4318
- * branch({
4319
- * title: "has cached data",
4320
- * when: ({ event }) => event.cached,
4321
- * target: (to) => to.full.Ready(),
4322
- * resolve: ({ match, target }) => target.from({ data: match })
4323
- * })
4324
- * ],
4325
- * otherwise: {
4326
- * target: (to) => to.full.Loading(),
4327
- * resolve: ({ target }) => target.from()
4328
- * }
4405
+ * branches: (to) => ({
4406
+ * cached: { target: to.full.Ready() },
4407
+ * loading: { target: to.full.Loading() }
4408
+ * }),
4409
+ * resolve: ({ event, select }) => event.cached
4410
+ * ? select.cached.from({ data: event.cached })
4411
+ * : select.loading.from()
4329
4412
  * })
4330
4413
  * ```
4331
4414
  *
@@ -4333,6 +4416,39 @@ export interface TransitionConstructor {
4333
4416
  * @since 0.14.0
4334
4417
  */
4335
4418
  export declare const transition: TransitionConstructor;
4419
+ /**
4420
+ * Sentinel used by direct targetless transition shorthands.
4421
+ *
4422
+ * This is the concise form of `target: (to) => to.none()`.
4423
+ *
4424
+ * ```ts
4425
+ * onElement: {
4426
+ * target: Machine.targetless,
4427
+ * resolve: ({ element }, enqueue) => {
4428
+ * enqueue.raise(new MeasurementReceived({ value: element }))
4429
+ * }
4430
+ * }
4431
+ *
4432
+ * onDone: { target: Machine.targetless }
4433
+ * ```
4434
+ *
4435
+ * @category constructors
4436
+ * @since 0.16.0
4437
+ */
4438
+ export interface TargetlessSelector {
4439
+ readonly "~effect/Machine/TargetlessSelector": true;
4440
+ <const States extends Machine.StateSchemas, StateId extends Machine.StateNodeIdentifier<States>>(to: Machine.TargetSelector<States, StateId>): ReturnType<Machine.TargetSelector<States, StateId>["none"]>;
4441
+ }
4442
+ /**
4443
+ * Selects no transition target while keeping enqueue operations explicit.
4444
+ *
4445
+ * Use as the `target` of a direct handler object when the handler should keep
4446
+ * the current state configuration and only raise, emit, or send events.
4447
+ *
4448
+ * @category constructors
4449
+ * @since 0.16.0
4450
+ */
4451
+ export declare const targetless: TargetlessSelector;
4336
4452
  /**
4337
4453
  * Machine-bound invocation constructor that preserves the owning machine's
4338
4454
  * public input and parent protocols in every invocation callback.
@@ -4365,6 +4481,32 @@ export interface Invoker<States extends Machine.StateSchemas, Events extends Rea
4365
4481
  readonly onDone?: never;
4366
4482
  readonly onFailure?: never;
4367
4483
  }): BoundEffectInvokeResult<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4484
+ <StateId extends Machine.StateIdentifier<States>, const Source extends (context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => Stream.Stream<unknown, unknown, any>>(config: StreamInvokeSource<States, Events, Emits, InputEvents, ParentEvents, StateId, Source> & {
4485
+ readonly onElement: StreamElementHandler<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4486
+ readonly onDone: StreamDoneHandler<States, Events, Emits, InputEvents, ParentEvents, StateId>;
4487
+ readonly onFailure: StreamFailureHandler<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4488
+ }, ..._validation: InvokeChannelIsNever<Stream.Success<ReturnType<Source>>> extends true ? [
4489
+ "onElement must be omitted when the Stream element is never"
4490
+ ] : InvokeChannelIsNever<Stream.Error<ReturnType<Source>>> extends true ? [
4491
+ "onFailure must be omitted when the Stream error is never"
4492
+ ] : []): StreamInvokeResult<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4493
+ <StateId extends Machine.StateIdentifier<States>, const Source extends (context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => Stream.Stream<never, unknown, any>>(config: StreamInvokeSource<States, Events, Emits, InputEvents, ParentEvents, StateId, Source> & {
4494
+ readonly onElement?: never;
4495
+ readonly onDone: StreamDoneHandler<States, Events, Emits, InputEvents, ParentEvents, StateId>;
4496
+ readonly onFailure: StreamFailureHandler<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4497
+ }, ..._validation: InvokeChannelIsNever<Stream.Error<ReturnType<Source>>> extends true ? [
4498
+ "onFailure must be omitted when the Stream error is never"
4499
+ ] : []): StreamInvokeResult<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4500
+ <StateId extends Machine.StateIdentifier<States>, const Source extends (context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => Stream.Stream<never, never, any>>(config: StreamInvokeSource<States, Events, Emits, InputEvents, ParentEvents, StateId, Source> & {
4501
+ readonly onElement?: never;
4502
+ readonly onDone: StreamDoneHandler<States, Events, Emits, InputEvents, ParentEvents, StateId>;
4503
+ readonly onFailure?: never;
4504
+ }): StreamInvokeResult<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4505
+ <StateId extends Machine.StateIdentifier<States>, const Source extends (context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => Stream.Stream<unknown, never, any>>(config: StreamInvokeSource<States, Events, Emits, InputEvents, ParentEvents, StateId, Source> & {
4506
+ readonly onElement: StreamElementHandler<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4507
+ readonly onDone: StreamDoneHandler<States, Events, Emits, InputEvents, ParentEvents, StateId>;
4508
+ readonly onFailure?: never;
4509
+ }): StreamInvokeResult<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4368
4510
  <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>;
4369
4511
  <StateId extends Machine.StateIdentifier<States>, const Source extends (context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => unknown, Address extends ChildAddress<never>>(config: {
4370
4512
  readonly logic: Source;
@@ -4387,15 +4529,18 @@ export interface Invoker<States extends Machine.StateSchemas, Events extends Rea
4387
4529
  /**
4388
4530
  * Preserves inference for a state-owned invocation configuration.
4389
4531
  *
4390
- * Use `effect` for one-shot work, `after` for a cancellable timer, `logic` for
4391
- * reusable process logic, or `child` for a complete child machine. `onDone` is
4392
- * required whenever the source can complete with an output, while `onFailure`
4393
- * is required only when the source has a typed failure channel.
4532
+ * Use `effect` for one-shot work, `stream` for repeated values, `after` for a
4533
+ * cancellable timer, `logic` for reusable process logic, or `child` for a
4534
+ * complete child machine. Stream elements are handled by `onElement` before
4535
+ * the next element is pulled. `onDone` is required whenever the source can
4536
+ * complete, while `onFailure` is required only when the source has a typed
4537
+ * failure channel.
4394
4538
  *
4395
4539
  * This constructor is an identity at runtime, but preserves lifecycle callback
4396
- * inference through published declarations. Effect factories run when their
4397
- * owning state is entered and infer the owner context, output, error, and
4398
- * service channels together without a return annotation. Durations may be
4540
+ * inference through published declarations. Effect and Stream factories run
4541
+ * when their owning state is entered and infer the owner context, value,
4542
+ * output, error, and service channels together without a return annotation.
4543
+ * Durations may be
4399
4544
  * supplied directly or derived from the owning state's entry context. Logic
4400
4545
  * invocations require both a lifecycle `id` and a typed communication
4401
4546
  * `address`. Child descriptors already own their identity, so `id` and
@@ -4453,6 +4598,32 @@ export declare const invoke: {
4453
4598
  readonly onDone?: never;
4454
4599
  readonly onFailure?: never;
4455
4600
  }): EffectInvokeResult<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4601
+ <const States extends Machine.StateSchemas, const Events extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, const Source extends (context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => Stream.Stream<unknown, unknown, any>, const InputEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const ParentEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly []>(config: StreamInvokeSource<States, Events, Emits, InputEvents, ParentEvents, StateId, Source> & {
4602
+ readonly onElement: StreamElementHandler<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4603
+ readonly onDone: StreamDoneHandler<States, Events, Emits, InputEvents, ParentEvents, StateId>;
4604
+ readonly onFailure: StreamFailureHandler<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4605
+ }, ..._validation: InvokeChannelIsNever<Stream.Success<ReturnType<Source>>> extends true ? [
4606
+ "onElement must be omitted when the Stream element is never"
4607
+ ] : InvokeChannelIsNever<Stream.Error<ReturnType<Source>>> extends true ? [
4608
+ "onFailure must be omitted when the Stream error is never"
4609
+ ] : []): StreamInvokeResult<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4610
+ <const States extends Machine.StateSchemas, const Events extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, const Source extends (context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => Stream.Stream<never, unknown, any>, const InputEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const ParentEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly []>(config: StreamInvokeSource<States, Events, Emits, InputEvents, ParentEvents, StateId, Source> & {
4611
+ readonly onElement?: never;
4612
+ readonly onDone: StreamDoneHandler<States, Events, Emits, InputEvents, ParentEvents, StateId>;
4613
+ readonly onFailure: StreamFailureHandler<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4614
+ }, ..._validation: InvokeChannelIsNever<Stream.Error<ReturnType<Source>>> extends true ? [
4615
+ "onFailure must be omitted when the Stream error is never"
4616
+ ] : []): StreamInvokeResult<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4617
+ <const States extends Machine.StateSchemas, const Events extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, const Source extends (context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => Stream.Stream<never, never, any>, const InputEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const ParentEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly []>(config: StreamInvokeSource<States, Events, Emits, InputEvents, ParentEvents, StateId, Source> & {
4618
+ readonly onElement?: never;
4619
+ readonly onDone: StreamDoneHandler<States, Events, Emits, InputEvents, ParentEvents, StateId>;
4620
+ readonly onFailure?: never;
4621
+ }): StreamInvokeResult<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4622
+ <const States extends Machine.StateSchemas, const Events extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, const Source extends (context: Machine.InvokeContext<States, Events, Emits, StateId, InputEvents, ParentEvents>) => Stream.Stream<unknown, never, any>, const InputEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const ParentEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly []>(config: StreamInvokeSource<States, Events, Emits, InputEvents, ParentEvents, StateId, Source> & {
4623
+ readonly onElement: StreamElementHandler<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4624
+ readonly onDone: StreamDoneHandler<States, Events, Emits, InputEvents, ParentEvents, StateId>;
4625
+ readonly onFailure?: never;
4626
+ }): StreamInvokeResult<States, Events, Emits, InputEvents, ParentEvents, StateId, Source>;
4456
4627
  <const States extends Machine.StateSchemas, const Events extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, const Config extends object, const InputEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const ParentEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly []>(config: Config & Machine.TimerInvokeArgs<States, Events, Emits, StateId, InputEvents, ParentEvents>): Config & Machine.InvokeOwned<States, Events, Emits, StateId> & Machine.InvokeTyped<void, never, never, never>;
4457
4628
  <const States extends Machine.StateSchemas, const Events extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, ChildState, ChildEvent, ChildError, ChildRequirements, ChildOutput, ChildInitialError, Address extends ChildAddress<never>, const InputEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const ParentEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly []>(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>;
4458
4629
  <const States extends Machine.StateSchemas, const Events extends ReadonlyArray<Machine.TaggedSchema>, const Emits extends ReadonlyArray<Machine.TaggedSchema>, StateId extends Machine.StateIdentifier<States>, ChildState, ChildEvent, ChildError, ChildRequirements, ChildOutput, ChildInitialError, Address extends ChildAddress<never>, const Config extends object, const InputEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly [], const ParentEvents extends ReadonlyArray<Machine.TaggedSchema> = readonly []>(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>;
@@ -4558,9 +4729,8 @@ export declare const initialDefinition: <M extends Machine.Any>(machine: M) => M
4558
4729
  *
4559
4730
  * Event handlers retain their handler-key order within each source state and
4560
4731
  * are followed by eventless and completion handlers. This function does not
4561
- * execute predicates or resolvers. Every direct, conditional, fallback, and
4562
- * targetless branch exposes the destination selected by its required static
4563
- * `target` declaration.
4732
+ * execute resolvers. Every direct, named, and targetless branch exposes the
4733
+ * destination selected by its required static `target` declaration.
4564
4734
  *
4565
4735
  * @category getters
4566
4736
  * @since 0.4.0