@kosdev-code/kos-freestyle-sdk 2.1.39 → 3.0.1

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 (210) hide show
  1. package/extension-utils-BFJb3AYW.cjs +344 -0
  2. package/extension-utils-BFJb3AYW.cjs.map +1 -0
  3. package/extension-utils-uGVieAa8.js +345 -0
  4. package/extension-utils-uGVieAa8.js.map +1 -0
  5. package/index.cjs +46 -1
  6. package/index.cjs.map +1 -1
  7. package/index.d.ts.map +1 -1
  8. package/index.js +44 -48
  9. package/index.js.map +1 -1
  10. package/models/constants/index.d.ts.map +1 -1
  11. package/models/index.d.ts.map +1 -1
  12. package/models/models/agitation-required-trouble/agitation-required-trouble-model.d.ts +2 -3
  13. package/models/models/agitation-required-trouble/agitation-required-trouble-model.d.ts.map +1 -1
  14. package/models/models/agitation-required-trouble/index.d.ts.map +1 -1
  15. package/models/models/agitation-required-trouble/types/index.d.ts +1 -3
  16. package/models/models/carb-agitator/carb-agitator-model.d.ts +3 -4
  17. package/models/models/carb-agitator/carb-agitator-model.d.ts.map +1 -1
  18. package/models/models/carb-agitator/index.d.ts.map +1 -1
  19. package/models/models/carb-agitator/services/carb-tank-services.d.ts +0 -1
  20. package/models/models/carb-agitator/services/carb-tank-services.d.ts.map +1 -1
  21. package/models/models/cartridge-agitator/cartridge-agitator-container-model.d.ts +2 -3
  22. package/models/models/cartridge-agitator/cartridge-agitator-container-model.d.ts.map +1 -1
  23. package/models/models/cartridge-agitator/cartridge-agitator-container-registration.d.ts +2 -3
  24. package/models/models/cartridge-agitator/cartridge-agitator-container-registration.d.ts.map +1 -1
  25. package/models/models/cartridge-agitator/cartridge-agitator-model.d.ts +1 -2
  26. package/models/models/cartridge-agitator/cartridge-agitator-model.d.ts.map +1 -1
  27. package/models/models/cartridge-agitator/cartridge-agitator-registration.d.ts +2 -3
  28. package/models/models/cartridge-agitator/cartridge-agitator-registration.d.ts.map +1 -1
  29. package/models/models/cartridge-agitator/index.d.ts.map +1 -1
  30. package/models/models/cartridge-agitator/services/cartridge-agitator-services.d.ts +0 -1
  31. package/models/models/cartridge-agitator/services/cartridge-agitator-services.d.ts.map +1 -1
  32. package/models/models/cgp-pump/cgp-pump-model.d.ts +3 -4
  33. package/models/models/cgp-pump/cgp-pump-model.d.ts.map +1 -1
  34. package/models/models/cgp-pump/index.d.ts.map +1 -1
  35. package/models/models/cgp-pump/types/index.d.ts +1 -3
  36. package/models/models/fcm-pump/fcm-pump-model.d.ts +2 -3
  37. package/models/models/fcm-pump/fcm-pump-model.d.ts.map +1 -1
  38. package/models/models/fcm-pump/fcm-pump-registration.d.ts +2 -3
  39. package/models/models/fcm-pump/fcm-pump-registration.d.ts.map +1 -1
  40. package/models/models/fcm-pump/index.d.ts.map +1 -1
  41. package/models/models/fcm-pump/services/fcm-pump-services.d.ts +0 -1
  42. package/models/models/fcm-pump/services/fcm-pump-services.d.ts.map +1 -1
  43. package/models/models/fcm-pump/services/index.d.ts.map +1 -1
  44. package/models/models/fcm-pump/types/index.d.ts +1 -3
  45. package/models/models/freestyle-assembly/freestyle-assembly-model.d.ts +7 -8
  46. package/models/models/freestyle-assembly/freestyle-assembly-model.d.ts.map +1 -1
  47. package/models/models/freestyle-assembly/freestyle-assembly-registration.d.ts +2 -3
  48. package/models/models/freestyle-assembly/freestyle-assembly-registration.d.ts.map +1 -1
  49. package/models/models/freestyle-assembly/index.d.ts.map +1 -1
  50. package/models/models/freestyle-assembly/types/index.d.ts +1 -3
  51. package/models/models/freestyle-holder/freestyle-holder-model.d.ts +2 -3
  52. package/models/models/freestyle-holder/freestyle-holder-model.d.ts.map +1 -1
  53. package/models/models/freestyle-holder/freestyle-holder-registration.d.ts +2 -3
  54. package/models/models/freestyle-holder/freestyle-holder-registration.d.ts.map +1 -1
  55. package/models/models/freestyle-holder/index.d.ts.map +1 -1
  56. package/models/models/freestyle-holder/types/index.d.ts +1 -3
  57. package/models/models/freestyle-nozzle/freestyle-nozzle-model.d.ts +2 -3
  58. package/models/models/freestyle-nozzle/freestyle-nozzle-model.d.ts.map +1 -1
  59. package/models/models/freestyle-nozzle/freestyle-nozzle-registration.d.ts +2 -3
  60. package/models/models/freestyle-nozzle/freestyle-nozzle-registration.d.ts.map +1 -1
  61. package/models/models/freestyle-nozzle/index.d.ts.map +1 -1
  62. package/models/models/freestyle-nozzle/services/freestyle-nozzle-services.d.ts.map +1 -1
  63. package/models/models/freestyle-nozzle/services/index.d.ts.map +1 -1
  64. package/models/models/freestyle-nozzle/types/index.d.ts +1 -3
  65. package/models/models/freestyle-pump/freestyle-pump-model.d.ts +2 -3
  66. package/models/models/freestyle-pump/freestyle-pump-model.d.ts.map +1 -1
  67. package/models/models/freestyle-pump/freestyle-pump-registration.d.ts +2 -3
  68. package/models/models/freestyle-pump/freestyle-pump-registration.d.ts.map +1 -1
  69. package/models/models/freestyle-pump/index.d.ts.map +1 -1
  70. package/models/models/freestyle-pump/services/freestyle-pump-services.d.ts.map +1 -1
  71. package/models/models/freestyle-pump/services/index.d.ts.map +1 -1
  72. package/models/models/freestyle-pump/types/index.d.ts +1 -3
  73. package/models/models/ice-agitator/ice-agitator-model.d.ts +2 -3
  74. package/models/models/ice-agitator/ice-agitator-model.d.ts.map +1 -1
  75. package/models/models/ice-agitator/index.d.ts.map +1 -1
  76. package/models/models/ice-agitator/services/ice-agitator-services.d.ts +0 -1
  77. package/models/models/ice-agitator/services/ice-agitator-services.d.ts.map +1 -1
  78. package/models/models/ice-agitator/services/index.d.ts.map +1 -1
  79. package/models/models/index.d.ts.map +1 -1
  80. package/models/models/lfcv-pump/index.d.ts.map +1 -1
  81. package/models/models/lfcv-pump/lfcv-pump-model.d.ts +2 -3
  82. package/models/models/lfcv-pump/lfcv-pump-model.d.ts.map +1 -1
  83. package/models/models/lfcv-pump/types/index.d.ts +1 -3
  84. package/models/models/remote-tray/index.d.ts.map +1 -1
  85. package/models/models/remote-tray/remote-tray-container-model.d.ts +1 -2
  86. package/models/models/remote-tray/remote-tray-container-model.d.ts.map +1 -1
  87. package/models/models/remote-tray/remote-tray-container-registration.d.ts +2 -3
  88. package/models/models/remote-tray/remote-tray-container-registration.d.ts.map +1 -1
  89. package/models/models/remote-tray/remote-tray-model.d.ts +3 -4
  90. package/models/models/remote-tray/remote-tray-model.d.ts.map +1 -1
  91. package/models/models/remote-tray/remote-tray-registration.d.ts +2 -3
  92. package/models/models/remote-tray/remote-tray-registration.d.ts.map +1 -1
  93. package/models/models/spm-pump/index.d.ts.map +1 -1
  94. package/models/models/spm-pump/services/index.d.ts.map +1 -1
  95. package/models/models/spm-pump/services/spm-pump-services.d.ts +0 -1
  96. package/models/models/spm-pump/services/spm-pump-services.d.ts.map +1 -1
  97. package/models/models/spm-pump/spm-pump-model.d.ts +2 -3
  98. package/models/models/spm-pump/spm-pump-model.d.ts.map +1 -1
  99. package/models/models/spm-pump/spm-pump-registration.d.ts +2 -3
  100. package/models/models/spm-pump/spm-pump-registration.d.ts.map +1 -1
  101. package/models/models/spm-pump/types/index.d.ts +1 -3
  102. package/models/models/types/assembly.d.ts +3 -4
  103. package/models/models/types/assembly.d.ts.map +1 -1
  104. package/models/models/types/ingredients.d.ts +0 -1
  105. package/models/models/types/ingredients.d.ts.map +1 -1
  106. package/models/models/types/pumps.d.ts +0 -1
  107. package/models/models/types/pumps.d.ts.map +1 -1
  108. package/models/utils/extension-utils.d.ts +2 -3
  109. package/models/utils/extension-utils.d.ts.map +1 -1
  110. package/models/utils/extensions/assembly/assembly-data-mapper.d.ts +2 -3
  111. package/models/utils/extensions/assembly/assembly-data-mapper.d.ts.map +1 -1
  112. package/models/utils/extensions/assembly/types.d.ts +2 -3
  113. package/models/utils/extensions/assembly/types.d.ts.map +1 -1
  114. package/models/utils/extensions/availability/freestyle-loader.d.ts +1 -2
  115. package/models/utils/extensions/availability/freestyle-loader.d.ts.map +1 -1
  116. package/models/utils/extensions/availability/freestyle-mapper.d.ts +2 -3
  117. package/models/utils/extensions/availability/freestyle-mapper.d.ts.map +1 -1
  118. package/models/utils/extensions/availability/middleware/assets.d.ts +1 -2
  119. package/models/utils/extensions/availability/middleware/assets.d.ts.map +1 -1
  120. package/models/utils/extensions/availability/middleware/beverage-screen.d.ts +1 -2
  121. package/models/utils/extensions/availability/middleware/beverage-screen.d.ts.map +1 -1
  122. package/models/utils/extensions/availability/middleware/beverages.d.ts +1 -2
  123. package/models/utils/extensions/availability/middleware/beverages.d.ts.map +1 -1
  124. package/models/utils/extensions/availability/middleware/brand-screen.d.ts +1 -2
  125. package/models/utils/extensions/availability/middleware/brand-screen.d.ts.map +1 -1
  126. package/models/utils/extensions/availability/middleware/brands.d.ts +1 -2
  127. package/models/utils/extensions/availability/middleware/brands.d.ts.map +1 -1
  128. package/models/utils/extensions/availability/middleware/copy-input.d.ts +0 -1
  129. package/models/utils/extensions/availability/middleware/copy-input.d.ts.map +1 -1
  130. package/models/utils/extensions/availability/middleware/flavors.d.ts +1 -2
  131. package/models/utils/extensions/availability/middleware/flavors.d.ts.map +1 -1
  132. package/models/utils/extensions/availability/middleware/nutrition.d.ts +1 -2
  133. package/models/utils/extensions/availability/middleware/nutrition.d.ts.map +1 -1
  134. package/models/utils/extensions/availability/middleware/related-brands.d.ts +1 -2
  135. package/models/utils/extensions/availability/middleware/related-brands.d.ts.map +1 -1
  136. package/models/utils/extensions/availability/types.d.ts.map +1 -1
  137. package/models/utils/extensions/availability/util/locate-brand.d.ts.map +1 -1
  138. package/models/utils/extensions/availability/util/process-related-brand.d.ts +0 -1
  139. package/models/utils/extensions/availability/util/process-related-brand.d.ts.map +1 -1
  140. package/models/utils/extensions/ingredient/index.d.ts.map +1 -1
  141. package/models/utils/extensions/ingredient/model-extension.d.ts +1 -2
  142. package/models/utils/extensions/ingredient/model-extension.d.ts.map +1 -1
  143. package/models/utils/extensions/pourable/select-pourable-mapper.d.ts +0 -1
  144. package/models/utils/extensions/pourable/select-pourable-mapper.d.ts.map +1 -1
  145. package/models/utils/extensions/trouble/trouble-utils.d.ts +0 -1
  146. package/models/utils/extensions/trouble/trouble-utils.d.ts.map +1 -1
  147. package/models/utils/freestyle-registration-manager.d.ts +9 -10
  148. package/models/utils/freestyle-registration-manager.d.ts.map +1 -1
  149. package/models/utils/index.d.ts.map +1 -1
  150. package/models/utils/openapi-index.d.ts.map +1 -1
  151. package/models/utils/services/freestyle/1.6.5/service.d.ts +34 -35
  152. package/models/utils/services/freestyle/1.6.5/service.d.ts.map +1 -1
  153. package/models/utils/services/freestyle/1.8.1/service.d.ts +34 -35
  154. package/models/utils/services/freestyle/1.8.1/service.d.ts.map +1 -1
  155. package/models/utils/services/freestyle/daily/service.d.ts +34 -35
  156. package/models/utils/services/freestyle/daily/service.d.ts.map +1 -1
  157. package/models/utils/services/handle/1.8.1/service.d.ts +34 -35
  158. package/models/utils/services/handle/1.8.1/service.d.ts.map +1 -1
  159. package/models/utils/services/handle/daily/service.d.ts +34 -35
  160. package/models/utils/services/handle/daily/service.d.ts.map +1 -1
  161. package/models/utils/services-index.d.ts.map +1 -1
  162. package/models.cjs +38 -1
  163. package/models.cjs.map +1 -1
  164. package/models.d.ts +1 -0
  165. package/models.js +35 -37
  166. package/models.js.map +1 -1
  167. package/package.json +9 -10
  168. package/service-BRuYqmJg.js +2277 -0
  169. package/service-BRuYqmJg.js.map +1 -0
  170. package/service-E5IuBoLR.cjs +2276 -0
  171. package/service-E5IuBoLR.cjs.map +1 -0
  172. package/ui/contexts/index.d.ts.map +1 -1
  173. package/ui/hooks/freestyle-assembly/index.d.ts.map +1 -1
  174. package/ui/hooks/freestyle-assembly/use-freestyle-assembly.d.ts +0 -1
  175. package/ui/hooks/freestyle-assembly/use-freestyle-assembly.d.ts.map +1 -1
  176. package/ui/hooks/freestyle-nozzle/index.d.ts.map +1 -1
  177. package/ui/hooks/freestyle-nozzle/use-freestyle-nozzle.d.ts +0 -1
  178. package/ui/hooks/freestyle-nozzle/use-freestyle-nozzle.d.ts.map +1 -1
  179. package/ui/hooks/ice-agitator/index.d.ts.map +1 -1
  180. package/ui/hooks/ice-agitator/use-ice-agitator.d.ts +1 -2
  181. package/ui/hooks/ice-agitator/use-ice-agitator.d.ts.map +1 -1
  182. package/ui/hooks/ice-agitator/with-ice-agitator.d.ts +0 -1
  183. package/ui/hooks/ice-agitator/with-ice-agitator.d.ts.map +1 -1
  184. package/ui/hooks/index.d.ts.map +1 -1
  185. package/ui/hooks/nutrition/index.d.ts.map +1 -1
  186. package/ui/hooks/nutrition/use-nutrition-info.d.ts +0 -1
  187. package/ui/hooks/nutrition/use-nutrition-info.d.ts.map +1 -1
  188. package/ui/index.d.ts.map +1 -1
  189. package/ui.cjs +8 -1
  190. package/ui.cjs.map +1 -1
  191. package/ui.d.ts +1 -0
  192. package/ui.js +6 -11
  193. package/ui.js.map +1 -1
  194. package/use-nutrition-info-B1EB2iYY.js +68 -0
  195. package/use-nutrition-info-B1EB2iYY.js.map +1 -0
  196. package/use-nutrition-info-BDv3r-Gf.cjs +67 -0
  197. package/use-nutrition-info-BDv3r-Gf.cjs.map +1 -0
  198. package/extension-utils-CFD54lr3.js +0 -237
  199. package/extension-utils-CFD54lr3.js.map +0 -1
  200. package/extension-utils-D3-Gwy8G.cjs +0 -2
  201. package/extension-utils-D3-Gwy8G.cjs.map +0 -1
  202. package/kos-models.json +0 -180
  203. package/service-8u3gW6pr.cjs +0 -2
  204. package/service-8u3gW6pr.cjs.map +0 -1
  205. package/service-DildzPxj.js +0 -1910
  206. package/service-DildzPxj.js.map +0 -1
  207. package/use-nutrition-info-DMKLi-5k.cjs +0 -2
  208. package/use-nutrition-info-DMKLi-5k.cjs.map +0 -1
  209. package/use-nutrition-info-DP_JHkR0.js +0 -52
  210. package/use-nutrition-info-DP_JHkR0.js.map +0 -1
@@ -0,0 +1,2276 @@
1
+ "use strict";
2
+ const kosUiSdk = require("@kosdev-code/kos-ui-sdk");
3
+ const kosDispenseSdk = require("@kosdev-code/kos-dispense-sdk");
4
+ const { URL: URL$6 } = kosUiSdk.resolveServiceUrl("ICE_AGITATOR_SERVICE");
5
+ const { postModel: postModel$5 } = kosUiSdk.ServiceFactory.build({
6
+ basePath: `${URL$6}/api/ext/freestyle/ice`
7
+ });
8
+ kosUiSdk.KosLog.createLogger({
9
+ name: "carb-tank-service",
10
+ group: "Services"
11
+ });
12
+ const testCarbTank = async (path, tracker) => {
13
+ const response = await postModel$5({
14
+ model: {},
15
+ tracker,
16
+ urlOverride: `${URL$6}/api/handle/${path}/test`
17
+ });
18
+ if (!response?.data) {
19
+ throw new Error("No response from server");
20
+ }
21
+ return response?.data;
22
+ };
23
+ var __defProp$b = Object.defineProperty;
24
+ var __getOwnPropDesc$e = Object.getOwnPropertyDescriptor;
25
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
26
+ var __decorateClass$e = (decorators, target, key, kind) => {
27
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$e(target, key) : target;
28
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
29
+ if (decorator = decorators[i])
30
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
31
+ if (kind && result) __defProp$b(target, key, result);
32
+ return result;
33
+ };
34
+ var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, key + "", value);
35
+ const MODEL_TYPE$e = "carb-agitator-model";
36
+ const PROP_STATE_PATH$1 = kosUiSdk.createPropKey("statePath");
37
+ let CarbAgitatorModelImpl = class {
38
+ /**
39
+ * Unique identifier for this carb agitator instance.
40
+ */
41
+ id;
42
+ /**
43
+ * Display name for this carb agitator.
44
+ */
45
+ name;
46
+ /**
47
+ * Device path for carb tank operations.
48
+ */
49
+ path;
50
+ /**
51
+ * State path for accessing probe and filling status.
52
+ */
53
+ statePath;
54
+ highProbeWet;
55
+ lowProbeWet;
56
+ filling;
57
+ enabled;
58
+ /**
59
+ * Creates a new carb agitator model instance.
60
+ *
61
+ * @param modelId - Unique identifier for this instance
62
+ * @param options - Configuration options including name
63
+ * @param context - KOS creation context providing assembly paths
64
+ */
65
+ constructor(modelId, options, context) {
66
+ this.id = modelId;
67
+ this.name = options.name;
68
+ this.path = context.kosContext.get(`assembly-feature-carbTank`)?.path || "";
69
+ const statePath = context.kosContext.get(`assembly-state-path-carbTank`);
70
+ this.statePath = statePath;
71
+ }
72
+ /**
73
+ * Gets the carb holder associated with this agitator.
74
+ *
75
+ * Retrieves the first holder from the "carb" group in the parent assembly.
76
+ *
77
+ * @returns The carb holder model, or undefined if not found
78
+ */
79
+ get holder() {
80
+ const carbHolder = this.getCompanionParent()?.getHoldersByGroup("carb")[0];
81
+ return carbHolder;
82
+ }
83
+ /**
84
+ * Gets the pump associated with the carb holder.
85
+ *
86
+ * Returns the first pump from the holder's pump collection.
87
+ *
88
+ * @returns The pump model, or undefined if holder or pump not available
89
+ */
90
+ get pump() {
91
+ return this.holder?.pumps.data[0];
92
+ }
93
+ /**
94
+ * Indicates whether the carb tank is currently being filled.
95
+ *
96
+ * @returns true if the filling state property indicates active filling
97
+ */
98
+ get isFilling() {
99
+ return !!this.filling.value;
100
+ }
101
+ /**
102
+ * Indicates whether the carb tank has been initialized.
103
+ *
104
+ * @returns true if the carb tank enabled configuration is set to true
105
+ */
106
+ get isCarbInitialized() {
107
+ return !!this.enabled.value;
108
+ }
109
+ /**
110
+ * Indicates whether carb tank activation is allowed.
111
+ *
112
+ * Activation is only allowed when the carb tank is not already enabled.
113
+ *
114
+ * @returns true if the carb tank can be activated
115
+ */
116
+ get canActivate() {
117
+ return !this.enabled.value;
118
+ }
119
+ /**
120
+ * Indicates whether the workflow can proceed past carb initialization.
121
+ *
122
+ * The workflow can proceed when the state machine is in either INITIALIZED
123
+ * (carb tank activated) or SKIPPED (user chose to bypass carbonation).
124
+ *
125
+ * @returns true if ready to proceed with beverage operations
126
+ */
127
+ get canProceed() {
128
+ return this.isInState(
129
+ "INITIALIZED"
130
+ /* INITIALIZED */
131
+ ) || this.isInState(
132
+ "SKIPPED"
133
+ /* SKIPPED */
134
+ );
135
+ }
136
+ handleActivationStart() {
137
+ this.logger.info("Carb tank activation started");
138
+ }
139
+ handleActivationComplete() {
140
+ this.logger.info("Carb tank initialized");
141
+ }
142
+ handleInitialized() {
143
+ this.logger.info("Carb tank ready to proceed");
144
+ }
145
+ handleSkipped() {
146
+ this.logger.info("Proceeding without carbinator");
147
+ }
148
+ async activateCarbTank() {
149
+ this.transition("ACTIVATE");
150
+ this.enabled.updateProperty(true);
151
+ this.transition("ACTIVATION_COMPLETE");
152
+ }
153
+ /**
154
+ * Deactivates the carb tank and resets to uninitialized state.
155
+ *
156
+ * This method:
157
+ * 1. Updates the enabled configuration property to false
158
+ * 2. Transitions back to UNINITIALIZED state
159
+ *
160
+ * Can be called from any state.
161
+ */
162
+ async deactivateCarbTank() {
163
+ this.enabled.updateProperty(false);
164
+ this.transition("RESET");
165
+ }
166
+ skip() {
167
+ this.transition("SKIP");
168
+ }
169
+ reset() {
170
+ this.enabled.updateProperty(false);
171
+ this.transition("RESET");
172
+ }
173
+ /**
174
+ * Toggles the carb tank between enabled and disabled states.
175
+ *
176
+ * If currently enabled, calls {@link deactivateCarbTank}.
177
+ * If currently disabled, calls {@link activateCarbTank}.
178
+ */
179
+ toggleCarbTank() {
180
+ if (this.enabled.value) {
181
+ this.deactivateCarbTank();
182
+ } else {
183
+ this.activateCarbTank();
184
+ }
185
+ }
186
+ handleTestCarbTank(tracker) {
187
+ if (!tracker) {
188
+ throw new Error("No tracker provided");
189
+ }
190
+ this.logger.info(`testing carb tank: ${this.id}`);
191
+ return testCarbTank(this.path, tracker);
192
+ }
193
+ };
194
+ __publicField$4(CarbAgitatorModelImpl, "Registration");
195
+ __decorateClass$e([
196
+ kosUiSdk.kosStateProp({
197
+ path: PROP_STATE_PATH$1,
198
+ attribute: "highProbeWet"
199
+ })
200
+ ], CarbAgitatorModelImpl.prototype, "highProbeWet", 2);
201
+ __decorateClass$e([
202
+ kosUiSdk.kosStateProp({
203
+ path: PROP_STATE_PATH$1,
204
+ attribute: "lowProbeWet"
205
+ })
206
+ ], CarbAgitatorModelImpl.prototype, "lowProbeWet", 2);
207
+ __decorateClass$e([
208
+ kosUiSdk.kosStateProp({
209
+ path: PROP_STATE_PATH$1,
210
+ attribute: "filling"
211
+ })
212
+ ], CarbAgitatorModelImpl.prototype, "filling", 2);
213
+ __decorateClass$e([
214
+ kosUiSdk.kosConfigProperty({
215
+ path: "assembly:core:board:macksm:carbTank:carbTank",
216
+ attribute: "enabled"
217
+ })
218
+ ], CarbAgitatorModelImpl.prototype, "enabled", 2);
219
+ __decorateClass$e([
220
+ kosUiSdk.kosStateEntry(
221
+ "ACTIVATING"
222
+ /* ACTIVATING */
223
+ )
224
+ ], CarbAgitatorModelImpl.prototype, "handleActivationStart", 1);
225
+ __decorateClass$e([
226
+ kosUiSdk.kosStateExit(
227
+ "ACTIVATING"
228
+ /* ACTIVATING */
229
+ )
230
+ ], CarbAgitatorModelImpl.prototype, "handleActivationComplete", 1);
231
+ __decorateClass$e([
232
+ kosUiSdk.kosStateEntry(
233
+ "INITIALIZED"
234
+ /* INITIALIZED */
235
+ )
236
+ ], CarbAgitatorModelImpl.prototype, "handleInitialized", 1);
237
+ __decorateClass$e([
238
+ kosUiSdk.kosStateEntry(
239
+ "SKIPPED"
240
+ /* SKIPPED */
241
+ )
242
+ ], CarbAgitatorModelImpl.prototype, "handleSkipped", 1);
243
+ __decorateClass$e([
244
+ kosUiSdk.kosStateGuard({ allowedStates: [
245
+ "UNINITIALIZED"
246
+ /* UNINITIALIZED */
247
+ ] })
248
+ ], CarbAgitatorModelImpl.prototype, "activateCarbTank", 1);
249
+ __decorateClass$e([
250
+ kosUiSdk.kosStateGuard({ allowedStates: [
251
+ "UNINITIALIZED"
252
+ /* UNINITIALIZED */
253
+ ] })
254
+ ], CarbAgitatorModelImpl.prototype, "skip", 1);
255
+ __decorateClass$e([
256
+ kosUiSdk.kosStateGuard({
257
+ allowedStates: [
258
+ "INITIALIZED",
259
+ "SKIPPED"
260
+ /* SKIPPED */
261
+ ]
262
+ })
263
+ ], CarbAgitatorModelImpl.prototype, "reset", 1);
264
+ __decorateClass$e([
265
+ kosUiSdk.kosFuture()
266
+ ], CarbAgitatorModelImpl.prototype, "handleTestCarbTank", 1);
267
+ CarbAgitatorModelImpl = __decorateClass$e([
268
+ kosUiSdk.kosModel({ modelTypeId: MODEL_TYPE$e, singleton: false }),
269
+ kosUiSdk.kosLoggerAware(),
270
+ kosUiSdk.kosCompanion({ mode: "composition", lifecycle: kosUiSdk.DependencyLifecycle.LOAD }),
271
+ kosUiSdk.kosFutureAware(),
272
+ kosUiSdk.kosStateMachine(
273
+ {
274
+ initial: "UNINITIALIZED",
275
+ states: {
276
+ [
277
+ "UNINITIALIZED"
278
+ /* UNINITIALIZED */
279
+ ]: {
280
+ on: {
281
+ ACTIVATE: "ACTIVATING",
282
+ SKIP: "SKIPPED"
283
+ /* SKIPPED */
284
+ }
285
+ },
286
+ [
287
+ "ACTIVATING"
288
+ /* ACTIVATING */
289
+ ]: {
290
+ on: {
291
+ ACTIVATION_COMPLETE: "INITIALIZED"
292
+ /* INITIALIZED */
293
+ }
294
+ },
295
+ [
296
+ "INITIALIZED"
297
+ /* INITIALIZED */
298
+ ]: {
299
+ on: {
300
+ RESET: "UNINITIALIZED"
301
+ /* UNINITIALIZED */
302
+ }
303
+ },
304
+ [
305
+ "SKIPPED"
306
+ /* SKIPPED */
307
+ ]: {
308
+ on: {
309
+ RESET: "UNINITIALIZED"
310
+ /* UNINITIALIZED */
311
+ }
312
+ }
313
+ }
314
+ },
315
+ {
316
+ throwOnInvalid: false
317
+ // Graceful handling for button clicks
318
+ }
319
+ )
320
+ ], CarbAgitatorModelImpl);
321
+ const CarbAgitator = CarbAgitatorModelImpl.Registration;
322
+ var __defProp$a = Object.defineProperty;
323
+ var __getOwnPropDesc$d = Object.getOwnPropertyDescriptor;
324
+ var __decorateClass$d = (decorators, target, key, kind) => {
325
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$d(target, key) : target;
326
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
327
+ if (decorator = decorators[i])
328
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
329
+ if (kind && result) __defProp$a(target, key, result);
330
+ return result;
331
+ };
332
+ const MODEL_TYPE$d = "cartridge-agitator-container-model";
333
+ let CartridgeAgitatorContainerModelImpl = class {
334
+ id;
335
+ logger;
336
+ _models;
337
+ constructor(modelId, options, context) {
338
+ this.id = modelId;
339
+ this.logger = context.logger;
340
+ this._models = new kosUiSdk.KosModelContainer({
341
+ parentId: modelId
342
+ });
343
+ }
344
+ getModel(id) {
345
+ return this._models.getModel(id);
346
+ }
347
+ get models() {
348
+ return this._models;
349
+ }
350
+ get data() {
351
+ return this._models.data;
352
+ }
353
+ addModel(model) {
354
+ this._models.addModel(model);
355
+ }
356
+ removeModel(id) {
357
+ this._models.removeModel(id);
358
+ }
359
+ // -------------------LIFECYCLE----------------------------
360
+ async init() {
361
+ this.logger.debug(
362
+ `initializing cartridge-agitator-container container ${this.id}`
363
+ );
364
+ }
365
+ async load() {
366
+ this.logger.debug(
367
+ `loading cartridge-agitator-container container ${this.id}`
368
+ );
369
+ }
370
+ };
371
+ __decorateClass$d([
372
+ kosUiSdk.kosChild
373
+ ], CartridgeAgitatorContainerModelImpl.prototype, "_models", 2);
374
+ CartridgeAgitatorContainerModelImpl = __decorateClass$d([
375
+ kosUiSdk.kosModel(MODEL_TYPE$d)
376
+ ], CartridgeAgitatorContainerModelImpl);
377
+ const { URL: URL$5 } = kosUiSdk.resolveServiceUrl("CARTRIDGE_AGITATOR_SERVICE");
378
+ const { postModel: postModel$4 } = kosUiSdk.ServiceFactory.build({
379
+ basePath: `${URL$5}/api/ext/freestyle/freestyle/ice`
380
+ });
381
+ const agitate$1 = async (path, tracker) => {
382
+ const response = await postModel$4({
383
+ model: {},
384
+ tracker,
385
+ urlOverride: `${URL$5}/api/handle/${path}/test`
386
+ });
387
+ if (!response?.data) {
388
+ throw new Error("No response from server");
389
+ }
390
+ return response.data;
391
+ };
392
+ var __defProp$9 = Object.defineProperty;
393
+ var __getOwnPropDesc$c = Object.getOwnPropertyDescriptor;
394
+ var __decorateClass$c = (decorators, target, key, kind) => {
395
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$c(target, key) : target;
396
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
397
+ if (decorator = decorators[i])
398
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
399
+ if (kind && result) __defProp$9(target, key, result);
400
+ return result;
401
+ };
402
+ const MODEL_TYPE$c = "cartridge-agitator-model";
403
+ class CartridgeAgitatorEvents {
404
+ static TOPIC_AGITATION_STARTED = "/kos/events/ddk/agitation-started";
405
+ static TOPIC_AGITATION_ENDED = "/kos/events/ddk/agitation-ended";
406
+ }
407
+ const PROP_PATH$1 = kosUiSdk.createPropKey("statePath");
408
+ let CartridgeAgitatorModelImpl = class {
409
+ id;
410
+ agitating;
411
+ path;
412
+ statePath;
413
+ name;
414
+ constructor(modelId, options) {
415
+ this.id = modelId;
416
+ this.path = options.path;
417
+ this.name = options.name;
418
+ this.statePath = options.statePath;
419
+ }
420
+ get isAgitating() {
421
+ return !!this.agitating.value;
422
+ }
423
+ async testAgitate(tracker) {
424
+ if (!tracker) {
425
+ throw new Error("No tracker provided");
426
+ }
427
+ this.logger.info(`agitating cartridge-agitator ${this.id}`);
428
+ return agitate$1(this.path, tracker);
429
+ }
430
+ handleAgitation() {
431
+ if (this.isAgitating) {
432
+ this.logger.info(`agitating cartridge-agitator ${this.id}`);
433
+ kosUiSdk.EventBus.publish(CartridgeAgitatorEvents.TOPIC_AGITATION_STARTED, {
434
+ path: this.path,
435
+ futureId: this.future?.futureId
436
+ });
437
+ } else {
438
+ kosUiSdk.EventBus.publish(CartridgeAgitatorEvents.TOPIC_AGITATION_ENDED, {
439
+ path: this.path
440
+ });
441
+ }
442
+ }
443
+ };
444
+ __decorateClass$c([
445
+ kosUiSdk.kosStateProp({ path: PROP_PATH$1, attribute: "agitating" })
446
+ ], CartridgeAgitatorModelImpl.prototype, "agitating", 2);
447
+ __decorateClass$c([
448
+ kosUiSdk.kosFuture()
449
+ ], CartridgeAgitatorModelImpl.prototype, "testAgitate", 1);
450
+ __decorateClass$c([
451
+ kosUiSdk.kosModelEffect({
452
+ dependencies: (model) => [model.isAgitating]
453
+ })
454
+ ], CartridgeAgitatorModelImpl.prototype, "handleAgitation", 1);
455
+ CartridgeAgitatorModelImpl = __decorateClass$c([
456
+ kosUiSdk.kosModel(MODEL_TYPE$c),
457
+ kosUiSdk.kosFutureAware(),
458
+ kosUiSdk.kosLoggerAware()
459
+ ], CartridgeAgitatorModelImpl);
460
+ const CartridgeAgitator = new kosUiSdk.KosModelRegistrationFactory({
461
+ class: CartridgeAgitatorModelImpl,
462
+ type: MODEL_TYPE$c
463
+ });
464
+ const CartridgeAgitatorContainer = new kosUiSdk.SingletonKosModelRegistrationFactory({
465
+ class: CartridgeAgitatorContainerModelImpl,
466
+ type: MODEL_TYPE$d
467
+ });
468
+ CartridgeAgitatorContainer.addRelatedModel(CartridgeAgitator);
469
+ var __defProp$8 = Object.defineProperty;
470
+ var __getOwnPropDesc$b = Object.getOwnPropertyDescriptor;
471
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
472
+ var __decorateClass$b = (decorators, target, key, kind) => {
473
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$b(target, key) : target;
474
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
475
+ if (decorator = decorators[i])
476
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
477
+ if (kind && result) __defProp$8(target, key, result);
478
+ return result;
479
+ };
480
+ var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, key + "", value);
481
+ const MODEL_TYPE$b = "cgp-pump-model";
482
+ const PROP_STATE_PATH = kosUiSdk.createPropKey("statePath");
483
+ let CgpPumpModelImpl = class {
484
+ highProbeWet;
485
+ lowProbeWet;
486
+ filling;
487
+ id;
488
+ state;
489
+ constructor(modelId, options) {
490
+ this.id = modelId;
491
+ this.state = options.data?.state ?? { name: "unknown", path: "" };
492
+ }
493
+ get statePath() {
494
+ return this.state.path;
495
+ }
496
+ };
497
+ __publicField$3(CgpPumpModelImpl, "Registration");
498
+ __decorateClass$b([
499
+ kosUiSdk.kosStateProp({
500
+ path: PROP_STATE_PATH,
501
+ attribute: "highProbeWet"
502
+ })
503
+ ], CgpPumpModelImpl.prototype, "highProbeWet", 2);
504
+ __decorateClass$b([
505
+ kosUiSdk.kosStateProp({
506
+ path: PROP_STATE_PATH,
507
+ attribute: "lowProbeWet"
508
+ })
509
+ ], CgpPumpModelImpl.prototype, "lowProbeWet", 2);
510
+ __decorateClass$b([
511
+ kosUiSdk.kosStateProp({
512
+ path: PROP_STATE_PATH,
513
+ attribute: "filling"
514
+ })
515
+ ], CgpPumpModelImpl.prototype, "filling", 2);
516
+ CgpPumpModelImpl = __decorateClass$b([
517
+ kosUiSdk.kosModel({ modelTypeId: MODEL_TYPE$b, singleton: false }),
518
+ kosUiSdk.kosCompanion({
519
+ mode: "composition"
520
+ }),
521
+ kosUiSdk.kosLoggerAware()
522
+ ], CgpPumpModelImpl);
523
+ const CgpPump = CgpPumpModelImpl.Registration;
524
+ const { URL: URL$4 } = kosUiSdk.resolveServiceUrl("FCM-PUMP_SERVICE");
525
+ const { postModel: postModel$3 } = kosUiSdk.ServiceFactory.build({
526
+ basePath: `${URL$4}/api/fcm-pump`
527
+ });
528
+ const log$5 = kosUiSdk.KosLog.createLogger({
529
+ name: "fcm-pump-service",
530
+ group: "Services"
531
+ });
532
+ const performElectricalTest = async (path) => {
533
+ log$5.debug(
534
+ `performElectricalTest - sending POST request to /api/ext/freestyle/fcm/diagnostics/${path}/electricalTest`
535
+ );
536
+ try {
537
+ const response = await postModel$3({
538
+ model: {},
539
+ urlOverride: `${URL$4}/api/ext/freestyle/fcm/diagnostics/${path}/electricalTest`
540
+ });
541
+ log$5.debug("performElectricalTest - response:", response);
542
+ if ((response?.status === 200 || response?.status === 499) && response.data?.error) {
543
+ return [response.data.error || "unknownError", response.data];
544
+ }
545
+ return [void 0, response?.data];
546
+ } catch (error) {
547
+ log$5.error(
548
+ `performElectricalTest - sending POST request to /api/ext/freestyle/fcm/diagnostics/${path}/electricalTest`,
549
+ error
550
+ );
551
+ if (error instanceof kosUiSdk.FetchError) {
552
+ const errorCode = error.payload?.data?.error || error.payload?.error || "unknownError";
553
+ return [errorCode, error.payload?.data || { error: errorCode }];
554
+ }
555
+ }
556
+ return ["unknownError", { error: "unknownError" }];
557
+ };
558
+ const performPreCalibrate$1 = async (pump, tracker) => {
559
+ log$5.debug(
560
+ `performPreCalibrate - sending POST request to /api/ext/freestyle/fcm/calibration/${pump}/preCalibrate`
561
+ );
562
+ try {
563
+ const response = await postModel$3({
564
+ model: {},
565
+ urlOverride: `${URL$4}/api/ext/freestyle/fcm/calibration/${pump}/preCalibrate`,
566
+ tracker
567
+ });
568
+ log$5.debug("performPreCalibrate - response:", response);
569
+ if (response?.data) {
570
+ kosUiSdk.FutureManager.initiateFuture(response.data);
571
+ }
572
+ return response?.data;
573
+ } catch (error) {
574
+ log$5.error(
575
+ `performPreCalibrate - sending POST request to /api/ext/freestyle/fcm/calibration/${pump}/preCalibrate`,
576
+ error
577
+ );
578
+ const futureResponse = {
579
+ id: tracker || "",
580
+ endState: kosUiSdk.FutureEndState.Fail,
581
+ tracker,
582
+ reason: "Failed to resolve trouble"
583
+ };
584
+ kosUiSdk.FutureManager.initiateFuture(futureResponse);
585
+ return futureResponse;
586
+ }
587
+ };
588
+ const performCalibrate$1 = async (pump, tracker) => {
589
+ log$5.debug(
590
+ `performPreCalibrate - sending POST request to /api/ext/freestyle/fcm/calibration/${pump}/calibrate`
591
+ );
592
+ try {
593
+ const response = await postModel$3({
594
+ model: {},
595
+ urlOverride: `${URL$4}/api/ext/freestyle/fcm/calibration/${pump}/calibrate`,
596
+ tracker
597
+ });
598
+ log$5.debug("performPreCalibrate - response:", response);
599
+ if (response?.data) {
600
+ kosUiSdk.FutureManager.initiateFuture(response.data);
601
+ }
602
+ return response?.data;
603
+ } catch (error) {
604
+ log$5.error(
605
+ `performPreCalibrate - sending POST request to /api/ext/freestyle/fcm/calibration/${pump}/calibrate`,
606
+ error
607
+ );
608
+ const futureResponse = {
609
+ id: tracker || "",
610
+ endState: kosUiSdk.FutureEndState.Fail,
611
+ tracker,
612
+ reason: "Failed to resolve trouble"
613
+ };
614
+ kosUiSdk.FutureManager.initiateFuture(futureResponse);
615
+ return futureResponse;
616
+ }
617
+ };
618
+ const performVerify$1 = async (pump, volume, tracker) => {
619
+ log$5.debug(
620
+ `performPreCalibrate - sending POST request to /api/ext/freestyle/fcm/calibration/${pump}/verify/${volume}`
621
+ );
622
+ try {
623
+ const response = await postModel$3({
624
+ model: {},
625
+ urlOverride: `${URL$4}/api/ext/freestyle/fcm/calibration/${pump}/verify/${volume}`,
626
+ tracker
627
+ });
628
+ log$5.debug("performVerify - response:", response);
629
+ if (response?.data) {
630
+ kosUiSdk.FutureManager.initiateFuture(response.data);
631
+ }
632
+ return response?.data;
633
+ } catch (error) {
634
+ log$5.error(
635
+ `performVerify - sending POST request to /api/ext/freestyle/fcm/calibration/${pump}/verify/${volume}`,
636
+ error
637
+ );
638
+ const futureResponse = {
639
+ id: tracker || "",
640
+ endState: kosUiSdk.FutureEndState.Fail,
641
+ tracker,
642
+ reason: "Failed to resolve trouble"
643
+ };
644
+ kosUiSdk.FutureManager.initiateFuture(futureResponse);
645
+ return futureResponse;
646
+ }
647
+ };
648
+ const processResponse = (response) => {
649
+ if (response) {
650
+ if (response.data === "success" || !response.data) {
651
+ return "success";
652
+ } else {
653
+ return response.data;
654
+ }
655
+ }
656
+ return "error";
657
+ };
658
+ const performComplete$1 = async (pump, volume1, volume2) => {
659
+ log$5.debug(
660
+ `performPreCalibrate - sending POST request to /api/ext/freestyle/fcm/calibration/${pump}/complete/${volume1}/${volume2}`
661
+ );
662
+ try {
663
+ const response = await postModel$3({
664
+ model: {},
665
+ urlOverride: `${URL$4}/api/ext/freestyle/fcm/calibration/${pump}/complete/${volume1}/${volume2}`
666
+ });
667
+ log$5.debug("performPreCalibrate - response:", response);
668
+ return processResponse(response?.data);
669
+ } catch (error) {
670
+ log$5.error(
671
+ `performPreCalibrate - sending POST request to /api/ext/freestyle/fcm/calibration/${pump}/complete/${volume1}/${volume2}`,
672
+ error
673
+ );
674
+ return void 0;
675
+ }
676
+ };
677
+ var __defProp$7 = Object.defineProperty;
678
+ var __getOwnPropDesc$a = Object.getOwnPropertyDescriptor;
679
+ var __decorateClass$a = (decorators, target, key, kind) => {
680
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$a(target, key) : target;
681
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
682
+ if (decorator = decorators[i])
683
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
684
+ if (kind && result) __defProp$7(target, key, result);
685
+ return result;
686
+ };
687
+ const MODEL_TYPE$a = "fcm-pump-model";
688
+ const log$4 = kosUiSdk.KosLog.createLogger({ name: "fcm-pump-model" });
689
+ let FcmPumpModelImpl = class {
690
+ id;
691
+ logger;
692
+ pumpModel;
693
+ futureHandler;
694
+ constructor(modelId, options, context) {
695
+ this.id = modelId;
696
+ this.logger = context.logger;
697
+ this.pumpModel = options.companionParent;
698
+ this.futureHandler = new kosUiSdk.FutureHandler(this);
699
+ }
700
+ get future() {
701
+ return this.futureHandler.future;
702
+ }
703
+ get name() {
704
+ return this.pumpModel.name;
705
+ }
706
+ get canPour() {
707
+ return this.pumpModel.canPour;
708
+ }
709
+ get isPouring() {
710
+ return this.pumpModel.isPouring;
711
+ }
712
+ async cancelPour() {
713
+ return this.pumpModel.cancelPour();
714
+ }
715
+ performIntent(props) {
716
+ return this.pumpModel.performIntent(props);
717
+ }
718
+ async performElectricalTest() {
719
+ const [error, data] = await performElectricalTest(this.pumpModel.path);
720
+ if (error) {
721
+ log$4.error(`Failed to perform electrical test on pump ${this.id}`, error);
722
+ }
723
+ return data;
724
+ }
725
+ getChildren() {
726
+ const allFutures = this.futureHandler.allFutures;
727
+ return [...allFutures];
728
+ }
729
+ async performPreCalibrate(tracker) {
730
+ return performPreCalibrate$1(this.pumpModel.path, tracker);
731
+ }
732
+ async performCalibrate(tracker) {
733
+ return performCalibrate$1(this.pumpModel.path, tracker);
734
+ }
735
+ async performVerify(volume, tracker) {
736
+ return performVerify$1(this.pumpModel.path, volume, tracker);
737
+ }
738
+ async performComplete(volume1, volume2) {
739
+ return performComplete$1(this.pumpModel.path, volume1, volume2);
740
+ }
741
+ // -------------------LIFECYCLE----------------------------
742
+ async init() {
743
+ this.logger.debug(`initializing fcm-pump ${this.id}`);
744
+ }
745
+ async load() {
746
+ this.logger.debug(`loading fcm-pump ${this.id}`);
747
+ }
748
+ };
749
+ __decorateClass$a([
750
+ kosUiSdk.kosFuture()
751
+ ], FcmPumpModelImpl.prototype, "performPreCalibrate", 1);
752
+ __decorateClass$a([
753
+ kosUiSdk.kosFuture()
754
+ ], FcmPumpModelImpl.prototype, "performCalibrate", 1);
755
+ __decorateClass$a([
756
+ kosUiSdk.kosFuture()
757
+ ], FcmPumpModelImpl.prototype, "performVerify", 1);
758
+ FcmPumpModelImpl = __decorateClass$a([
759
+ kosUiSdk.kosModel(MODEL_TYPE$a)
760
+ ], FcmPumpModelImpl);
761
+ const FcmPump = new kosUiSdk.KosModelRegistrationFactory({
762
+ class: FcmPumpModelImpl,
763
+ type: MODEL_TYPE$a
764
+ });
765
+ var __defProp$6 = Object.defineProperty;
766
+ var __getOwnPropDesc$9 = Object.getOwnPropertyDescriptor;
767
+ var __decorateClass$9 = (decorators, target, key, kind) => {
768
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$9(target, key) : target;
769
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
770
+ if (decorator = decorators[i])
771
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
772
+ if (kind && result) __defProp$6(target, key, result);
773
+ return result;
774
+ };
775
+ const MODEL_TYPE$9 = "freestyle-assembly-model";
776
+ const FEATURE_SUPPORTS_ICE = "iceAgitator";
777
+ const FEATURE_SUPPORTS_CARB = "carbTank";
778
+ const FEATURE_SUPPORTS_REMOTE_TRAYS = "remoteTrays";
779
+ let FreestyleAssemblyModelImpl = class {
780
+ id;
781
+ _carbTankModel;
782
+ logger;
783
+ assembly;
784
+ _remoteTrays;
785
+ constructor(modelId, options, context) {
786
+ this.id = modelId;
787
+ this.logger = context.logger;
788
+ this.assembly = options.companionParent;
789
+ }
790
+ get holderGroups() {
791
+ return this.assembly.holderGroups;
792
+ }
793
+ get nozzlePaths() {
794
+ return this.assembly.nozzlePaths;
795
+ }
796
+ get allHolders() {
797
+ return this.assembly.allHolders;
798
+ }
799
+ getHoldersByGroup(group) {
800
+ return this.assembly.getHoldersByGroup(group);
801
+ }
802
+ getHoldersByNozzle(nozzlePath) {
803
+ return this.assembly.getHoldersByNozzle(nozzlePath);
804
+ }
805
+ get pumpsByNozzle() {
806
+ return this.assembly.pumpsByNozzle;
807
+ }
808
+ get pumpPaths() {
809
+ return this.assembly.pumpPaths;
810
+ }
811
+ get boards() {
812
+ return this.assembly.boards;
813
+ }
814
+ updateModel(options) {
815
+ return this.assembly.updateModel(options);
816
+ }
817
+ get iceAgitator() {
818
+ return this.assembly.iceAgitator;
819
+ }
820
+ get carbTank() {
821
+ return this._carbTankModel;
822
+ }
823
+ get cartridgeAgitators() {
824
+ return this.assembly.cartridgeAgitators;
825
+ }
826
+ get defaultCartridgeAgitator() {
827
+ return this.assembly.cartridgeAgitators.data[0];
828
+ }
829
+ get cartridgeAgitatorModels() {
830
+ return this.assembly.cartridgeAgitators.data;
831
+ }
832
+ get hasCartridgeAgitators() {
833
+ return this.assembly.cartridgeAgitators.data.length > 0;
834
+ }
835
+ get remoteTrays() {
836
+ return this.assembly.remoteTrays;
837
+ }
838
+ get hasRemoteTrays() {
839
+ return this.assembly.remoteTrays ? this.assembly.remoteTrays.data.length > 0 : false;
840
+ }
841
+ // -------------------LIFECYCLE----------------------------
842
+ get supportsRemoteTrays() {
843
+ return kosUiSdk.KosFeatureFlags.isFeatureEnabled(FEATURE_SUPPORTS_REMOTE_TRAYS);
844
+ }
845
+ get supportsIce() {
846
+ return kosUiSdk.KosFeatureFlags.isFeatureEnabled(FEATURE_SUPPORTS_ICE);
847
+ }
848
+ get supportsCarb() {
849
+ return kosUiSdk.KosFeatureFlags.isFeatureEnabled(FEATURE_SUPPORTS_CARB);
850
+ }
851
+ async init() {
852
+ this.logger.debug(`initializing freestyle-assembly ${this.id}`);
853
+ }
854
+ async ready() {
855
+ const _carbTank = kosUiSdk.getKosCompanionModel(
856
+ this.assembly,
857
+ CarbAgitator.type
858
+ );
859
+ this._carbTankModel = _carbTank;
860
+ }
861
+ };
862
+ __decorateClass$9([
863
+ kosUiSdk.kosChild
864
+ ], FreestyleAssemblyModelImpl.prototype, "_remoteTrays", 2);
865
+ FreestyleAssemblyModelImpl = __decorateClass$9([
866
+ kosUiSdk.kosParentAware(),
867
+ kosUiSdk.kosModel(MODEL_TYPE$9)
868
+ ], FreestyleAssemblyModelImpl);
869
+ const FreestyleAssembly = new kosUiSdk.SingletonKosModelRegistrationFactory({
870
+ class: FreestyleAssemblyModelImpl,
871
+ type: MODEL_TYPE$9
872
+ });
873
+ var __defProp$5 = Object.defineProperty;
874
+ var __getOwnPropDesc$8 = Object.getOwnPropertyDescriptor;
875
+ var __decorateClass$8 = (decorators, target, key, kind) => {
876
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$8(target, key) : target;
877
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
878
+ if (decorator = decorators[i])
879
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
880
+ if (kind && result) __defProp$5(target, key, result);
881
+ return result;
882
+ };
883
+ const MODEL_TYPE$8 = "remote-tray-model";
884
+ kosUiSdk.createPropKey("holderPath");
885
+ const PROP_CONFIG_PATH = kosUiSdk.createPropKey("configPath");
886
+ let RemoteTrayModelImpl = class {
887
+ /** Unique identifier for the remote tray instance */
888
+ id;
889
+ logger;
890
+ /** Path reference to the associated holder model */
891
+ holderPath;
892
+ /** Configuration path for tray-specific settings */
893
+ configPath;
894
+ /** Display name of the remote tray */
895
+ name;
896
+ remoteTrayEnabled;
897
+ constructor(modelId, options, context) {
898
+ this.id = modelId;
899
+ this.logger = context.logger;
900
+ this.holderPath = options.holderPath;
901
+ this.configPath = options.configPath;
902
+ this.name = options.name;
903
+ }
904
+ /**
905
+ * Gets the troubles from the associated holder model.
906
+ * Propagates trouble states from the holder to this remote tray.
907
+ *
908
+ * @returns Array of trouble models from the holder, or empty array if no holder
909
+ */
910
+ get troubles() {
911
+ return this.holder?.troubles ?? [];
912
+ }
913
+ /**
914
+ * Gets the highest priority trouble status.
915
+ * Currently returns empty string as troubles are managed by the holder.
916
+ *
917
+ * @returns Empty string (trouble status handled by holder)
918
+ */
919
+ get troubleStatus() {
920
+ return "";
921
+ }
922
+ /**
923
+ * Gets troubles grouped by type from the associated holder.
924
+ *
925
+ * @returns Record of troubles grouped by type from the holder, or empty object if no holder
926
+ */
927
+ get troublesByType() {
928
+ return this.holder?.troublesByType ?? {};
929
+ }
930
+ /**
931
+ * Updates the model with new configuration options.
932
+ * Can be used to modify the holder path, config path, or name after initialization.
933
+ *
934
+ * @param _options - New configuration options for the remote tray
935
+ */
936
+ updateModel(_options) {
937
+ }
938
+ /**
939
+ * Gets the associated holder model for this remote tray.
940
+ * Uses synchronous model lookup to retrieve the holder by path.
941
+ *
942
+ * @returns The HolderModel instance referenced by holderPath, or undefined if not found
943
+ */
944
+ get holder() {
945
+ return kosUiSdk.getKosModelSync(this.holderPath).model;
946
+ }
947
+ /**
948
+ * Determines if the remote tray is currently active.
949
+ * Active state is based on the remoteTrayEnabled configuration property.
950
+ *
951
+ * @returns true if the tray is enabled, false otherwise
952
+ */
953
+ get active() {
954
+ return !!this.remoteTrayEnabled.value;
955
+ }
956
+ // -------------------LIFECYCLE----------------------------
957
+ /**
958
+ * Initializes the remote tray model.
959
+ * Called during the model lifecycle initialization phase.
960
+ * Sets up initial state and prepares the model for use.
961
+ *
962
+ * @returns Promise that resolves when initialization is complete
963
+ */
964
+ async init() {
965
+ this.logger.debug(`initializing remote-tray ${this.id}`);
966
+ }
967
+ /**
968
+ * Loads the remote tray configuration and associated data.
969
+ * Called during the model lifecycle load phase.
970
+ * Typically loads configuration settings and establishes holder references.
971
+ *
972
+ * @returns Promise that resolves when loading is complete
973
+ */
974
+ async load() {
975
+ this.logger.debug(`loading remote-tray ${this.id}`);
976
+ }
977
+ };
978
+ __decorateClass$8([
979
+ kosUiSdk.kosConfigProperty({
980
+ path: PROP_CONFIG_PATH,
981
+ attribute: "enabled"
982
+ })
983
+ ], RemoteTrayModelImpl.prototype, "remoteTrayEnabled", 2);
984
+ RemoteTrayModelImpl = __decorateClass$8([
985
+ kosUiSdk.kosModel(MODEL_TYPE$8)
986
+ ], RemoteTrayModelImpl);
987
+ const RemoteTray = new kosUiSdk.KosModelRegistrationFactory({
988
+ class: RemoteTrayModelImpl,
989
+ type: MODEL_TYPE$8
990
+ });
991
+ var __getOwnPropDesc$7 = Object.getOwnPropertyDescriptor;
992
+ var __decorateClass$7 = (decorators, target, key, kind) => {
993
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$7(target, key) : target;
994
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
995
+ if (decorator = decorators[i])
996
+ result = decorator(result) || result;
997
+ return result;
998
+ };
999
+ const MODEL_TYPE$7 = "remote-tray-container-model";
1000
+ let RemoteTrayContainerModelImpl = class {
1001
+ id;
1002
+ constructor(modelId) {
1003
+ this.id = modelId;
1004
+ }
1005
+ };
1006
+ RemoteTrayContainerModelImpl = __decorateClass$7([
1007
+ kosUiSdk.kosModel(MODEL_TYPE$7),
1008
+ kosUiSdk.kosLoggerAware(),
1009
+ kosUiSdk.kosContainerAware()
1010
+ ], RemoteTrayContainerModelImpl);
1011
+ const RemoteTrayContainer = new kosUiSdk.SingletonKosModelRegistrationFactory({
1012
+ class: RemoteTrayContainerModelImpl,
1013
+ type: MODEL_TYPE$7
1014
+ });
1015
+ RemoteTrayContainer.addRelatedModel(RemoteTray);
1016
+ var __getOwnPropDesc$6 = Object.getOwnPropertyDescriptor;
1017
+ var __decorateClass$6 = (decorators, target, key, kind) => {
1018
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$6(target, key) : target;
1019
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
1020
+ if (decorator = decorators[i])
1021
+ result = decorator(result) || result;
1022
+ return result;
1023
+ };
1024
+ const MODEL_TYPE$6 = "freestyle-holder-model";
1025
+ function resolveFreestyleAssembly(id) {
1026
+ const context = kosUiSdk.KosContextManager.getContext(id);
1027
+ const freestyleAssembly = context?.get(
1028
+ FreestyleAssembly.type
1029
+ );
1030
+ if (!freestyleAssembly) {
1031
+ kosUiSdk.KosLog.error("Freestyle assembly not found");
1032
+ return void 0;
1033
+ }
1034
+ return freestyleAssembly;
1035
+ }
1036
+ async function futureDelegate(model, method) {
1037
+ if (!model || !method) {
1038
+ return void 0;
1039
+ }
1040
+ const response = await model[method]();
1041
+ if (response?.tracker) {
1042
+ return kosUiSdk.FutureManager.getFuture(response.tracker);
1043
+ }
1044
+ return void 0;
1045
+ }
1046
+ let FreestyleHolderModelImpl = class {
1047
+ id;
1048
+ logger;
1049
+ holder;
1050
+ context;
1051
+ future;
1052
+ constructor(modelId, options, context) {
1053
+ this.id = modelId;
1054
+ this.logger = context.logger;
1055
+ this.context = context.kosContext;
1056
+ this.holder = options.companionParent;
1057
+ }
1058
+ get altName() {
1059
+ return this.holder.attributes["ncui_altName"];
1060
+ }
1061
+ get agitated() {
1062
+ return this.holder.data.agitated;
1063
+ }
1064
+ async agitate() {
1065
+ if (!this.holder.data.agitated) {
1066
+ return void 0;
1067
+ }
1068
+ this.future = void 0;
1069
+ const freestyleAssembly = resolveFreestyleAssembly(this.id);
1070
+ if (!freestyleAssembly) {
1071
+ return void 0;
1072
+ }
1073
+ const agitator = freestyleAssembly.defaultCartridgeAgitator;
1074
+ if (!agitator) {
1075
+ this.logger.error("Agitator not found");
1076
+ return void 0;
1077
+ }
1078
+ this.future = await futureDelegate(
1079
+ freestyleAssembly.defaultCartridgeAgitator,
1080
+ "testAgitate"
1081
+ );
1082
+ return this.future;
1083
+ }
1084
+ get isRemote() {
1085
+ const remoteTrayId = `${RemoteTray.type}-${this.holder.path}`;
1086
+ const remoteTray = kosUiSdk.getKosModelSync(remoteTrayId);
1087
+ if (!remoteTray?.model) {
1088
+ return false;
1089
+ }
1090
+ return !!remoteTray.model.remoteTrayEnabled.value;
1091
+ }
1092
+ // -------------------LIFECYCLE----------------------------
1093
+ async init() {
1094
+ this.logger.debug(`initializing freestyle-holder ${this.id}`);
1095
+ }
1096
+ async load() {
1097
+ this.logger.debug(`loading freestyle-holder ${this.id}`);
1098
+ }
1099
+ };
1100
+ FreestyleHolderModelImpl = __decorateClass$6([
1101
+ kosUiSdk.kosModel(MODEL_TYPE$6)
1102
+ ], FreestyleHolderModelImpl);
1103
+ const FreestyleHolder = new kosUiSdk.KosModelRegistrationFactory({
1104
+ class: FreestyleHolderModelImpl,
1105
+ type: MODEL_TYPE$6
1106
+ });
1107
+ const { URL: URL$3 } = kosUiSdk.resolveServiceUrl("FREESTYLE-NOZZLE_SERVICE");
1108
+ const { getOne } = kosUiSdk.ServiceFactory.build({
1109
+ basePath: `${URL$3}/api/freestyle-nozzle`
1110
+ });
1111
+ const log$3 = kosUiSdk.KosLog.createLogger({
1112
+ name: "freestyle-nozzle-service",
1113
+ group: "Services"
1114
+ });
1115
+ class NutritionInfoError extends Error {
1116
+ constructor(message) {
1117
+ super(message);
1118
+ this.name = "NutritionInfoError";
1119
+ }
1120
+ }
1121
+ class InvalidRequestError extends Error {
1122
+ constructor(message) {
1123
+ super(message);
1124
+ this.name = "InvalidRequestError";
1125
+ }
1126
+ }
1127
+ const getFreestyleNutritionInfo = async (nozzleUrlPrefix, beverageId, volumes, baseUrl = "http://localhost:8081") => {
1128
+ log$3.debug("sending GET for freestyle-nozzle");
1129
+ if (!beverageId) {
1130
+ log$3.error("Invalid freestyle-nozzle request: beverageId is required");
1131
+ throw new InvalidRequestError("No beverageId provided");
1132
+ }
1133
+ if (!volumes || volumes.length === 0) {
1134
+ log$3.error("Invalid freestyle-nozzle request: volumes are required");
1135
+ throw new InvalidRequestError("No volumes provided");
1136
+ }
1137
+ const response = await getOne({
1138
+ urlOverride: `${baseUrl}${nozzleUrlPrefix}/pipeline/beverage/engine/nutrition/${beverageId}?volumes=${volumes.join(
1139
+ ","
1140
+ )}`
1141
+ });
1142
+ if (!response?.data) {
1143
+ log$3.error("Failed to retrieve freestyle-nozzle data");
1144
+ throw new Error("Failed to retrieve freestyle-nozzle data");
1145
+ }
1146
+ if (response.data.error) {
1147
+ throw new NutritionInfoError(response.data.error);
1148
+ }
1149
+ return response.data;
1150
+ };
1151
+ var __defProp$4 = Object.defineProperty;
1152
+ var __getOwnPropDesc$5 = Object.getOwnPropertyDescriptor;
1153
+ var __decorateClass$5 = (decorators, target, key, kind) => {
1154
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$5(target, key) : target;
1155
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
1156
+ if (decorator = decorators[i])
1157
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1158
+ if (kind && result) __defProp$4(target, key, result);
1159
+ return result;
1160
+ };
1161
+ const MODEL_TYPE$5 = "freestyle-nozzle-model";
1162
+ let FreestyleNozzleModelImpl = class {
1163
+ id;
1164
+ logger;
1165
+ nozzleModel;
1166
+ _cupSizes;
1167
+ _nutritionInfo;
1168
+ constructor(modelId, options, context) {
1169
+ this.id = modelId;
1170
+ this.logger = context.logger;
1171
+ this.nozzleModel = options.companionParent;
1172
+ this._cupSizes = [100];
1173
+ }
1174
+ set cupSizes(cupSizes) {
1175
+ this._cupSizes = cupSizes;
1176
+ }
1177
+ get nutritionInfo() {
1178
+ return this._nutritionInfo;
1179
+ }
1180
+ get selectedPourable() {
1181
+ return this.nozzleModel.selectedPourable;
1182
+ }
1183
+ async handleBeverageSelection() {
1184
+ if (this.nozzleModel.selectedPourable.beverage && this._cupSizes.length) {
1185
+ this.logger.debug(
1186
+ `selected beverage: ${this.nozzleModel.selectedPourable.beverage.rawId}. Volume: ${this._cupSizes.join(", ")}`
1187
+ );
1188
+ const beverageId = this.nozzleModel.selectedPourable.beverage.rawId;
1189
+ const prefix = this.nozzleModel.urlPrefix;
1190
+ try {
1191
+ const response = await getFreestyleNutritionInfo(
1192
+ prefix,
1193
+ beverageId,
1194
+ this._cupSizes
1195
+ );
1196
+ kosUiSdk.kosAction(() => {
1197
+ this._nutritionInfo = response;
1198
+ });
1199
+ } catch (error) {
1200
+ this.logger.error(`Error fetching nutrition info: ${error}`);
1201
+ }
1202
+ }
1203
+ }
1204
+ // -------------------LIFECYCLE----------------------------
1205
+ async init() {
1206
+ this.logger.debug(`initializing freestyle-nozzle ${this.id}`);
1207
+ }
1208
+ unload() {
1209
+ this.logger.debug(`unloading freestyle-nozzle ${this.id}`);
1210
+ }
1211
+ async load() {
1212
+ this.logger.debug(`loading freestyle-nozzle ${this.id}`);
1213
+ }
1214
+ };
1215
+ __decorateClass$5([
1216
+ kosUiSdk.kosModelEffect({
1217
+ dependencies: (model) => [
1218
+ model.selectedPourable.beverage
1219
+ ]
1220
+ })
1221
+ ], FreestyleNozzleModelImpl.prototype, "handleBeverageSelection", 1);
1222
+ FreestyleNozzleModelImpl = __decorateClass$5([
1223
+ kosUiSdk.kosParentAware(),
1224
+ kosUiSdk.kosModel(MODEL_TYPE$5)
1225
+ ], FreestyleNozzleModelImpl);
1226
+ const FreestyleNozzle = new kosUiSdk.KosModelRegistrationFactory({
1227
+ class: FreestyleNozzleModelImpl,
1228
+ type: MODEL_TYPE$5
1229
+ });
1230
+ const { URL: URL$2 } = kosUiSdk.resolveServiceUrl("PUMP_SERVICE");
1231
+ const { postModel: postModel$2 } = kosUiSdk.ServiceFactory.build({
1232
+ basePath: `${URL$2}/api/ext/freestyle/microCalibration`
1233
+ });
1234
+ const log$2 = kosUiSdk.KosLog.createLogger({
1235
+ name: "freestyle-pump-service",
1236
+ group: "Services"
1237
+ });
1238
+ const replacePump = async (pumpId, code) => {
1239
+ log$2.debug(
1240
+ `replacePump - sending POST request to /api/ext/freestyle/microCalibration/cal/${pumpId}/code/${code}`
1241
+ );
1242
+ try {
1243
+ const response = await postModel$2({
1244
+ model: {},
1245
+ urlOverride: `${URL$2}/api/ext/freestyle/microCalibration/cal/${pumpId}/code/${code}`
1246
+ });
1247
+ log$2.debug("replacePump - response:", response);
1248
+ if ((response?.status === 200 || response?.status === 499) && response.data?.error) {
1249
+ return [response.data.error || "unknownError", response.data];
1250
+ }
1251
+ return [void 0, response?.data];
1252
+ } catch (error) {
1253
+ log$2.error(
1254
+ `replacePump - sending POST request to /api/cal/${pumpId}/code/${code}`,
1255
+ error
1256
+ );
1257
+ if (error instanceof kosUiSdk.FetchError) {
1258
+ const errorCode = error.payload?.data?.error || error.payload?.error || "unknownError";
1259
+ return [errorCode, error.payload?.data || { error: errorCode }];
1260
+ }
1261
+ }
1262
+ return ["unknownError", { error: "unknownError" }];
1263
+ };
1264
+ var __getOwnPropDesc$4 = Object.getOwnPropertyDescriptor;
1265
+ var __decorateClass$4 = (decorators, target, key, kind) => {
1266
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$4(target, key) : target;
1267
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
1268
+ if (decorator = decorators[i])
1269
+ result = decorator(result) || result;
1270
+ return result;
1271
+ };
1272
+ const MODEL_TYPE$4 = "freestyle-pump-model";
1273
+ let FreestylePumpModelImpl = class {
1274
+ id;
1275
+ logger;
1276
+ pump;
1277
+ constructor(modelId, options, context) {
1278
+ this.id = modelId;
1279
+ this.logger = context.logger;
1280
+ this.pump = options.companionParent;
1281
+ }
1282
+ // -------------------LIFECYCLE----------------------------
1283
+ async replacePump(code) {
1284
+ const [error, data] = await replacePump(this.pump.path, code);
1285
+ if (error) {
1286
+ this.logger.error(`Failed to replace the pump, ${this.pump.id}`, error);
1287
+ }
1288
+ return [error, data];
1289
+ }
1290
+ };
1291
+ FreestylePumpModelImpl = __decorateClass$4([
1292
+ kosUiSdk.kosModel(MODEL_TYPE$4)
1293
+ ], FreestylePumpModelImpl);
1294
+ const FreestylePump = new kosUiSdk.KosModelRegistrationFactory({
1295
+ class: FreestylePumpModelImpl,
1296
+ type: MODEL_TYPE$4
1297
+ });
1298
+ const { URL: URL$1 } = kosUiSdk.resolveServiceUrl("ICE_AGITATOR_SERVICE");
1299
+ const { getAll, postModel: postModel$1 } = kosUiSdk.ServiceFactory.build({
1300
+ basePath: `${URL$1}/api/ext/freestyle/ice`
1301
+ });
1302
+ const log$1 = kosUiSdk.KosLog.createLogger({
1303
+ name: "ice-agitator-service",
1304
+ group: "Services"
1305
+ });
1306
+ const getIceTypes = async (path) => {
1307
+ log$1.debug("sending GET for ice types");
1308
+ const response = await getAll({
1309
+ urlOverride: `${URL$1}/api/handle/${path}/types`
1310
+ });
1311
+ return response;
1312
+ };
1313
+ const updateIceType = async (agitator, type) => {
1314
+ log$1.debug("sending POST for ice types");
1315
+ const response = await postModel$1({
1316
+ urlOverride: `${URL$1}/api/handle/${agitator}/type/${type}`,
1317
+ model: {}
1318
+ });
1319
+ return response;
1320
+ };
1321
+ const resetIceSetting = async (path) => {
1322
+ const response = await getAll({
1323
+ urlOverride: `${URL$1}/api/kos/config/details/${path}/4`
1324
+ });
1325
+ return response;
1326
+ };
1327
+ const pour = async (path, tracker) => {
1328
+ const response = await postModel$1({
1329
+ model: {},
1330
+ tracker,
1331
+ urlOverride: `${URL$1}/api/handle/${path}/pour`
1332
+ });
1333
+ if (!response?.data) {
1334
+ throw new Error("No response from server");
1335
+ }
1336
+ return response?.data;
1337
+ };
1338
+ const agitate = async (path, tracker) => {
1339
+ const response = await postModel$1({
1340
+ model: {},
1341
+ tracker,
1342
+ urlOverride: `${URL$1}/api/handle/${path}/test/agitation`
1343
+ });
1344
+ if (!response?.data) {
1345
+ throw new Error("No response from server");
1346
+ }
1347
+ return response?.data;
1348
+ };
1349
+ const testGate = async (path, tracker) => {
1350
+ const response = await postModel$1({
1351
+ model: {},
1352
+ tracker,
1353
+ urlOverride: `${URL$1}/api/handle/${path}/test/gate`
1354
+ });
1355
+ if (!response?.data) {
1356
+ throw new Error("No response from server");
1357
+ }
1358
+ return response?.data;
1359
+ };
1360
+ var __defProp$3 = Object.defineProperty;
1361
+ var __getOwnPropDesc$3 = Object.getOwnPropertyDescriptor;
1362
+ var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1363
+ var __decorateClass$3 = (decorators, target, key, kind) => {
1364
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$3(target, key) : target;
1365
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
1366
+ if (decorator = decorators[i])
1367
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1368
+ if (kind && result) __defProp$3(target, key, result);
1369
+ return result;
1370
+ };
1371
+ var __publicField$2 = (obj, key, value) => __defNormalProp$2(obj, key + "", value);
1372
+ class IceAgitatorEvents {
1373
+ static TOPIC_AGITATION_STARTED = "/kos/events/ddk/ice-agitation-started";
1374
+ static TOPIC_AGITATION_ENDED = "/kos/events/ddk/ice-agitation-ended";
1375
+ }
1376
+ const MODEL_TYPE$3 = "ice-agitator-model";
1377
+ const PROP_PATH = kosUiSdk.createPropKey("statePath");
1378
+ let IceAgitatorModelImpl = class {
1379
+ id;
1380
+ name;
1381
+ path;
1382
+ volWithoutIceMl;
1383
+ durationSec;
1384
+ enableIceChuteClear;
1385
+ iceChuteClearDurationMs;
1386
+ iceChuteClearIntervalSec;
1387
+ iceChuteClearRetryIntervalSec;
1388
+ maxDispenseSec;
1389
+ type;
1390
+ dilutionOffset;
1391
+ inactivitySec;
1392
+ agitating;
1393
+ iceChuteOpen;
1394
+ statePath;
1395
+ _allIceTypes;
1396
+ currentState = kosDispenseSdk.PourState.IDLE;
1397
+ constructor(modelId, options) {
1398
+ this.id = modelId;
1399
+ this.name = options.name;
1400
+ this.path = options.path;
1401
+ this.statePath = options.statePath;
1402
+ this._allIceTypes = [];
1403
+ }
1404
+ get iceTypes() {
1405
+ return this._allIceTypes;
1406
+ }
1407
+ get isAgitating() {
1408
+ return !!this.agitating.value;
1409
+ }
1410
+ get isIceChuteOpen() {
1411
+ return !!this.iceChuteOpen.value;
1412
+ }
1413
+ // future, pourFuture, agitateFuture, gateFuture getters are now provided by @kosMultipleFutureAware decorator
1414
+ /**
1415
+ * A derived value that indicates if the nozzle is currently pouring a beverage.
1416
+ * @readonly
1417
+ */
1418
+ get isPouring() {
1419
+ return !!(this.pourFuture && !this.pourFuture?.endState) || this.currentState === kosDispenseSdk.PourState.POUR_STARTING || this.currentState === kosDispenseSdk.PourState.POURING || this.currentState === kosDispenseSdk.PourState.POUR_CANCELING;
1420
+ }
1421
+ /**
1422
+ * A derived value that indicates if it is possible to dispense ice.
1423
+ *
1424
+ * The value is observable and will change as the current dispense state changes
1425
+ * @readonly
1426
+ * */
1427
+ get canPour() {
1428
+ return this.currentState === kosDispenseSdk.PourState.IDLE;
1429
+ }
1430
+ updateIfCurrent(currentState, nextState) {
1431
+ if (this.currentState === currentState) {
1432
+ kosUiSdk.kosAction(() => {
1433
+ this.currentState = nextState;
1434
+ });
1435
+ }
1436
+ }
1437
+ async pourIce(tracker) {
1438
+ try {
1439
+ if (this.currentState === kosDispenseSdk.PourState.IDLE) {
1440
+ this.updateIfCurrent(kosDispenseSdk.PourState.IDLE, kosDispenseSdk.PourState.POUR_STARTING);
1441
+ if (!tracker) {
1442
+ throw new Error("No tracker provided");
1443
+ }
1444
+ const result = await pour(this.path, tracker);
1445
+ this.updateIfCurrent(kosDispenseSdk.PourState.POUR_STARTING, kosDispenseSdk.PourState.POURING);
1446
+ if (result?.endState) {
1447
+ this.updateIfCurrent(kosDispenseSdk.PourState.POURING, kosDispenseSdk.PourState.IDLE);
1448
+ }
1449
+ return result;
1450
+ } else {
1451
+ throw new Error(`Cannot pour in state ${this.currentState}`);
1452
+ }
1453
+ } catch (e) {
1454
+ this.logger.error(e);
1455
+ this.currentState = kosDispenseSdk.PourState.IDLE;
1456
+ throw e;
1457
+ }
1458
+ }
1459
+ /**
1460
+ * An action that will cancel the ice dispense if it is currently in progress.
1461
+ * */
1462
+ async cancelIceDispense() {
1463
+ if (this.currentState === kosDispenseSdk.PourState.POURING || this.currentState === kosDispenseSdk.PourState.POUR_STARTING) {
1464
+ this.currentState = kosDispenseSdk.PourState.POUR_CANCELING;
1465
+ await this.pourFuture?.cancelFuture();
1466
+ kosUiSdk.kosAction(() => {
1467
+ this.currentState = kosDispenseSdk.PourState.IDLE;
1468
+ });
1469
+ } else {
1470
+ this.logger.warn(
1471
+ `Cannot cancel ice dispense in state ${this.currentState}`
1472
+ );
1473
+ }
1474
+ }
1475
+ async testAgitate(tracker) {
1476
+ if (!tracker) {
1477
+ throw new Error("No tracker provided");
1478
+ }
1479
+ this.logger.info(`agitating ice-agitator ${this.id}`);
1480
+ return agitate(this.path, tracker);
1481
+ }
1482
+ async testGate(tracker) {
1483
+ if (!tracker) {
1484
+ throw new Error("No tracker provided");
1485
+ }
1486
+ this.logger.info(`testing ice gate: ${this.id}`);
1487
+ return testGate(this.path, tracker);
1488
+ }
1489
+ handleAgitationChange() {
1490
+ if (this.isAgitating) {
1491
+ this.logger.info(`agitating ice-agitator ${this.id}`);
1492
+ kosUiSdk.EventBus.publish(IceAgitatorEvents.TOPIC_AGITATION_STARTED, {
1493
+ path: this.path,
1494
+ futureId: this.futureHandler.future?.futureId
1495
+ });
1496
+ } else {
1497
+ kosUiSdk.EventBus.publish(IceAgitatorEvents.TOPIC_AGITATION_ENDED, {
1498
+ path: this.path
1499
+ });
1500
+ }
1501
+ }
1502
+ async updateIceType(type) {
1503
+ await updateIceType(this.path, type);
1504
+ }
1505
+ resetDefaultValues = async () => {
1506
+ const defaults = await resetIceSetting(this.path);
1507
+ return defaults;
1508
+ };
1509
+ async init() {
1510
+ this.logger.debug(`initializing ice-agitator ${this.id}`);
1511
+ }
1512
+ async load() {
1513
+ try {
1514
+ this.logger.debug(`loading ice-agitator ${this.id}`);
1515
+ const iceTypes = await getIceTypes(this.path);
1516
+ if (iceTypes?.status === 200) {
1517
+ kosUiSdk.kosAction(() => {
1518
+ this._allIceTypes = iceTypes.data || [];
1519
+ });
1520
+ }
1521
+ } catch (e) {
1522
+ this.logger.error(e);
1523
+ }
1524
+ }
1525
+ };
1526
+ __publicField$2(IceAgitatorModelImpl, "Registration");
1527
+ __decorateClass$3([
1528
+ kosUiSdk.kosConfigProperty({
1529
+ path: kosUiSdk.KOS_MODEL_ID,
1530
+ attribute: "settings.volWithoutIceMl"
1531
+ })
1532
+ ], IceAgitatorModelImpl.prototype, "volWithoutIceMl", 2);
1533
+ __decorateClass$3([
1534
+ kosUiSdk.kosConfigProperty({
1535
+ path: kosUiSdk.KOS_MODEL_ID,
1536
+ attribute: "settings.durationSec",
1537
+ converter: {
1538
+ to: "second"
1539
+ }
1540
+ })
1541
+ ], IceAgitatorModelImpl.prototype, "durationSec", 2);
1542
+ __decorateClass$3([
1543
+ kosUiSdk.kosConfigProperty({
1544
+ path: kosUiSdk.KOS_MODEL_ID,
1545
+ attribute: "enableIceChuteClear"
1546
+ })
1547
+ ], IceAgitatorModelImpl.prototype, "enableIceChuteClear", 2);
1548
+ __decorateClass$3([
1549
+ kosUiSdk.kosConfigProperty({
1550
+ path: kosUiSdk.KOS_MODEL_ID,
1551
+ attribute: "iceChuteClearDurationMs"
1552
+ })
1553
+ ], IceAgitatorModelImpl.prototype, "iceChuteClearDurationMs", 2);
1554
+ __decorateClass$3([
1555
+ kosUiSdk.kosConfigProperty({
1556
+ path: kosUiSdk.KOS_MODEL_ID,
1557
+ attribute: "iceChuteClearIntervalSec"
1558
+ })
1559
+ ], IceAgitatorModelImpl.prototype, "iceChuteClearIntervalSec", 2);
1560
+ __decorateClass$3([
1561
+ kosUiSdk.kosConfigProperty({
1562
+ path: kosUiSdk.KOS_MODEL_ID,
1563
+ attribute: "iceChuteClearRetryIntervalSec"
1564
+ })
1565
+ ], IceAgitatorModelImpl.prototype, "iceChuteClearRetryIntervalSec", 2);
1566
+ __decorateClass$3([
1567
+ kosUiSdk.kosConfigProperty({
1568
+ path: kosUiSdk.KOS_MODEL_ID,
1569
+ attribute: "maxDispenseSec"
1570
+ })
1571
+ ], IceAgitatorModelImpl.prototype, "maxDispenseSec", 2);
1572
+ __decorateClass$3([
1573
+ kosUiSdk.kosConfigProperty({
1574
+ path: kosUiSdk.KOS_MODEL_ID,
1575
+ attribute: "type"
1576
+ })
1577
+ ], IceAgitatorModelImpl.prototype, "type", 2);
1578
+ __decorateClass$3([
1579
+ kosUiSdk.kosConfigProperty({
1580
+ path: kosUiSdk.KOS_MODEL_ID,
1581
+ attribute: "settings.dilutionOffset"
1582
+ })
1583
+ ], IceAgitatorModelImpl.prototype, "dilutionOffset", 2);
1584
+ __decorateClass$3([
1585
+ kosUiSdk.kosConfigProperty({
1586
+ path: kosUiSdk.KOS_MODEL_ID,
1587
+ attribute: "settings.inactivitySec",
1588
+ converter: {
1589
+ to: "minute"
1590
+ }
1591
+ })
1592
+ ], IceAgitatorModelImpl.prototype, "inactivitySec", 2);
1593
+ __decorateClass$3([
1594
+ kosUiSdk.kosStateProp({ path: PROP_PATH, attribute: "agitating" })
1595
+ ], IceAgitatorModelImpl.prototype, "agitating", 2);
1596
+ __decorateClass$3([
1597
+ kosUiSdk.kosStateProp({ path: PROP_PATH, attribute: "iceChuteOpen" })
1598
+ ], IceAgitatorModelImpl.prototype, "iceChuteOpen", 2);
1599
+ __decorateClass$3([
1600
+ kosUiSdk.kosFuture({ alias: "pour" })
1601
+ ], IceAgitatorModelImpl.prototype, "pourIce", 1);
1602
+ __decorateClass$3([
1603
+ kosUiSdk.kosFuture({ alias: "agitate" })
1604
+ ], IceAgitatorModelImpl.prototype, "testAgitate", 1);
1605
+ __decorateClass$3([
1606
+ kosUiSdk.kosFuture({
1607
+ alias: "gate"
1608
+ })
1609
+ ], IceAgitatorModelImpl.prototype, "testGate", 1);
1610
+ __decorateClass$3([
1611
+ kosUiSdk.kosModelEffect({
1612
+ dependencies: (model) => [model.isAgitating]
1613
+ })
1614
+ ], IceAgitatorModelImpl.prototype, "handleAgitationChange", 1);
1615
+ IceAgitatorModelImpl = __decorateClass$3([
1616
+ kosUiSdk.kosModel({ modelTypeId: MODEL_TYPE$3, singleton: false }),
1617
+ kosUiSdk.kosLoggerAware(),
1618
+ kosUiSdk.kosMultipleFutureAware()
1619
+ ], IceAgitatorModelImpl);
1620
+ const IceAgitator = IceAgitatorModelImpl.Registration;
1621
+ var __defProp$2 = Object.defineProperty;
1622
+ var __getOwnPropDesc$2 = Object.getOwnPropertyDescriptor;
1623
+ var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1624
+ var __decorateClass$2 = (decorators, target, key, kind) => {
1625
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$2(target, key) : target;
1626
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
1627
+ if (decorator = decorators[i])
1628
+ result = decorator(result) || result;
1629
+ return result;
1630
+ };
1631
+ var __publicField$1 = (obj, key, value) => __defNormalProp$1(obj, key + "", value);
1632
+ const MODEL_TYPE$2 = "lfcv-pump-model";
1633
+ let LfcvPumpModelImpl = class {
1634
+ id;
1635
+ constructor(modelId, _options) {
1636
+ this.id = modelId;
1637
+ }
1638
+ get name() {
1639
+ return this.pumpModel.name;
1640
+ }
1641
+ get canPour() {
1642
+ return this.pumpModel.canPour;
1643
+ }
1644
+ get isPouring() {
1645
+ return this.pumpModel.isPouring;
1646
+ }
1647
+ async cancelPour() {
1648
+ return this.pumpModel.cancelPour();
1649
+ }
1650
+ performIntent(props) {
1651
+ return this.pumpModel.performIntent(props);
1652
+ }
1653
+ };
1654
+ __publicField$1(LfcvPumpModelImpl, "Registration");
1655
+ LfcvPumpModelImpl = __decorateClass$2([
1656
+ kosUiSdk.kosModel({ modelTypeId: MODEL_TYPE$2, singleton: false }),
1657
+ kosUiSdk.kosLoggerAware(),
1658
+ kosUiSdk.kosCompanion({
1659
+ mode: "composition",
1660
+ parentProperty: "pumpModel"
1661
+ })
1662
+ ], LfcvPumpModelImpl);
1663
+ const LfcvPump = LfcvPumpModelImpl.Registration;
1664
+ const { URL } = kosUiSdk.resolveServiceUrl("SPM-PUMP_SERVICE");
1665
+ const { postModel } = kosUiSdk.ServiceFactory.build({
1666
+ basePath: `${URL}/api/spm-pump`
1667
+ });
1668
+ const log = kosUiSdk.KosLog.createLogger({
1669
+ name: "spm-pump-service",
1670
+ group: "Services"
1671
+ });
1672
+ const performPreCalibrate = async (pump, tracker) => {
1673
+ log.debug(
1674
+ `performPreCalibrate - sending POST request to /api/ext/freestyle/microCalibration/pour/${pump}/preCalibrate`
1675
+ );
1676
+ try {
1677
+ const response = await postModel({
1678
+ model: {},
1679
+ urlOverride: `${URL}/api/ext/freestyle/microCalibration/pour/${pump}/preCalibrate`,
1680
+ tracker
1681
+ });
1682
+ log.debug("performPreCalibrate - response:", response);
1683
+ if (response?.data) {
1684
+ kosUiSdk.FutureManager.initiateFuture(response.data);
1685
+ }
1686
+ return response?.data;
1687
+ } catch (error) {
1688
+ log.error(
1689
+ `performPreCalibrate - sending POST request to /api/ext/freestyle/microCalibration/pour/${pump}/preCalibrate`,
1690
+ error
1691
+ );
1692
+ const futureResponse = {
1693
+ id: tracker || "",
1694
+ endState: kosUiSdk.FutureEndState.Fail,
1695
+ tracker,
1696
+ reason: "Failed to resolve trouble"
1697
+ };
1698
+ kosUiSdk.FutureManager.initiateFuture(futureResponse);
1699
+ return futureResponse;
1700
+ }
1701
+ };
1702
+ const performCalibrate = async (pump, tracker) => {
1703
+ log.debug(
1704
+ `performCalibrate - sending POST request to /api/ext/freestyle/microCalibration/pour/${pump}/calibrate`
1705
+ );
1706
+ try {
1707
+ const response = await postModel({
1708
+ model: {},
1709
+ urlOverride: `${URL}/api/ext/freestyle/microCalibration/pour/${pump}/calibrate`,
1710
+ tracker
1711
+ });
1712
+ log.debug("performCalibrate - response:", response);
1713
+ if (response?.data) {
1714
+ kosUiSdk.FutureManager.initiateFuture(response.data);
1715
+ }
1716
+ return response?.data;
1717
+ } catch (error) {
1718
+ log.error(
1719
+ `performCalibrate - sending POST request to /api/ext/freestyle/microCalibration/pour/${pump}/calibrate`,
1720
+ error
1721
+ );
1722
+ const futureResponse = {
1723
+ id: tracker || "",
1724
+ endState: kosUiSdk.FutureEndState.Fail,
1725
+ tracker,
1726
+ reason: "Failed to resolve trouble"
1727
+ };
1728
+ kosUiSdk.FutureManager.initiateFuture(futureResponse);
1729
+ return futureResponse;
1730
+ }
1731
+ };
1732
+ const performVerify = async (pump, volume, payload, tracker) => {
1733
+ log.debug(
1734
+ `performVerify - sending POST request to /api/ext/freestyle/microCalibration/pour/${pump}/verify`
1735
+ );
1736
+ try {
1737
+ const response = await postModel({
1738
+ model: {
1739
+ ...payload,
1740
+ // commandedCalibrationVolume: 0,
1741
+ measuredCalibrationVolume: volume
1742
+ // measuredVerificationVolume: 0,
1743
+ // newCalibrationValue: 0,
1744
+ // pouredCalibrationVolume: 0,
1745
+ },
1746
+ urlOverride: `${URL}/api/ext/freestyle/microCalibration/pour/${pump}/verify`,
1747
+ tracker
1748
+ });
1749
+ log.debug("performVerify - response:", response);
1750
+ if (response?.data) {
1751
+ kosUiSdk.FutureManager.initiateFuture(response.data);
1752
+ }
1753
+ return response?.data;
1754
+ } catch (error) {
1755
+ log.error(
1756
+ `performVerify - sending POST request to /api/ext/freestyle/microCalibration/pour/${pump}/verify`,
1757
+ error
1758
+ );
1759
+ const futureResponse = {
1760
+ id: tracker || "",
1761
+ endState: kosUiSdk.FutureEndState.Fail,
1762
+ tracker,
1763
+ reason: "Failed to resolve trouble"
1764
+ };
1765
+ kosUiSdk.FutureManager.initiateFuture(futureResponse);
1766
+ return futureResponse;
1767
+ }
1768
+ };
1769
+ const performComplete = async (pump, volume1, volume2, payload) => {
1770
+ log.debug(
1771
+ `performComplete - sending POST request to /api/ext/freestyle/microCalibration/pour/${pump}/complete`
1772
+ );
1773
+ try {
1774
+ const response = await postModel({
1775
+ model: {
1776
+ ...payload,
1777
+ // commandedCalibrationVolume: 0,
1778
+ measuredCalibrationVolume: volume1,
1779
+ measuredVerificationVolume: volume2
1780
+ // newCalibrationValue: 0,
1781
+ // pouredCalibrationVolume: 0,
1782
+ },
1783
+ urlOverride: `${URL}/api/ext/freestyle/microCalibration/pour/${pump}/complete`
1784
+ });
1785
+ log.debug("performComplete - response:", response);
1786
+ if ((response?.status === 200 || response?.status === 499) && response.data?.error) {
1787
+ return [response.data.error || "unknownError", response.data];
1788
+ }
1789
+ return [void 0, response?.data];
1790
+ } catch (error) {
1791
+ log.error(
1792
+ `performComplete - sending POST request to /api/ext/freestyle/microCalibration/pour/${pump}/complete`,
1793
+ error
1794
+ );
1795
+ if (error instanceof kosUiSdk.FetchError) {
1796
+ const errorCode = error.payload?.data?.error || error.payload?.error || "unknownError";
1797
+ return [errorCode, error.payload?.data || { error: errorCode }];
1798
+ }
1799
+ }
1800
+ return ["unknownError", { error: "unknownError" }];
1801
+ };
1802
+ var __defProp$1 = Object.defineProperty;
1803
+ var __getOwnPropDesc$1 = Object.getOwnPropertyDescriptor;
1804
+ var __decorateClass$1 = (decorators, target, key, kind) => {
1805
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$1(target, key) : target;
1806
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
1807
+ if (decorator = decorators[i])
1808
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1809
+ if (kind && result) __defProp$1(target, key, result);
1810
+ return result;
1811
+ };
1812
+ const MODEL_TYPE$1 = "spm-pump-model";
1813
+ let SpmPumpModelImpl = class {
1814
+ id;
1815
+ logger;
1816
+ pump;
1817
+ futureHandler;
1818
+ constructor(modelId, options, context) {
1819
+ this.id = modelId;
1820
+ this.logger = context.logger;
1821
+ this.pump = options.companionParent;
1822
+ this.futureHandler = new kosUiSdk.FutureHandler(this);
1823
+ }
1824
+ get name() {
1825
+ return this.pump.name;
1826
+ }
1827
+ get canPour() {
1828
+ return this.pump.canPour;
1829
+ }
1830
+ get isPouring() {
1831
+ return this.pump.isPouring;
1832
+ }
1833
+ async cancelPour() {
1834
+ return this.pump.cancelPour();
1835
+ }
1836
+ performIntent(props) {
1837
+ return this.pump.performIntent(props);
1838
+ }
1839
+ get future() {
1840
+ return this.futureHandler.future;
1841
+ }
1842
+ async performPreCalibrate(tracker) {
1843
+ return performPreCalibrate(this.pump.path, tracker);
1844
+ }
1845
+ async performCalibrate(tracker) {
1846
+ return performCalibrate(this.pump.path, tracker);
1847
+ }
1848
+ async performVerify(volume, payload, tracker) {
1849
+ return performVerify(this.pump.path, volume, payload, tracker);
1850
+ }
1851
+ async performComplete(volume1, volume2, payload) {
1852
+ return performComplete(this.pump.path, volume1, volume2, payload);
1853
+ }
1854
+ // -------------------LIFECYCLE----------------------------
1855
+ async init() {
1856
+ this.logger.debug(`initializing spm-pump ${this.id}`);
1857
+ }
1858
+ async load() {
1859
+ this.logger.debug(`loading spm-pump ${this.id}`);
1860
+ }
1861
+ };
1862
+ __decorateClass$1([
1863
+ kosUiSdk.kosFuture()
1864
+ ], SpmPumpModelImpl.prototype, "performPreCalibrate", 1);
1865
+ __decorateClass$1([
1866
+ kosUiSdk.kosFuture()
1867
+ ], SpmPumpModelImpl.prototype, "performCalibrate", 1);
1868
+ __decorateClass$1([
1869
+ kosUiSdk.kosFuture()
1870
+ ], SpmPumpModelImpl.prototype, "performVerify", 1);
1871
+ SpmPumpModelImpl = __decorateClass$1([
1872
+ kosUiSdk.kosModel(MODEL_TYPE$1)
1873
+ ], SpmPumpModelImpl);
1874
+ const SpmPump = new kosUiSdk.KosModelRegistrationFactory({
1875
+ class: SpmPumpModelImpl,
1876
+ type: MODEL_TYPE$1
1877
+ });
1878
+ var __defProp = Object.defineProperty;
1879
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
1880
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
1881
+ var __decorateClass = (decorators, target, key, kind) => {
1882
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
1883
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
1884
+ if (decorator = decorators[i])
1885
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1886
+ if (kind && result) __defProp(target, key, result);
1887
+ return result;
1888
+ };
1889
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "", value);
1890
+ const MODEL_TYPE = "agitation-required-trouble-model";
1891
+ const agitationModelFactory = (troubleModel) => {
1892
+ if (troubleModel.data.agitationRequired) {
1893
+ return MODEL_TYPE;
1894
+ }
1895
+ return void 0;
1896
+ };
1897
+ const AGITATION_REQUIRED_TROUBLE = "InsufficientAgitationTrouble";
1898
+ let AgitationRequiredTroubleModelImpl = class {
1899
+ /**
1900
+ * Unique identifier for this model instance.
1901
+ */
1902
+ id;
1903
+ _deferred;
1904
+ _holdersLoaded = false;
1905
+ agitateBeforePour;
1906
+ /**
1907
+ * Creates a new AgitationRequiredTrouble model instance.
1908
+ *
1909
+ * @param modelId - Unique identifier for this model instance (typically matches parent trouble ID)
1910
+ */
1911
+ constructor(modelId) {
1912
+ this.id = modelId;
1913
+ this._deferred = false;
1914
+ }
1915
+ /**
1916
+ * Resolves the agitation trouble by delegating to the parent trouble model.
1917
+ *
1918
+ * Resolution typically involves completing the agitation process and clearing
1919
+ * the trouble state once carbonation or mixing levels are acceptable.
1920
+ *
1921
+ * @returns Promise resolving to the future response from the parent trouble's resolution
1922
+ */
1923
+ async resolve() {
1924
+ return this.trouble.resolve();
1925
+ }
1926
+ /**
1927
+ * Gets the holder model associated with this agitation trouble.
1928
+ *
1929
+ * The holder is the physical container (cartridge holder, ingredient holder, etc.)
1930
+ * that requires agitation. Returns undefined if the holder model hasn't been
1931
+ * loaded yet through the Assembly model initialization.
1932
+ *
1933
+ * @returns The holder model or undefined if not yet loaded
1934
+ */
1935
+ get holder() {
1936
+ if (!this.trouble) {
1937
+ return void 0;
1938
+ }
1939
+ const holderPath = this.trouble.data.holderPaths[0];
1940
+ const holderModel = kosUiSdk.getKosModelSync(holderPath);
1941
+ if (!this._holdersLoaded && !holderModel.model) {
1942
+ return void 0;
1943
+ }
1944
+ return holderModel?.model;
1945
+ }
1946
+ updateHolder() {
1947
+ if (!this._holdersLoaded && !!this.trouble) {
1948
+ const holderPath = this.trouble.data.holderPaths[0];
1949
+ const holderModel = kosUiSdk.getKosModelSync(holderPath);
1950
+ if (holderModel.model) {
1951
+ this._holdersLoaded = true;
1952
+ }
1953
+ }
1954
+ }
1955
+ /**
1956
+ * Determines if trouble resolution should be deferred until agitation completes.
1957
+ *
1958
+ * Trouble resolution is deferred when:
1959
+ * 1. The holder has active insufficient agitation troubles
1960
+ * 2. The `agitateBeforePour` configuration is enabled
1961
+ *
1962
+ * This ensures that operations requiring agitation (prime, purge, or other
1963
+ * holder-related troubles) wait for proper carbonation or mixing before
1964
+ * being marked as resolved.
1965
+ *
1966
+ * @returns true if trouble resolution should wait for agitation to complete
1967
+ */
1968
+ get shouldDefer() {
1969
+ if (!this.holder) {
1970
+ return true;
1971
+ }
1972
+ const troubleList = this.holder?.troublesByType[AGITATION_REQUIRED_TROUBLE] || [];
1973
+ const hasInsufficientAgitationTrouble = troubleList.length > 0;
1974
+ const waitForAgitation = !!this.agitateBeforePour?.value;
1975
+ return waitForAgitation && hasInsufficientAgitationTrouble;
1976
+ }
1977
+ /**
1978
+ * Gets the current deferral state of this trouble.
1979
+ *
1980
+ * @returns true if this trouble resolution is currently deferred
1981
+ */
1982
+ get deferred() {
1983
+ return this._deferred;
1984
+ }
1985
+ /**
1986
+ * Marks this trouble as deferred, preventing immediate resolution.
1987
+ *
1988
+ * Called by the trouble system to indicate that trouble resolution
1989
+ * should wait for agitation to complete before being marked as resolved.
1990
+ */
1991
+ defer() {
1992
+ this._deferred = true;
1993
+ }
1994
+ /**
1995
+ * Clears the deferral state, allowing trouble resolution to proceed.
1996
+ *
1997
+ * Typically called after agitation has completed and the trouble can
1998
+ * now be safely resolved.
1999
+ */
2000
+ clearDefer() {
2001
+ this._deferred = false;
2002
+ }
2003
+ };
2004
+ __publicField(AgitationRequiredTroubleModelImpl, "Registration");
2005
+ __decorateClass([
2006
+ kosUiSdk.kosConfigProperty({
2007
+ path: "app:kosdev.ddk:app",
2008
+ attribute: "ncui.agitateBeforePour"
2009
+ })
2010
+ ], AgitationRequiredTroubleModelImpl.prototype, "agitateBeforePour", 2);
2011
+ __decorateClass([
2012
+ kosUiSdk.kosTopicHandler({
2013
+ topic: kosUiSdk.modelTypeEventTopicFactory(kosDispenseSdk.Assembly.type),
2014
+ lifecycle: kosUiSdk.DependencyLifecycle.INIT
2015
+ })
2016
+ ], AgitationRequiredTroubleModelImpl.prototype, "updateHolder", 1);
2017
+ AgitationRequiredTroubleModelImpl = __decorateClass([
2018
+ kosUiSdk.kosModel({ modelTypeId: MODEL_TYPE, singleton: false }),
2019
+ kosUiSdk.kosLoggerAware(),
2020
+ kosUiSdk.kosCompanion({ mode: "composition", parentProperty: "trouble" })
2021
+ ], AgitationRequiredTroubleModelImpl);
2022
+ const AgitationRequiredTrouble = AgitationRequiredTroubleModelImpl.Registration;
2023
+ const AGITATOR_KEYS = ["iceAgitator"];
2024
+ const AGITATOR_FACTORY_MAP = {
2025
+ iceAgitator: IceAgitator
2026
+ };
2027
+ const logger = kosUiSdk.KosLog.createLogger({ name: "freestyle-assembly-data-mapper" });
2028
+ const freestyleAssemblyDataMapper = async (data) => {
2029
+ const cartridgeAgitators = CartridgeAgitatorContainer.instance().options({}).build();
2030
+ const remoteTrays = RemoteTrayContainer.instance().options({}).build();
2031
+ const response = data.assemblies.reduce((acc, assembly) => {
2032
+ AGITATOR_KEYS.forEach((key) => {
2033
+ const agitator = assembly[key];
2034
+ if (agitator) {
2035
+ const factory = AGITATOR_FACTORY_MAP[key];
2036
+ acc[key] = factory.instance(agitator.path).options({
2037
+ name: agitator.name,
2038
+ path: agitator.path,
2039
+ statePath: agitator.state?.path || ""
2040
+ }).build();
2041
+ }
2042
+ });
2043
+ assembly.cartridgeAgitators?.forEach((cartridgeAgitatorData) => {
2044
+ const cartridgeAgitator = CartridgeAgitator.instance(
2045
+ cartridgeAgitatorData.path
2046
+ ).options({
2047
+ name: cartridgeAgitatorData.name,
2048
+ path: cartridgeAgitatorData.path,
2049
+ statePath: cartridgeAgitatorData.state?.path || ""
2050
+ }).build();
2051
+ cartridgeAgitators.addModel(cartridgeAgitator);
2052
+ });
2053
+ if (assembly.remoteTrays) {
2054
+ assembly.remoteTrays.forEach((tray) => {
2055
+ logger.info(`Found remote tray ${tray.name} with path ${tray.path}`);
2056
+ const trayId = `${RemoteTray.type}-${tray.holderPath}`;
2057
+ const trayModel = RemoteTray.instance(trayId).options({
2058
+ holderPath: tray.holderPath,
2059
+ configPath: tray.path,
2060
+ name: tray.name
2061
+ }).build();
2062
+ remoteTrays.addModel(trayModel);
2063
+ });
2064
+ }
2065
+ return acc;
2066
+ }, {});
2067
+ const supportsIce = !!response.iceAgitator;
2068
+ const supportsCarb = !!response["carbTank"];
2069
+ return {
2070
+ ...response,
2071
+ cartridgeAgitators,
2072
+ remoteTrays,
2073
+ supportsCarb,
2074
+ supportsIce
2075
+ };
2076
+ };
2077
+ const registerFreestyleModels = (root) => () => {
2078
+ kosUiSdk.registerCoreModels(root)();
2079
+ kosDispenseSdk.registerDispenseModels(root)();
2080
+ FreestyleNozzle.register();
2081
+ FreestyleAssembly.register();
2082
+ IceAgitator.register();
2083
+ CarbAgitator.register();
2084
+ CartridgeAgitatorContainer.register();
2085
+ SpmPump.register();
2086
+ FcmPump.register();
2087
+ LfcvPump.register();
2088
+ CgpPump.register();
2089
+ FreestylePump.register();
2090
+ FreestyleHolder.register();
2091
+ RemoteTray.register();
2092
+ RemoteTrayContainer.register();
2093
+ kosUiSdk.RegistrationManager.companion.register(root)(
2094
+ kosDispenseSdk.Nozzle.type,
2095
+ FreestyleNozzle.type
2096
+ );
2097
+ kosUiSdk.RegistrationManager.companion.register(root)(
2098
+ kosDispenseSdk.Assembly.type,
2099
+ FreestyleAssembly.type
2100
+ );
2101
+ AgitationRequiredTrouble.register();
2102
+ kosUiSdk.RegistrationManager.companion.register(root)(
2103
+ kosUiSdk.Trouble.type,
2104
+ agitationModelFactory
2105
+ );
2106
+ kosUiSdk.RegistrationManager.companion.register(root)(kosDispenseSdk.Pump.type, FreestylePump.type);
2107
+ kosUiSdk.RegistrationManager.companion.register(root)(
2108
+ kosDispenseSdk.Holder.type,
2109
+ FreestyleHolder.type
2110
+ );
2111
+ kosUiSdk.ExtensionManager[kosUiSdk.EXTENSION_TROUBLE_DATA_MAPPER].register(
2112
+ "EnjoyByTrouble",
2113
+ async (trouble) => {
2114
+ if (trouble.data.enjoyByDate) {
2115
+ const enjoyByDate = new Date(trouble.data.enjoyByDate);
2116
+ const now = /* @__PURE__ */ new Date();
2117
+ const daysSinceEnjoyBy = Math.floor(
2118
+ (now.getTime() - enjoyByDate.getTime()) / (1e3 * 60 * 60 * 24)
2119
+ );
2120
+ return {
2121
+ enjoyByDays: daysSinceEnjoyBy || ""
2122
+ };
2123
+ }
2124
+ return {};
2125
+ }
2126
+ );
2127
+ kosUiSdk.ExtensionManager[kosUiSdk.EXTENSION_TROUBLE_DATA_MAPPER].register(
2128
+ "SuperPumpRequiredTrouble",
2129
+ // This is the trouble type
2130
+ async (_trouble) => {
2131
+ const { model: pumpContainer } = kosUiSdk.getKosModelSync(
2132
+ kosDispenseSdk.PumpContainer.type
2133
+ );
2134
+ if (pumpContainer) {
2135
+ const superPumpModels = pumpContainer.models.getIndexByKey(
2136
+ kosDispenseSdk.PumpIndex.byType,
2137
+ "microSuper"
2138
+ );
2139
+ const superPumps = superPumpModels.map((model) => model.name).join(", ");
2140
+ return {
2141
+ superPumps
2142
+ };
2143
+ }
2144
+ return {};
2145
+ }
2146
+ );
2147
+ kosUiSdk.ExtensionManager[kosUiSdk.EXTENSION_TROUBLE_DATA_MAPPER].register(
2148
+ "MicroPumpAirDetectTrouble",
2149
+ async (trouble) => {
2150
+ if (trouble.ifaces.includes("container")) {
2151
+ return {};
2152
+ }
2153
+ if (trouble.data.pumpPath) {
2154
+ const { model: pumpModel } = kosUiSdk.getKosModelSync(
2155
+ trouble.data.pumpPath
2156
+ );
2157
+ if (pumpModel) {
2158
+ const ingredientModel = pumpModel.ingredientId ? kosUiSdk.getKosModelSync(pumpModel.ingredientId).model : void 0;
2159
+ return {
2160
+ ingredientId: pumpModel.ingredientId,
2161
+ ingredientName: ingredientModel?.name || ""
2162
+ };
2163
+ }
2164
+ }
2165
+ return {};
2166
+ }
2167
+ );
2168
+ return {
2169
+ preload: kosUiSdk.RegistrationManager.model.preloadModel(root),
2170
+ model: kosUiSdk.RegistrationManager.model.register(root),
2171
+ companion: kosUiSdk.RegistrationManager.companion.register(root),
2172
+ legacy: kosUiSdk.RegistrationManager.model.registerLegacyModel(root)
2173
+ };
2174
+ };
2175
+ const _KosModelRegistry = {
2176
+ ...kosDispenseSdk.KosModelRegistry
2177
+ };
2178
+ _KosModelRegistry.freestyle = {
2179
+ models: registerFreestyleModels(_KosModelRegistry)
2180
+ };
2181
+ _KosModelRegistry.preload = kosUiSdk.RegistrationManager.model.preloadModel(_KosModelRegistry);
2182
+ _KosModelRegistry.model = kosUiSdk.RegistrationManager.model.register(_KosModelRegistry);
2183
+ _KosModelRegistry.companion = kosUiSdk.RegistrationManager.companion.register(_KosModelRegistry);
2184
+ _KosModelRegistry.legacy = kosUiSdk.RegistrationManager.model.registerLegacyModel(_KosModelRegistry);
2185
+ const KosModelRegistry = _KosModelRegistry;
2186
+ function kosServiceRequest$4(params) {
2187
+ return kosUiSdk.kosServiceRequest(params);
2188
+ }
2189
+ const api$4 = kosUiSdk.createClient();
2190
+ const service$4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2191
+ __proto__: null,
2192
+ api: api$4,
2193
+ default: api$4,
2194
+ kosServiceRequest: kosServiceRequest$4
2195
+ }, Symbol.toStringTag, { value: "Module" }));
2196
+ function kosServiceRequest$3(params) {
2197
+ return kosUiSdk.kosServiceRequest(params);
2198
+ }
2199
+ const api$3 = kosUiSdk.createClient();
2200
+ const service$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2201
+ __proto__: null,
2202
+ api: api$3,
2203
+ default: api$3,
2204
+ kosServiceRequest: kosServiceRequest$3
2205
+ }, Symbol.toStringTag, { value: "Module" }));
2206
+ function kosServiceRequest$2(params) {
2207
+ return kosUiSdk.kosServiceRequest(params);
2208
+ }
2209
+ const api$2 = kosUiSdk.createClient();
2210
+ const service$2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2211
+ __proto__: null,
2212
+ api: api$2,
2213
+ default: api$2,
2214
+ kosServiceRequest: kosServiceRequest$2
2215
+ }, Symbol.toStringTag, { value: "Module" }));
2216
+ function kosServiceRequest$1(params) {
2217
+ return kosUiSdk.kosServiceRequest(params);
2218
+ }
2219
+ const api$1 = kosUiSdk.createClient();
2220
+ const service$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2221
+ __proto__: null,
2222
+ api: api$1,
2223
+ default: api$1,
2224
+ kosServiceRequest: kosServiceRequest$1
2225
+ }, Symbol.toStringTag, { value: "Module" }));
2226
+ function kosServiceRequest(params) {
2227
+ return kosUiSdk.kosServiceRequest(params);
2228
+ }
2229
+ const api = kosUiSdk.createClient();
2230
+ const service = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2231
+ __proto__: null,
2232
+ api,
2233
+ default: api,
2234
+ kosServiceRequest
2235
+ }, Symbol.toStringTag, { value: "Module" }));
2236
+ exports.AGITATION_REQUIRED_TROUBLE = AGITATION_REQUIRED_TROUBLE;
2237
+ exports.AgitationRequiredTrouble = AgitationRequiredTrouble;
2238
+ exports.CarbAgitator = CarbAgitator;
2239
+ exports.CartridgeAgitator = CartridgeAgitator;
2240
+ exports.CartridgeAgitatorContainer = CartridgeAgitatorContainer;
2241
+ exports.CartridgeAgitatorEvents = CartridgeAgitatorEvents;
2242
+ exports.CgpPump = CgpPump;
2243
+ exports.FEATURE_SUPPORTS_ICE = FEATURE_SUPPORTS_ICE;
2244
+ exports.FcmPump = FcmPump;
2245
+ exports.FreestyleAssembly = FreestyleAssembly;
2246
+ exports.FreestyleHolder = FreestyleHolder;
2247
+ exports.FreestyleNozzle = FreestyleNozzle;
2248
+ exports.FreestylePump = FreestylePump;
2249
+ exports.IceAgitator = IceAgitator;
2250
+ exports.IceAgitatorEvents = IceAgitatorEvents;
2251
+ exports.InvalidRequestError = InvalidRequestError;
2252
+ exports.KosModelRegistry = KosModelRegistry;
2253
+ exports.LfcvPump = LfcvPump;
2254
+ exports.NutritionInfoError = NutritionInfoError;
2255
+ exports.RemoteTray = RemoteTray;
2256
+ exports.RemoteTrayContainer = RemoteTrayContainer;
2257
+ exports.SpmPump = SpmPump;
2258
+ exports.freestyleAssemblyDataMapper = freestyleAssemblyDataMapper;
2259
+ exports.getFreestyleNutritionInfo = getFreestyleNutritionInfo;
2260
+ exports.performCalibrate = performCalibrate$1;
2261
+ exports.performCalibrate$1 = performCalibrate;
2262
+ exports.performComplete = performComplete$1;
2263
+ exports.performComplete$1 = performComplete;
2264
+ exports.performElectricalTest = performElectricalTest;
2265
+ exports.performPreCalibrate = performPreCalibrate$1;
2266
+ exports.performPreCalibrate$1 = performPreCalibrate;
2267
+ exports.performVerify = performVerify$1;
2268
+ exports.performVerify$1 = performVerify;
2269
+ exports.registerFreestyleModels = registerFreestyleModels;
2270
+ exports.replacePump = replacePump;
2271
+ exports.service = service$4;
2272
+ exports.service$1 = service$3;
2273
+ exports.service$2 = service$2;
2274
+ exports.service$3 = service$1;
2275
+ exports.service$4 = service;
2276
+ //# sourceMappingURL=service-E5IuBoLR.cjs.map