@typeonce/effect-machine 0.31.1 → 0.32.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 (151) hide show
  1. package/README.md +145 -140
  2. package/dist/Machine.d.ts +428 -254
  3. package/dist/Machine.d.ts.map +1 -1
  4. package/dist/Machine.js +91 -111
  5. package/dist/Machine.js.map +1 -1
  6. package/dist/internal/machine/atom.d.ts +3 -4
  7. package/dist/internal/machine/atom.d.ts.map +1 -1
  8. package/dist/internal/machine/atom.js +0 -2
  9. package/dist/internal/machine/atom.js.map +1 -1
  10. package/dist/internal/machine/childRegistry.d.ts +52 -0
  11. package/dist/internal/machine/childRegistry.d.ts.map +1 -0
  12. package/dist/internal/machine/childRegistry.js +74 -0
  13. package/dist/internal/machine/childRegistry.js.map +1 -0
  14. package/dist/internal/machine/cluster.d.ts +2 -3
  15. package/dist/internal/machine/cluster.d.ts.map +1 -1
  16. package/dist/internal/machine/cluster.js.map +1 -1
  17. package/dist/internal/machine/configuration.d.ts.map +1 -1
  18. package/dist/internal/machine/configuration.js +14 -4
  19. package/dist/internal/machine/configuration.js.map +1 -1
  20. package/dist/internal/machine/executionPlan.d.ts +1 -0
  21. package/dist/internal/machine/executionPlan.d.ts.map +1 -1
  22. package/dist/internal/machine/executionPlan.js +97 -53
  23. package/dist/internal/machine/executionPlan.js.map +1 -1
  24. package/dist/internal/machine/invocation.d.ts.map +1 -1
  25. package/dist/internal/machine/invocation.js +4 -2
  26. package/dist/internal/machine/invocation.js.map +1 -1
  27. package/dist/internal/machine/invocationDefinition.d.ts +35 -0
  28. package/dist/internal/machine/invocationDefinition.d.ts.map +1 -0
  29. package/dist/internal/machine/invocationDefinition.js +21 -0
  30. package/dist/internal/machine/invocationDefinition.js.map +1 -0
  31. package/dist/internal/machine/invocationEvent.d.ts +0 -2
  32. package/dist/internal/machine/invocationEvent.d.ts.map +1 -1
  33. package/dist/internal/machine/invocationEvent.js +0 -8
  34. package/dist/internal/machine/invocationEvent.js.map +1 -1
  35. package/dist/internal/machine/machine.d.ts +21 -43
  36. package/dist/internal/machine/machine.d.ts.map +1 -1
  37. package/dist/internal/machine/machine.js +98 -374
  38. package/dist/internal/machine/machine.js.map +1 -1
  39. package/dist/internal/machine/planner.d.ts +13 -19
  40. package/dist/internal/machine/planner.d.ts.map +1 -1
  41. package/dist/internal/machine/planner.js +71 -39
  42. package/dist/internal/machine/planner.js.map +1 -1
  43. package/dist/internal/machine/process.d.ts +6 -8
  44. package/dist/internal/machine/process.d.ts.map +1 -1
  45. package/dist/internal/machine/process.js +1 -0
  46. package/dist/internal/machine/process.js.map +1 -1
  47. package/dist/internal/machine/protocol.d.ts +2 -2
  48. package/dist/internal/machine/protocol.d.ts.map +1 -1
  49. package/dist/internal/machine/protocol.js +4 -18
  50. package/dist/internal/machine/protocol.js.map +1 -1
  51. package/dist/internal/machine/readiness.d.ts +1 -1
  52. package/dist/internal/machine/readiness.d.ts.map +1 -1
  53. package/dist/internal/machine/requirements.d.ts +4 -0
  54. package/dist/internal/machine/requirements.d.ts.map +1 -0
  55. package/dist/internal/machine/requirements.js +2 -0
  56. package/dist/internal/machine/requirements.js.map +1 -0
  57. package/dist/internal/machine/runtime.d.ts +4 -58
  58. package/dist/internal/machine/runtime.d.ts.map +1 -1
  59. package/dist/internal/machine/runtime.js +1 -69
  60. package/dist/internal/machine/runtime.js.map +1 -1
  61. package/dist/internal/machine/serialization.d.ts.map +1 -1
  62. package/dist/internal/machine/serialization.js +16 -0
  63. package/dist/internal/machine/serialization.js.map +1 -1
  64. package/dist/internal/machine/stateDefinition.d.ts +3 -1
  65. package/dist/internal/machine/stateDefinition.d.ts.map +1 -1
  66. package/dist/internal/machine/stateDefinition.js +36 -2
  67. package/dist/internal/machine/stateDefinition.js.map +1 -1
  68. package/dist/internal/machine/targetBuilder.d.ts +16 -0
  69. package/dist/internal/machine/targetBuilder.d.ts.map +1 -0
  70. package/dist/internal/machine/targetBuilder.js +333 -0
  71. package/dist/internal/machine/targetBuilder.js.map +1 -0
  72. package/dist/internal/machine/topology.js +3 -3
  73. package/dist/internal/machine/topology.js.map +1 -1
  74. package/dist/internal/machine/transition.d.ts +16 -0
  75. package/dist/internal/machine/transition.d.ts.map +1 -0
  76. package/dist/internal/machine/transition.js +2 -0
  77. package/dist/internal/machine/transition.js.map +1 -0
  78. package/dist/internal/testing/machine/finiteModel.d.ts.map +1 -1
  79. package/dist/internal/testing/machine/finiteModel.js +10 -12
  80. package/dist/internal/testing/machine/finiteModel.js.map +1 -1
  81. package/dist/internal/testing/machine/format.d.ts +7 -0
  82. package/dist/internal/testing/machine/format.d.ts.map +1 -0
  83. package/dist/internal/testing/machine/format.js +104 -0
  84. package/dist/internal/testing/machine/format.js.map +1 -0
  85. package/dist/internal/testing/machine/probe.d.ts +1 -1
  86. package/dist/internal/testing/machine/probe.d.ts.map +1 -1
  87. package/dist/internal/testing/machine/probe.js +1 -1
  88. package/dist/internal/testing/machine/probe.js.map +1 -1
  89. package/dist/internal/testing/machine/referenceModel.d.ts.map +1 -1
  90. package/dist/internal/testing/machine/referenceModel.js +15 -19
  91. package/dist/internal/testing/machine/referenceModel.js.map +1 -1
  92. package/dist/internal/testing/machine/trace.d.ts +1 -1
  93. package/dist/internal/testing/machine/trace.d.ts.map +1 -1
  94. package/dist/internal/testing/machine/trace.js +3 -3
  95. package/dist/internal/testing/machine/trace.js.map +1 -1
  96. package/dist/internal/testing/machine/value.d.ts +8 -0
  97. package/dist/internal/testing/machine/value.d.ts.map +1 -0
  98. package/dist/internal/testing/machine/value.js +82 -0
  99. package/dist/internal/testing/machine/value.js.map +1 -0
  100. package/dist/internal/testing/machine/verification.d.ts +2 -13
  101. package/dist/internal/testing/machine/verification.d.ts.map +1 -1
  102. package/dist/internal/testing/machine/verification.js +21 -113
  103. package/dist/internal/testing/machine/verification.js.map +1 -1
  104. package/dist/testing/MachineTest.d.ts +89 -104
  105. package/dist/testing/MachineTest.d.ts.map +1 -1
  106. package/dist/testing/MachineTest.js +70 -84
  107. package/dist/testing/MachineTest.js.map +1 -1
  108. package/dist/unstable/cluster/ClusterMachine.d.ts +10 -13
  109. package/dist/unstable/cluster/ClusterMachine.d.ts.map +1 -1
  110. package/dist/unstable/cluster/ClusterMachine.js +5 -8
  111. package/dist/unstable/cluster/ClusterMachine.js.map +1 -1
  112. package/dist/unstable/reactivity/AtomMachine.d.ts +26 -61
  113. package/dist/unstable/reactivity/AtomMachine.d.ts.map +1 -1
  114. package/dist/unstable/reactivity/AtomMachine.js +17 -26
  115. package/dist/unstable/reactivity/AtomMachine.js.map +1 -1
  116. package/docs/agent-guide.md +45 -45
  117. package/docs/effect-atom-react.md +35 -63
  118. package/docs/machine-review.md +7 -7
  119. package/docs/root-api.md +214 -0
  120. package/package.json +1 -1
  121. package/src/Machine.ts +778 -437
  122. package/src/internal/machine/atom.ts +3 -13
  123. package/src/internal/machine/childRegistry.ts +141 -0
  124. package/src/internal/machine/cluster.ts +5 -14
  125. package/src/internal/machine/configuration.ts +20 -4
  126. package/src/internal/machine/executionPlan.ts +109 -52
  127. package/src/internal/machine/invocation.ts +10 -6
  128. package/src/internal/machine/invocationDefinition.ts +52 -0
  129. package/src/internal/machine/invocationEvent.ts +0 -8
  130. package/src/internal/machine/machine.ts +154 -679
  131. package/src/internal/machine/planner.ts +82 -66
  132. package/src/internal/machine/process.ts +14 -21
  133. package/src/internal/machine/protocol.ts +9 -32
  134. package/src/internal/machine/readiness.ts +1 -0
  135. package/src/internal/machine/requirements.ts +11 -0
  136. package/src/internal/machine/runtime.ts +17 -186
  137. package/src/internal/machine/serialization.ts +22 -0
  138. package/src/internal/machine/stateDefinition.ts +36 -3
  139. package/src/internal/machine/targetBuilder.ts +525 -0
  140. package/src/internal/machine/topology.ts +3 -3
  141. package/src/internal/machine/transition.ts +26 -0
  142. package/src/internal/testing/machine/finiteModel.ts +22 -23
  143. package/src/internal/testing/machine/format.ts +120 -0
  144. package/src/internal/testing/machine/probe.ts +4 -4
  145. package/src/internal/testing/machine/referenceModel.ts +25 -17
  146. package/src/internal/testing/machine/trace.ts +4 -4
  147. package/src/internal/testing/machine/value.ts +77 -0
  148. package/src/internal/testing/machine/verification.ts +904 -1109
  149. package/src/testing/MachineTest.ts +103 -114
  150. package/src/unstable/cluster/ClusterMachine.ts +10 -20
  151. package/src/unstable/reactivity/AtomMachine.ts +42 -79
@@ -13,6 +13,10 @@ import type { AsyncResult, Atom, AtomRegistry } from "effect/unstable/reactivity
13
13
  import * as internal from "../../internal/machine/atom.js"
14
14
  import type { ChildNotActiveError, NotReadyError } from "../../internal/machine/atom.js"
15
15
  import type { EnsureExecutable } from "../../internal/machine/readiness.js"
16
+ import type {
17
+ ExcludeCompatibleRuntime as ExcludeCompatibleMachineRuntime,
18
+ IsAny
19
+ } from "../../internal/machine/requirements.js"
16
20
  import type * as Machine from "../../Machine.js"
17
21
 
18
22
  /**
@@ -41,15 +45,6 @@ type EnsureNoExternalRequirements<Requirements> = [ExternalRequirements<Requirem
41
45
  readonly [ExternalRequirementsTypeId]: ExternalRequirements<Requirements>
42
46
  }
43
47
 
44
- type IsAny<A> = 0 extends (1 & A) ? true : false
45
-
46
- type ExcludeCompatibleMachineRuntime<Requirements, Events, Emits> = Requirements extends
47
- Machine.Runtime.Requirement<infer RequiredEvents, infer RequiredEmits> ?
48
- IsAny<Requirements> extends true ? Requirements
49
- : [RequiredEvents] extends [Events] ? [RequiredEmits] extends [Emits] ? never : Requirements
50
- : Requirements
51
- : Requirements
52
-
53
48
  type MachineRequirements<InitialR, R, Events, Emits> = ExcludeCompatibleMachineRuntime<
54
49
  Machine.ExecutionServices<InitialR | R>,
55
50
  Events,
@@ -110,17 +105,6 @@ export interface MachineAtom<State, Event, Error = never, Output = never, StartE
110
105
  AsyncResult.AsyncResult<Machine.RuntimeSnapshot<State, Error, Output>, StartError>
111
106
  >
112
107
 
113
- /**
114
- * Atom containing the state value from the latest runtime snapshot.
115
- *
116
- * This preserves the historical behavior of exposing a state even when the
117
- * runtime snapshot reports a terminal error. Use `result` when runtime
118
- * failures must be represented in the atom failure channel.
119
- *
120
- * @since 0.4.0
121
- */
122
- readonly state: Atom.Atom<AsyncResult.AsyncResult<State, StartError>>
123
-
124
108
  /**
125
109
  * Atom containing the current state, with startup and runtime failures in
126
110
  * one typed failure channel.
@@ -251,17 +235,7 @@ export interface ChildMachineAtom<Child extends Machine.ChildMachine.Any, StartE
251
235
  StartError
252
236
  >
253
237
  >
254
- /**
255
- * Atom containing the current child state when active.
256
- *
257
- * Runtime failures retain the last successful state. Use `result` when they
258
- * must be represented in the atom failure channel.
259
- *
260
- * @since 0.4.0
261
- */
262
- readonly state: Atom.Atom<
263
- AsyncResult.AsyncResult<Option.Option<RefState<Machine.ChildMachine.Ref<Child>>>, StartError>
264
- >
238
+
265
239
  /**
266
240
  * Atom containing the current child state when active, with startup and
267
241
  * runtime failures in one typed failure channel.
@@ -324,16 +298,8 @@ export type ChildOf<
324
298
  Child extends Machine.ChildMachine.Any
325
299
  > = ChildMachineAtom<Child, BridgeStartError<Parent>>
326
300
 
327
- type SnapshotNode<State> = State extends Machine.Machine.AtomicSnapshot<string, unknown> ?
328
- | State
329
- | (State extends { readonly state: infer Child } ? SnapshotNode<Child>
330
- : State extends { readonly states: infer Regions } ? SnapshotNode<Regions[keyof Regions]>
331
- : never)
332
- : never
333
-
334
- type SnapshotIdentifier<State> = SnapshotNode<State> extends infer Node ?
335
- Node extends { readonly path: infer Path extends string } ? Path : never
336
- : never
301
+ type SnapshotNode<State> = Machine.Snapshot.Node<State>
302
+ type SnapshotIdentifier<State> = Machine.Snapshot.Path<State>
337
303
 
338
304
  type ValuedSnapshotIdentifier<State> = SnapshotNode<State> extends infer Node ?
339
305
  Node extends { readonly path: infer Path extends string; readonly value: infer Value } ?
@@ -350,7 +316,7 @@ type SnapshotByIdentifier<State, Path extends SnapshotIdentifier<State>> = Snaps
350
316
  Node extends { readonly path: Path } ? Node : never
351
317
  : never
352
318
 
353
- type ChildState<Child extends Machine.ChildMachine.Any> = RefState<Machine.ChildMachine.Ref<Child>>
319
+ type ChildState<Child extends Machine.ChildMachine.Any> = ChildSnapshot<Child>
354
320
 
355
321
  type ChildSnapshot<Child extends Machine.ChildMachine.Any> = Machine.Machine.Snapshot<
356
322
  Machine.Machine.States<Child["machine"]>
@@ -425,15 +391,12 @@ type EnsureValuedSelectorPath<State, Path extends string> = [Path] extends [Valu
425
391
  * class Count extends Schema.TaggedClass<Count>("Count")("Count", {
426
392
  * value: Schema.Number
427
393
  * }) {}
428
- * const States = Machine.states({ Count })
394
+ * const States = Machine.state({ initial: "Count", states: { Count } })
429
395
  * const machine = Machine.make({
430
- * states: States.states,
431
- * events: Machine.events(),
432
- * initial: {
433
- * target: (to) => to.Count(),
434
- * resolve: ({ target }) => target.decoded(new Count({ value: 0 }))
435
- * }
436
- * }).handle({ Count: {} })
396
+ * root: States,
397
+ * events: Machine.eventsFromSchemas(),
398
+ * initialConfiguration: root => root.resolve(({ target }) => target.from(tree => tree.Count.decoded(new Count({ value: 0 }))))
399
+ * }).handle({ states: { Count: {} } })
437
400
  * const machineAtom = AtomMachine.make(machine)
438
401
  *
439
402
  * const countAtom = AtomMachine.select(machineAtom, "Count")
@@ -558,15 +521,18 @@ export const selectSnapshot: {
558
521
  * @since 0.4.0
559
522
  */
560
523
  export const selectChild: {
561
- <
562
- Child extends Machine.ChildMachine.Any = never,
563
- StartError = never,
564
- const Path extends ValuedSnapshotIdentifier<ChildState<Child>> = ValuedSnapshotIdentifier<ChildState<Child>>
565
- >(path: Path):
524
+ <const Path extends string = never>(path: NoInfer<Path>):
566
525
  & SelectorProjection<"selectChild", Path>
567
- & ((self: ChildMachineAtom<Child, StartError>) => Atom.Atom<
526
+ & (<
527
+ Child extends Machine.ChildMachine.Any,
528
+ StartError
529
+ >(
530
+ self: ChildMachineAtom<Child, StartError> & EnsureValuedSelectorPath<ChildState<Child>, Path>
531
+ ) => Atom.Atom<
568
532
  AsyncResult.AsyncResult<
569
- Option.Option<SnapshotValueByIdentifier<ChildState<Child>, Path>>,
533
+ Option.Option<
534
+ SnapshotValueByIdentifier<ChildState<Child>, Extract<Path, ValuedSnapshotIdentifier<ChildState<Child>>>>
535
+ >,
570
536
  StartError | RefError<Machine.ChildMachine.Ref<Child>>
571
537
  >
572
538
  >)
@@ -663,15 +629,12 @@ export const selectSnapshotChild: {
663
629
  * import { AtomMachine } from "@typeonce/effect-machine/reactivity"
664
630
  *
665
631
  * class Idle extends Schema.TaggedClass<Idle>("Idle")("Idle", {}) {}
666
- * const States = Machine.states({ Idle })
632
+ * const States = Machine.state({ initial: "Idle", states: { Idle } })
667
633
  * const machine = Machine.make({
668
- * states: States.states,
669
- * events: Machine.events(),
670
- * initial: {
671
- * target: (to) => to.Idle(),
672
- * resolve: ({ target }) => target.from()
673
- * }
674
- * }).handle({ Idle: {} })
634
+ * root: States,
635
+ * events: Machine.eventsFromSchemas(),
636
+ * initialConfiguration: root => root.resolve(({ target }) => target.from(tree => tree.Idle.from()))
637
+ * }).handle({ states: { Idle: {} } })
675
638
  * const machineAtom = AtomMachine.make(machine)
676
639
  *
677
640
  * const isIdleAtom = AtomMachine.matches(machineAtom, "Idle")
@@ -796,7 +759,7 @@ type MachineRequirementsOf<M extends Machine.Machine.Any> = MachineRequirements<
796
759
  Machine.Machine.InitialServices<M>,
797
760
  Machine.Machine.Services<M>,
798
761
  Machine.Machine.Event<M>,
799
- Machine.Machine.Emit<M>
762
+ Machine.Machine.EmittedEvent<M>
800
763
  >
801
764
 
802
765
  type MissingBoundRequirements<Services, M extends Machine.Machine.Any> = Exclude<
@@ -815,7 +778,7 @@ type EnsureBoundRequirements<Services, M extends Machine.Machine.Any> = IsAny<Ma
815
778
  type MachineResumeRequirementsOf<M extends Machine.Machine.Any> = MachineResumeRequirements<
816
779
  Machine.Machine.Services<M>,
817
780
  Machine.Machine.Event<M>,
818
- Machine.Machine.Emit<M>
781
+ Machine.Machine.EmittedEvent<M>
819
782
  >
820
783
 
821
784
  type MissingBoundResumeRequirements<Services, M extends Machine.Machine.Any> = Exclude<
@@ -1056,7 +1019,7 @@ export interface Bound<Services, RuntimeError = never> {
1056
1019
  * const processAtoms = AtomMachine.family(processMachine, {
1057
1020
  * atoms: {
1058
1021
  * ready: AtomMachine.matches("Ready"),
1059
- * state: (machine) => machine.state,
1022
+ * state: (machine) => machine.result,
1060
1023
  * send: (machine) => machine.send
1061
1024
  * }
1062
1025
  * })
@@ -1104,7 +1067,7 @@ export const family: <
1104
1067
  * child: (plantId: string) => Plant(plantId),
1105
1068
  * atoms: {
1106
1069
  * broken: AtomMachine.matchesChild("Broken"),
1107
- * state: (child) => child.state,
1070
+ * state: (child) => child.result,
1108
1071
  * send: (child) => child.send
1109
1072
  * }
1110
1073
  * })
@@ -1117,7 +1080,10 @@ export const familyChild: <
1117
1080
  Key,
1118
1081
  Parent extends MachineAtom<any, never, any, any, any, any> | ChildMachineAtom<any, any>,
1119
1082
  Child extends Machine.ChildMachine.Any,
1120
- const Projections extends FamilyProjectionRecord<ChildOf<Parent, Child>, ChildFamilySelectorProjection<Child>>
1083
+ const Projections extends FamilyProjectionRecord<
1084
+ ChildOf<Parent, NoInfer<Child>>,
1085
+ ChildFamilySelectorProjection<NoInfer<Child>>
1086
+ >
1121
1087
  >(
1122
1088
  parent: Parent,
1123
1089
  options: {
@@ -1141,15 +1107,12 @@ export const familyChild: <
1141
1107
  * import { AtomMachine } from "@typeonce/effect-machine/reactivity"
1142
1108
  *
1143
1109
  * class Idle extends Schema.TaggedClass<Idle>("Idle")("Idle", {}) {}
1144
- * const States = Machine.states({ Idle })
1110
+ * const States = Machine.state({ initial: "Idle", states: { Idle } })
1145
1111
  * const machine = Machine.make({
1146
- * states: States.states,
1147
- * events: Machine.events(),
1148
- * initial: {
1149
- * target: (to) => to.Idle(),
1150
- * resolve: ({ target }) => target.from()
1151
- * }
1152
- * }).handle({ Idle: {} })
1112
+ * root: States,
1113
+ * events: Machine.eventsFromSchemas(),
1114
+ * initialConfiguration: root => root.resolve(({ target }) => target.from(tree => tree.Idle.from()))
1115
+ * }).handle({ states: { Idle: {} } })
1153
1116
  *
1154
1117
  * const machineAtom = AtomMachine.make(machine)
1155
1118
  * ```
@@ -1196,7 +1159,7 @@ export const make: {
1196
1159
  InitialR,
1197
1160
  R,
1198
1161
  Machine.Machine.EventOf<Events>,
1199
- Machine.Machine.EmitOf<Emits>
1162
+ Machine.Machine.EmittedEventOf<Emits>
1200
1163
  >
1201
1164
  >
1202
1165
  & EnsureExecutable<States, UnhandledStates, OutputStates>