@kosdev-code/kos-dispense-sdk 0.1.0-next.970 → 0.1.0-next.975

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 (50) hide show
  1. package/.kos.json +7 -0
  2. package/{dispense-registration-manager-Da9CW_cN.js → dispense-registration-manager-J59_vyyY.js} +584 -184
  3. package/dispense-registration-manager-J59_vyyY.js.map +1 -0
  4. package/{dispense-registration-manager-Dtb31fcI.cjs → dispense-registration-manager-OYGAiIZy.cjs} +551 -151
  5. package/dispense-registration-manager-OYGAiIZy.cjs.map +1 -0
  6. package/{extension-utils-D_dnBLH6.js → extension-utils-DEM1emOY.js} +2 -2
  7. package/{extension-utils-D_dnBLH6.js.map → extension-utils-DEM1emOY.js.map} +1 -1
  8. package/{extension-utils-Cfhe358W.cjs → extension-utils-Pd5ntKtv.cjs} +2 -2
  9. package/{extension-utils-Cfhe358W.cjs.map → extension-utils-Pd5ntKtv.cjs.map} +1 -1
  10. package/index.cjs +6 -4
  11. package/index.cjs.map +1 -1
  12. package/index.js +66 -64
  13. package/models/models/cui-kit-state/cui-kit-state-model.d.ts +131 -0
  14. package/models/models/cui-kit-state/cui-kit-state-model.d.ts.map +1 -0
  15. package/models/models/cui-kit-state/index.d.ts +4 -0
  16. package/models/models/cui-kit-state/index.d.ts.map +1 -0
  17. package/models/models/cui-kit-state/types/index.d.ts +68 -0
  18. package/models/models/index.d.ts +1 -0
  19. package/models/models/index.d.ts.map +1 -1
  20. package/models/utils/dispense-registration-manager.d.ts +13 -0
  21. package/models/utils/dispense-registration-manager.d.ts.map +1 -1
  22. package/models/utils/pour-context.d.ts +8 -0
  23. package/models/utils/pour-context.d.ts.map +1 -0
  24. package/models.cjs +4 -2
  25. package/models.cjs.map +1 -1
  26. package/models.js +17 -15
  27. package/package.json +5 -5
  28. package/{pump-provider-uNNMh9uh.cjs → pump-provider-BSbTT-BC.cjs} +371 -418
  29. package/pump-provider-BSbTT-BC.cjs.map +1 -0
  30. package/{pump-provider-BQmCKz7S.js → pump-provider-Ch7NOeRj.js} +417 -464
  31. package/pump-provider-Ch7NOeRj.js.map +1 -0
  32. package/ui/contexts/cui-kit/cui-kit.d.ts +12 -1
  33. package/ui/contexts/cui-kit/cui-kit.d.ts.map +1 -1
  34. package/ui/hooks/cui-kit/use-cui-kit.d.ts +44 -5
  35. package/ui/hooks/cui-kit/use-cui-kit.d.ts.map +1 -1
  36. package/ui/hooks/utils/pour-strategy/hold-to-pour-intent-strategy.d.ts.map +1 -1
  37. package/ui/hooks/utils/pour-strategy/hold-to-pour-strategy.d.ts.map +1 -1
  38. package/ui/hooks/utils/pour-strategy/pour-strategy.d.ts +2 -0
  39. package/ui/hooks/utils/pour-strategy/pour-strategy.d.ts.map +1 -1
  40. package/ui/hooks/utils/pour-strategy/tap-or-hold-to-pour-intent-strategy.d.ts.map +1 -1
  41. package/ui/utils/pour-context.d.ts +1 -7
  42. package/ui/utils/pour-context.d.ts.map +1 -1
  43. package/ui.cjs +3 -2
  44. package/ui.cjs.map +1 -1
  45. package/ui.js +49 -48
  46. package/ui.js.map +1 -1
  47. package/dispense-registration-manager-Da9CW_cN.js.map +0 -1
  48. package/dispense-registration-manager-Dtb31fcI.cjs.map +0 -1
  49. package/pump-provider-BQmCKz7S.js.map +0 -1
  50. package/pump-provider-uNNMh9uh.cjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { kosModel, Kos, isKosModel, resolveServiceUrl, ServiceFactory, KosLog, KosModelContainer, KosExtensionUtils, kosChild, FetchError, ExtensionManager, EXTENSION_TROUBLE_MAPPER, EXTENSION_TROUBLE_DATA_MAPPER, getKosModelSync, kosDependency, kosTroubleAware, kosAction, kosTopicHandler, DependencyLifecycle, getKosModel, FutureManager, kosFuture, FutureHandler, EXTENSION_FEATURE_FLAG_RESOLVER, isKosDataModel, ChildModels, KosFeatureFlags, kosParentAware, createPropKey, kosStateEntry, kosStateExit, kosStateGuard, kosLoggerAware, kosStateMachine, MultipleFutureHandler, arraysEqual, getAllKosCompanionModels, EventBus, KosContextManager, destroyKosModel, SingletonKosModelRegistrationFactory, kosFutureAware, ObservableData, KosModelRegistrationFactory, KosModelRegistry as KosModelRegistry$1, RegistrationManager, registerCoreModels, registerLegacyModel } from "@kosdev-code/kos-ui-sdk";
1
+ import { kosModel, Kos, isKosModel, resolveServiceUrl, ServiceFactory, KosLog, KosModelContainer, KosExtensionUtils, kosChild, FetchError, ExtensionManager, EXTENSION_TROUBLE_MAPPER, EXTENSION_TROUBLE_DATA_MAPPER, getKosModelSync, kosDependency, kosTroubleAware, kosAction, kosTopicHandler, DependencyLifecycle, getKosModel, FutureManager, kosFuture, FutureHandler, EXTENSION_FEATURE_FLAG_RESOLVER, isKosDataModel, ChildModels, KosFeatureFlags, kosParentAware, createPropKey, kosStateEntry, kosStateExit, kosStateGuard, kosLoggerAware, kosStateMachine, MultipleFutureHandler, arraysEqual, getAllKosCompanionModels, EventBus, KosContextManager, destroyKosModel, kosModelEffect, getKosCompanionModel, SingletonKosModelRegistrationFactory, kosFutureAware, ObservableData, KosModelRegistrationFactory, KosModelRegistry as KosModelRegistry$1, RegistrationManager, registerCoreModels, registerLegacyModel } from "@kosdev-code/kos-ui-sdk";
2
2
  import "react";
3
3
  var ExtensionType = /* @__PURE__ */ ((ExtensionType2) => {
4
4
  ExtensionType2["IngredientLoader"] = "kos.ingredient.loader";
@@ -30,15 +30,15 @@ var DispenseModelType = /* @__PURE__ */ ((DispenseModelType2) => {
30
30
  DispenseModelType2["PumpContainer"] = "pump-container-model";
31
31
  return DispenseModelType2;
32
32
  })(DispenseModelType || {});
33
- var __getOwnPropDesc$c = Object.getOwnPropertyDescriptor;
34
- var __decorateClass$c = (decorators, target, key, kind) => {
35
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$c(target, key) : target;
33
+ var __getOwnPropDesc$d = Object.getOwnPropertyDescriptor;
34
+ var __decorateClass$d = (decorators, target, key, kind) => {
35
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$d(target, key) : target;
36
36
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
37
37
  if (decorator = decorators[i])
38
38
  result = decorator(result) || result;
39
39
  return result;
40
40
  };
41
- const MODEL_TYPE$c = "ingredient-model";
41
+ const MODEL_TYPE$d = "ingredient-model";
42
42
  let IngredientModelImpl = class {
43
43
  id;
44
44
  ingredientId;
@@ -75,19 +75,19 @@ let IngredientModelImpl = class {
75
75
  // -------------------LIFECYCLE----------------------------
76
76
  // -------------------ENTITY----------------------------
77
77
  };
78
- IngredientModelImpl = __decorateClass$c([
79
- kosModel(MODEL_TYPE$c)
78
+ IngredientModelImpl = __decorateClass$d([
79
+ kosModel(MODEL_TYPE$d)
80
80
  ], IngredientModelImpl);
81
81
  const Ingredient = {
82
82
  registration: {
83
- [MODEL_TYPE$c]: {
83
+ [MODEL_TYPE$d]: {
84
84
  class: IngredientModelImpl,
85
85
  singleton: false
86
86
  }
87
87
  },
88
- type: MODEL_TYPE$c,
89
- predicate: isKosModel(MODEL_TYPE$c),
90
- factory: Kos.Factory.create(MODEL_TYPE$c)
88
+ type: MODEL_TYPE$d,
89
+ predicate: isKosModel(MODEL_TYPE$d),
90
+ factory: Kos.Factory.create(MODEL_TYPE$d)
91
91
  };
92
92
  const { URL: URL$6 } = resolveServiceUrl("INGREDIENT_SERVICE");
93
93
  const { getOne: getOne$3 } = ServiceFactory.build({
@@ -99,17 +99,17 @@ const getIngredients = async () => {
99
99
  });
100
100
  return response;
101
101
  };
102
- var __defProp$9 = Object.defineProperty;
103
- var __getOwnPropDesc$b = Object.getOwnPropertyDescriptor;
104
- var __decorateClass$b = (decorators, target, key, kind) => {
105
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$b(target, key) : target;
102
+ var __defProp$a = Object.defineProperty;
103
+ var __getOwnPropDesc$c = Object.getOwnPropertyDescriptor;
104
+ var __decorateClass$c = (decorators, target, key, kind) => {
105
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$c(target, key) : target;
106
106
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
107
107
  if (decorator = decorators[i])
108
108
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
109
- if (kind && result) __defProp$9(target, key, result);
109
+ if (kind && result) __defProp$a(target, key, result);
110
110
  return result;
111
111
  };
112
- const MODEL_TYPE$b = "ingredient-container-model";
112
+ const MODEL_TYPE$c = "ingredient-container-model";
113
113
  const log$3 = KosLog.createLogger({ name: "ingredient-container-model" });
114
114
  let IngredientContainerModelImpl = class {
115
115
  id;
@@ -168,22 +168,22 @@ let IngredientContainerModelImpl = class {
168
168
  }
169
169
  // -------------------ENTITY----------------------------
170
170
  };
171
- __decorateClass$b([
171
+ __decorateClass$c([
172
172
  kosChild
173
173
  ], IngredientContainerModelImpl.prototype, "ingredients", 2);
174
- IngredientContainerModelImpl = __decorateClass$b([
175
- kosModel(MODEL_TYPE$b)
174
+ IngredientContainerModelImpl = __decorateClass$c([
175
+ kosModel(MODEL_TYPE$c)
176
176
  ], IngredientContainerModelImpl);
177
177
  const IngredientContainer = {
178
178
  registration: {
179
- [MODEL_TYPE$b]: {
179
+ [MODEL_TYPE$c]: {
180
180
  class: IngredientContainerModelImpl,
181
181
  singleton: true
182
182
  }
183
183
  },
184
- type: MODEL_TYPE$b,
185
- predicate: isKosModel(MODEL_TYPE$b),
186
- factory: Kos.Singleton.create(MODEL_TYPE$b)
184
+ type: MODEL_TYPE$c,
185
+ predicate: isKosModel(MODEL_TYPE$c),
186
+ factory: Kos.Singleton.create(MODEL_TYPE$c)
187
187
  };
188
188
  const { URL: URL$5 } = resolveServiceUrl("HOLDER_SERVICE");
189
189
  const { getAll: getAll$1, postModel: postModel$4, deleteModel: deleteModel$2 } = ServiceFactory.build({
@@ -273,17 +273,17 @@ const deleteAssignment = async (id) => {
273
273
  const response = await deleteModel$1({ id, fos: useFos });
274
274
  return response;
275
275
  };
276
- var __defProp$8 = Object.defineProperty;
277
- var __getOwnPropDesc$a = Object.getOwnPropertyDescriptor;
278
- var __decorateClass$a = (decorators, target, key, kind) => {
279
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$a(target, key) : target;
276
+ var __defProp$9 = Object.defineProperty;
277
+ var __getOwnPropDesc$b = Object.getOwnPropertyDescriptor;
278
+ var __decorateClass$b = (decorators, target, key, kind) => {
279
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$b(target, key) : target;
280
280
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
281
281
  if (decorator = decorators[i])
282
282
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
283
- if (kind && result) __defProp$8(target, key, result);
283
+ if (kind && result) __defProp$9(target, key, result);
284
284
  return result;
285
285
  };
286
- const MODEL_TYPE$a = DispenseModelType.Holder;
286
+ const MODEL_TYPE$b = DispenseModelType.Holder;
287
287
  const log$1 = KosLog.createLogger({ name: "holder-model" });
288
288
  ExtensionManager[EXTENSION_TROUBLE_MAPPER].register(
289
289
  "holder",
@@ -610,26 +610,26 @@ let HolderModelImpl = class {
610
610
  // }
611
611
  // -------------------ENTITY----------------------------
612
612
  };
613
- __decorateClass$a([
613
+ __decorateClass$b([
614
614
  kosChild
615
615
  ], HolderModelImpl.prototype, "pumps", 2);
616
- __decorateClass$a([
616
+ __decorateClass$b([
617
617
  kosDependency({ modelType: IngredientContainer.type })
618
618
  ], HolderModelImpl.prototype, "ingredientContainer", 2);
619
- HolderModelImpl = __decorateClass$a([
620
- kosModel(MODEL_TYPE$a),
619
+ HolderModelImpl = __decorateClass$b([
620
+ kosModel(MODEL_TYPE$b),
621
621
  kosTroubleAware()
622
622
  ], HolderModelImpl);
623
623
  const Holder = {
624
624
  registration: {
625
- [MODEL_TYPE$a]: {
625
+ [MODEL_TYPE$b]: {
626
626
  class: HolderModelImpl,
627
627
  singleton: false
628
628
  }
629
629
  },
630
- type: MODEL_TYPE$a,
631
- predicate: isKosModel(MODEL_TYPE$a),
632
- factory: Kos.Factory.create(MODEL_TYPE$a)
630
+ type: MODEL_TYPE$b,
631
+ predicate: isKosModel(MODEL_TYPE$b),
632
+ factory: Kos.Factory.create(MODEL_TYPE$b)
633
633
  };
634
634
  const mapAssemblyHolderToModel = async (group, holderData) => {
635
635
  const _ingredientId = ExtensionManager.propertyMapper.executeMapper(
@@ -685,17 +685,17 @@ const getAssembly = async () => {
685
685
  const response = await getOne$2({});
686
686
  return response;
687
687
  };
688
- var __defProp$7 = Object.defineProperty;
689
- var __getOwnPropDesc$9 = Object.getOwnPropertyDescriptor;
690
- var __decorateClass$9 = (decorators, target, key, kind) => {
691
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$9(target, key) : target;
688
+ var __defProp$8 = Object.defineProperty;
689
+ var __getOwnPropDesc$a = Object.getOwnPropertyDescriptor;
690
+ var __decorateClass$a = (decorators, target, key, kind) => {
691
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$a(target, key) : target;
692
692
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
693
693
  if (decorator = decorators[i])
694
694
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
695
- if (kind && result) __defProp$7(target, key, result);
695
+ if (kind && result) __defProp$8(target, key, result);
696
696
  return result;
697
697
  };
698
- const MODEL_TYPE$9 = "board-container-model";
698
+ const MODEL_TYPE$a = "board-container-model";
699
699
  const TOPIC_BOARD_LINKED = "/kos/hardware/board/linked";
700
700
  const TOPIC_BOARD_UNLINKED = "/kos/hardware/board/unlinked";
701
701
  let BoardContainerModel = class {
@@ -749,25 +749,25 @@ let BoardContainerModel = class {
749
749
  }
750
750
  }
751
751
  };
752
- __decorateClass$9([
752
+ __decorateClass$a([
753
753
  kosChild
754
754
  ], BoardContainerModel.prototype, "models", 2);
755
- __decorateClass$9([
755
+ __decorateClass$a([
756
756
  kosTopicHandler({
757
757
  lifecycle: DependencyLifecycle.INIT,
758
758
  topic: TOPIC_BOARD_LINKED,
759
759
  websocket: true
760
760
  })
761
761
  ], BoardContainerModel.prototype, "handleBoardLinkEvent", 1);
762
- __decorateClass$9([
762
+ __decorateClass$a([
763
763
  kosTopicHandler({
764
764
  lifecycle: DependencyLifecycle.INIT,
765
765
  topic: TOPIC_BOARD_UNLINKED,
766
766
  websocket: true
767
767
  })
768
768
  ], BoardContainerModel.prototype, "handleBoardUnlinkEvent", 1);
769
- BoardContainerModel = __decorateClass$9([
770
- kosModel(MODEL_TYPE$9)
769
+ BoardContainerModel = __decorateClass$a([
770
+ kosModel(MODEL_TYPE$a)
771
771
  ], BoardContainerModel);
772
772
  const boardTroubleDataMapper = async (trouble) => {
773
773
  const boardPath = trouble.data.boardPath;
@@ -776,17 +776,17 @@ const boardTroubleDataMapper = async (trouble) => {
776
776
  boardName: model?.name || ""
777
777
  };
778
778
  };
779
- var __defProp$6 = Object.defineProperty;
780
- var __getOwnPropDesc$8 = Object.getOwnPropertyDescriptor;
781
- var __decorateClass$8 = (decorators, target, key, kind) => {
782
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$8(target, key) : target;
779
+ var __defProp$7 = Object.defineProperty;
780
+ var __getOwnPropDesc$9 = Object.getOwnPropertyDescriptor;
781
+ var __decorateClass$9 = (decorators, target, key, kind) => {
782
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$9(target, key) : target;
783
783
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
784
784
  if (decorator = decorators[i])
785
785
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
786
- if (kind && result) __defProp$6(target, key, result);
786
+ if (kind && result) __defProp$7(target, key, result);
787
787
  return result;
788
788
  };
789
- const MODEL_TYPE$8 = DispenseModelType.PumpContainer;
789
+ const MODEL_TYPE$9 = DispenseModelType.PumpContainer;
790
790
  var PumpIndex = /* @__PURE__ */ ((PumpIndex2) => {
791
791
  PumpIndex2["byBoard"] = "byBoard";
792
792
  PumpIndex2["byType"] = "byType";
@@ -842,23 +842,23 @@ let PumpContainerModelImpl = class {
842
842
  }
843
843
  // -------------------ENTITY----------------------------
844
844
  };
845
- __decorateClass$8([
845
+ __decorateClass$9([
846
846
  kosChild
847
847
  ], PumpContainerModelImpl.prototype, "pumps", 2);
848
- PumpContainerModelImpl = __decorateClass$8([
849
- kosModel(MODEL_TYPE$8)
848
+ PumpContainerModelImpl = __decorateClass$9([
849
+ kosModel(MODEL_TYPE$9)
850
850
  ], PumpContainerModelImpl);
851
851
  const PumpContainer = {
852
852
  registration: {
853
- [MODEL_TYPE$8]: {
853
+ [MODEL_TYPE$9]: {
854
854
  class: PumpContainerModelImpl,
855
855
  singleton: true
856
856
  }
857
857
  },
858
- type: MODEL_TYPE$8,
859
- predicate: isKosModel(MODEL_TYPE$8),
858
+ type: MODEL_TYPE$9,
859
+ predicate: isKosModel(MODEL_TYPE$9),
860
860
  factory: Kos.Singleton.create(
861
- MODEL_TYPE$8
861
+ MODEL_TYPE$9
862
862
  )
863
863
  };
864
864
  const getPumpRelatedPaths = async (pumpPath) => {
@@ -902,15 +902,15 @@ const boardTroubleResolver = async (trouble) => {
902
902
  }
903
903
  return Array.from(new Set(result));
904
904
  };
905
- var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor;
906
- var __decorateClass$7 = (decorators, target, key, kind) => {
907
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$7(target, key) : target;
905
+ var __getOwnPropDesc$8 = Object.getOwnPropertyDescriptor;
906
+ var __decorateClass$8 = (decorators, target, key, kind) => {
907
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$8(target, key) : target;
908
908
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
909
909
  if (decorator = decorators[i])
910
910
  result = decorator(result) || result;
911
911
  return result;
912
912
  };
913
- const MODEL_TYPE$7 = "board-model";
913
+ const MODEL_TYPE$8 = "board-model";
914
914
  const mapOptionsToModel = (options, model) => {
915
915
  const { type, name, path, linked, instanceId, link, ...rest } = options;
916
916
  model.type = type;
@@ -953,45 +953,45 @@ let BoardModelImpl = class {
953
953
  this.logger.debug(`loading board ${this.id}`);
954
954
  }
955
955
  };
956
- BoardModelImpl = __decorateClass$7([
957
- kosModel(MODEL_TYPE$7)
956
+ BoardModelImpl = __decorateClass$8([
957
+ kosModel(MODEL_TYPE$8)
958
958
  ], BoardModelImpl);
959
959
  const Board = {
960
960
  registration: {
961
- [MODEL_TYPE$7]: {
961
+ [MODEL_TYPE$8]: {
962
962
  class: BoardModelImpl,
963
963
  singleton: false
964
964
  }
965
965
  },
966
- type: MODEL_TYPE$7,
967
- predicate: isKosModel(MODEL_TYPE$7),
968
- factory: Kos.Factory.create(MODEL_TYPE$7)
966
+ type: MODEL_TYPE$8,
967
+ predicate: isKosModel(MODEL_TYPE$8),
968
+ factory: Kos.Factory.create(MODEL_TYPE$8)
969
969
  };
970
970
  const BoardContainer = {
971
971
  registration: {
972
- [MODEL_TYPE$9]: {
972
+ [MODEL_TYPE$a]: {
973
973
  class: BoardContainerModel,
974
974
  singleton: true
975
975
  },
976
976
  ...Board.registration
977
977
  },
978
- type: MODEL_TYPE$9,
979
- predicate: isKosModel(MODEL_TYPE$9),
978
+ type: MODEL_TYPE$a,
979
+ predicate: isKosModel(MODEL_TYPE$a),
980
980
  factory: Kos.Singleton.create(
981
- MODEL_TYPE$9
981
+ MODEL_TYPE$a
982
982
  )
983
983
  };
984
- var __defProp$5 = Object.defineProperty;
985
- var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor;
986
- var __decorateClass$6 = (decorators, target, key, kind) => {
987
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$6(target, key) : target;
984
+ var __defProp$6 = Object.defineProperty;
985
+ var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor;
986
+ var __decorateClass$7 = (decorators, target, key, kind) => {
987
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$7(target, key) : target;
988
988
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
989
989
  if (decorator = decorators[i])
990
990
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
991
- if (kind && result) __defProp$5(target, key, result);
991
+ if (kind && result) __defProp$6(target, key, result);
992
992
  return result;
993
993
  };
994
- const MODEL_TYPE$6 = DispenseModelType.HolderContainer;
994
+ const MODEL_TYPE$7 = DispenseModelType.HolderContainer;
995
995
  const TOPIC_INSERT_START = "/kos/insertion/insert/start";
996
996
  const TOPIC_INSERT_COMPLETE = "/kos/insertion/insert/complete";
997
997
  const TOPIC_INSERT_UPDATE = "/kos/insertion/insert/update";
@@ -1071,17 +1071,17 @@ let HolderContainerModelImpl = class {
1071
1071
  }
1072
1072
  // -------------------ENTITY----------------------------
1073
1073
  };
1074
- __decorateClass$6([
1074
+ __decorateClass$7([
1075
1075
  kosChild
1076
1076
  ], HolderContainerModelImpl.prototype, "holders", 2);
1077
- __decorateClass$6([
1077
+ __decorateClass$7([
1078
1078
  kosTopicHandler({
1079
1079
  topic: TOPIC_HOLDER_CHANGED,
1080
1080
  websocket: true,
1081
1081
  condition: (event, model) => model.holders.getModel(event.path) !== void 0
1082
1082
  })
1083
1083
  ], HolderContainerModelImpl.prototype, "handleHolderEvents", 1);
1084
- __decorateClass$6([
1084
+ __decorateClass$7([
1085
1085
  kosTopicHandler({
1086
1086
  topic: [
1087
1087
  TOPIC_INSERT_START,
@@ -1093,20 +1093,20 @@ __decorateClass$6([
1093
1093
  websocket: true
1094
1094
  })
1095
1095
  ], HolderContainerModelImpl.prototype, "handleInsertion", 1);
1096
- HolderContainerModelImpl = __decorateClass$6([
1097
- kosModel(MODEL_TYPE$6)
1096
+ HolderContainerModelImpl = __decorateClass$7([
1097
+ kosModel(MODEL_TYPE$7)
1098
1098
  ], HolderContainerModelImpl);
1099
1099
  const HolderContainer = {
1100
1100
  registration: {
1101
- [MODEL_TYPE$6]: {
1101
+ [MODEL_TYPE$7]: {
1102
1102
  class: HolderContainerModelImpl,
1103
1103
  singleton: true
1104
1104
  }
1105
1105
  },
1106
- type: MODEL_TYPE$6,
1107
- predicate: isKosModel(MODEL_TYPE$6),
1106
+ type: MODEL_TYPE$7,
1107
+ predicate: isKosModel(MODEL_TYPE$7),
1108
1108
  factory: Kos.Singleton.create(
1109
- MODEL_TYPE$6
1109
+ MODEL_TYPE$7
1110
1110
  )
1111
1111
  };
1112
1112
  const Logger$1 = KosLog.createLogger({ name: "board-utils" });
@@ -1166,17 +1166,17 @@ const getIntentVolume = async (pumpId, intent) => {
1166
1166
  }
1167
1167
  return response.data;
1168
1168
  };
1169
- var __defProp$4 = Object.defineProperty;
1170
- var __getOwnPropDesc$5 = Object.getOwnPropertyDescriptor;
1171
- var __decorateClass$5 = (decorators, target, key, kind) => {
1172
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$5(target, key) : target;
1169
+ var __defProp$5 = Object.defineProperty;
1170
+ var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor;
1171
+ var __decorateClass$6 = (decorators, target, key, kind) => {
1172
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$6(target, key) : target;
1173
1173
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
1174
1174
  if (decorator = decorators[i])
1175
1175
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1176
- if (kind && result) __defProp$4(target, key, result);
1176
+ if (kind && result) __defProp$5(target, key, result);
1177
1177
  return result;
1178
1178
  };
1179
- const MODEL_TYPE$5 = DispenseModelType.Pump;
1179
+ const MODEL_TYPE$6 = DispenseModelType.Pump;
1180
1180
  ExtensionManager[EXTENSION_TROUBLE_MAPPER].register(
1181
1181
  "pump",
1182
1182
  pumpTroubleResolver
@@ -1320,22 +1320,22 @@ let PumpModelImpl = class {
1320
1320
  }
1321
1321
  // -------------------ENTITY----------------------------
1322
1322
  };
1323
- __decorateClass$5([
1323
+ __decorateClass$6([
1324
1324
  kosFuture()
1325
1325
  ], PumpModelImpl.prototype, "performIntent", 1);
1326
- PumpModelImpl = __decorateClass$5([
1327
- kosModel(MODEL_TYPE$5)
1326
+ PumpModelImpl = __decorateClass$6([
1327
+ kosModel(MODEL_TYPE$6)
1328
1328
  ], PumpModelImpl);
1329
1329
  const Pump = {
1330
1330
  registration: {
1331
- [MODEL_TYPE$5]: {
1331
+ [MODEL_TYPE$6]: {
1332
1332
  class: PumpModelImpl,
1333
1333
  singleton: false
1334
1334
  }
1335
1335
  },
1336
- type: MODEL_TYPE$5,
1337
- predicate: isKosModel(MODEL_TYPE$5),
1338
- factory: Kos.Factory.create(MODEL_TYPE$5)
1336
+ type: MODEL_TYPE$6,
1337
+ predicate: isKosModel(MODEL_TYPE$6),
1338
+ factory: Kos.Factory.create(MODEL_TYPE$6)
1339
1339
  };
1340
1340
  const Logger = KosLog.createLogger({ name: "pump-utils" });
1341
1341
  const mapAssemblyPumpToModel = (nozzlePath, pump) => {
@@ -1384,17 +1384,17 @@ const assemblyPumpMap = (pumpContainer) => (holderContainer) => (nozzle) => (ass
1384
1384
  throw error;
1385
1385
  }
1386
1386
  };
1387
- var __defProp$3 = Object.defineProperty;
1388
- var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor;
1389
- var __decorateClass$4 = (decorators, target, key, kind) => {
1390
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$4(target, key) : target;
1387
+ var __defProp$4 = Object.defineProperty;
1388
+ var __getOwnPropDesc$5 = Object.getOwnPropertyDescriptor;
1389
+ var __decorateClass$5 = (decorators, target, key, kind) => {
1390
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$5(target, key) : target;
1391
1391
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
1392
1392
  if (decorator = decorators[i])
1393
1393
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1394
- if (kind && result) __defProp$3(target, key, result);
1394
+ if (kind && result) __defProp$4(target, key, result);
1395
1395
  return result;
1396
1396
  };
1397
- const MODEL_TYPE$4 = "assembly-model";
1397
+ const MODEL_TYPE$5 = "assembly-model";
1398
1398
  const CONTEXT_ASSEMBLY_DATA = "assembly-data";
1399
1399
  const CONTEXT_ASSEMBLY_RAW_DATA = "assembly-raw-data";
1400
1400
  let AssemblyModelImpl = class {
@@ -1524,43 +1524,43 @@ let AssemblyModelImpl = class {
1524
1524
  }
1525
1525
  }
1526
1526
  };
1527
- __decorateClass$4([
1527
+ __decorateClass$5([
1528
1528
  kosDependency({
1529
1529
  modelType: "trouble-container-model"
1530
1530
  })
1531
1531
  ], AssemblyModelImpl.prototype, "troubleContainer", 2);
1532
- __decorateClass$4([
1532
+ __decorateClass$5([
1533
1533
  kosChild
1534
1534
  ], AssemblyModelImpl.prototype, "holderContainer", 2);
1535
- __decorateClass$4([
1535
+ __decorateClass$5([
1536
1536
  kosChild
1537
1537
  ], AssemblyModelImpl.prototype, "boardContainer", 2);
1538
- __decorateClass$4([
1538
+ __decorateClass$5([
1539
1539
  kosChild
1540
1540
  ], AssemblyModelImpl.prototype, "pumpContainer", 2);
1541
- AssemblyModelImpl = __decorateClass$4([
1542
- kosModel(MODEL_TYPE$4)
1541
+ AssemblyModelImpl = __decorateClass$5([
1542
+ kosModel(MODEL_TYPE$5)
1543
1543
  ], AssemblyModelImpl);
1544
1544
  const Assembly = {
1545
1545
  registration: {
1546
- [MODEL_TYPE$4]: {
1546
+ [MODEL_TYPE$5]: {
1547
1547
  class: AssemblyModelImpl,
1548
1548
  singleton: true
1549
1549
  }
1550
1550
  },
1551
- type: MODEL_TYPE$4,
1552
- predicate: isKosModel(MODEL_TYPE$4),
1553
- factory: Kos.Singleton.create(MODEL_TYPE$4)
1551
+ type: MODEL_TYPE$5,
1552
+ predicate: isKosModel(MODEL_TYPE$5),
1553
+ factory: Kos.Singleton.create(MODEL_TYPE$5)
1554
1554
  };
1555
- var __getOwnPropDesc$3 = Object.getOwnPropertyDescriptor;
1556
- var __decorateClass$3 = (decorators, target, key, kind) => {
1557
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$3(target, key) : target;
1555
+ var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor;
1556
+ var __decorateClass$4 = (decorators, target, key, kind) => {
1557
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$4(target, key) : target;
1558
1558
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
1559
1559
  if (decorator = decorators[i])
1560
1560
  result = decorator(result) || result;
1561
1561
  return result;
1562
1562
  };
1563
- const MODEL_TYPE$3 = DispenseModelType.Availability;
1563
+ const MODEL_TYPE$4 = DispenseModelType.Availability;
1564
1564
  let AvailabilityModelImpl = class {
1565
1565
  id;
1566
1566
  data;
@@ -1606,23 +1606,38 @@ let AvailabilityModelImpl = class {
1606
1606
  // -------------------LIFECYCLE----------------------------
1607
1607
  // -------------------ENTITY----------------------------
1608
1608
  };
1609
- AvailabilityModelImpl = __decorateClass$3([
1609
+ AvailabilityModelImpl = __decorateClass$4([
1610
1610
  kosParentAware(),
1611
- kosModel(MODEL_TYPE$3)
1611
+ kosModel(MODEL_TYPE$4)
1612
1612
  ], AvailabilityModelImpl);
1613
1613
  const Availability = {
1614
1614
  registration: {
1615
- [MODEL_TYPE$3]: {
1615
+ [MODEL_TYPE$4]: {
1616
1616
  class: AvailabilityModelImpl,
1617
1617
  singleton: false
1618
1618
  }
1619
1619
  },
1620
- type: MODEL_TYPE$3,
1621
- predicate: isKosModel(MODEL_TYPE$3),
1620
+ type: MODEL_TYPE$4,
1621
+ predicate: isKosModel(MODEL_TYPE$4),
1622
1622
  factory: Kos.Factory.create(
1623
- MODEL_TYPE$3
1623
+ MODEL_TYPE$4
1624
1624
  )
1625
1625
  };
1626
+ class PourContext {
1627
+ _data = /* @__PURE__ */ new Map();
1628
+ get(key) {
1629
+ return this._data.get(key);
1630
+ }
1631
+ set(key, value) {
1632
+ this._data.set(key, value);
1633
+ }
1634
+ remove(key) {
1635
+ this._data.delete(key);
1636
+ }
1637
+ has(key) {
1638
+ return this._data.has(key);
1639
+ }
1640
+ }
1626
1641
  const { URL: URL$1 } = resolveServiceUrl("NOZZLE_SERVICE");
1627
1642
  const { postModel: postModel$1, deleteModel, getOne } = ServiceFactory.build({
1628
1643
  basePath: `${URL$1}/api/nozzle`
@@ -1671,17 +1686,17 @@ const clearPourable = async (nozzleId) => {
1671
1686
  });
1672
1687
  return response;
1673
1688
  };
1674
- var __defProp$2 = Object.defineProperty;
1675
- var __getOwnPropDesc$2 = Object.getOwnPropertyDescriptor;
1676
- var __decorateClass$2 = (decorators, target, key, kind) => {
1677
- var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$2(target, key) : target;
1689
+ var __defProp$3 = Object.defineProperty;
1690
+ var __getOwnPropDesc$3 = Object.getOwnPropertyDescriptor;
1691
+ var __decorateClass$3 = (decorators, target, key, kind) => {
1692
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$3(target, key) : target;
1678
1693
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
1679
1694
  if (decorator = decorators[i])
1680
1695
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1681
- if (kind && result) __defProp$2(target, key, result);
1696
+ if (kind && result) __defProp$3(target, key, result);
1682
1697
  return result;
1683
1698
  };
1684
- const MODEL_TYPE$2 = DispenseModelType.Nozzle;
1699
+ const MODEL_TYPE$3 = DispenseModelType.Nozzle;
1685
1700
  const PROP_BEVERAGE_TOPIC_PREFIX = createPropKey(
1686
1701
  "beverageTopicPrefix"
1687
1702
  );
@@ -2151,42 +2166,42 @@ let NozzleModelImpl = class {
2151
2166
  }
2152
2167
  // -------------------ENTITY----------------------------
2153
2168
  };
2154
- __decorateClass$2([
2169
+ __decorateClass$3([
2155
2170
  kosChild
2156
2171
  ], NozzleModelImpl.prototype, "_availabilityItems", 2);
2157
- __decorateClass$2([
2172
+ __decorateClass$3([
2158
2173
  kosStateEntry(PourState.POURING)
2159
2174
  ], NozzleModelImpl.prototype, "handlePouringStart", 1);
2160
- __decorateClass$2([
2175
+ __decorateClass$3([
2161
2176
  kosStateExit(PourState.POURING)
2162
2177
  ], NozzleModelImpl.prototype, "handlePouringEnd", 1);
2163
- __decorateClass$2([
2178
+ __decorateClass$3([
2164
2179
  kosStateEntry(PourState.POUR_CANCELING)
2165
2180
  ], NozzleModelImpl.prototype, "handleCancelStart", 1);
2166
- __decorateClass$2([
2181
+ __decorateClass$3([
2167
2182
  kosStateExit(PourState.POUR_CANCELING)
2168
2183
  ], NozzleModelImpl.prototype, "handleCanceled", 1);
2169
- __decorateClass$2([
2184
+ __decorateClass$3([
2170
2185
  kosFuture(),
2171
2186
  kosStateGuard({ allowedStates: [PourState.IDLE] })
2172
2187
  ], NozzleModelImpl.prototype, "pour", 1);
2173
- __decorateClass$2([
2188
+ __decorateClass$3([
2174
2189
  kosFuture(),
2175
2190
  kosStateGuard({ allowedStates: [PourState.IDLE] })
2176
2191
  ], NozzleModelImpl.prototype, "fixedPour", 1);
2177
- __decorateClass$2([
2192
+ __decorateClass$3([
2178
2193
  kosStateGuard({
2179
2194
  allowedStates: [PourState.POUR_STARTING, PourState.POURING]
2180
2195
  })
2181
2196
  ], NozzleModelImpl.prototype, "cancelPour", 1);
2182
- __decorateClass$2([
2197
+ __decorateClass$3([
2183
2198
  kosTopicHandler({
2184
2199
  topic: `${PROP_BEVERAGE_TOPIC_PREFIX}/availability`,
2185
2200
  websocket: true
2186
2201
  })
2187
2202
  ], NozzleModelImpl.prototype, "updateAvailability", 1);
2188
- NozzleModelImpl = __decorateClass$2([
2189
- kosModel({ modelTypeId: MODEL_TYPE$2, singleton: false }),
2203
+ NozzleModelImpl = __decorateClass$3([
2204
+ kosModel({ modelTypeId: MODEL_TYPE$3, singleton: false }),
2190
2205
  kosLoggerAware(),
2191
2206
  kosStateMachine(
2192
2207
  {
@@ -2227,15 +2242,391 @@ NozzleModelImpl = __decorateClass$2([
2227
2242
  ], NozzleModelImpl);
2228
2243
  const Nozzle = {
2229
2244
  registration: {
2230
- [MODEL_TYPE$2]: {
2245
+ [MODEL_TYPE$3]: {
2231
2246
  class: NozzleModelImpl,
2232
2247
  singleton: false
2233
2248
  }
2234
2249
  },
2235
- type: MODEL_TYPE$2,
2236
- predicate: isKosModel(MODEL_TYPE$2),
2237
- factory: Kos.Factory.create(MODEL_TYPE$2)
2250
+ type: MODEL_TYPE$3,
2251
+ predicate: isKosModel(MODEL_TYPE$3),
2252
+ factory: Kos.Factory.create(MODEL_TYPE$3)
2253
+ };
2254
+ var __defProp$2 = Object.defineProperty;
2255
+ var __getOwnPropDesc$2 = Object.getOwnPropertyDescriptor;
2256
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
2257
+ var __decorateClass$2 = (decorators, target, key, kind) => {
2258
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$2(target, key) : target;
2259
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
2260
+ if (decorator = decorators[i])
2261
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
2262
+ if (kind && result) __defProp$2(target, key, result);
2263
+ return result;
2264
+ };
2265
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
2266
+ const MODEL_TYPE$2 = "cui-kit-state-model";
2267
+ const MODEL_CONFIG = {
2268
+ modelTypeId: MODEL_TYPE$2,
2269
+ singleton: false
2270
+ };
2271
+ const cuiKitId = (nozzlePath) => `cui-kit:${nozzlePath}`;
2272
+ let CuiKitStateModelImpl = class {
2273
+ id;
2274
+ nozzlePath;
2275
+ initialGroup;
2276
+ steps;
2277
+ companionTypes;
2278
+ currentGroup;
2279
+ selectedBrand = null;
2280
+ selectedBeverage = null;
2281
+ selectedFlavors = [];
2282
+ pourStrategy;
2283
+ onPourComplete;
2284
+ /** Data passed to the before-pour gate; carries `selectedBeverage`. */
2285
+ pourContext = new PourContext();
2286
+ /** The target of the last pour the kit started. */
2287
+ activeTarget;
2288
+ beforePour;
2289
+ pressCount = 0;
2290
+ released = true;
2291
+ lastPourState;
2292
+ lastPourError;
2293
+ nozzle;
2294
+ constructor(modelId, options) {
2295
+ this.id = modelId;
2296
+ this.nozzlePath = options.nozzlePath;
2297
+ this.initialGroup = options.initialGroup ?? "brands";
2298
+ this.steps = options.steps;
2299
+ this.companionTypes = options.companionTypes ?? {};
2300
+ this.pourStrategy = options.pour?.strategy;
2301
+ this.onPourComplete = options.onPourComplete;
2302
+ this.currentGroup = this.firstGroup;
2303
+ if (options.steps && options.initialGroup) {
2304
+ throw new Error(
2305
+ "CUI Kit: pass steps or initialGroup, not both (initialGroup is replaced by steps.brands)"
2306
+ );
2307
+ }
2308
+ }
2309
+ updateModel(options) {
2310
+ this.companionTypes = options.companionTypes ?? {};
2311
+ }
2312
+ // -------------------STEPS----------------------------
2313
+ /** The steps shown, in order. */
2314
+ get enabledSteps() {
2315
+ if (!this.steps) {
2316
+ return this.initialGroup === "brands" ? ["brands", "beverages", "flavors"] : ["beverages", "flavors"];
2317
+ }
2318
+ return [
2319
+ ...this.steps.brands ? ["brands"] : [],
2320
+ "beverages",
2321
+ ...this.steps.flavors ? ["flavors"] : [],
2322
+ ...this.steps.pour ? ["pour"] : []
2323
+ ];
2324
+ }
2325
+ /** The step navigation starts at and `home()` returns to. */
2326
+ get firstGroup() {
2327
+ if (!this.steps) return this.initialGroup;
2328
+ return this.steps.brands ? "brands" : "beverages";
2329
+ }
2330
+ /** The step `back()` moves to, or undefined when there is none. */
2331
+ get previousGroup() {
2332
+ if (!this.steps) {
2333
+ return this.currentGroup === "brands" ? void 0 : this.initialGroup;
2334
+ }
2335
+ const steps = this.enabledSteps;
2336
+ const index = steps.indexOf(this.currentGroup);
2337
+ return index > 0 ? steps[index - 1] : void 0;
2338
+ }
2339
+ get canBack() {
2340
+ return this.previousGroup !== void 0;
2341
+ }
2342
+ // -------------------LISTS----------------------------
2343
+ get brands() {
2344
+ return this.nozzle?.visibleBrands ?? [];
2345
+ }
2346
+ /** Whether the kit shows a brands step; without `steps` it follows `initialGroup`. */
2347
+ get hasBrands() {
2348
+ return this.enabledSteps.includes("brands");
2349
+ }
2350
+ get beverages() {
2351
+ if (!this.nozzle) return [];
2352
+ const brand = this.steps && !this.hasBrands ? void 0 : this.nozzle.selectedBrand;
2353
+ const items = brand ? this.nozzle.getAvailabilityByParent(brand.id) : this.nozzle.getGroupAvailabilityItems("beverages");
2354
+ return items.filter((item) => item.visible);
2355
+ }
2356
+ get flavors() {
2357
+ return this.nozzle?.getGroupAvailabilityItems("flavors").filter((flavor) => flavor.visible) ?? [];
2358
+ }
2359
+ get brandCompanions() {
2360
+ return this.companionsOf(this.brands, this.companionTypes.brand);
2361
+ }
2362
+ get beverageCompanions() {
2363
+ return this.companionsOf(this.beverages, this.companionTypes.beverage);
2364
+ }
2365
+ get flavorCompanions() {
2366
+ return this.companionsOf(this.flavors, this.companionTypes.flavor);
2367
+ }
2368
+ companionsOf(models, type) {
2369
+ if (!type) return [];
2370
+ return models.map((model) => getKosCompanionModel(model, type));
2371
+ }
2372
+ // -------------------SELECTION----------------------------
2373
+ selectBrand(brand, context) {
2374
+ this.selectedBrand = brand;
2375
+ this.nozzle?.setSelectedBrand(brand, context);
2376
+ this.currentGroup = "beverages";
2377
+ this.publish("brand/selected", brand);
2378
+ }
2379
+ clearBrand() {
2380
+ this.selectedBrand = null;
2381
+ this.nozzle?.setSelectedBrand(void 0);
2382
+ this.publish("brand/cleared", {});
2383
+ }
2384
+ async selectBeverage(beverage, context, forceUpdate) {
2385
+ this.selectedBeverage = beverage;
2386
+ this.pourContext.set("selectedBeverage", beverage);
2387
+ await this.nozzle?.setSelectedPourable({ beverage, context }, forceUpdate);
2388
+ if (!this.steps || this.steps.flavors) {
2389
+ this.currentGroup = "flavors";
2390
+ }
2391
+ this.publish("beverage/selected", beverage);
2392
+ }
2393
+ async clearBeverage() {
2394
+ this.selectedBeverage = null;
2395
+ this.pourContext.remove("selectedBeverage");
2396
+ await this.nozzle?.setSelectedPourable({ beverage: void 0 });
2397
+ this.publish("beverage/cleared", {});
2398
+ }
2399
+ /** Toggles a flavor and sends the beverage with the resulting flavors to the nozzle. */
2400
+ async selectFlavor(flavor, context, forceUpdate) {
2401
+ const flavors = this.selectedFlavors.includes(flavor) ? this.selectedFlavors.filter((selected) => selected !== flavor) : [...this.selectedFlavors, flavor];
2402
+ this.selectedFlavors = flavors;
2403
+ const beverage = this.nozzle?.selectedPourable.beverage;
2404
+ if (beverage) {
2405
+ await this.nozzle.setSelectedPourable(
2406
+ { beverage, additional: flavors, context },
2407
+ forceUpdate
2408
+ );
2409
+ }
2410
+ this.publish("flavor/selected", flavor);
2411
+ }
2412
+ async clearFlavors() {
2413
+ this.selectedFlavors = [];
2414
+ const beverage = this.nozzle?.selectedPourable.beverage;
2415
+ if (beverage) {
2416
+ await this.nozzle.setSelectedPourable({ beverage });
2417
+ this.publish("flavor/cleared", {});
2418
+ }
2419
+ }
2420
+ // -------------------NAVIGATION----------------------------
2421
+ /** Moves to the previous step. Without `steps`, returns to the start and clears brand and beverage. */
2422
+ back() {
2423
+ if (!this.steps) {
2424
+ if (this.currentGroup !== "brands") {
2425
+ this.currentGroup = this.initialGroup;
2426
+ }
2427
+ void this.clearBeverage();
2428
+ this.clearBrand();
2429
+ return;
2430
+ }
2431
+ const previous = this.previousGroup;
2432
+ if (previous) {
2433
+ this.currentGroup = previous;
2434
+ }
2435
+ }
2436
+ /** Returns to the first step and clears the selections. */
2437
+ home() {
2438
+ this.publish("home", {});
2439
+ this.currentGroup = this.firstGroup;
2440
+ if (this.steps) {
2441
+ void this.clearFlavors();
2442
+ void this.clearBeverage();
2443
+ if (this.steps.brands) this.clearBrand();
2444
+ return;
2445
+ }
2446
+ void this.clearBeverage();
2447
+ if (this.initialGroup === "brands") {
2448
+ this.clearBrand();
2449
+ }
2450
+ }
2451
+ /** Number of `useCuiKit` hooks attached to this kit. */
2452
+ attached = 0;
2453
+ /**
2454
+ * Attaches a `useCuiKit` hook. A nozzle has one kit hook; components read it through
2455
+ * the kit's context. Returns false, and logs an error, for a second hook.
2456
+ */
2457
+ attach() {
2458
+ this.attached += 1;
2459
+ if (this.attached > 1) {
2460
+ this.logger.error(
2461
+ `useCuiKit is mounted ${this.attached} times for nozzle ${this.nozzlePath}; read the kit with the useCuiKitContext hook returned by initializeCuiKit`
2462
+ );
2463
+ return false;
2464
+ }
2465
+ return true;
2466
+ }
2467
+ detach() {
2468
+ this.attached = Math.max(0, this.attached - 1);
2469
+ }
2470
+ /**
2471
+ * Returns the kit to the first step with nothing selected, as a newly mounted kit
2472
+ * starts. The nozzle's own selection is left as it is.
2473
+ */
2474
+ reset() {
2475
+ this.currentGroup = this.firstGroup;
2476
+ this.selectedBrand = null;
2477
+ this.selectedBeverage = null;
2478
+ this.selectedFlavors = [];
2479
+ this.pourContext.remove("selectedBeverage");
2480
+ }
2481
+ /**
2482
+ * Moves to the pour step. Only available when `steps.pour` is on. With `start`, also
2483
+ * starts a pour; ignored, with a warning, when the pour needs a held button.
2484
+ */
2485
+ toPour(options = {}) {
2486
+ if (!this.steps?.pour) {
2487
+ this.logger.warn("toPour() ignored: the pour step is not enabled");
2488
+ return;
2489
+ }
2490
+ this.currentGroup = "pour";
2491
+ if (!options.start) return;
2492
+ if (!options.fixedPourName && this.strategyFor(options)?.requiresHold) {
2493
+ this.logger.warn(
2494
+ "toPour({ start: true }) ignored: the pour strategy needs a held button"
2495
+ );
2496
+ return;
2497
+ }
2498
+ void this.startPour(options);
2499
+ }
2500
+ // -------------------POUR----------------------------
2501
+ /** Sets the before-pour gate the kit calls before every pour. */
2502
+ setBeforePour(callback) {
2503
+ this.beforePour = callback;
2504
+ }
2505
+ /** Starts a pour without a gesture (a click-to-pour button or an automated pour). */
2506
+ startPour(options = {}) {
2507
+ return this.runPour(options, false);
2508
+ }
2509
+ /** The press half of a pour gesture; `releasePour` is the release. */
2510
+ pressPour(options = {}) {
2511
+ return this.runPour(options, true);
2512
+ }
2513
+ /** The release half of a pour gesture. */
2514
+ releasePour(options = {}) {
2515
+ this.released = true;
2516
+ const target = options.target ?? this.nozzle;
2517
+ const ended = this.strategyFor(options)?.initiateEnded?.(target);
2518
+ void Promise.resolve(ended).then((keepPouring) => {
2519
+ if (keepPouring !== true) {
2520
+ this.publish("pour/cancel", {});
2521
+ }
2522
+ });
2523
+ }
2524
+ /** Cancels the pour the kit started last. */
2525
+ async cancelPour() {
2526
+ await (this.activeTarget ?? this.nozzle)?.cancelPour();
2527
+ this.publish("pour/cancel", {});
2528
+ }
2529
+ /** The pour target whose state the kit reports: the last one poured, else the nozzle. */
2530
+ get pourTarget() {
2531
+ return this.activeTarget ?? this.nozzle;
2532
+ }
2533
+ strategyFor(options) {
2534
+ return options.strategy ?? this.pourStrategy;
2535
+ }
2536
+ /**
2537
+ * select → prepare → before-pour gate → pour. While the target is pouring nothing is
2538
+ * selected; for a gesture, a release before the pour starts stops the sequence.
2539
+ */
2540
+ async runPour(options, gesture) {
2541
+ const press = ++this.pressCount;
2542
+ this.released = false;
2543
+ const target = options.target ?? this.nozzle;
2544
+ const strategy = this.strategyFor(options);
2545
+ if (!target || !strategy && !options.fixedPourName) {
2546
+ this.logger.error("pour ignored: no pour target or strategy");
2547
+ return false;
2548
+ }
2549
+ const releasedEarly = () => gesture && (this.released || press !== this.pressCount);
2550
+ if (options.select && !target.isPouring) {
2551
+ await this.selectForPour(options.select);
2552
+ }
2553
+ if (releasedEarly()) return false;
2554
+ await options.prepare?.(this.pourContext);
2555
+ if (releasedEarly()) return false;
2556
+ this.publish("pre/pour", {});
2557
+ await this.beforePour?.(this.pourContext) || true;
2558
+ if (releasedEarly()) return false;
2559
+ this.activeTarget = target;
2560
+ this.lastPourError = void 0;
2561
+ const started = options.fixedPourName ? this.nozzle.fixedPour(options.fixedPourName) : strategy?.initiate(target);
2562
+ void Promise.resolve(started).catch((error) => {
2563
+ this.lastPourError = error;
2564
+ this.logger.error(`pour failed: ${error}`);
2565
+ });
2566
+ this.publish("pour", {});
2567
+ return true;
2568
+ }
2569
+ /**
2570
+ * Selects a beverage, and its brand first when the kit has a brands step, and waits
2571
+ * for the nozzle.
2572
+ */
2573
+ async selectForPour(beverage) {
2574
+ const brand = this.hasBrands ? this.nozzle?.brands.find((b) => b.id === beverage.parentId) : void 0;
2575
+ if (brand && this.selectedBrand !== brand) {
2576
+ this.selectBrand(brand);
2577
+ }
2578
+ if (this.selectedBeverage !== beverage) {
2579
+ await this.selectBeverage(beverage);
2580
+ }
2581
+ }
2582
+ trackPourCompletion() {
2583
+ const state = this.pourTarget?.currentState;
2584
+ const previous = this.lastPourState;
2585
+ this.lastPourState = state;
2586
+ const completed = state === PourState.IDLE && (previous === PourState.POURING || previous === PourState.POUR_STARTING);
2587
+ if (!completed || !this.onPourComplete) return;
2588
+ const target = this.pourTarget;
2589
+ const endState = target?.future?.endState;
2590
+ setTimeout(() => {
2591
+ this.onPourComplete?.({ endState, error: this.lastPourError });
2592
+ }, 0);
2593
+ }
2594
+ publishBeverageList() {
2595
+ this.publish("beverage/list/updated", this.beverages);
2596
+ }
2597
+ publish(path, body) {
2598
+ EventBus.publish(`/kos/dispense/${this.nozzlePath}/${path}/`, body);
2599
+ }
2600
+ // -------------------LIFECYCLE----------------------------
2601
+ async init() {
2602
+ this.logger.debug(`initializing cui-kit-state ${this.id}`);
2603
+ }
2238
2604
  };
2605
+ __publicField(CuiKitStateModelImpl, "Registration");
2606
+ __decorateClass$2([
2607
+ kosDependency({
2608
+ modelType: Nozzle.type,
2609
+ id: createPropKey("nozzlePath")
2610
+ })
2611
+ ], CuiKitStateModelImpl.prototype, "nozzle", 2);
2612
+ __decorateClass$2([
2613
+ kosModelEffect({
2614
+ dependencies: (model) => [
2615
+ model.pourTarget?.currentState
2616
+ ]
2617
+ })
2618
+ ], CuiKitStateModelImpl.prototype, "trackPourCompletion", 1);
2619
+ __decorateClass$2([
2620
+ kosModelEffect({
2621
+ dependencies: (model) => [model.beverages],
2622
+ options: { fireImmediately: true }
2623
+ })
2624
+ ], CuiKitStateModelImpl.prototype, "publishBeverageList", 1);
2625
+ CuiKitStateModelImpl = __decorateClass$2([
2626
+ kosModel(MODEL_CONFIG),
2627
+ kosLoggerAware()
2628
+ ], CuiKitStateModelImpl);
2629
+ const CuiKitState = CuiKitStateModelImpl.Registration;
2239
2630
  var __defProp$1 = Object.defineProperty;
2240
2631
  var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
2241
2632
  var __decorateClass$1 = (decorators, target, key, kind) => {
@@ -2576,6 +2967,7 @@ const kosModels = {
2576
2967
  const registerDispenseModels = (root) => () => {
2577
2968
  registerCoreModels(root)();
2578
2969
  DeviceAssembly.register();
2970
+ CuiKitState.register();
2579
2971
  Object.keys(kosModels).forEach((key) => {
2580
2972
  const model = kosModels[key];
2581
2973
  registerLegacyModel(root)(key, model);
@@ -2606,12 +2998,16 @@ const registerDispenseModels = (root) => () => {
2606
2998
  legacy: RegistrationManager.model.registerLegacyModel(root)
2607
2999
  };
2608
3000
  };
3001
+ const registerCuiKitModels = (root) => () => registerDispenseModels(root)();
2609
3002
  const _KosModelRegistry = {
2610
3003
  ...KosModelRegistry$1
2611
3004
  };
2612
3005
  _KosModelRegistry.dispense = {
2613
3006
  models: registerDispenseModels(_KosModelRegistry)
2614
3007
  };
3008
+ _KosModelRegistry.cuiKit = {
3009
+ models: registerCuiKitModels(_KosModelRegistry)
3010
+ };
2615
3011
  _KosModelRegistry.preload = RegistrationManager.model.preloadModel(_KosModelRegistry);
2616
3012
  _KosModelRegistry.model = RegistrationManager.model.register(_KosModelRegistry);
2617
3013
  _KosModelRegistry.companion = RegistrationManager.companion.register(_KosModelRegistry);
@@ -2623,46 +3019,50 @@ export {
2623
3019
  CONTEXT_ASSEMBLY_DATA as C,
2624
3020
  DeviceAssembly as D,
2625
3021
  ExtensionType as E,
2626
- getIntentVolume as F,
3022
+ sendRfidOverride as F,
2627
3023
  GenericPour as G,
2628
3024
  Holder as H,
2629
3025
  Ingredient as I,
2630
- sendIntent as J,
3026
+ unassignHolderIngredient as J,
2631
3027
  KosModelRegistry as K,
2632
- clearPourable as L,
2633
- getAvailability as M,
3028
+ getAssembly as L,
3029
+ getIntentVolume as M,
2634
3030
  Nozzle as N,
2635
- pourNamedPourable as O,
2636
- PourState as P,
2637
- pourPourable as Q,
2638
- selectPourable as R,
2639
- pourOnTarget as S,
3031
+ sendIntent as O,
3032
+ PourContext as P,
3033
+ clearPourable as Q,
3034
+ getAvailability as R,
3035
+ pourNamedPourable as S,
2640
3036
  TOPIC_BOARD_LINKED as T,
3037
+ pourPourable as U,
3038
+ selectPourable as V,
3039
+ pourOnTarget as W,
3040
+ cuiKitId as X,
2641
3041
  Availability as a,
2642
3042
  BoardContainer as b,
2643
3043
  BoardContainerModel as c,
2644
3044
  CONTEXT_ASSEMBLY_RAW_DATA as d,
2645
- DispenseModelType as e,
2646
- HolderContainer as f,
2647
- IngredientContainer as g,
2648
- Pump as h,
2649
- PumpContainer as i,
2650
- PumpIndex as j,
2651
- TOPIC_BOARD_UNLINKED as k,
2652
- TOPIC_GENERIC_POUR_CANCEL as l,
2653
- TOPIC_GENERIC_POUR_PROGRESS as m,
2654
- TOPIC_GENERIC_POUR_STARTED as n,
2655
- kosModels as o,
2656
- getIngredients as p,
2657
- addAssignment as q,
2658
- registerDispenseModels as r,
2659
- assignHolderIngredient as s,
2660
- deleteAssignment as t,
2661
- getAssignments as u,
2662
- getHolders as v,
2663
- replaceLine as w,
2664
- sendRfidOverride as x,
2665
- unassignHolderIngredient as y,
2666
- getAssembly as z
2667
- };
2668
- //# sourceMappingURL=dispense-registration-manager-Da9CW_cN.js.map
3045
+ CuiKitState as e,
3046
+ DispenseModelType as f,
3047
+ HolderContainer as g,
3048
+ IngredientContainer as h,
3049
+ PourState as i,
3050
+ Pump as j,
3051
+ PumpContainer as k,
3052
+ PumpIndex as l,
3053
+ TOPIC_BOARD_UNLINKED as m,
3054
+ TOPIC_GENERIC_POUR_CANCEL as n,
3055
+ TOPIC_GENERIC_POUR_PROGRESS as o,
3056
+ TOPIC_GENERIC_POUR_STARTED as p,
3057
+ kosModels as q,
3058
+ registerCuiKitModels as r,
3059
+ registerDispenseModels as s,
3060
+ getIngredients as t,
3061
+ addAssignment as u,
3062
+ assignHolderIngredient as v,
3063
+ deleteAssignment as w,
3064
+ getAssignments as x,
3065
+ getHolders as y,
3066
+ replaceLine as z
3067
+ };
3068
+ //# sourceMappingURL=dispense-registration-manager-J59_vyyY.js.map