@reventlessdev/reventless-aws 3.0.0-alpha.386 → 3.0.0-alpha.388

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 (89) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +1 -1
  3. package/package.json +12 -12
  4. package/scripts/ProvisionIdentity.res +1 -1
  5. package/src/Platform.res +20 -13
  6. package/src/Platform.res.mjs +34 -30
  7. package/src/Platform_Stack.res +3 -3
  8. package/src/adapter/AWS_Tags.res +1 -1
  9. package/src/adapter/Auth/Auth_ActiveRolePoolAttachment.res +1 -1
  10. package/src/adapter/Auth/Auth_ActiveRoleStore_Ops.res +2 -2
  11. package/src/adapter/Auth/Auth_ActiveRoleStore_Schema.res +1 -1
  12. package/src/adapter/Auth/Auth_Cognito.res +1 -1
  13. package/src/adapter/Auth/Auth_LoginIdentifier.res +1 -1
  14. package/src/adapter/Auth/Auth_SignUpMode.res +1 -1
  15. package/src/adapter/DcbEventLog/DcbEventLogStorage_DynamoDb_Runtime.res +2 -2
  16. package/src/adapter/EventLog/EventLogBackend.res +1 -1
  17. package/src/adapter/QueryDb/PgQueryResolver_Lambda.res +2 -2
  18. package/src/adapter/Runtime/AggregateEntryPoint.mjs +6 -6
  19. package/src/adapter/Runtime/AggregateEntryPoint_Ops.res +1 -1
  20. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res +8 -8
  21. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro.res.mjs +7 -7
  22. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res +8 -8
  23. package/src/adapter/Runtime/AggregateRuntime_Builder_Micro_Async.res.mjs +7 -7
  24. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res +7 -7
  25. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate.res.mjs +6 -6
  26. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res +7 -7
  27. package/src/adapter/Runtime/AggregateRuntime_Builder_PerAggregate_Async.res.mjs +6 -6
  28. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res +7 -7
  29. package/src/adapter/Runtime/AggregateRuntime_Builder_Single.res.mjs +6 -6
  30. package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res +7 -7
  31. package/src/adapter/Runtime/AggregateRuntime_Builder_Single_Async.res.mjs +6 -6
  32. package/src/adapter/Runtime/AutomationSliceEntryPoint_Ops.res +1 -1
  33. package/src/adapter/Runtime/AutomationSliceRuntime_Builder_Single.res +2 -2
  34. package/src/adapter/Runtime/DcbCommandTopicEntryPoint.mjs +7 -7
  35. package/src/adapter/Runtime/DcbCommandTopicEntryPoint_Ops.res +7 -7
  36. package/src/adapter/Runtime/DcbCommandTopicEntryPoint_Ops.res.mjs +2 -2
  37. package/src/adapter/Runtime/EventCollectorEntryPoint.mjs +1 -1
  38. package/src/adapter/Runtime/RuntimeEnvironment_Lambda.res +2 -2
  39. package/src/adapter/Runtime/RuntimeExtensionEntryPoint_Ops.res +2 -2
  40. package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res +10 -10
  41. package/src/adapter/Runtime/StateChangeSliceRuntime_Builder_Single.res.mjs +3 -3
  42. package/src/adapter/StateTopic/StateTopic_AppSync.res +1 -1
  43. package/src/capability/Capability_Messaging.res +2 -2
  44. package/src/components/Aggregate_Builder_Micro.res +3 -3
  45. package/src/components/Aggregate_Builder_Micro.res.mjs +3 -3
  46. package/src/components/Aggregate_Builder_NoResolver.res +3 -3
  47. package/src/components/Aggregate_Builder_NoResolver.res.mjs +3 -3
  48. package/src/components/Aggregate_Builder_PerAggregate.res +3 -3
  49. package/src/components/Aggregate_Builder_PerAggregate.res.mjs +3 -3
  50. package/src/components/Aggregate_Builder_Single.res +3 -3
  51. package/src/components/Aggregate_Builder_Single.res.mjs +3 -3
  52. package/src/components/Aggregate_Builder_Single_Async.res +3 -3
  53. package/src/components/Aggregate_Builder_Single_Async.res.mjs +3 -3
  54. package/src/components/Api/AppSync_Adapter.res +3 -3
  55. package/src/components/Api/AppSync_SdlDecorate.res +3 -3
  56. package/src/components/SideEffectHandler_PerSideEffectHandler.res +1 -1
  57. package/src/components/StateChangeSlice_Builder.res +4 -4
  58. package/src/components/StateChangeSlice_Builder.res.mjs +4 -4
  59. package/src/plugin/runtime/PluginRuntime_Builder.res +4 -4
  60. package/src/plugin/runtime/PluginRuntime_Builder.res.mjs +3 -3
  61. package/src/plugin/stack/Plugin_Stack.res +1 -1
  62. package/src/util/Util_Bundle.res +1 -1
  63. package/src/util/Util_ShellConfig.res +7 -1
  64. package/src/util/Util_ShellConfig.res.mjs +8 -2
  65. package/tests/AppSync_AdapterTest.res +1 -1
  66. package/tests/AppSync_RetirementNarrowingTest.res +1 -1
  67. package/tests/AppSync_SdlDecorateTest.res +1 -1
  68. package/tests/Auth_LoginIdentifierTest.res +1 -1
  69. package/tests/Auth_SignUpModeTest.res +1 -1
  70. package/tests/BakeConvergenceTest.res +11 -11
  71. package/tests/BakeConvergenceTest.res.mjs +13 -13
  72. package/tests/QueryDbResolvers_AppSyncTest.res +1 -1
  73. package/tests/Upload_ClaimTest.res +1 -1
  74. package/tests/Util_AwsErrorTest.res +1 -1
  75. package/tests/Util_ShellConfigTest.res +40 -0
  76. package/tests/Util_ShellConfigTest.res.mjs +76 -21
  77. package/tests/Util_StoreLayoutTest.res +1 -1
  78. package/tests/dcbColdStartPartition.mjs +3 -3
  79. package/tests/integration/{AggTestAggregateBehavior.res → AggTestAggregateDecision.res} +2 -2
  80. package/tests/integration/{AggTestAggregateBehavior.res.mjs → AggTestAggregateDecision.res.mjs} +1 -1
  81. package/tests/integration/AggregateEntryPoint_IntegrationTest.res +3 -3
  82. package/tests/integration/AggregateEntryPoint_IntegrationTest.res.mjs +2 -2
  83. package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res +5 -5
  84. package/tests/integration/DcbCommandTopicEntryPoint_IntegrationTest.res.mjs +4 -4
  85. package/tests/integration/DcbEventLogStorage_DynamoDb_IntegrationTest.res +1 -1
  86. package/tests/integration/{EpCompositeSliceBehavior.res → EpCompositeSliceDecision.res} +2 -2
  87. package/tests/integration/{EpCompositeSliceBehavior.res.mjs → EpCompositeSliceDecision.res.mjs} +1 -1
  88. package/tests/integration/{EpTestSliceBehavior.res → EpTestSliceDecision.res} +2 -2
  89. package/tests/integration/{EpTestSliceBehavior.res.mjs → EpTestSliceDecision.res.mjs} +1 -1
package/CHANGELOG.md CHANGED
@@ -3,6 +3,27 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # 3.0.0-alpha.388 (2026-10-21)
7
+
8
+ * feat!: the write-side logic module is called the decision, and a codemod moves an app over ([cb573ff](https://github.com/ReventlessDev/reventless-core/commit/cb573ff5b928c7d7f3e75988dfaa65066f8c95eb))
9
+
10
+ ### BREAKING CHANGES
11
+
12
+ * <Spec>_Behavior.res, @@reventless.behavior,
13
+ Reventless.Behavior.T, StateChangeSlice.Behavior, Behavior_GWT and
14
+ thenRefused no longer exist. Run `npx reventless-rename-to-decision` at an
15
+ app's root, then rebuild; comments are not rewritten. The PPX must be the
16
+ matching release.
17
+
18
+
19
+
20
+ # 3.0.0-alpha.387 (2026-10-19)
21
+
22
+ ### Features
23
+
24
+ * **spec,aws,local:** tell the host shell which environment it runs in, and write local host UI files into a chosen assetsDir ([4f896d1](https://github.com/ReventlessDev/reventless-core/commit/4f896d13ae9ec0d211c33dbd9271e7197cfebc41))
25
+
26
+
6
27
  # 3.0.0-alpha.386 (2026-10-17)
7
28
 
8
29
  **Note:** Version bump only for package @reventlessdev/reventless-aws
package/README.md CHANGED
@@ -21,7 +21,7 @@ ReScript modules, consumed by adding the package to your `rescript.json` `depend
21
21
 
22
22
  - **`Platform`** — the AWS platform functor (`Platform.Make()` / `Platform.MakeWithConfig({...})`).
23
23
  Applying it wires up AWS builders once; your plugin functor then takes only the
24
- application-defined `Spec`, `Behavior`, and `Mappings`.
24
+ application-defined `Spec`, `Decision`, and `Mappings`.
25
25
  - **Component builders** (`Aggregate_Builder`, `ReadModel_Builder`, `Plugin`,
26
26
  the slice builders, `Task_Builder`, `Counter_Builder`, `Scheduler`, …) —
27
27
  AWS-preconfigured versions of the core hierarchical components, including the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-aws",
3
- "version": "3.0.0-alpha.386",
3
+ "version": "3.0.0-alpha.388",
4
4
  "description": "AWS adapters for Reventless",
5
5
  "license": "Apache-2.0",
6
6
  "bin": {
@@ -22,19 +22,19 @@
22
22
  "sury": "11.0.0",
23
23
  "uuid": "^13.0.0",
24
24
  "yaml": "^2.8.3",
25
- "@reventlessdev/rescript-aws-sdk": "3.0.0-alpha.32",
26
- "@reventlessdev/rescript-effect": "1.0.0-alpha.0",
27
- "@reventlessdev/rescript-jest": "1.0.0-alpha.12",
28
- "@reventlessdev/rescript-node": "2.0.0-alpha.22",
29
- "@reventlessdev/rescript-pulumi-aws": "3.0.0-alpha.30",
25
+ "@reventlessdev/rescript-aws-sdk": "3.0.0-alpha.33",
26
+ "@reventlessdev/rescript-effect": "1.0.0-alpha.1",
27
+ "@reventlessdev/rescript-jest": "1.0.0-alpha.13",
28
+ "@reventlessdev/rescript-pulumi-aws": "3.0.0-alpha.31",
29
+ "@reventlessdev/rescript-node": "2.0.0-alpha.23",
30
30
  "@reventlessdev/rescript-pulumi-pulumi": "3.0.0-alpha.0",
31
31
  "@reventlessdev/rescript-uuid": "2.0.0-alpha.1",
32
- "@reventlessdev/rescript-web": "1.0.0-alpha.7",
33
- "@reventlessdev/reventless-core": "3.0.0-alpha.299",
34
- "@reventlessdev/reventless-infra": "3.0.0-alpha.196",
35
- "@reventlessdev/reventless-interop": "3.0.0-alpha.41",
36
- "@reventlessdev/reventless-postgres": "3.0.0-alpha.163",
37
- "@reventlessdev/reventless-spec": "3.0.0-alpha.168"
32
+ "@reventlessdev/reventless-core": "3.0.0-alpha.301",
33
+ "@reventlessdev/rescript-web": "1.0.0-alpha.8",
34
+ "@reventlessdev/reventless-infra": "3.0.0-alpha.198",
35
+ "@reventlessdev/reventless-postgres": "3.0.0-alpha.165",
36
+ "@reventlessdev/reventless-interop": "3.0.0-alpha.42",
37
+ "@reventlessdev/reventless-spec": "3.0.0-alpha.170"
38
38
  },
39
39
  "devDependencies": {
40
40
  "rescript": "12.3.1",
@@ -10,7 +10,7 @@ outside every stack. That is this.
10
10
  🚨 **It does not attach a pre-token-generation trigger, and must not.** The pool's
11
11
  one trigger slot is the deploy's business: a script that filled it would be the
12
12
  hand-run `UpdateUserPool` this whole area refuses, leaving the deployment's
13
- behaviour depending on an act no source describes.
13
+ behavior depending on an act no source describes.
14
14
 
15
15
  The store's name and key schema come from [Auth_ActiveRoleStore_Schema] rather
16
16
  than from constants here. A second copy of either would be one edit away from
package/src/Platform.res CHANGED
@@ -2,7 +2,7 @@
2
2
  //
3
3
  // Creates a platform instance with pre-wired AWS builders (DynamoDB, Lambda, SQS, SNS).
4
4
  // Config is applied once at platform creation; component Make functors then take only
5
- // the application-defined arguments (Spec, Behavior, Mappings).
5
+ // the application-defined arguments (Spec, Decision, Mappings).
6
6
  //
7
7
  // Example:
8
8
  // module Platform = Platform.Make()
@@ -593,19 +593,19 @@ module MakeWithConfig = (
593
593
  // _Micro, _NoResolver) — see docs/plans/Backlog/aws-deployment-strategy.md.
594
594
  module Make = (
595
595
  Spec: Reventless.Aggregate.Spec,
596
- Behavior: Reventless.Behavior.T with module Spec := Spec,
596
+ Decision: Reventless.Decision.T with module Spec := Spec,
597
597
  EventMappings: ReventlessInfra.EventMapper.Mappings with module Target := Spec,
598
598
  ): (
599
599
  ReventlessInfra.Aggregate.T with type api = Types.AppSync.api
600
- ) => Aggregate_Builder_Single.Make(Spec, Behavior, EventMappings)
600
+ ) => Aggregate_Builder_Single.Make(Spec, Decision, EventMappings)
601
601
  /** Async variant — uses FIFO SQS channel, commands return `CommandPending`. */
602
602
  module MakeAsync = (
603
603
  Spec: Reventless.Aggregate.Spec,
604
- Behavior: Reventless.Behavior.T with module Spec := Spec,
604
+ Decision: Reventless.Decision.T with module Spec := Spec,
605
605
  EventMappings: ReventlessInfra.EventMapper.Mappings with module Target := Spec,
606
606
  ): (
607
607
  ReventlessInfra.Aggregate.T with type api = Types.AppSync.api
608
- ) => Aggregate_Builder_Single_Async.Make(Spec, Behavior, EventMappings)
608
+ ) => Aggregate_Builder_Single_Async.Make(Spec, Decision, EventMappings)
609
609
  }
610
610
 
611
611
  module ReadModel = {
@@ -734,16 +734,16 @@ module MakeWithConfig = (
734
734
  module StateChangeSlice = {
735
735
  module Make = (
736
736
  Spec: Reventless.StateChangeSlice.Spec,
737
- Behavior: Reventless.StateChangeSlice.Behavior with module Spec := Spec,
737
+ Decision: Reventless.StateChangeSlice.Decision with module Spec := Spec,
738
738
  ): (
739
739
  ReventlessInfra.StateChangeSlice.T with module Spec = Spec
740
- ) => StateChangeSlice_Builder.Make(Spec, Behavior)
740
+ ) => StateChangeSlice_Builder.Make(Spec, Decision)
741
741
  /** Async variant — uses FIFO SQS channel, commands return `CommandPending`. */
742
742
  module MakeAsync = (
743
743
  Spec: Reventless.StateChangeSlice.Spec,
744
- Behavior: Reventless.StateChangeSlice.Behavior with module Spec := Spec,
744
+ Decision: Reventless.StateChangeSlice.Decision with module Spec := Spec,
745
745
  ): (ReventlessInfra.StateChangeSlice.T with module Spec = Spec) => {
746
- include StateChangeSlice_Builder.Make(Spec, Behavior)
746
+ include StateChangeSlice_Builder.Make(Spec, Decision)
747
747
  let isAsync = true
748
748
  }
749
749
  }
@@ -769,7 +769,7 @@ module MakeWithConfig = (
769
769
  // slice's command handler exactly once).
770
770
  module UiFragmentRegistrySlice = StateChangeSlice.Make(
771
771
  ReventlessCore.UiFragmentRegistry,
772
- ReventlessCore.UiFragmentRegistry_Behavior,
772
+ ReventlessCore.UiFragmentRegistry_Decision,
773
773
  )
774
774
  module UiFragmentsViewSlice = StateViewSlice.Make(
775
775
  ReventlessCore.UiFragments,
@@ -1085,7 +1085,7 @@ module MakeWithConfig = (
1085
1085
  module PluginAggregate: ReventlessInfra.Aggregate.T
1086
1086
  with type api = Types.AppSync.api = Aggregate_Builder_Single.Make(
1087
1087
  ReventlessCore.PluginSpec,
1088
- ReventlessCore.PluginBehavior,
1088
+ ReventlessCore.PluginDecision,
1089
1089
  ReventlessInfra.NoEventMappings.Make(ReventlessCore.PluginSpec),
1090
1090
  )
1091
1091
 
@@ -2355,6 +2355,12 @@ module MakeWithConfig = (
2355
2355
  // `platformApiEndpoint`, already present) with the store it declares, so there
2356
2356
  // is no per-store URL to publish. The store's *serving* base URL still travels
2357
2357
  // in the `objectStores` stack output above.
2358
+ // Outside the apply; the same name the deployment record carries.
2359
+ let shellEnvironment = Reventless.ShellEnvironment.resolve(
2360
+ ~provenance=Reventless.DeploymentProvenance.current(),
2361
+ ~stack=stackName,
2362
+ ~prodStacks=Util_HostUiDomain.resolveProdStacks(),
2363
+ )
2358
2364
  let configJsonContent =
2359
2365
  (
2360
2366
  (
@@ -2407,6 +2413,7 @@ module MakeWithConfig = (
2407
2413
  // public Function URL and its config key are both gone.
2408
2414
  Util_ShellConfig.fields(
2409
2415
  ~computed=withEvents,
2416
+ ~environment=shellEnvironment,
2410
2417
  ~viewModes=?cfg.viewModes,
2411
2418
  ~bakedManifest=?cfg.bakedManifest,
2412
2419
  ~uiSlotsFile=?cfg.uiSlotsFile,
@@ -2697,7 +2704,7 @@ module MakeWithConfig = (
2697
2704
  //
2698
2705
  // A platform that provisioned no geocoder yields "", and the plugin's client
2699
2706
  // reports `Unavailable` — retried, then surfaced by the heartbeat sweep. That
2700
- // is a modelled outcome, which is the point of the empty string: a plugin
2707
+ // is a modeled outcome, which is the point of the empty string: a plugin
2701
2708
  // deployed against a platform without the capability degrades rather than
2702
2709
  // failing to deploy.
2703
2710
  // The place index, not the Function URL. A slice's Lambda reaches Amazon
@@ -2900,7 +2907,7 @@ module MakeWithConfig = (
2900
2907
  // why a *declared* need fails the deploy.
2901
2908
  //
2902
2909
  // Only a declared need. A plugin that says nothing still degrades
2903
- // exactly as before: the empty endpoint is a modelled outcome for a
2910
+ // exactly as before: the empty endpoint is a modeled outcome for a
2904
2911
  // deployment that simply has no geocoder, and failing those would break
2905
2912
  // deployments that work.
2906
2913
  switch Reventless.CapabilityNeed.unmet(
@@ -35,6 +35,7 @@ import * as Plugin_Stack$ReventlessAws from "./plugin/stack/Plugin_Stack.res.mjs
35
35
  import * as UiFragments$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateView/UiFragments.res.mjs";
36
36
  import * as Util_Pulumi$ReventlessCore from "@reventlessdev/reventless-core/src/util/Util_Pulumi.res.mjs";
37
37
  import * as AccountsManifest$Reventless from "@reventlessdev/reventless-spec/src/types/AccountsManifest.res.mjs";
38
+ import * as ShellEnvironment$Reventless from "@reventlessdev/reventless-spec/src/types/ShellEnvironment.res.mjs";
38
39
  import * as Platform_Casts$ReventlessAws from "./Platform_Casts.res.mjs";
39
40
  import * as Platform_Stack$ReventlessAws from "./Platform_Stack.res.mjs";
40
41
  import * as QueryDbBackend$ReventlessAws from "./adapter/QueryDb/QueryDbBackend.res.mjs";
@@ -42,7 +43,7 @@ import * as AppSync_Adapter$ReventlessAws from "./components/Api/AppSync_Adapter
42
43
  import * as Counter_Builder$ReventlessAws from "./components/Counter_Builder.res.mjs";
43
44
  import * as EventLogBackend$ReventlessAws from "./adapter/EventLog/EventLogBackend.res.mjs";
44
45
  import * as Platform_Admin$ReventlessCore from "@reventlessdev/reventless-core/src/admin/Platform_Admin.res.mjs";
45
- import * as PluginBehavior$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginBehavior.res.mjs";
46
+ import * as PluginDecision$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginDecision.res.mjs";
46
47
  import * as Plugin_Helpers$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/component/Plugin_Helpers.res.mjs";
47
48
  import * as Upload_Claim_S3$ReventlessAws from "./adapter/Upload/Upload_Claim_S3.res.mjs";
48
49
  import * as PgProjectionFeed$ReventlessAws from "./adapter/Postgres/PgProjectionFeed.res.mjs";
@@ -52,6 +53,7 @@ import * as Util_StoreLayout$ReventlessAws from "./util/Util_StoreLayout.res.mjs
52
53
  import * as IndexJs from "@pulumi/pulumi/runtime/index.js";
53
54
  import * as AppSync_EventsApi$ReventlessAws from "./adapter/Api/AppSync_EventsApi.res.mjs";
54
55
  import * as AppSync_MergedApi$ReventlessAws from "./components/Api/AppSync_MergedApi.res.mjs";
56
+ import * as DeploymentProvenance$Reventless from "@reventlessdev/reventless-spec/src/types/DeploymentProvenance.res.mjs";
55
57
  import * as GraphQL_Stitcher$ReventlessCore from "@reventlessdev/reventless-core/src/components/Api/GraphQL_Stitcher.res.mjs";
56
58
  import * as NoEventMappings$ReventlessInfra from "@reventlessdev/reventless-infra/src/types/NoEventMappings.res.mjs";
57
59
  import * as Platform_UiSlots$ReventlessCore from "@reventlessdev/reventless-core/src/admin/Platform_UiSlots.res.mjs";
@@ -93,7 +95,7 @@ import * as PluginExtensionPointSpec$ReventlessInfra from "@reventlessdev/revent
93
95
  import * as Platform_UIFragments_Lambda$ReventlessAws from "./adapter/Api/Platform_UIFragments_Lambda.res.mjs";
94
96
  import * as CommandTopicChannel_SQS_Sync$ReventlessAws from "./adapter/CommandTopic/CommandTopicChannel_SQS_Sync.res.mjs";
95
97
  import * as EventLogSubscription_AppSync$ReventlessAws from "./adapter/EventLogSubscription/EventLogSubscription_AppSync.res.mjs";
96
- import * as UiFragmentRegistry_Behavior$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChange/UiFragmentRegistry_Behavior.res.mjs";
98
+ import * as UiFragmentRegistry_Decision$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChange/UiFragmentRegistry_Decision.res.mjs";
97
99
  import * as CommandTopicChannel_SQS_Async$ReventlessAws from "./adapter/CommandTopic/CommandTopicChannel_SQS_Async.res.mjs";
98
100
  import * as Geocoder_AwsLocation_Resolver$ReventlessAws from "./adapter/Geocoder/Geocoder_AwsLocation_Resolver.res.mjs";
99
101
  import * as Plugin_ExtensionPoint_Builder$ReventlessAws from "./plugin/stack/Plugin_ExtensionPoint_Builder.res.mjs";
@@ -381,8 +383,8 @@ function MakeWithConfig(Config) {
381
383
  api: resolveTargetApi,
382
384
  apiRole: resolveTargetApiRole
383
385
  };
384
- let Make = Spec => (Behavior => (EventMappings => Aggregate_Builder_Single$ReventlessAws.Make(Spec)(Behavior)(EventMappings)));
385
- let MakeAsync = Spec => (Behavior => (EventMappings => Aggregate_Builder_Single_Async$ReventlessAws.Make(Spec)(Behavior)(EventMappings)));
386
+ let Make = Spec => (Decision => (EventMappings => Aggregate_Builder_Single$ReventlessAws.Make(Spec)(Decision)(EventMappings)));
387
+ let MakeAsync = Spec => (Decision => (EventMappings => Aggregate_Builder_Single_Async$ReventlessAws.Make(Spec)(Decision)(EventMappings)));
386
388
  let Aggregate = {
387
389
  Make: Make,
388
390
  MakeAsync: MakeAsync
@@ -462,12 +464,12 @@ function MakeWithConfig(Config) {
462
464
  Make: Make$5
463
465
  };
464
466
  let Counter = Counter_Builder$ReventlessAws.Make(ApiConfig);
465
- let Make$6 = Spec => (Behavior => StateChangeSlice_Builder$ReventlessAws.Make(Spec)(Behavior));
466
- let MakeAsync$1 = Spec => (Behavior => {
467
- let include = StateChangeSlice_Builder$ReventlessAws.Make(Spec)(Behavior);
467
+ let Make$6 = Spec => (Decision => StateChangeSlice_Builder$ReventlessAws.Make(Spec)(Decision));
468
+ let MakeAsync$1 = Spec => (Decision => {
469
+ let include = StateChangeSlice_Builder$ReventlessAws.Make(Spec)(Decision);
468
470
  return {
469
471
  Spec: include.Spec,
470
- Behavior: include.Behavior,
472
+ Decision: include.Decision,
471
473
  isAsync: true,
472
474
  make: include.make
473
475
  };
@@ -496,9 +498,9 @@ function MakeWithConfig(Config) {
496
498
  };
497
499
  let UiFragmentRegistrySlice = StateChangeSlice_Builder$ReventlessAws.Make(Spec)({
498
500
  initialState: undefined,
499
- evolve: UiFragmentRegistry_Behavior$ReventlessCore.evolve,
500
- decide: UiFragmentRegistry_Behavior$ReventlessCore.decide,
501
- moduleUrl: UiFragmentRegistry_Behavior$ReventlessCore.moduleUrl
501
+ evolve: UiFragmentRegistry_Decision$ReventlessCore.evolve,
502
+ decide: UiFragmentRegistry_Decision$ReventlessCore.decide,
503
+ moduleUrl: UiFragmentRegistry_Decision$ReventlessCore.moduleUrl
502
504
  });
503
505
  let UiFragmentsViewSlice = Make$7({
504
506
  name: UiFragments$ReventlessCore.name,
@@ -690,11 +692,11 @@ function MakeWithConfig(Config) {
690
692
  commandTransition: PluginSpec$ReventlessCore.commandTransition,
691
693
  traits: PluginSpec$ReventlessCore.traits
692
694
  })({
693
- initialState: PluginBehavior$ReventlessCore.initialState,
694
- evolve: PluginBehavior$ReventlessCore.evolve,
695
- decide: PluginBehavior$ReventlessCore.decide,
695
+ initialState: PluginDecision$ReventlessCore.initialState,
696
+ evolve: PluginDecision$ReventlessCore.evolve,
697
+ decide: PluginDecision$ReventlessCore.decide,
696
698
  snapshot: undefined,
697
- moduleUrl: PluginBehavior$ReventlessCore.moduleUrl
699
+ moduleUrl: PluginDecision$ReventlessCore.moduleUrl
698
700
  })(NoEventMappings$ReventlessInfra.Make({
699
701
  name: PluginSpec$ReventlessCore.name,
700
702
  Id: Id$Reventless.$$String,
@@ -1235,6 +1237,7 @@ function MakeWithConfig(Config) {
1235
1237
  if (capabilities.includes("Messaging") && !emailSenderProvisioned) {
1236
1238
  Stdlib_JsError.throwWithMessage(`A plugin of this deployment declares the Messaging capability, but this platform provisions no email sender.\n The sender is configuration and has no default: set \`platform:messagingEmailSender\` in Pulumi.<stack>.yaml (or the env var REVENTLESS_MESSAGING_EMAIL_SENDER), then verify the address with SES.\n A stack that should not mail anybody sets \`platform:messagingEmailProvider: log\` instead — every message is logged and none is sent, and the address is optional.\n The root must also pass \`~messagingSender\` in \`~hostUiBundle\`, from \`ReventlessAws.Capability_Messaging.make(~name=…)\`.\n The declaration is generated from the plugins' capabilities.json — regenerate with \`pnpm run generate:platform\` if it is stale.`);
1237
1239
  }
1240
+ let shellEnvironment = ShellEnvironment$Reventless.resolve(DeploymentProvenance$Reventless.current(), stackName, Util_HostUiDomain$ReventlessAws.resolveProdStacks());
1238
1241
  let configJsonContent = Pulumi.all([
1239
1242
  Pulumi.all([
1240
1243
  resolvedDomainApiEndpoint,
@@ -1286,7 +1289,7 @@ function MakeWithConfig(Config) {
1286
1289
  AppSync_EventsApi$ReventlessAws.clientNamespaceName
1287
1290
  ]
1288
1291
  ]) : computed;
1289
- return JSON.stringify(Util_ShellConfig$ReventlessAws.fields(withEvents, hostUiBundle.viewModes, hostUiBundle.bakedManifest, hostUiBundle.uiSlotsFile, hostUiBundle.shellConfig));
1292
+ return JSON.stringify(Util_ShellConfig$ReventlessAws.fields(withEvents, shellEnvironment, hostUiBundle.viewModes, hostUiBundle.bakedManifest, hostUiBundle.uiSlotsFile, hostUiBundle.shellConfig));
1290
1293
  });
1291
1294
  let bootFileCacheControl = "no-cache";
1292
1295
  new (Aws.s3.BucketObject)("host-ui-config-json", {
@@ -1797,8 +1800,8 @@ function Make($star) {
1797
1800
  api: resolveTargetApi,
1798
1801
  apiRole: resolveTargetApiRole
1799
1802
  };
1800
- let Make$1 = Spec => (Behavior => (EventMappings => Aggregate_Builder_Single$ReventlessAws.Make(Spec)(Behavior)(EventMappings)));
1801
- let MakeAsync = Spec => (Behavior => (EventMappings => Aggregate_Builder_Single_Async$ReventlessAws.Make(Spec)(Behavior)(EventMappings)));
1803
+ let Make$1 = Spec => (Decision => (EventMappings => Aggregate_Builder_Single$ReventlessAws.Make(Spec)(Decision)(EventMappings)));
1804
+ let MakeAsync = Spec => (Decision => (EventMappings => Aggregate_Builder_Single_Async$ReventlessAws.Make(Spec)(Decision)(EventMappings)));
1802
1805
  let Aggregate = {
1803
1806
  Make: Make$1,
1804
1807
  MakeAsync: MakeAsync
@@ -1878,12 +1881,12 @@ function Make($star) {
1878
1881
  Make: Make$6
1879
1882
  };
1880
1883
  let Counter = Counter_Builder$ReventlessAws.Make(ApiConfig);
1881
- let Make$7 = Spec => (Behavior => StateChangeSlice_Builder$ReventlessAws.Make(Spec)(Behavior));
1882
- let MakeAsync$1 = Spec => (Behavior => {
1883
- let include = StateChangeSlice_Builder$ReventlessAws.Make(Spec)(Behavior);
1884
+ let Make$7 = Spec => (Decision => StateChangeSlice_Builder$ReventlessAws.Make(Spec)(Decision));
1885
+ let MakeAsync$1 = Spec => (Decision => {
1886
+ let include = StateChangeSlice_Builder$ReventlessAws.Make(Spec)(Decision);
1884
1887
  return {
1885
1888
  Spec: include.Spec,
1886
- Behavior: include.Behavior,
1889
+ Decision: include.Decision,
1887
1890
  isAsync: true,
1888
1891
  make: include.make
1889
1892
  };
@@ -1912,9 +1915,9 @@ function Make($star) {
1912
1915
  };
1913
1916
  let UiFragmentRegistrySlice = StateChangeSlice_Builder$ReventlessAws.Make(Spec)({
1914
1917
  initialState: undefined,
1915
- evolve: UiFragmentRegistry_Behavior$ReventlessCore.evolve,
1916
- decide: UiFragmentRegistry_Behavior$ReventlessCore.decide,
1917
- moduleUrl: UiFragmentRegistry_Behavior$ReventlessCore.moduleUrl
1918
+ evolve: UiFragmentRegistry_Decision$ReventlessCore.evolve,
1919
+ decide: UiFragmentRegistry_Decision$ReventlessCore.decide,
1920
+ moduleUrl: UiFragmentRegistry_Decision$ReventlessCore.moduleUrl
1918
1921
  });
1919
1922
  let UiFragmentsViewSlice = Make$8({
1920
1923
  name: UiFragments$ReventlessCore.name,
@@ -2106,11 +2109,11 @@ function Make($star) {
2106
2109
  commandTransition: PluginSpec$ReventlessCore.commandTransition,
2107
2110
  traits: PluginSpec$ReventlessCore.traits
2108
2111
  })({
2109
- initialState: PluginBehavior$ReventlessCore.initialState,
2110
- evolve: PluginBehavior$ReventlessCore.evolve,
2111
- decide: PluginBehavior$ReventlessCore.decide,
2112
+ initialState: PluginDecision$ReventlessCore.initialState,
2113
+ evolve: PluginDecision$ReventlessCore.evolve,
2114
+ decide: PluginDecision$ReventlessCore.decide,
2112
2115
  snapshot: undefined,
2113
- moduleUrl: PluginBehavior$ReventlessCore.moduleUrl
2116
+ moduleUrl: PluginDecision$ReventlessCore.moduleUrl
2114
2117
  })(NoEventMappings$ReventlessInfra.Make({
2115
2118
  name: PluginSpec$ReventlessCore.name,
2116
2119
  Id: Id$Reventless.$$String,
@@ -2628,6 +2631,7 @@ function Make($star) {
2628
2631
  if (capabilities.includes("Messaging") && !emailSenderProvisioned) {
2629
2632
  Stdlib_JsError.throwWithMessage(`A plugin of this deployment declares the Messaging capability, but this platform provisions no email sender.\n The sender is configuration and has no default: set \`platform:messagingEmailSender\` in Pulumi.<stack>.yaml (or the env var REVENTLESS_MESSAGING_EMAIL_SENDER), then verify the address with SES.\n A stack that should not mail anybody sets \`platform:messagingEmailProvider: log\` instead — every message is logged and none is sent, and the address is optional.\n The root must also pass \`~messagingSender\` in \`~hostUiBundle\`, from \`ReventlessAws.Capability_Messaging.make(~name=…)\`.\n The declaration is generated from the plugins' capabilities.json — regenerate with \`pnpm run generate:platform\` if it is stale.`);
2630
2633
  }
2634
+ let shellEnvironment = ShellEnvironment$Reventless.resolve(DeploymentProvenance$Reventless.current(), stackName, Util_HostUiDomain$ReventlessAws.resolveProdStacks());
2631
2635
  let configJsonContent = Pulumi.all([
2632
2636
  Pulumi.all([
2633
2637
  resolvedDomainApiEndpoint,
@@ -2679,7 +2683,7 @@ function Make($star) {
2679
2683
  AppSync_EventsApi$ReventlessAws.clientNamespaceName
2680
2684
  ]
2681
2685
  ]) : computed;
2682
- return JSON.stringify(Util_ShellConfig$ReventlessAws.fields(withEvents, hostUiBundle.viewModes, hostUiBundle.bakedManifest, hostUiBundle.uiSlotsFile, hostUiBundle.shellConfig));
2686
+ return JSON.stringify(Util_ShellConfig$ReventlessAws.fields(withEvents, shellEnvironment, hostUiBundle.viewModes, hostUiBundle.bakedManifest, hostUiBundle.uiSlotsFile, hostUiBundle.shellConfig));
2683
2687
  });
2684
2688
  let bootFileCacheControl = "no-cache";
2685
2689
  new (Aws.s3.BucketObject)("host-ui-config-json", {
@@ -110,7 +110,7 @@ let _identityProviderId = (~cfg: Pulumi.Config.t): option<string> => {
110
110
  `platform:loginIdentifier` (or `REVENTLESS_LOGIN_IDENTIFIER` / the sidecar).
111
111
 
112
112
  Absent means `email`, which is what every pool so far was created with. An
113
- unrecognised spelling fails the deploy — see [Auth_LoginIdentifier] for why
113
+ unrecognized spelling fails the deploy — see [Auth_LoginIdentifier] for why
114
114
  defaulting past a typo here is unrecoverable. */
115
115
  let _loginIdentifier = (~cfg: Pulumi.Config.t): Auth_LoginIdentifier.t => {
116
116
  let raw = switch Util_LocalConfig.get("loginIdentifier") {
@@ -128,7 +128,7 @@ let _loginIdentifier = (~cfg: Pulumi.Config.t): Auth_LoginIdentifier.t => {
128
128
 
129
129
  Absent means `adminOnly`, which is what every pool so far was created with, so
130
130
  an existing stack redeploys unchanged. Unlike the sign-in attribute this is an
131
- ordinary in-place update on a live pool — but an unrecognised spelling still
131
+ ordinary in-place update on a live pool — but an unrecognized spelling still
132
132
  fails the deploy, because defaulting past it would refuse every registration
133
133
  while the config read as if it allowed them. See [Auth_SignUpMode]. */
134
134
  let _signUpMode = (~cfg: Pulumi.Config.t): Auth_SignUpMode.t => {
@@ -215,7 +215,7 @@ let _resolveUncached = (): cognitoUserPool => {
215
215
  // separate attachment resource — so the trigger is attached by a declared
216
216
  // resource that describes the pool, merges into what it finds, and sends the
217
217
  // result back whole. Never a hand-run command: that would leave the
218
- // deployment's behaviour depending on an act no source describes.
218
+ // deployment's behavior depending on an act no source describes.
219
219
  // The code hash is an input so a new build of the trigger reaches this
220
220
  // resource: the function ARN is stable, so it alone would let a broken
221
221
  // version onto the pool unchecked after the first deploy.
@@ -14,7 +14,7 @@ dimension; the bare spelling bought nothing.
14
14
  The three attribution facts are independent and all three are needed to identify
15
15
  a resource (see `ResourceAttribution`):
16
16
 
17
- - `~kind` — the modelling kind of the owning component (Aggregate, …)
17
+ - `~kind` — the modeling kind of the owning component (Aggregate, …)
18
18
  - `~role` — the deployment piece this resource implements (EventLog, Runtime, …)
19
19
  - `~scope` — component / plugin / platform
20
20
 
@@ -14,7 +14,7 @@
14
14
  attachment resource, so something has to call `UpdateUserPool` against a pool
15
15
  no stack owns. That belongs in a declared resource executed at deploy time,
16
16
  never a hand-run command against a live pool, which would leave the
17
- deployment's behaviour depending on an act no source describes.
17
+ deployment's behavior depending on an act no source describes.
18
18
 
19
19
  🚨 **The slot is the pool's, and this resource takes it only when it is
20
20
  free or already ours.** Cognito allows a pool exactly one
@@ -8,7 +8,7 @@
8
8
  // the pre-token-generation trigger ([Auth_ActiveRoleTrigger_Ops.res]) reads this
9
9
  // row on the next refresh and narrows the group claim to it. Nothing here can
10
10
  // grant anything: the trigger re-checks the stored role against real membership
11
- // before applying it, so a row is at most a request that the trigger may honour.
11
+ // before applying it, so a row is at most a request that the trigger may honor.
12
12
  //
13
13
  // 🚨 **The subject is taken from the verified identity, never from the arguments.**
14
14
  // The row key is `ctx.identity.sub` as the AppSync Cognito authorizer resolved it.
@@ -115,7 +115,7 @@ type appSyncEvent = {
115
115
  The name to address this caller by when asking Cognito what groups they are in.
116
116
 
117
117
  The username when the authorizer supplied one, the subject otherwise. The
118
- fallback is not a guess at a username: it is the behaviour this handler had
118
+ fallback is not a guess at a username: it is the behavior this handler had
119
119
  before the username was forwarded, kept for the pool shapes where it is correct —
120
120
  one whose username *is* the subject — rather than turning a working deployment
121
121
  into a hard failure on an absent field. Pure so the choice can be tested without
@@ -74,7 +74,7 @@ repaired for. So adoption checks the schema and refuses, rather than reporting
74
74
  success.
75
75
 
76
76
  The pre-`clientId` store is exactly this case: keyed on the subject alone. An
77
- operator upgrading meets a sentence instead of a silent misbehaviour.
77
+ operator upgrading meets a sentence instead of a silent misbehavior.
78
78
 
79
79
  Order-insensitive, because `DescribeTable` does not promise one.
80
80
  */
@@ -11,7 +11,7 @@
11
11
  //
12
12
  // * `fromAppSyncIdentity` — AppSync-resolver path. Reads the
13
13
  // already-validated identity context attached by AppSync to the
14
- // resolver event (`event.identity`). Recognises both the Cognito
14
+ // resolver event (`event.identity`). Recognizes both the Cognito
15
15
  // UserPool shape (`sub`, `username`, `claims['cognito:groups']`) and
16
16
  // the AWS_IAM additional-provider shape (`userArn`, `accountId`) used
17
17
  // by server-to-server lambdas signed via the existing IAM role.
@@ -44,7 +44,7 @@ let usernameAttributes = (identifier: t): array<string> =>
44
44
  /**
45
45
  The deploy-time choice, or why the deploy cannot proceed.
46
46
 
47
- An unrecognised spelling refuses rather than falling back to the default: a typo
47
+ An unrecognized spelling refuses rather than falling back to the default: a typo
48
48
  that defaulted would create a pool signing in on the wrong attribute, which is
49
49
  the one property no later deploy can correct.
50
50
  */
@@ -53,7 +53,7 @@ let allowAdminCreateUserOnly = (mode: t): bool =>
53
53
  /**
54
54
  The deploy-time choice, or why the deploy cannot proceed.
55
55
 
56
- An unrecognised spelling refuses rather than falling back to the default, and the
56
+ An unrecognized spelling refuses rather than falling back to the default, and the
57
57
  reason is *not* [Auth_LoginIdentifier]'s — this setting is correctable at any
58
58
  time. It is that the mistake would be silent. The default is closed, so a typo
59
59
  fails safe, but it fails safe *invisibly*: the deploy is green, the config says
@@ -138,7 +138,7 @@ let toItem = (
138
138
  item->Dict.set("tags", tagsJson->JSON.Encode.array)
139
139
 
140
140
  // Flatten meta.* to top-level item attributes so individual meta keys stay
141
- // GSI-projectable (matches the EventLog adapter behaviour). The DCB read
141
+ // GSI-projectable (matches the EventLog adapter behavior). The DCB read
142
142
  // path reassembles meta via `Reventless.Message.composeMeta`.
143
143
  event.meta
144
144
  ->ReventlessCore.Message.decomposeMeta
@@ -986,7 +986,7 @@ let appendUnconditional = async (
986
986
  // The synthetic fence tag is keyed on `getCompositePartitionKeyValue` — the same
987
987
  // value `derivePartitionKey` uses for the base-table `id` — so it is exactly as
988
988
  // selective as the entity's storage partition (and the `tag_composite` read
989
- // scope). Fencing per-member (the historical behaviour) gave every low-cardinality
989
+ // scope). Fencing per-member (the historical behavior) gave every low-cardinality
990
990
  // member (e.g. `environment`, `platformName`) its own fence, which a deploy-time
991
991
  // fan-out sharing those prefixes turns into a hot partition → `TransactionConflict`
992
992
  // → `retries exhausted`; it also over-fenced (two DISTINCT composite entities
@@ -14,7 +14,7 @@
14
14
  // its plugin's EventCollector SQS queue.
15
15
  //
16
16
  // All classic EventLogs in the platform share one selection, mirroring the DCB
17
- // toggle. Only the Single (sync/async) aggregate strategies honour it; the
17
+ // toggle. Only the Single (sync/async) aggregate strategies honor it; the
18
18
  // PerAggregate and Micro strategies stay DynamoDB-only.
19
19
 
20
20
  type selection = {
@@ -143,7 +143,7 @@ let emptyConnection = (): JSON.t =>
143
143
 
144
144
  // Spec-level authorization then the (optional) user interceptor — mirrors
145
145
  // QueryDbResolvers_GraphQL.runInterceptor. Denials return the kind's empty shape
146
- // (the provider-agnostic resolver behaviour), not an error.
146
+ // (the provider-agnostic resolver behavior), not an error.
147
147
  let runInterceptor = async (
148
148
  ~binding,
149
149
  ~payload,
@@ -192,7 +192,7 @@ let dispatch = async (
192
192
  | RefuseOwned => false
193
193
  | ScopeTo(field, required) => item->argStr(field)->Option.mapOr(false, v => v == required)
194
194
  }
195
- // The caller's request to see the archive, honoured only where the
195
+ // The caller's request to see the archive, honored only where the
196
196
  // classification says it counts.
197
197
  let askedForRetired =
198
198
  payload.arguments
@@ -1,5 +1,5 @@
1
1
  // Aggregate Lambda entry point.
2
- // At cold start: reads HANDLER_CONFIG, dynamically imports Spec+Behavior modules,
2
+ // At cold start: reads HANDLER_CONFIG, dynamically imports Spec+Decision modules,
3
3
  // wires EventLog_Operations, Aggregate_Callback, CommandTopic_Callback.
4
4
  // Handles both SQS CommandTopic events (Route 2) and AppSync direct invocation (Route 1).
5
5
 
@@ -135,7 +135,7 @@ async function checkPluginStatus(event) {
135
135
  // Postgres EventLog runtime; absence keeps the DynamoDB path byte-identical.
136
136
  // `eventLogTableName` doubles as the Postgres `event_log.log_name` discriminator
137
137
  // (all aggregates share one Postgres table, unlike DynamoDB's table-per-aggregate).
138
- function buildAggregateParts(specModule, behaviorModule, eventLogTableName, queueUrl, pgConnection) {
138
+ function buildAggregateParts(specModule, decisionModule, eventLogTableName, queueUrl, pgConnection) {
139
139
  const patchedSpec = patchSpecId(specModule);
140
140
  // Typed core: backend-specific EventLog storage ops (Postgres when pgConnection
141
141
  // is present, else DynamoDB). Returns the full 6-field EventLog_Adapter.operations
@@ -147,7 +147,7 @@ function buildAggregateParts(specModule, behaviorModule, eventLogTableName, queu
147
147
  eventTopic: { publish: async () => {} },
148
148
  storage: rawStorageOps,
149
149
  });
150
- const aggregateCallback = aggregateCallbackMake(patchedSpec)(behaviorModule)({
150
+ const aggregateCallback = aggregateCallbackMake(patchedSpec)(decisionModule)({
151
151
  Spec: patchedSpec,
152
152
  EventLog: { Spec: patchedSpec },
153
153
  eventLog: eventLogOps,
@@ -227,7 +227,7 @@ const DISPATCH_MODE = process.env["DISPATCH_MODE"] === "async" ? "async" : "sync
227
227
  // already-parsed `HANDLER_CONFIG` shape, with an injectable module loader. In
228
228
  // production, `buildAllHandlers` wraps this with the env config + the Lambda's
229
229
  // `/var/task/node_modules` dynamic import; the integration test injects a loader
230
- // returning pre-imported spec/behavior modules so it can drive the real
230
+ // returning pre-imported spec/decision modules so it can drive the real
231
231
  // cmdGenHandler end-to-end against DynamoDB Local. (Mirrors the DCB entry point.)
232
232
  export async function buildHandlersForConfig(config, opts = {}) {
233
233
  const loadModule = opts.loadModule ?? dynamicImport;
@@ -236,8 +236,8 @@ export async function buildHandlersForConfig(config, opts = {}) {
236
236
  const cmdGenHandlers = {};
237
237
  await Promise.all((config.handlers || []).map(async h => {
238
238
  const specModule = await loadModule(h.specModule);
239
- const behaviorModule = await loadModule(h.behaviorModule);
240
- const parts = buildAggregateParts(specModule, behaviorModule, h.eventLogTable, h.queueUrl, h.pgConnection);
239
+ const decisionModule = await loadModule(h.decisionModule);
240
+ const parts = buildAggregateParts(specModule, decisionModule, h.eventLogTable, h.queueUrl, h.pgConnection);
241
241
  // Pair each handler with the comp of the aggregate it belongs to: this
242
242
  // Lambda can host every aggregate in the platform, so the comp is what keeps
243
243
  // their log lines separable.
@@ -2,7 +2,7 @@
2
2
  //
3
3
  // The "typed core, thin shell" split (docs/plans/done/minimize-lambda-entrypoint-mjs-shell.md).
4
4
  // The `.mjs` shell owns the untyped seams — reading `HANDLER_CONFIG`, the dynamic
5
- // `import()` of user Spec/Behavior modules, and the functor wiring that consumes
5
+ // `import()` of user Spec/Decision modules, and the functor wiring that consumes
6
6
  // those runtime-loaded modules (`EventLog_Operations.Make`, `Aggregate_Callback.Make`,
7
7
  // `CommandTopic_Callback.Make`). This module owns the one piece that is pure
8
8
  // typed framework wiring: selecting and building the EventLog storage operations.