@reventlessdev/reventless-local 3.0.0-alpha.290 → 3.0.0-alpha.292

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 (53) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/package.json +11 -11
  3. package/src/BakedManifest.res +7 -2
  4. package/src/BakedManifest.res.mjs +4 -4
  5. package/src/HostShellDist.res +11 -0
  6. package/src/HostShellDist.res.mjs +14 -1
  7. package/src/Platform.res +31 -19
  8. package/src/Platform.res.mjs +63 -60
  9. package/src/ShellConfig.res +27 -24
  10. package/src/ShellConfig.res.mjs +25 -13
  11. package/src/UiHints.res +4 -6
  12. package/src/UiSlots.res +2 -3
  13. package/src/adapter/Auth/LocalAuth.res +2 -2
  14. package/src/adapter/Backend.res +2 -2
  15. package/src/adapter/LocalBus.res +1 -1
  16. package/src/adapter/LocalUploadResolvers.res +1 -1
  17. package/src/components/Aggregate_Builder.res +2 -2
  18. package/src/components/Aggregate_Builder.res.mjs +4 -4
  19. package/src/components/DcbEventLog_Builder.res +1 -1
  20. package/src/components/StateChangeSlice_Builder.res +3 -3
  21. package/src/components/StateChangeSlice_Builder.res.mjs +3 -3
  22. package/src/reset/LocalSeedReset.res +1 -1
  23. package/tests/HostShellDistTest.res +70 -0
  24. package/tests/HostShellDistTest.res.mjs +75 -0
  25. package/tests/ShellConfigTest.res +45 -7
  26. package/tests/ShellConfigTest.res.mjs +45 -8
  27. package/tests/adapter/BackendParityTest.res +1 -1
  28. package/tests/adapter/EventHistoryResolverTest.res +2 -2
  29. package/tests/adapter/GraphQL_SchemaInspectorTest.res +1 -1
  30. package/tests/adapter/LocalAuthLoginTest.res +1 -1
  31. package/tests/adapter/QueryDbListResolverTest.res +1 -1
  32. package/tests/adapter/QueryDbResolvedFieldsTest.res +1 -1
  33. package/tests/components/aggregate/AggregateFixtures.res +6 -6
  34. package/tests/components/aggregate/AggregateFixtures.res.mjs +3 -3
  35. package/tests/components/aggregate/AggregateSelfMappingFixtures.res +2 -2
  36. package/tests/components/aggregate/AggregateSelfMappingFixtures.res.mjs +3 -3
  37. package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res +4 -4
  38. package/tests/components/automationslice/AutomationSliceSelfDeadlockFixtures.res.mjs +4 -4
  39. package/tests/components/commandgenerator/CommandGeneratorFixtures.res +3 -3
  40. package/tests/components/commandgenerator/CommandGeneratorFixtures.res.mjs +4 -4
  41. package/tests/components/dcb/DcbCrossPartitionFixtures.res +2 -2
  42. package/tests/components/dcb/DcbCrossPartitionFixtures.res.mjs +2 -2
  43. package/tests/components/dcb/DcbFixtures.res +2 -2
  44. package/tests/components/dcb/DcbFixtures.res.mjs +2 -2
  45. package/tests/components/outboundtranslationslice/OutboundTranslationSliceFixtures.res +1 -1
  46. package/tests/components/outboundtranslationslice/OutboundTranslationSlicePlatformFixtures.res +2 -2
  47. package/tests/components/outboundtranslationslice/OutboundTranslationSlicePlatformFixtures.res.mjs +2 -2
  48. package/tests/components/readmodel/DcbReadModelE2EFixtures.res +2 -2
  49. package/tests/components/readmodel/DcbReadModelE2EFixtures.res.mjs +2 -2
  50. package/tests/plugin/{PluginBehavior_GWT.res → PluginDecision_GWT.res} +2 -2
  51. package/tests/plugin/{PluginBehavior_GWT.res.mjs → PluginDecision_GWT.res.mjs} +8 -8
  52. package/tests/plugin/UiFragmentRegistry_GWT.res +1 -1
  53. package/tests/plugin/UiFragmentRegistry_GWT.res.mjs +5 -5
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.292 (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.291 (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.290 (2026-10-17)
7
28
 
8
29
  **Note:** Version bump only for package @reventlessdev/reventless-local
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reventlessdev/reventless-local",
3
- "version": "3.0.0-alpha.290",
3
+ "version": "3.0.0-alpha.292",
4
4
  "description": "Local platform for Reventless (in-memory or SQLite backend, for development and testing without AWS)",
5
5
  "license": "Apache-2.0",
6
6
  "bin": {
@@ -35,18 +35,18 @@
35
35
  "sury": "11.0.0",
36
36
  "ws": "^8.18.0",
37
37
  "@reventlessdev/rescript-graphql-yoga": "1.0.0-alpha.29",
38
- "@reventlessdev/rescript-effect": "1.0.0-alpha.0",
39
- "@reventlessdev/rescript-jest": "1.0.0-alpha.12",
40
- "@reventlessdev/rescript-node": "2.0.0-alpha.22",
38
+ "@reventlessdev/rescript-jest": "1.0.0-alpha.13",
39
+ "@reventlessdev/rescript-effect": "1.0.0-alpha.1",
40
+ "@reventlessdev/rescript-node": "2.0.0-alpha.23",
41
41
  "@reventlessdev/rescript-mcp-sdk": "1.0.0-alpha.23",
42
42
  "@reventlessdev/rescript-pulumi-pulumi": "3.0.0-alpha.0",
43
- "@reventlessdev/reventless-core": "3.0.0-alpha.299",
44
- "@reventlessdev/reventless-graphql-server": "1.0.0-alpha.147",
45
- "@reventlessdev/reventless-gwt": "1.0.0-alpha.247",
46
- "@reventlessdev/reventless-postgres": "3.0.0-alpha.163",
47
- "@reventlessdev/reventless-infra": "3.0.0-alpha.196",
48
- "@reventlessdev/reventless-seed": "1.0.0-alpha.34",
49
- "@reventlessdev/reventless-spec": "3.0.0-alpha.168"
43
+ "@reventlessdev/reventless-core": "3.0.0-alpha.301",
44
+ "@reventlessdev/reventless-gwt": "1.0.0-alpha.249",
45
+ "@reventlessdev/reventless-infra": "3.0.0-alpha.198",
46
+ "@reventlessdev/reventless-graphql-server": "1.0.0-alpha.149",
47
+ "@reventlessdev/reventless-postgres": "3.0.0-alpha.165",
48
+ "@reventlessdev/reventless-seed": "1.0.0-alpha.35",
49
+ "@reventlessdev/reventless-spec": "3.0.0-alpha.170"
50
50
  },
51
51
  "devDependencies": {
52
52
  "rescript": "12.3.1",
@@ -1,5 +1,5 @@
1
1
  // Writes the curated component manifest where the local host shell serves its
2
- // static assets from (`HostShellDist`), so `manifestUrl` discovery works in dev
2
+ // static assets from (the chosen `assetsDir`, else `HostShellDist`), so `manifestUrl` discovery works in dev
3
3
  // exactly as it does in a deployment. Rewritten on every boot, which also makes
4
4
  // it self-healing — a `pnpm install` that replaces the package directory costs
5
5
  // one restart, not a debugging session.
@@ -30,6 +30,8 @@ let files = (~config: ReventlessInfra.Platform.bakedManifest): array<(
30
30
  let emit = (
31
31
  ~structures: array<(string, Reventless.Plugin.pluginStructure)>,
32
32
  ~config: ReventlessInfra.Platform.bakedManifest,
33
+ // The platform's chosen `assetsDir`; unset, the host-shell package's `dist/`.
34
+ ~dir: option<string>=?,
33
35
  ) => {
34
36
  let outputs = files(~config)
35
37
  // Every file is curated before any is written. A declaration naming a
@@ -42,7 +44,10 @@ let emit = (
42
44
  | Ok(manifest) => manifest
43
45
  },
44
46
  ))
45
- switch HostShellDist.dir() {
47
+ switch switch dir {
48
+ | Some(_) as given => given
49
+ | None => HostShellDist.dir()
50
+ } {
46
51
  | None =>
47
52
  JsError.throwWithMessage(
48
53
  `baked manifest: cannot resolve ${HostShellDist.package} from ${NodeProcess.cwd()} — ` ++
@@ -11,7 +11,7 @@ let log = Logger$ReventlessCore.fromEnv();
11
11
 
12
12
  let files = Platform_BakedManifest$ReventlessCore.files;
13
13
 
14
- function emit(structures, config) {
14
+ function emit(structures, config, dir) {
15
15
  let outputs = Platform_BakedManifest$ReventlessCore.files(config);
16
16
  let curated = outputs.map(param => {
17
17
  let e = Platform_BakedManifest$ReventlessCore.curate(structures, param[1]);
@@ -22,11 +22,11 @@ function emit(structures, config) {
22
22
  tmp
23
23
  ];
24
24
  });
25
- let dir = HostShellDist$ReventlessLocal.dir();
26
- if (dir !== undefined) {
25
+ let dir$1 = dir !== undefined ? dir : HostShellDist$ReventlessLocal.dir();
26
+ if (dir$1 !== undefined) {
27
27
  curated.forEach(param => {
28
28
  let key = param[0];
29
- let path = Nodepath.join(dir, key);
29
+ let path = Nodepath.join(dir$1, key);
30
30
  Nodefs.writeFileSync(path, JSON.stringify(param[1], undefined, 2), "utf8");
31
31
  log.info("BakedManifest", undefined, `wrote ` + key + `: ` + path);
32
32
  });
@@ -27,3 +27,14 @@ let dir = (): option<string> =>
27
27
  } catch {
28
28
  | _ => None
29
29
  }
30
+
31
+ /** The directory the local writers write into: the app's chosen `assetsDir`,
32
+ created if missing, else the package's `dist/`. */
33
+ let resolve = (~assetsDir: option<string>): option<string> =>
34
+ switch assetsDir {
35
+ | Some(chosen) =>
36
+ let absolute = NodePath.resolve([NodeProcess.cwd(), chosen])
37
+ NodeFs.mkdirSync(absolute, {recursive: true})
38
+ Some(absolute)
39
+ | None => dir()
40
+ }
@@ -1,5 +1,6 @@
1
1
  // Generated by ReScript, PLEASE EDIT WITH CARE
2
2
 
3
+ import * as Nodefs from "node:fs";
3
4
  import * as Nodepath from "node:path";
4
5
  import * as Nodemodule from "node:module";
5
6
 
@@ -13,8 +14,20 @@ function dir() {
13
14
  }
14
15
  }
15
16
 
17
+ function resolve(assetsDir) {
18
+ if (assetsDir === undefined) {
19
+ return dir();
20
+ }
21
+ let absolute = Nodepath.resolve(process.cwd(), assetsDir);
22
+ Nodefs.mkdirSync(absolute, {
23
+ recursive: true
24
+ });
25
+ return absolute;
26
+ }
27
+
16
28
  export {
17
29
  $$package,
18
30
  dir,
31
+ resolve,
19
32
  }
20
- /* node:path Not a pure module */
33
+ /* node:fs Not a pure module */
package/src/Platform.res CHANGED
@@ -585,21 +585,21 @@ module MakeWithConfig = (
585
585
  module Aggregate = {
586
586
  module Make = (
587
587
  Spec: Reventless.Aggregate.Spec,
588
- Behavior: Reventless.Behavior.T with module Spec := Spec,
588
+ Decision: Reventless.Decision.T with module Spec := Spec,
589
589
  EventMappings: ReventlessInfra.EventMapper.Mappings with module Target := Spec,
590
590
  ): (ReventlessInfra.Aggregate.T with type api = unit) => AggregateMaker.Make(
591
591
  Spec,
592
- Behavior,
592
+ Decision,
593
593
  EventMappings,
594
594
  )
595
595
  /** Async variant — in-memory uses the same channel (no FIFO distinction). */
596
596
  module MakeAsync = (
597
597
  Spec: Reventless.Aggregate.Spec,
598
- Behavior: Reventless.Behavior.T with module Spec := Spec,
598
+ Decision: Reventless.Decision.T with module Spec := Spec,
599
599
  EventMappings: ReventlessInfra.EventMapper.Mappings with module Target := Spec,
600
600
  ): (ReventlessInfra.Aggregate.T with type api = unit) => AggregateMaker.Make(
601
601
  Spec,
602
- Behavior,
602
+ Decision,
603
603
  EventMappings,
604
604
  )
605
605
  }
@@ -717,16 +717,16 @@ module MakeWithConfig = (
717
717
  module StateChangeSlice = {
718
718
  module Make = (
719
719
  Spec: Reventless.StateChangeSlice.Spec,
720
- Behavior: Reventless.StateChangeSlice.Behavior with module Spec := Spec,
720
+ Decision: Reventless.StateChangeSlice.Decision with module Spec := Spec,
721
721
  ): (
722
722
  ReventlessInfra.StateChangeSlice.T with module Spec = Spec
723
- ) => StateChangeSlice_Builder.Make(Spec, Behavior)
723
+ ) => StateChangeSlice_Builder.Make(Spec, Decision)
724
724
  /** Async variant — in-memory uses the same channel (no FIFO distinction). */
725
725
  module MakeAsync = (
726
726
  Spec: Reventless.StateChangeSlice.Spec,
727
- Behavior: Reventless.StateChangeSlice.Behavior with module Spec := Spec,
727
+ Decision: Reventless.StateChangeSlice.Decision with module Spec := Spec,
728
728
  ): (ReventlessInfra.StateChangeSlice.T with module Spec = Spec) => {
729
- include StateChangeSlice_Builder.Make(Spec, Behavior)
729
+ include StateChangeSlice_Builder.Make(Spec, Decision)
730
730
  let isAsync = true
731
731
  }
732
732
  }
@@ -746,7 +746,7 @@ module MakeWithConfig = (
746
746
  // Built once and passed into Admin.construct below.
747
747
  module UiFragmentRegistrySlice = StateChangeSlice.Make(
748
748
  ReventlessCore.UiFragmentRegistry,
749
- ReventlessCore.UiFragmentRegistry_Behavior,
749
+ ReventlessCore.UiFragmentRegistry_Decision,
750
750
  )
751
751
  module UiFragmentsViewSlice = StateViewSlice.Make(
752
752
  ReventlessCore.UiFragments,
@@ -822,7 +822,7 @@ module MakeWithConfig = (
822
822
  module LocalPluginAggregate: ReventlessInfra.Aggregate.T
823
823
  with type api = unit = AggregateMaker.Make(
824
824
  ReventlessCore.PluginSpec,
825
- ReventlessCore.PluginBehavior,
825
+ ReventlessCore.PluginDecision,
826
826
  ReventlessInfra.NoEventMappings.Make(ReventlessCore.PluginSpec),
827
827
  )
828
828
 
@@ -879,7 +879,7 @@ module MakeWithConfig = (
879
879
  // Per-session server ports for the VS Code local platform runner (features
880
880
  // plan Phase 9). The runner spawns one platform child per app folder; default
881
881
  // ports (4000/4001/3001/3002) collide when several run, so each is overridable
882
- // via env. Defaults preserve today's behaviour for all non-runner callers.
882
+ // via env. Defaults preserve today's behavior for all non-runner callers.
883
883
  let resolvePort = (key, fallback) =>
884
884
  NodeProcess.env->Dict.get(key)->Option.flatMap(v => Int.fromString(v))->Option.getOr(fallback)
885
885
  let domainPort = resolvePort("REVENTLESS_DOMAIN_PORT", 4000)
@@ -928,6 +928,7 @@ module MakeWithConfig = (
928
928
  let bakeManifest = (
929
929
  ~pluginComponents: array<ReventlessCore.Plugin.component>,
930
930
  ~config: ReventlessInfra.Platform.bakedManifest,
931
+ ~dir: option<string>,
931
932
  ) => {
932
933
  let resolved: array<(string, Reventless.Plugin.pluginStructure)> = []
933
934
  let expected = pluginComponents->Array.length
@@ -942,7 +943,7 @@ module MakeWithConfig = (
942
943
  | None => ()
943
944
  }
944
945
  if resolved->Array.length === expected {
945
- BakedManifest.emit(~structures=resolved, ~config)
946
+ BakedManifest.emit(~structures=resolved, ~config, ~dir?)
946
947
  }
947
948
  })
948
949
  })
@@ -1518,13 +1519,15 @@ module MakeWithConfig = (
1518
1519
  })
1519
1520
 
1520
1521
  // In-memory ignores the infrastructure half of `~hostUiBundle` — the host shell
1521
- // is served from the installed package's own `dist/`, not from a CDN. What a
1522
- // deployment *says* is honoured, in the same three files the AWS deploy writes
1522
+ // is served from a local directory (`assetsDir`, else the installed package's
1523
+ // own `dist/`), not from a CDN. What a deployment *says* is honored, in the same files the AWS deploy writes
1523
1524
  // beside each other: `bakedManifest` through `BakedManifest`, `shellConfig`
1524
1525
  // through `ShellConfig`, which overlays the served `config.json` the way the
1525
1526
  // AWS deploy composes the one it writes, and `uiHintsFile` through `UiHints`,
1526
1527
  // which replaces the served hints file the way the deploy uploads it.
1527
1528
  type hostUiBundleConfig = {
1529
+ // Where every file below is written, as on AWS. Unset: the host-shell
1530
+ // package's `dist/`.
1528
1531
  assetsDir?: string,
1529
1532
  bundleVersion?: string,
1530
1533
  // `makePlatform` serves the declared file in place of the host-shell
@@ -1736,7 +1739,14 @@ module MakeWithConfig = (
1736
1739
  // structure Output to land. Unconditional, unlike the bake, because it is
1737
1740
  // also what restores the shipped file for a platform that has stopped
1738
1741
  // declaring anything.
1742
+ //
1743
+ // All four writers share one directory, resolved once: a second opinion puts
1744
+ // a file where nothing reads it.
1745
+ let hostUiDir = HostShellDist.resolve(
1746
+ ~assetsDir=hostUiBundle->Option.flatMap(cfg => cfg.assetsDir),
1747
+ )
1739
1748
  ShellConfig.emit(
1749
+ ~dir=?hostUiDir,
1740
1750
  ~bakedManifest=hostUiBundle->Option.flatMap(cfg => cfg.bakedManifest),
1741
1751
  // Names the module `UiSlots.emit` serves below. Both or neither: a key
1742
1752
  // without the file is a 404 the shell survives quietly, and a file without
@@ -1747,7 +1757,7 @@ module MakeWithConfig = (
1747
1757
  // Unconditional for the same reason, and one file over: it is also what
1748
1758
  // restores the shell package's own hints for a platform that has stopped
1749
1759
  // declaring its own.
1750
- UiHints.emit(~uiHintsFile=hostUiBundle->Option.flatMap(cfg => cfg.uiHintsFile))
1760
+ UiHints.emit(~uiHintsFile=hostUiBundle->Option.flatMap(cfg => cfg.uiHintsFile), ~dir=?hostUiDir)
1751
1761
  // The dev loop for the file just written. Editing hints is presentation
1752
1762
  // work — you change a label, you want to see the label — and routing that
1753
1763
  // through a platform restart puts fifteen seconds between the two. The
@@ -1759,20 +1769,22 @@ module MakeWithConfig = (
1759
1769
  // would imply a shutdown path this platform does not have.
1760
1770
  let _ = UiHints.watch(
1761
1771
  ~uiHintsFile=hostUiBundle->Option.flatMap(cfg => cfg.uiHintsFile),
1772
+ ~dir=?hostUiDir,
1762
1773
  ~onReload=LocalEvents_Server.broadcastUiHintsChanged,
1763
1774
  )
1764
1775
  // The same pair for the module that draws what a hint cannot say. Also
1765
1776
  // unconditional, and for a reason the hints file does not have: this is what
1766
1777
  // removes a module a platform has stopped declaring, and leaving one behind
1767
1778
  // would go on drawing regions with nothing in the deployment to explain it.
1768
- UiSlots.emit(~uiSlotsFile=hostUiBundle->Option.flatMap(cfg => cfg.uiSlotsFile))
1779
+ UiSlots.emit(~uiSlotsFile=hostUiBundle->Option.flatMap(cfg => cfg.uiSlotsFile), ~dir=?hostUiDir)
1769
1780
  let _ = UiSlots.watch(
1770
1781
  ~uiSlotsFile=hostUiBundle->Option.flatMap(cfg => cfg.uiSlotsFile),
1782
+ ~dir=?hostUiDir,
1771
1783
  ~onReload=LocalEvents_Server.broadcastUiSlotsChanged,
1772
1784
  )
1773
1785
  switch hostUiBundle->Option.flatMap(cfg => cfg.bakedManifest) {
1774
1786
  | None => ()
1775
- | Some(cfg) => bakeManifest(~pluginComponents=plugins, ~config=cfg)
1787
+ | Some(cfg) => bakeManifest(~pluginComponents=plugins, ~config=cfg, ~dir=hostUiDir)
1776
1788
  }
1777
1789
  switch (projectionCatchup, pgProjectionCatchup) {
1778
1790
  | (Some((db, upperBound, dcbUpperBound)), _) =>
@@ -2184,7 +2196,7 @@ module MakeWithConfig = (
2184
2196
  // own explicit `Platform_UIFragments` flat-array resolver registered
2185
2197
  // above; it isn't exposed as an MCP resource because the auto-generated
2186
2198
  // single/list field shape was removed when the auto-generated query
2187
- // entry was dropped in favour of that explicit field.
2199
+ // entry was dropped in favor of that explicit field.
2188
2200
  let adminFieldToQueryDb = Dict.fromArray([
2189
2201
  (singleQueryField, pluginQueryDbName),
2190
2202
  (listQueryField, pluginQueryDbName),
@@ -2463,7 +2475,7 @@ module MakeWithConfig = (
2463
2475
  | Platform => None
2464
2476
  }
2465
2477
 
2466
- // Each plugin creates its own scheduler (mirrors AWS behaviour).
2478
+ // Each plugin creates its own scheduler (mirrors AWS behavior).
2467
2479
  let scheduler = makeScheduler()
2468
2480
  hooks.scheduler := Some(scheduler)
2469
2481
  hooks.api := Some({val: ()->Obj.magic})
@@ -38,9 +38,10 @@ import * as ComponentType$ReventlessCore from "@reventlessdev/reventless-core/sr
38
38
  import * as SqliteDriver$ReventlessLocal from "./adapter/SqliteDriver.res.mjs";
39
39
  import * as Task_Builder$ReventlessLocal from "./components/Task_Builder.res.mjs";
40
40
  import * as BakedManifest$ReventlessLocal from "./BakedManifest.res.mjs";
41
+ import * as HostShellDist$ReventlessLocal from "./HostShellDist.res.mjs";
41
42
  import * as LocalEventTap$ReventlessLocal from "./adapter/LocalEventTap.res.mjs";
42
43
  import * as Platform_Admin$ReventlessCore from "@reventlessdev/reventless-core/src/admin/Platform_Admin.res.mjs";
43
- import * as PluginBehavior$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginBehavior.res.mjs";
44
+ import * as PluginDecision$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/lifecycle/PluginDecision.res.mjs";
44
45
  import * as Plugin_Helpers$ReventlessCore from "@reventlessdev/reventless-core/src/plugin/component/Plugin_Helpers.res.mjs";
45
46
  import * as Plugin_Builder$ReventlessLocal from "./components/Plugin_Builder.res.mjs";
46
47
  import * as Counter_Builder$ReventlessLocal from "./components/Counter_Builder.res.mjs";
@@ -96,7 +97,7 @@ import * as StateChangeSlice_Builder$ReventlessLocal from "./components/StateCha
96
97
  import * as DcbEventLogStorage_Sqlite$ReventlessLocal from "./adapter/DcbEventLog/DcbEventLogStorage_Sqlite.res.mjs";
97
98
  import * as LocalEventCollectorChannel$ReventlessLocal from "./adapter/EventCollector/LocalEventCollectorChannel.res.mjs";
98
99
  import * as PluginRuntime_Builder_Micro$ReventlessCore from "@reventlessdev/reventless-core/src/adapter/Runtime/PluginRuntime_Builder_Micro.res.mjs";
99
- import * as UiFragmentRegistry_Behavior$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChange/UiFragmentRegistry_Behavior.res.mjs";
100
+ import * as UiFragmentRegistry_Decision$ReventlessCore from "@reventlessdev/reventless-core/src/admin/UiFragmentRegistry/StateChange/UiFragmentRegistry_Decision.res.mjs";
100
101
  import * as Platform_PluginStructuresApi$ReventlessCore from "@reventlessdev/reventless-core/src/admin/Platform_PluginStructuresApi.res.mjs";
101
102
  import * as EventHistoryResolvers_GraphQL$ReventlessLocal from "./adapter/EventHistory/EventHistoryResolvers_GraphQL.res.mjs";
102
103
  import * as InboundTranslationSlice_Builder$ReventlessLocal from "./components/InboundTranslationSlice_Builder.res.mjs";
@@ -488,8 +489,8 @@ function MakeWithConfig(Config) {
488
489
  let AutomationSliceMaker = AutomationSlice_Builder$ReventlessLocal.Make(Bus);
489
490
  let OutboundTranslationSliceMaker = OutboundTranslationSlice_Builder$ReventlessLocal.Make(Bus);
490
491
  let InboundTranslationSliceMaker = InboundTranslationSlice_Builder$ReventlessLocal.Make(Bus);
491
- let Make = Spec => (Behavior => (EventMappings => {
492
- let $$let = AggregateMaker.Make(Spec)(Behavior)(EventMappings);
492
+ let Make = Spec => (Decision => (EventMappings => {
493
+ let $$let = AggregateMaker.Make(Spec)(Decision)(EventMappings);
493
494
  return {
494
495
  Spec: $$let.Spec,
495
496
  make: $$let.make,
@@ -498,8 +499,8 @@ function MakeWithConfig(Config) {
498
499
  finish: $$let.finish
499
500
  };
500
501
  }));
501
- let MakeAsync = Spec => (Behavior => (EventMappings => {
502
- let $$let = AggregateMaker.Make(Spec)(Behavior)(EventMappings);
502
+ let MakeAsync = Spec => (Decision => (EventMappings => {
503
+ let $$let = AggregateMaker.Make(Spec)(Decision)(EventMappings);
503
504
  return {
504
505
  Spec: $$let.Spec,
505
506
  make: $$let.make,
@@ -609,20 +610,20 @@ function MakeWithConfig(Config) {
609
610
  Make: Make$5
610
611
  };
611
612
  let Counter = Counter_Builder$ReventlessLocal.Make(Bus);
612
- let Make$6 = Spec => (Behavior => {
613
- let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Behavior);
613
+ let Make$6 = Spec => (Decision => {
614
+ let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Decision);
614
615
  return {
615
616
  Spec: $$let.Spec,
616
- Behavior: $$let.Behavior,
617
+ Decision: $$let.Decision,
617
618
  isAsync: $$let.isAsync,
618
619
  make: $$let.make
619
620
  };
620
621
  });
621
- let MakeAsync$1 = Spec => (Behavior => {
622
- let include = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Behavior);
622
+ let MakeAsync$1 = Spec => (Decision => {
623
+ let include = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Decision);
623
624
  return {
624
625
  Spec: include.Spec,
625
- Behavior: include.Behavior,
626
+ Decision: include.Decision,
626
627
  isAsync: true,
627
628
  make: include.make
628
629
  };
@@ -654,20 +655,20 @@ function MakeWithConfig(Config) {
654
655
  traits: UiFragmentRegistry$ReventlessCore.traits,
655
656
  readConsistency: UiFragmentRegistry$ReventlessCore.readConsistency
656
657
  };
657
- let Behavior = {
658
+ let Decision = {
658
659
  initialState: undefined,
659
- evolve: UiFragmentRegistry_Behavior$ReventlessCore.evolve,
660
- decide: UiFragmentRegistry_Behavior$ReventlessCore.decide,
661
- moduleUrl: UiFragmentRegistry_Behavior$ReventlessCore.moduleUrl
660
+ evolve: UiFragmentRegistry_Decision$ReventlessCore.evolve,
661
+ decide: UiFragmentRegistry_Decision$ReventlessCore.decide,
662
+ moduleUrl: UiFragmentRegistry_Decision$ReventlessCore.moduleUrl
662
663
  };
663
- let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Behavior);
664
+ let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Decision);
664
665
  let UiFragmentRegistrySlice_Spec = $$let.Spec;
665
- let UiFragmentRegistrySlice_Behavior = $$let.Behavior;
666
+ let UiFragmentRegistrySlice_Decision = $$let.Decision;
666
667
  let UiFragmentRegistrySlice_isAsync = $$let.isAsync;
667
668
  let UiFragmentRegistrySlice_make = $$let.make;
668
669
  let UiFragmentRegistrySlice = {
669
670
  Spec: UiFragmentRegistrySlice_Spec,
670
- Behavior: UiFragmentRegistrySlice_Behavior,
671
+ Decision: UiFragmentRegistrySlice_Decision,
671
672
  isAsync: UiFragmentRegistrySlice_isAsync,
672
673
  make: UiFragmentRegistrySlice_make
673
674
  };
@@ -765,11 +766,11 @@ function MakeWithConfig(Config) {
765
766
  commandTransition: PluginSpec$ReventlessCore.commandTransition,
766
767
  traits: PluginSpec$ReventlessCore.traits
767
768
  })({
768
- initialState: PluginBehavior$ReventlessCore.initialState,
769
- evolve: PluginBehavior$ReventlessCore.evolve,
770
- decide: PluginBehavior$ReventlessCore.decide,
769
+ initialState: PluginDecision$ReventlessCore.initialState,
770
+ evolve: PluginDecision$ReventlessCore.evolve,
771
+ decide: PluginDecision$ReventlessCore.decide,
771
772
  snapshot: undefined,
772
- moduleUrl: PluginBehavior$ReventlessCore.moduleUrl
773
+ moduleUrl: PluginDecision$ReventlessCore.moduleUrl
773
774
  })(NoEventMappings$ReventlessInfra.Make({
774
775
  name: PluginSpec$ReventlessCore.name,
775
776
  Id: Id$Reventless.$$String,
@@ -860,7 +861,7 @@ function MakeWithConfig(Config) {
860
861
  let pluginStructuresStore = {
861
862
  contents: {}
862
863
  };
863
- let bakeManifest = (pluginComponents, config) => {
864
+ let bakeManifest = (pluginComponents, config, dir) => {
864
865
  let resolved = [];
865
866
  let expected = pluginComponents.length;
866
867
  pluginComponents.forEach(plugin => {
@@ -877,7 +878,7 @@ function MakeWithConfig(Config) {
877
878
  ]);
878
879
  }
879
880
  if (resolved.length === expected) {
880
- return BakedManifest$ReventlessLocal.emit(resolved, config);
881
+ return BakedManifest$ReventlessLocal.emit(resolved, config, dir);
881
882
  }
882
883
  });
883
884
  });
@@ -1330,14 +1331,15 @@ function MakeWithConfig(Config) {
1330
1331
  adminResources: []
1331
1332
  });
1332
1333
  subscribeToPluginEvents();
1333
- ShellConfig$ReventlessLocal.emit(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.bakedManifest), Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiSlotsFile), Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.shellConfig), undefined);
1334
- UiHints$ReventlessLocal.emit(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiHintsFile), undefined);
1335
- UiHints$ReventlessLocal.watch(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiHintsFile), undefined, LocalEvents_Server$ReventlessLocal.broadcastUiHintsChanged);
1336
- UiSlots$ReventlessLocal.emit(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiSlotsFile), undefined);
1337
- UiSlots$ReventlessLocal.watch(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiSlotsFile), undefined, LocalEvents_Server$ReventlessLocal.broadcastUiSlotsChanged);
1334
+ let hostUiDir = HostShellDist$ReventlessLocal.resolve(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.assetsDir));
1335
+ ShellConfig$ReventlessLocal.emit(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.bakedManifest), Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiSlotsFile), Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.shellConfig), hostUiDir);
1336
+ UiHints$ReventlessLocal.emit(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiHintsFile), hostUiDir);
1337
+ UiHints$ReventlessLocal.watch(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiHintsFile), hostUiDir, LocalEvents_Server$ReventlessLocal.broadcastUiHintsChanged);
1338
+ UiSlots$ReventlessLocal.emit(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiSlotsFile), hostUiDir);
1339
+ UiSlots$ReventlessLocal.watch(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiSlotsFile), hostUiDir, LocalEvents_Server$ReventlessLocal.broadcastUiSlotsChanged);
1338
1340
  let cfg = Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.bakedManifest);
1339
1341
  if (cfg !== undefined) {
1340
- bakeManifest(plugins$1, cfg);
1342
+ bakeManifest(plugins$1, cfg, hostUiDir);
1341
1343
  }
1342
1344
  if (projectionCatchup !== undefined) {
1343
1345
  Stdlib_Promise.$$catch(ProjectionCheckpoint$ReventlessLocal.startupCatchup(projectionCatchup[0], projectionCatchup[1], projectionCatchup[2], () => Bus.projectionCatchupHandlers()), e => {
@@ -2248,8 +2250,8 @@ function Make($star) {
2248
2250
  let AutomationSliceMaker = AutomationSlice_Builder$ReventlessLocal.Make(Bus);
2249
2251
  let OutboundTranslationSliceMaker = OutboundTranslationSlice_Builder$ReventlessLocal.Make(Bus);
2250
2252
  let InboundTranslationSliceMaker = InboundTranslationSlice_Builder$ReventlessLocal.Make(Bus);
2251
- let Make$1 = Spec => (Behavior => (EventMappings => {
2252
- let $$let = AggregateMaker.Make(Spec)(Behavior)(EventMappings);
2253
+ let Make$1 = Spec => (Decision => (EventMappings => {
2254
+ let $$let = AggregateMaker.Make(Spec)(Decision)(EventMappings);
2253
2255
  return {
2254
2256
  Spec: $$let.Spec,
2255
2257
  make: $$let.make,
@@ -2258,8 +2260,8 @@ function Make($star) {
2258
2260
  finish: $$let.finish
2259
2261
  };
2260
2262
  }));
2261
- let MakeAsync = Spec => (Behavior => (EventMappings => {
2262
- let $$let = AggregateMaker.Make(Spec)(Behavior)(EventMappings);
2263
+ let MakeAsync = Spec => (Decision => (EventMappings => {
2264
+ let $$let = AggregateMaker.Make(Spec)(Decision)(EventMappings);
2263
2265
  return {
2264
2266
  Spec: $$let.Spec,
2265
2267
  make: $$let.make,
@@ -2369,20 +2371,20 @@ function Make($star) {
2369
2371
  Make: Make$6
2370
2372
  };
2371
2373
  let Counter = Counter_Builder$ReventlessLocal.Make(Bus);
2372
- let Make$7 = Spec => (Behavior => {
2373
- let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Behavior);
2374
+ let Make$7 = Spec => (Decision => {
2375
+ let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Decision);
2374
2376
  return {
2375
2377
  Spec: $$let.Spec,
2376
- Behavior: $$let.Behavior,
2378
+ Decision: $$let.Decision,
2377
2379
  isAsync: $$let.isAsync,
2378
2380
  make: $$let.make
2379
2381
  };
2380
2382
  });
2381
- let MakeAsync$1 = Spec => (Behavior => {
2382
- let include = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Behavior);
2383
+ let MakeAsync$1 = Spec => (Decision => {
2384
+ let include = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Decision);
2383
2385
  return {
2384
2386
  Spec: include.Spec,
2385
- Behavior: include.Behavior,
2387
+ Decision: include.Decision,
2386
2388
  isAsync: true,
2387
2389
  make: include.make
2388
2390
  };
@@ -2414,20 +2416,20 @@ function Make($star) {
2414
2416
  traits: UiFragmentRegistry$ReventlessCore.traits,
2415
2417
  readConsistency: UiFragmentRegistry$ReventlessCore.readConsistency
2416
2418
  };
2417
- let Behavior = {
2419
+ let Decision = {
2418
2420
  initialState: undefined,
2419
- evolve: UiFragmentRegistry_Behavior$ReventlessCore.evolve,
2420
- decide: UiFragmentRegistry_Behavior$ReventlessCore.decide,
2421
- moduleUrl: UiFragmentRegistry_Behavior$ReventlessCore.moduleUrl
2421
+ evolve: UiFragmentRegistry_Decision$ReventlessCore.evolve,
2422
+ decide: UiFragmentRegistry_Decision$ReventlessCore.decide,
2423
+ moduleUrl: UiFragmentRegistry_Decision$ReventlessCore.moduleUrl
2422
2424
  };
2423
- let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Behavior);
2425
+ let $$let = StateChangeSlice_Builder$ReventlessLocal.Make(Spec)(Decision);
2424
2426
  let UiFragmentRegistrySlice_Spec = $$let.Spec;
2425
- let UiFragmentRegistrySlice_Behavior = $$let.Behavior;
2427
+ let UiFragmentRegistrySlice_Decision = $$let.Decision;
2426
2428
  let UiFragmentRegistrySlice_isAsync = $$let.isAsync;
2427
2429
  let UiFragmentRegistrySlice_make = $$let.make;
2428
2430
  let UiFragmentRegistrySlice = {
2429
2431
  Spec: UiFragmentRegistrySlice_Spec,
2430
- Behavior: UiFragmentRegistrySlice_Behavior,
2432
+ Decision: UiFragmentRegistrySlice_Decision,
2431
2433
  isAsync: UiFragmentRegistrySlice_isAsync,
2432
2434
  make: UiFragmentRegistrySlice_make
2433
2435
  };
@@ -2525,11 +2527,11 @@ function Make($star) {
2525
2527
  commandTransition: PluginSpec$ReventlessCore.commandTransition,
2526
2528
  traits: PluginSpec$ReventlessCore.traits
2527
2529
  })({
2528
- initialState: PluginBehavior$ReventlessCore.initialState,
2529
- evolve: PluginBehavior$ReventlessCore.evolve,
2530
- decide: PluginBehavior$ReventlessCore.decide,
2530
+ initialState: PluginDecision$ReventlessCore.initialState,
2531
+ evolve: PluginDecision$ReventlessCore.evolve,
2532
+ decide: PluginDecision$ReventlessCore.decide,
2531
2533
  snapshot: undefined,
2532
- moduleUrl: PluginBehavior$ReventlessCore.moduleUrl
2534
+ moduleUrl: PluginDecision$ReventlessCore.moduleUrl
2533
2535
  })(NoEventMappings$ReventlessInfra.Make({
2534
2536
  name: PluginSpec$ReventlessCore.name,
2535
2537
  Id: Id$Reventless.$$String,
@@ -2620,7 +2622,7 @@ function Make($star) {
2620
2622
  let pluginStructuresStore = {
2621
2623
  contents: {}
2622
2624
  };
2623
- let bakeManifest = (pluginComponents, config) => {
2625
+ let bakeManifest = (pluginComponents, config, dir) => {
2624
2626
  let resolved = [];
2625
2627
  let expected = pluginComponents.length;
2626
2628
  pluginComponents.forEach(plugin => {
@@ -2637,7 +2639,7 @@ function Make($star) {
2637
2639
  ]);
2638
2640
  }
2639
2641
  if (resolved.length === expected) {
2640
- return BakedManifest$ReventlessLocal.emit(resolved, config);
2642
+ return BakedManifest$ReventlessLocal.emit(resolved, config, dir);
2641
2643
  }
2642
2644
  });
2643
2645
  });
@@ -3085,14 +3087,15 @@ function Make($star) {
3085
3087
  adminResources: []
3086
3088
  });
3087
3089
  subscribeToPluginEvents();
3088
- ShellConfig$ReventlessLocal.emit(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.bakedManifest), Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiSlotsFile), Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.shellConfig), undefined);
3089
- UiHints$ReventlessLocal.emit(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiHintsFile), undefined);
3090
- UiHints$ReventlessLocal.watch(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiHintsFile), undefined, LocalEvents_Server$ReventlessLocal.broadcastUiHintsChanged);
3091
- UiSlots$ReventlessLocal.emit(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiSlotsFile), undefined);
3092
- UiSlots$ReventlessLocal.watch(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiSlotsFile), undefined, LocalEvents_Server$ReventlessLocal.broadcastUiSlotsChanged);
3090
+ let hostUiDir = HostShellDist$ReventlessLocal.resolve(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.assetsDir));
3091
+ ShellConfig$ReventlessLocal.emit(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.bakedManifest), Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiSlotsFile), Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.shellConfig), hostUiDir);
3092
+ UiHints$ReventlessLocal.emit(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiHintsFile), hostUiDir);
3093
+ UiHints$ReventlessLocal.watch(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiHintsFile), hostUiDir, LocalEvents_Server$ReventlessLocal.broadcastUiHintsChanged);
3094
+ UiSlots$ReventlessLocal.emit(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiSlotsFile), hostUiDir);
3095
+ UiSlots$ReventlessLocal.watch(Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.uiSlotsFile), hostUiDir, LocalEvents_Server$ReventlessLocal.broadcastUiSlotsChanged);
3093
3096
  let cfg = Stdlib_Option.flatMap(hostUiBundle, cfg => cfg.bakedManifest);
3094
3097
  if (cfg !== undefined) {
3095
- bakeManifest(plugins$1, cfg);
3098
+ bakeManifest(plugins$1, cfg, hostUiDir);
3096
3099
  }
3097
3100
  if (projectionCatchup !== undefined) {
3098
3101
  Stdlib_Promise.$$catch(ProjectionCheckpoint$ReventlessLocal.startupCatchup(projectionCatchup[0], projectionCatchup[1], projectionCatchup[2], () => Bus.projectionCatchupHandlers()), e => {