@kosdev-code/kos-ui-sdk 0.1.0-next.719 → 0.1.0-next.734

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 (43) hide show
  1. package/core/core/kosCore.d.ts.map +1 -1
  2. package/core/core/kosModel.d.ts +1 -0
  3. package/core/core/kosModel.d.ts.map +1 -1
  4. package/core/core/model/kos-fsm-manager.d.ts +4 -1
  5. package/core/core/model/kos-fsm-manager.d.ts.map +1 -1
  6. package/core/core/model/kos-online-lifecycle-manager.d.ts.map +1 -1
  7. package/core/core/transport/base-message-transport.d.ts +0 -10
  8. package/core/core/transport/base-message-transport.d.ts.map +1 -1
  9. package/core/core/transport/webSocketTransport.d.ts +12 -0
  10. package/core/core/transport/webSocketTransport.d.ts.map +1 -1
  11. package/index.cjs +463 -179
  12. package/index.cjs.map +1 -1
  13. package/index.js +463 -179
  14. package/index.js.map +1 -1
  15. package/models/models/future/future-model.d.ts.map +1 -1
  16. package/models/models/translation/translation-model.d.ts +1 -0
  17. package/models/models/translation/translation-model.d.ts.map +1 -1
  18. package/models/models/trouble-container/trouble-container-model.d.ts +1 -0
  19. package/models/models/trouble-container/trouble-container-model.d.ts.map +1 -1
  20. package/package.json +3 -3
  21. package/ui/components/index.d.ts +1 -0
  22. package/ui/components/index.d.ts.map +1 -1
  23. package/ui/components/reconnecting-overlay/index.d.ts +35 -0
  24. package/ui/components/reconnecting-overlay/index.d.ts.map +1 -0
  25. package/ui/components/reconnecting-overlay/reconnecting-overlay-styles.d.ts +4 -0
  26. package/ui/components/reconnecting-overlay/reconnecting-overlay-styles.d.ts.map +1 -0
  27. package/ui/components/reconnecting-overlay/use-reconnecting-overlay-state.d.ts +57 -0
  28. package/ui/components/reconnecting-overlay/use-reconnecting-overlay-state.d.ts.map +1 -0
  29. package/ui/contexts/kos-core-context.d.ts.map +1 -1
  30. package/ui/contexts/translation-container/kos-translations-provider.d.ts +5 -0
  31. package/ui/contexts/translation-container/kos-translations-provider.d.ts.map +1 -1
  32. package/ui/hooks/index.d.ts +1 -0
  33. package/ui/hooks/index.d.ts.map +1 -1
  34. package/ui/hooks/use-connection-state.d.ts +38 -0
  35. package/ui/hooks/use-connection-state.d.ts.map +1 -0
  36. package/ui/index.d.ts +1 -0
  37. package/ui/index.d.ts.map +1 -1
  38. package/ui/policies/constants.d.ts +11 -0
  39. package/ui/policies/constants.d.ts.map +1 -0
  40. package/ui/policies/index.d.ts +3 -0
  41. package/ui/policies/index.d.ts.map +1 -0
  42. package/ui/policies/reload-on-disconnect-policy.d.ts +56 -0
  43. package/ui/policies/reload-on-disconnect-policy.d.ts.map +1 -0
package/index.cjs CHANGED
@@ -807,12 +807,12 @@ log$Q.methodFactory = function(methodName, logLevel, loggerName) {
807
807
  return function(...args) {
808
808
  const _name = loggerName ? String(loggerName) : "";
809
809
  const prefix = _name ? `[${String(_name).substring(_name.lastIndexOf(":") + 1)}] | ` : "[root] | ";
810
- const message = args.map(
810
+ const message2 = args.map(
811
811
  (arg) => typeof arg === "object" ? JSON.stringify(arg) : String(arg)
812
812
  ).join(" ");
813
- rawMethod(`${prefix}${message}`);
813
+ rawMethod(`${prefix}${message2}`);
814
814
  if (globalThis?.kosConfig?.logging && globalThis.kosLog && (loggerName !== WS_LOG || enableMessageLogging && enableStudioMessageLogging)) {
815
- globalThis.kosLog(`UI: ${prefix}${message}`);
815
+ globalThis.kosLog(`UI: ${prefix}${message2}`);
816
816
  }
817
817
  };
818
818
  };
@@ -1027,11 +1027,11 @@ function createTransitionMethod(_instance, config2, options, entryHandlers, exit
1027
1027
  };
1028
1028
  }
1029
1029
  function handleUninitializedFsm(initializeAt, throwOnInvalid) {
1030
- const message = `Cannot transition: FSM not initialized. Waiting for ${initializeAt} lifecycle phase.`;
1030
+ const message2 = `Cannot transition: FSM not initialized. Waiting for ${initializeAt} lifecycle phase.`;
1031
1031
  if (throwOnInvalid) {
1032
- throw new Error(message);
1032
+ throw new Error(message2);
1033
1033
  } else {
1034
- console.warn(message);
1034
+ console.warn(message2);
1035
1035
  }
1036
1036
  }
1037
1037
  function resolveNextState(currentState, event, config2, throwOnInvalid) {
@@ -1044,11 +1044,11 @@ function resolveNextState(currentState, event, config2, throwOnInvalid) {
1044
1044
  return nextState;
1045
1045
  }
1046
1046
  function handleInvalidTransition(currentState, event, throwOnInvalid) {
1047
- const message = `Invalid transition: Event "${event}" not allowed from state "${currentState}"`;
1047
+ const message2 = `Invalid transition: Event "${event}" not allowed from state "${currentState}"`;
1048
1048
  if (throwOnInvalid) {
1049
- throw new Error(message);
1049
+ throw new Error(message2);
1050
1050
  } else {
1051
- console.warn(message);
1051
+ console.warn(message2);
1052
1052
  }
1053
1053
  }
1054
1054
  function executeTransition(instance, currentState, nextState, event, stateProperty, entryHandlers, exitHandlers, options) {
@@ -1364,8 +1364,8 @@ class ServiceRequestError extends Error {
1364
1364
  responseBody;
1365
1365
  /** Response headers as a plain key/value map */
1366
1366
  responseHeaders;
1367
- constructor(message, details) {
1368
- super(message);
1367
+ constructor(message2, details) {
1368
+ super(message2);
1369
1369
  this.name = "ServiceRequestError";
1370
1370
  this.status = details.status;
1371
1371
  this.statusText = details.statusText;
@@ -1668,16 +1668,16 @@ function kosStateGuard(options) {
1668
1668
  const currentState = this.currentState;
1669
1669
  const isAllowed = options.allowedStates.includes(currentState);
1670
1670
  if (!isAllowed) {
1671
- const message = `Method ${String(
1671
+ const message2 = `Method ${String(
1672
1672
  propertyKey
1673
1673
  )} cannot be called from state "${currentState}". Allowed states: ${options.allowedStates.join(
1674
1674
  ", "
1675
1675
  )}`;
1676
1676
  const shouldThrow = options.throwOnInvalid !== void 0 ? options.throwOnInvalid : this[StateMachineSetup]?.options?.throwOnInvalid !== false;
1677
1677
  if (shouldThrow) {
1678
- throw new Error(message);
1678
+ throw new Error(message2);
1679
1679
  } else {
1680
- log$M.warn(message);
1680
+ log$M.warn(message2);
1681
1681
  return void 0;
1682
1682
  }
1683
1683
  }
@@ -1943,9 +1943,9 @@ class ExtensionException extends Error {
1943
1943
  extensionId;
1944
1944
  extensionType;
1945
1945
  cause;
1946
- constructor(extensionId, extensionType, cause, message) {
1946
+ constructor(extensionId, extensionType, cause, message2) {
1947
1947
  super(
1948
- message || `Extension failure in ${extensionType} for id "${extensionId}"`
1948
+ message2 || `Extension failure in ${extensionType} for id "${extensionId}"`
1949
1949
  );
1950
1950
  this.name = "ExtensionException";
1951
1951
  this.extensionId = extensionId;
@@ -3393,11 +3393,11 @@ function injectTroubleAwareSupport(modelInstance) {
3393
3393
  get() {
3394
3394
  const pathValue = this[pathProperty];
3395
3395
  if (pathValue === void 0 || pathValue === null) {
3396
- const message = `@kosTroubleAware: Path property '${pathProperty}' is undefined on model ${this.id || "unknown"}. Returning empty troubles array.`;
3396
+ const message2 = `@kosTroubleAware: Path property '${pathProperty}' is undefined on model ${this.id || "unknown"}. Returning empty troubles array.`;
3397
3397
  if (this.logger && typeof this.logger.warn === "function") {
3398
- this.logger.warn(message);
3398
+ this.logger.warn(message2);
3399
3399
  } else {
3400
- console.warn(message);
3400
+ console.warn(message2);
3401
3401
  }
3402
3402
  return [];
3403
3403
  }
@@ -4175,8 +4175,8 @@ class KosModelCache {
4175
4175
  class KosModelError extends Error {
4176
4176
  context;
4177
4177
  originalCause;
4178
- constructor(message, context, cause) {
4179
- super(message, { cause });
4178
+ constructor(message2, context, cause) {
4179
+ super(message2, { cause });
4180
4180
  this.name = "KosModelError";
4181
4181
  this.context = context;
4182
4182
  this.originalCause = cause;
@@ -4479,8 +4479,8 @@ const TransitionMap = {
4479
4479
  };
4480
4480
  class ModelError extends Error {
4481
4481
  model;
4482
- constructor(message, model) {
4483
- super(message);
4482
+ constructor(message2, model) {
4483
+ super(message2);
4484
4484
  this.model = model;
4485
4485
  }
4486
4486
  }
@@ -5398,10 +5398,19 @@ class KosFSMManager {
5398
5398
  });
5399
5399
  }
5400
5400
  /**
5401
- * Checks if a given target maps to status or activeStatus
5401
+ * Checks if a given target maps to status, activeStatus, or onlineStatus.
5402
+ * Online/offline transitions are tracked on model.onlineStatus because the
5403
+ * main FSM keeps status at READY when GO_ONLINE / GO_OFFLINE fire; reading
5404
+ * model.status for those targets would hang the transition forever.
5402
5405
  */
5403
5406
  getTransitionStatusFor(target) {
5404
- return [KosModelState.ACTIVE, KosModelState.INACTIVE].includes(target) ? this.model.activeStatus : this.model.status;
5407
+ if ([KosModelState.ACTIVE, KosModelState.INACTIVE].includes(target)) {
5408
+ return this.model.activeStatus;
5409
+ }
5410
+ if ([KosModelState.ONLINE, KosModelState.OFFLINE].includes(target)) {
5411
+ return this.model.onlineStatus;
5412
+ }
5413
+ return this.model.status;
5405
5414
  }
5406
5415
  }
5407
5416
  const BROWSER_ROUTER_MODEL_TYPE = "browser-router-model";
@@ -5763,6 +5772,7 @@ class KosOnlineLifecycleManager {
5763
5772
  log;
5764
5773
  unsubscribers = [];
5765
5774
  register() {
5775
+ this.dispose();
5766
5776
  const modelId = this.model.modelId;
5767
5777
  const onlineUnsub = subscribe("/kosCore/online", async () => {
5768
5778
  this.log.debug(
@@ -7453,11 +7463,6 @@ class BaseTransport {
7453
7463
  onConnectionLost;
7454
7464
  offlineMessages = [];
7455
7465
  oldSend;
7456
- // Reconnection configuration
7457
- reconnectAttempts = 0;
7458
- static MAX_RECONNECT_ATTEMPTS = 10;
7459
- static BASE_DELAY_MS = 1e3;
7460
- static MAX_DELAY_MS = 3e4;
7461
7466
  constructor({
7462
7467
  host,
7463
7468
  port,
@@ -7527,7 +7532,6 @@ class BaseTransport {
7527
7532
  }
7528
7533
  onOpen(event) {
7529
7534
  KosLog.info(`websocket connection opened`);
7530
- this.reconnectAttempts = 0;
7531
7535
  this.socket = event.currentTarget;
7532
7536
  mobx.runInAction(() => {
7533
7537
  this.connectionEstablished = true;
@@ -7557,26 +7561,8 @@ alias:${this.alias}
7557
7561
  this.connectionEstablished = false;
7558
7562
  });
7559
7563
  publish("websocket.disconnected", { code, reason, wasClean });
7560
- const shouldReconnect = this.shouldAttemptReconnection(code);
7561
- if (!this.onConnectionLost) {
7562
- return;
7563
- }
7564
- if (shouldReconnect && this.reconnectAttempts < BaseTransport.MAX_RECONNECT_ATTEMPTS) {
7565
- const delay2 = this.calculateBackoffDelay();
7566
- KosLog.debug(
7567
- `Reconnecting in ${delay2}ms (attempt ${this.reconnectAttempts + 1}/${BaseTransport.MAX_RECONNECT_ATTEMPTS})`
7568
- );
7569
- setTimeout(() => {
7570
- this.reconnectAttempts++;
7571
- this.onConnectionLost?.();
7572
- }, delay2);
7573
- } else if (this.reconnectAttempts >= BaseTransport.MAX_RECONNECT_ATTEMPTS) {
7574
- KosLog.error(
7575
- `Max reconnection attempts (${BaseTransport.MAX_RECONNECT_ATTEMPTS}) reached. Giving up.`
7576
- );
7577
- publish("websocket.max_retries_exceeded", {
7578
- attempts: this.reconnectAttempts
7579
- });
7564
+ if (this.shouldAttemptReconnection(code)) {
7565
+ this.onConnectionLost?.();
7580
7566
  } else {
7581
7567
  KosLog.info(
7582
7568
  `Not reconnecting due to close code ${code} (intentional close or configuration error)`
@@ -7595,7 +7581,7 @@ alias:${this.alias}
7595
7581
  shouldAttemptReconnection(code) {
7596
7582
  switch (code) {
7597
7583
  case 1e3:
7598
- return false;
7584
+ return true;
7599
7585
  case 1001:
7600
7586
  return true;
7601
7587
  case 1002:
@@ -7628,19 +7614,6 @@ alias:${this.alias}
7628
7614
  return true;
7629
7615
  }
7630
7616
  }
7631
- /**
7632
- * Calculates the delay before the next reconnection attempt using
7633
- * exponential backoff with jitter.
7634
- * @returns Delay in milliseconds
7635
- */
7636
- calculateBackoffDelay() {
7637
- const exponentialDelay = Math.min(
7638
- BaseTransport.BASE_DELAY_MS * Math.pow(2, this.reconnectAttempts),
7639
- BaseTransport.MAX_DELAY_MS
7640
- );
7641
- const jitter = exponentialDelay * 0.25 * (Math.random() * 2 - 1);
7642
- return Math.floor(exponentialDelay + jitter);
7643
- }
7644
7617
  send(data) {
7645
7618
  KosLog.wsSend(data);
7646
7619
  if (window.kosLogEvents) {
@@ -7701,15 +7674,15 @@ class BridgeTransport {
7701
7674
  }
7702
7675
  sendNextMessage() {
7703
7676
  if (this.messageQueue.length > 0) {
7704
- const message = this.messageQueue.shift();
7705
- globalThis.kosWindowWebsocketSend(message);
7677
+ const message2 = this.messageQueue.shift();
7678
+ globalThis.kosWindowWebsocketSend(message2);
7706
7679
  setTimeout(() => this.sendNextMessage(), 1);
7707
7680
  } else {
7708
7681
  this.isSending = false;
7709
7682
  }
7710
7683
  }
7711
- enqueueMessage(message) {
7712
- this.messageQueue.push(message);
7684
+ enqueueMessage(message2) {
7685
+ this.messageQueue.push(message2);
7713
7686
  if (!this.isSending) {
7714
7687
  this.isSending = true;
7715
7688
  this.sendNextMessage();
@@ -7864,6 +7837,11 @@ class WebSocketTransport {
7864
7837
  fosSocket;
7865
7838
  fosPort;
7866
7839
  useFosTransport;
7840
+ // Reconnection state (persists across BaseTransport re-creation in init())
7841
+ reconnectAttempts = 0;
7842
+ static MAX_RECONNECT_ATTEMPTS = 10;
7843
+ static BASE_DELAY_MS = 1e3;
7844
+ static MAX_DELAY_MS = 3e4;
7867
7845
  constructor({
7868
7846
  host = `localhost`,
7869
7847
  port = 8080,
@@ -7896,6 +7874,7 @@ class WebSocketTransport {
7896
7874
  (connectionEstablished) => {
7897
7875
  if (connectionEstablished) {
7898
7876
  log$z.warn("Connection Established");
7877
+ this.reconnectAttempts = 0;
7899
7878
  publish(
7900
7879
  WebSocketEvents.CONNECTED,
7901
7880
  WebSocketEvents.CONNECTED
@@ -7946,11 +7925,7 @@ class WebSocketTransport {
7946
7925
  alias: this.alias,
7947
7926
  onConnectionLost: () => {
7948
7927
  log$z.error(`Connection Lost`);
7949
- publish(
7950
- WebSocketEvents.DISCONNECTED,
7951
- WebSocketEvents.DISCONNECTED
7952
- );
7953
- this.init();
7928
+ this.scheduleReconnect();
7954
7929
  }
7955
7930
  });
7956
7931
  if (globalThis.kosWindowWebsocketOpen) {
@@ -7961,6 +7936,39 @@ class WebSocketTransport {
7961
7936
  }
7962
7937
  return this;
7963
7938
  }
7939
+ /**
7940
+ * Schedules a reconnect attempt using exponential backoff with jitter.
7941
+ * Counter persists across BaseTransport re-creation, so the cap actually
7942
+ * fires after MAX_RECONNECT_ATTEMPTS consecutive failures rather than
7943
+ * resetting on every new BaseTransport instance.
7944
+ */
7945
+ scheduleReconnect() {
7946
+ if (this.reconnectAttempts >= WebSocketTransport.MAX_RECONNECT_ATTEMPTS) {
7947
+ KosLog.error(
7948
+ `Max reconnection attempts (${WebSocketTransport.MAX_RECONNECT_ATTEMPTS}) reached. Giving up.`
7949
+ );
7950
+ publish(WebSocketEvents.MAX_RETRIES_EXCEEDED, {
7951
+ attempts: this.reconnectAttempts
7952
+ });
7953
+ return;
7954
+ }
7955
+ const delay2 = this.calculateBackoffDelay();
7956
+ KosLog.debug(
7957
+ `Reconnecting in ${delay2}ms (attempt ${this.reconnectAttempts + 1}/${WebSocketTransport.MAX_RECONNECT_ATTEMPTS})`
7958
+ );
7959
+ setTimeout(() => {
7960
+ this.reconnectAttempts++;
7961
+ this.init();
7962
+ }, delay2);
7963
+ }
7964
+ calculateBackoffDelay() {
7965
+ const exponentialDelay = Math.min(
7966
+ WebSocketTransport.BASE_DELAY_MS * Math.pow(2, this.reconnectAttempts),
7967
+ WebSocketTransport.MAX_DELAY_MS
7968
+ );
7969
+ const jitter = exponentialDelay * 0.25 * (Math.random() * 2 - 1);
7970
+ return Math.floor(exponentialDelay + jitter);
7971
+ }
7964
7972
  _sendSubscriptionMessage(topic, type, fos = false, bridge = false, connectionId, explicitDestination = false) {
7965
7973
  log$z.debug(`${type} to topic ${topic}`);
7966
7974
  let connId;
@@ -10014,13 +10022,33 @@ class KosCore {
10014
10022
  this.transport.token = data.body;
10015
10023
  }
10016
10024
  });
10025
+ subscribe(WebSocketEvents.DISCONNECTED, async () => {
10026
+ await Promise.allSettled(
10027
+ this.modelManager.models.map(async (model) => {
10028
+ try {
10029
+ await model.offline?.();
10030
+ } catch (e) {
10031
+ log$v.error(`model ${model.modelId} offline() threw:`, e);
10032
+ }
10033
+ model.onlineLifecycleManager?.dispose();
10034
+ })
10035
+ );
10036
+ this.fsmService.service.send(KosCoreEvents.GO_OFFLINE);
10037
+ });
10017
10038
  subscribe(WebSocketEvents.CONNECTED, async () => {
10018
10039
  await this.whenReady();
10040
+ await Promise.allSettled(
10041
+ this.modelManager.models.map(async (model) => {
10042
+ model.onlineLifecycleManager?.register();
10043
+ try {
10044
+ await model.online?.();
10045
+ } catch (e) {
10046
+ log$v.error(`model ${model.modelId} online() threw:`, e);
10047
+ }
10048
+ })
10049
+ );
10019
10050
  this.fsmService.service.send(KosCoreEvents.GO_ONLINE);
10020
10051
  });
10021
- subscribe(WebSocketEvents.DISCONNECTED, async () => {
10022
- this.fsmService.service.send(KosCoreEvents.GO_OFFLINE);
10023
- });
10024
10052
  subscribe("/studioServer/auth/LOGGED_IN", () => {
10025
10053
  this.authState = "logged_in";
10026
10054
  this.transport.authorized = true;
@@ -11073,8 +11101,8 @@ const getModelById = (destinationAddress2, url, _fetch) => async ({
11073
11101
  };
11074
11102
  class FetchError extends Error {
11075
11103
  payload;
11076
- constructor(message, payload) {
11077
- super(message);
11104
+ constructor(message2, payload) {
11105
+ super(message2);
11078
11106
  this.name = "FetchException";
11079
11107
  this.payload = payload;
11080
11108
  }
@@ -12178,21 +12206,21 @@ async function waitForAppsToStart(appIds, options = {}) {
12178
12206
  return false;
12179
12207
  });
12180
12208
  if (notStartedApps.length > 0) {
12181
- const message = `Apps not started: ${notStartedApps.join(", ")}`;
12182
- log$q.error(message);
12209
+ const message2 = `Apps not started: ${notStartedApps.join(", ")}`;
12210
+ log$q.error(message2);
12183
12211
  if (throwOnTimeout) {
12184
- throw new Error(`App startup timeout: ${message}`);
12212
+ throw new Error(`App startup timeout: ${message2}`);
12185
12213
  }
12186
12214
  return false;
12187
12215
  }
12188
12216
  log$q.info(`All apps started successfully: ${appIds.join(", ")}`);
12189
12217
  return true;
12190
12218
  } catch (error) {
12191
- const message = `Failed to wait for apps to start: ${appIds.join(", ")}`;
12192
- log$q.error(message, error);
12219
+ const message2 = `Failed to wait for apps to start: ${appIds.join(", ")}`;
12220
+ log$q.error(message2, error);
12193
12221
  if (throwOnTimeout) {
12194
12222
  throw new Error(
12195
- `${message} - ${error instanceof Error ? error.message : String(error)}`
12223
+ `${message2} - ${error instanceof Error ? error.message : String(error)}`
12196
12224
  );
12197
12225
  }
12198
12226
  return false;
@@ -12368,14 +12396,14 @@ const buildConfigBeanModel = (factory) => (modelId) => (configBeanOptions) => {
12368
12396
  const configBeanModel = factory.build(modelId, configBeanOptions);
12369
12397
  return configBeanModel;
12370
12398
  };
12371
- var __defProp$u = Object.defineProperty;
12399
+ var __defProp$v = Object.defineProperty;
12372
12400
  var __getOwnPropDesc$A = Object.getOwnPropertyDescriptor;
12373
12401
  var __decorateClass$A = (decorators, target, key, kind) => {
12374
12402
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$A(target, key) : target;
12375
12403
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
12376
12404
  if (decorator = decorators[i])
12377
12405
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
12378
- if (kind && result) __defProp$u(target, key, result);
12406
+ if (kind && result) __defProp$v(target, key, result);
12379
12407
  return result;
12380
12408
  };
12381
12409
  function matchValue(patterns, value) {
@@ -12735,14 +12763,14 @@ function defaultMeasureMapReducer(systemAcc, unitSystem) {
12735
12763
  });
12736
12764
  return systemAcc;
12737
12765
  }
12738
- var __defProp$t = Object.defineProperty;
12766
+ var __defProp$u = Object.defineProperty;
12739
12767
  var __getOwnPropDesc$z = Object.getOwnPropertyDescriptor;
12740
12768
  var __decorateClass$z = (decorators, target, key, kind) => {
12741
12769
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$z(target, key) : target;
12742
12770
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
12743
12771
  if (decorator = decorators[i])
12744
12772
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
12745
- if (kind && result) __defProp$t(target, key, result);
12773
+ if (kind && result) __defProp$u(target, key, result);
12746
12774
  return result;
12747
12775
  };
12748
12776
  const MODEL_TYPE$w = "region-info-model";
@@ -13347,14 +13375,14 @@ const displayOptionsFactory = (schema, unitSystem) => {
13347
13375
  }
13348
13376
  return schema.options;
13349
13377
  };
13350
- var __defProp$s = Object.defineProperty;
13378
+ var __defProp$t = Object.defineProperty;
13351
13379
  var __getOwnPropDesc$y = Object.getOwnPropertyDescriptor;
13352
13380
  var __decorateClass$y = (decorators, target, key, kind) => {
13353
13381
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$y(target, key) : target;
13354
13382
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
13355
13383
  if (decorator = decorators[i])
13356
13384
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
13357
- if (kind && result) __defProp$s(target, key, result);
13385
+ if (kind && result) __defProp$t(target, key, result);
13358
13386
  return result;
13359
13387
  };
13360
13388
  function isEnum(schema) {
@@ -14191,14 +14219,14 @@ const index$e = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
14191
14219
  __proto__: null,
14192
14220
  getStateBeanData
14193
14221
  }, Symbol.toStringTag, { value: "Module" }));
14194
- var __defProp$r = Object.defineProperty;
14222
+ var __defProp$s = Object.defineProperty;
14195
14223
  var __getOwnPropDesc$x = Object.getOwnPropertyDescriptor;
14196
14224
  var __decorateClass$x = (decorators, target, key, kind) => {
14197
14225
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$x(target, key) : target;
14198
14226
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
14199
14227
  if (decorator = decorators[i])
14200
14228
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
14201
- if (kind && result) __defProp$r(target, key, result);
14229
+ if (kind && result) __defProp$s(target, key, result);
14202
14230
  return result;
14203
14231
  };
14204
14232
  const MODEL_TYPE$u = "state-bean-model";
@@ -14296,14 +14324,14 @@ const kosStateBean = ({ path }) => (target, name) => {
14296
14324
  lifecycle: DependencyLifecycle.INIT
14297
14325
  };
14298
14326
  };
14299
- var __defProp$q = Object.defineProperty;
14327
+ var __defProp$r = Object.defineProperty;
14300
14328
  var __getOwnPropDesc$w = Object.getOwnPropertyDescriptor;
14301
14329
  var __decorateClass$w = (decorators, target, key, kind) => {
14302
14330
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$w(target, key) : target;
14303
14331
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
14304
14332
  if (decorator = decorators[i])
14305
14333
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
14306
- if (kind && result) __defProp$q(target, key, result);
14334
+ if (kind && result) __defProp$r(target, key, result);
14307
14335
  return result;
14308
14336
  };
14309
14337
  const MODEL_TYPE$t = "state-prop-model";
@@ -14402,14 +14430,14 @@ function kosStateProp(params2) {
14402
14430
  };
14403
14431
  };
14404
14432
  }
14405
- var __defProp$p = Object.defineProperty;
14433
+ var __defProp$q = Object.defineProperty;
14406
14434
  var __getOwnPropDesc$v = Object.getOwnPropertyDescriptor;
14407
14435
  var __decorateClass$v = (decorators, target, key, kind) => {
14408
14436
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$v(target, key) : target;
14409
14437
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
14410
14438
  if (decorator = decorators[i])
14411
14439
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
14412
- if (kind && result) __defProp$p(target, key, result);
14440
+ if (kind && result) __defProp$q(target, key, result);
14413
14441
  return result;
14414
14442
  };
14415
14443
  const MODEL_TYPE$s = "browser-router-model";
@@ -14529,14 +14557,14 @@ const BrowserRouter = new SingletonKosModelRegistrationFactory({
14529
14557
  class: BrowserRouterModelImpl,
14530
14558
  type: MODEL_TYPE$s
14531
14559
  });
14532
- var __defProp$o = Object.defineProperty;
14560
+ var __defProp$p = Object.defineProperty;
14533
14561
  var __getOwnPropDesc$u = Object.getOwnPropertyDescriptor;
14534
14562
  var __decorateClass$u = (decorators, target, key, kind) => {
14535
14563
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$u(target, key) : target;
14536
14564
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
14537
14565
  if (decorator = decorators[i])
14538
14566
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
14539
- if (kind && result) __defProp$o(target, key, result);
14567
+ if (kind && result) __defProp$p(target, key, result);
14540
14568
  return result;
14541
14569
  };
14542
14570
  const log$i = KosLog.getLogger(FutureFactory.type);
@@ -14600,7 +14628,10 @@ let FutureModel$1 = class FutureModel {
14600
14628
  async cancelFuture() {
14601
14629
  const path = this.namespace === "studio" ? `/api/future` : `/api/${this.namespace}/future`;
14602
14630
  await kosWhen(() => this.futureId !== FUTURE_NOT_ASSIGNED);
14603
- await this._cancelFuture(this.futureId, path);
14631
+ const response = await this._cancelFuture(this.futureId, path);
14632
+ if (response?.status !== 200) {
14633
+ log$i.error(`Failed to cancel Future ${this.id}. Response: ${JSON.stringify(response)}`);
14634
+ }
14604
14635
  }
14605
14636
  /**
14606
14637
  * Gets the current status of the future operation.
@@ -14674,14 +14705,14 @@ FutureModel$1 = __decorateClass$u([
14674
14705
  kosModel(FutureFactory.type)
14675
14706
  ], FutureModel$1);
14676
14707
  const FutureModel2 = FutureModel$1;
14677
- var __defProp$n = Object.defineProperty;
14708
+ var __defProp$o = Object.defineProperty;
14678
14709
  var __getOwnPropDesc$t = Object.getOwnPropertyDescriptor;
14679
14710
  var __decorateClass$t = (decorators, target, key, kind) => {
14680
14711
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$t(target, key) : target;
14681
14712
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
14682
14713
  if (decorator = decorators[i])
14683
14714
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
14684
- if (kind && result) __defProp$n(target, key, result);
14715
+ if (kind && result) __defProp$o(target, key, result);
14685
14716
  return result;
14686
14717
  };
14687
14718
  const log$h = KosLog.getLogger(FutureContainerFactory.type);
@@ -14906,14 +14937,14 @@ const index$c = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
14906
14937
  getKeyValue,
14907
14938
  updateKeyValue
14908
14939
  }, Symbol.toStringTag, { value: "Module" }));
14909
- var __defProp$m = Object.defineProperty;
14940
+ var __defProp$n = Object.defineProperty;
14910
14941
  var __getOwnPropDesc$s = Object.getOwnPropertyDescriptor;
14911
14942
  var __decorateClass$s = (decorators, target, key, kind) => {
14912
14943
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$s(target, key) : target;
14913
14944
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
14914
14945
  if (decorator = decorators[i])
14915
14946
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
14916
- if (kind && result) __defProp$m(target, key, result);
14947
+ if (kind && result) __defProp$n(target, key, result);
14917
14948
  return result;
14918
14949
  };
14919
14950
  const MODEL_TYPE$r = "key-value-model";
@@ -16603,9 +16634,9 @@ Parser.prototype.isOperatorEnabled = function(op) {
16603
16634
  var operators = this.options.operators || {};
16604
16635
  return !(optionName in operators) || !!operators[optionName];
16605
16636
  };
16606
- var __defProp$l = Object.defineProperty;
16637
+ var __defProp$m = Object.defineProperty;
16607
16638
  var __getOwnPropDesc$r = Object.getOwnPropertyDescriptor;
16608
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$l(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
16639
+ var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$m(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
16609
16640
  var __decorateClass$r = (decorators, target, key, kind) => {
16610
16641
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$r(target, key) : target;
16611
16642
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
@@ -16961,14 +16992,14 @@ const index$b = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
16961
16992
  __proto__: null,
16962
16993
  getLogOverrides
16963
16994
  }, Symbol.toStringTag, { value: "Module" }));
16964
- var __defProp$k = Object.defineProperty;
16995
+ var __defProp$l = Object.defineProperty;
16965
16996
  var __getOwnPropDesc$q = Object.getOwnPropertyDescriptor;
16966
16997
  var __decorateClass$q = (decorators, target, key, kind) => {
16967
16998
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$q(target, key) : target;
16968
16999
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
16969
17000
  if (decorator = decorators[i])
16970
17001
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
16971
- if (kind && result) __defProp$k(target, key, result);
17002
+ if (kind && result) __defProp$l(target, key, result);
16972
17003
  return result;
16973
17004
  };
16974
17005
  const MODEL_TYPE$p = "kos-log-manager-model";
@@ -17215,14 +17246,14 @@ const index$a = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
17215
17246
  setTime,
17216
17247
  setTimezone
17217
17248
  }, Symbol.toStringTag, { value: "Module" }));
17218
- var __defProp$j = Object.defineProperty;
17249
+ var __defProp$k = Object.defineProperty;
17219
17250
  var __getOwnPropDesc$p = Object.getOwnPropertyDescriptor;
17220
17251
  var __decorateClass$p = (decorators, target, key, kind) => {
17221
17252
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$p(target, key) : target;
17222
17253
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
17223
17254
  if (decorator = decorators[i])
17224
17255
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
17225
- if (kind && result) __defProp$j(target, key, result);
17256
+ if (kind && result) __defProp$k(target, key, result);
17226
17257
  return result;
17227
17258
  };
17228
17259
  const MODEL_TYPE$o = "kos-time-model";
@@ -17316,14 +17347,14 @@ const KosTime = {
17316
17347
  predicate: isKosModel(MODEL_TYPE$o),
17317
17348
  factory: Kos.Singleton.create(MODEL_TYPE$o)
17318
17349
  };
17319
- var __defProp$i = Object.defineProperty;
17350
+ var __defProp$j = Object.defineProperty;
17320
17351
  var __getOwnPropDesc$o = Object.getOwnPropertyDescriptor;
17321
17352
  var __decorateClass$o = (decorators, target, key, kind) => {
17322
17353
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$o(target, key) : target;
17323
17354
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
17324
17355
  if (decorator = decorators[i])
17325
17356
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
17326
- if (kind && result) __defProp$i(target, key, result);
17357
+ if (kind && result) __defProp$j(target, key, result);
17327
17358
  return result;
17328
17359
  };
17329
17360
  const MODEL_TYPE$n = "log-block-container-model";
@@ -17557,14 +17588,14 @@ const LogBlockContainer = new KosModelRegistrationFactory({
17557
17588
  type: MODEL_TYPE$n
17558
17589
  });
17559
17590
  LogBlockContainer.addRelatedModel(LogBlock);
17560
- var __defProp$h = Object.defineProperty;
17591
+ var __defProp$i = Object.defineProperty;
17561
17592
  var __getOwnPropDesc$m = Object.getOwnPropertyDescriptor;
17562
17593
  var __decorateClass$m = (decorators, target, key, kind) => {
17563
17594
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$m(target, key) : target;
17564
17595
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
17565
17596
  if (decorator = decorators[i])
17566
17597
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
17567
- if (kind && result) __defProp$h(target, key, result);
17598
+ if (kind && result) __defProp$i(target, key, result);
17568
17599
  return result;
17569
17600
  };
17570
17601
  const MODEL_TYPE$l = "log-stream-model";
@@ -17785,14 +17816,14 @@ const LogStream = new KosModelRegistrationFactory({
17785
17816
  class: LogStreamModelImpl,
17786
17817
  type: MODEL_TYPE$l
17787
17818
  });
17788
- var __defProp$g = Object.defineProperty;
17819
+ var __defProp$h = Object.defineProperty;
17789
17820
  var __getOwnPropDesc$l = Object.getOwnPropertyDescriptor;
17790
17821
  var __decorateClass$l = (decorators, target, key, kind) => {
17791
17822
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$l(target, key) : target;
17792
17823
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
17793
17824
  if (decorator = decorators[i])
17794
17825
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
17795
- if (kind && result) __defProp$g(target, key, result);
17826
+ if (kind && result) __defProp$h(target, key, result);
17796
17827
  return result;
17797
17828
  };
17798
17829
  const MODEL_TYPE$k = "log-stream-container-model";
@@ -18187,14 +18218,14 @@ class TroubleHandlerFactory {
18187
18218
  }
18188
18219
  }
18189
18220
  }
18190
- var __defProp$f = Object.defineProperty;
18221
+ var __defProp$g = Object.defineProperty;
18191
18222
  var __getOwnPropDesc$k = Object.getOwnPropertyDescriptor;
18192
18223
  var __decorateClass$k = (decorators, target, key, kind) => {
18193
18224
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$k(target, key) : target;
18194
18225
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
18195
18226
  if (decorator = decorators[i])
18196
18227
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
18197
- if (kind && result) __defProp$f(target, key, result);
18228
+ if (kind && result) __defProp$g(target, key, result);
18198
18229
  return result;
18199
18230
  };
18200
18231
  const MODEL_TYPE$j = "trouble-model";
@@ -18349,18 +18380,29 @@ const Trouble = {
18349
18380
  predicate: isKosModel(MODEL_TYPE$j),
18350
18381
  factory: Kos.Factory.create(MODEL_TYPE$j)
18351
18382
  };
18352
- var __defProp$e = Object.defineProperty;
18383
+ var __defProp$f = Object.defineProperty;
18353
18384
  var __getOwnPropDesc$j = Object.getOwnPropertyDescriptor;
18354
- var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
18385
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$f(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
18355
18386
  var __decorateClass$j = (decorators, target, key, kind) => {
18356
18387
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$j(target, key) : target;
18357
18388
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
18358
18389
  if (decorator = decorators[i])
18359
18390
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
18360
- if (kind && result) __defProp$e(target, key, result);
18391
+ if (kind && result) __defProp$f(target, key, result);
18361
18392
  return result;
18362
18393
  };
18363
18394
  var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, key + "", value);
18395
+ const addTrouble = (trouble) => {
18396
+ const options = {
18397
+ ...trouble,
18398
+ rank: troubleRankMapper(trouble),
18399
+ color: troubleColorMapper(trouble),
18400
+ role: troubleRoleMapper(trouble),
18401
+ id: String(trouble.id)
18402
+ };
18403
+ const newTrouble = Trouble.factory(`trouble-${trouble.id}`)(options);
18404
+ return newTrouble;
18405
+ };
18364
18406
  function troubleRankMapper(trouble) {
18365
18407
  const _rank = ExtensionManager.propertyMapper.hasMapper(
18366
18408
  KosCoreModelPropertyMapper.TroubleRank
@@ -18405,6 +18447,16 @@ let TroubleContainerModelImpl = class {
18405
18447
  this.servicePath = options.servicePath ?? this.servicePath;
18406
18448
  }
18407
18449
  // -------------------LIFECYCLE----------------------------
18450
+ async reload() {
18451
+ this.logger.info("reloading trouble container");
18452
+ const _troubles = await getTroubles(this.servicePath);
18453
+ const incoming = _troubles?.data ?? [];
18454
+ const incomingKeys = new Set(incoming.map((t) => `trouble-${t.id}`));
18455
+ const toRemove = this.troubles.data.map((m) => m.id).filter((id) => !incomingKeys.has(id));
18456
+ const toAdd = incoming.filter((t) => !this.troubles.getModel(`trouble-${t.id}`)).map(addTrouble);
18457
+ this.troubles.removeAll(toRemove);
18458
+ this.troubles.addAll(toAdd);
18459
+ }
18408
18460
  async load() {
18409
18461
  this.logger.debug("loading trouble container");
18410
18462
  try {
@@ -18504,14 +18556,14 @@ const getArtifacts = async () => {
18504
18556
  log$c.debug("getArtifacts - response:", response);
18505
18557
  return response?.data;
18506
18558
  };
18507
- var __defProp$d = Object.defineProperty;
18559
+ var __defProp$e = Object.defineProperty;
18508
18560
  var __getOwnPropDesc$i = Object.getOwnPropertyDescriptor;
18509
18561
  var __decorateClass$i = (decorators, target, key, kind) => {
18510
18562
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$i(target, key) : target;
18511
18563
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
18512
18564
  if (decorator = decorators[i])
18513
18565
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
18514
- if (kind && result) __defProp$d(target, key, result);
18566
+ if (kind && result) __defProp$e(target, key, result);
18515
18567
  return result;
18516
18568
  };
18517
18569
  const MODEL_TYPE$h = "ota-model";
@@ -18710,14 +18762,14 @@ function encodeFrame(rgba, format, stripAlpha) {
18710
18762
  return btoa(String.fromCharCode(...rgb));
18711
18763
  }
18712
18764
  }
18713
- var __defProp$c = Object.defineProperty;
18765
+ var __defProp$d = Object.defineProperty;
18714
18766
  var __getOwnPropDesc$h = Object.getOwnPropertyDescriptor;
18715
18767
  var __decorateClass$h = (decorators, target, key, kind) => {
18716
18768
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$h(target, key) : target;
18717
18769
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
18718
18770
  if (decorator = decorators[i])
18719
18771
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
18720
- if (kind && result) __defProp$c(target, key, result);
18772
+ if (kind && result) __defProp$d(target, key, result);
18721
18773
  return result;
18722
18774
  };
18723
18775
  const MODEL_TYPE$g = "canvas-renderer-model";
@@ -20755,14 +20807,14 @@ const getRenderer = ({
20755
20807
  }
20756
20808
  throw new Error(`Unknown mode: ${mode}`);
20757
20809
  };
20758
- var __defProp$b = Object.defineProperty;
20810
+ var __defProp$c = Object.defineProperty;
20759
20811
  var __getOwnPropDesc$g = Object.getOwnPropertyDescriptor;
20760
20812
  var __decorateClass$g = (decorators, target, key, kind) => {
20761
20813
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$g(target, key) : target;
20762
20814
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
20763
20815
  if (decorator = decorators[i])
20764
20816
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
20765
- if (kind && result) __defProp$b(target, key, result);
20817
+ if (kind && result) __defProp$c(target, key, result);
20766
20818
  return result;
20767
20819
  };
20768
20820
  const MODEL_TYPE$f = "canvas-dispatcher-model";
@@ -20975,14 +21027,14 @@ const index$6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
20975
21027
  getDeviceDetails,
20976
21028
  getSerialNumber
20977
21029
  }, Symbol.toStringTag, { value: "Module" }));
20978
- var __defProp$a = Object.defineProperty;
21030
+ var __defProp$b = Object.defineProperty;
20979
21031
  var __getOwnPropDesc$f = Object.getOwnPropertyDescriptor;
20980
21032
  var __decorateClass$f = (decorators, target, key, kind) => {
20981
21033
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$f(target, key) : target;
20982
21034
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
20983
21035
  if (decorator = decorators[i])
20984
21036
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
20985
- if (kind && result) __defProp$a(target, key, result);
21037
+ if (kind && result) __defProp$b(target, key, result);
20986
21038
  return result;
20987
21039
  };
20988
21040
  const MODEL_TYPE$e = "device-model";
@@ -21322,14 +21374,14 @@ const index$5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
21322
21374
  __proto__: null,
21323
21375
  getNetworkInterfaces
21324
21376
  }, Symbol.toStringTag, { value: "Module" }));
21325
- var __defProp$9 = Object.defineProperty;
21377
+ var __defProp$a = Object.defineProperty;
21326
21378
  var __getOwnPropDesc$d = Object.getOwnPropertyDescriptor;
21327
21379
  var __decorateClass$d = (decorators, target, key, kind) => {
21328
21380
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$d(target, key) : target;
21329
21381
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
21330
21382
  if (decorator = decorators[i])
21331
21383
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
21332
- if (kind && result) __defProp$9(target, key, result);
21384
+ if (kind && result) __defProp$a(target, key, result);
21333
21385
  return result;
21334
21386
  };
21335
21387
  const MODEL_TYPE$c = "network-interface-container-model";
@@ -21513,14 +21565,14 @@ const StorageDevice = new KosModelRegistrationFactory({
21513
21565
  class: StorageDeviceModelImpl,
21514
21566
  type: MODEL_TYPE$b
21515
21567
  });
21516
- var __defProp$8 = Object.defineProperty;
21568
+ var __defProp$9 = Object.defineProperty;
21517
21569
  var __getOwnPropDesc$b = Object.getOwnPropertyDescriptor;
21518
21570
  var __decorateClass$b = (decorators, target, key, kind) => {
21519
21571
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$b(target, key) : target;
21520
21572
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
21521
21573
  if (decorator = decorators[i])
21522
21574
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
21523
- if (kind && result) __defProp$8(target, key, result);
21575
+ if (kind && result) __defProp$9(target, key, result);
21524
21576
  return result;
21525
21577
  };
21526
21578
  const MODEL_TYPE$a = "storage-device-container-model";
@@ -21658,14 +21710,14 @@ const index$3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
21658
21710
  getAvailableUpdates,
21659
21711
  installUpdate
21660
21712
  }, Symbol.toStringTag, { value: "Module" }));
21661
- var __defProp$7 = Object.defineProperty;
21713
+ var __defProp$8 = Object.defineProperty;
21662
21714
  var __getOwnPropDesc$a = Object.getOwnPropertyDescriptor;
21663
21715
  var __decorateClass$a = (decorators, target, key, kind) => {
21664
21716
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$a(target, key) : target;
21665
21717
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
21666
21718
  if (decorator = decorators[i])
21667
21719
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
21668
- if (kind && result) __defProp$7(target, key, result);
21720
+ if (kind && result) __defProp$8(target, key, result);
21669
21721
  return result;
21670
21722
  };
21671
21723
  const MODEL_TYPE$9 = "usb-update-model";
@@ -21731,14 +21783,14 @@ const UsbUpdate = new KosModelRegistrationFactory({
21731
21783
  class: UsbUpdateModelImpl,
21732
21784
  type: MODEL_TYPE$9
21733
21785
  });
21734
- var __defProp$6 = Object.defineProperty;
21786
+ var __defProp$7 = Object.defineProperty;
21735
21787
  var __getOwnPropDesc$9 = Object.getOwnPropertyDescriptor;
21736
21788
  var __decorateClass$9 = (decorators, target, key, kind) => {
21737
21789
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$9(target, key) : target;
21738
21790
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
21739
21791
  if (decorator = decorators[i])
21740
21792
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
21741
- if (kind && result) __defProp$6(target, key, result);
21793
+ if (kind && result) __defProp$7(target, key, result);
21742
21794
  return result;
21743
21795
  };
21744
21796
  const MODEL_TYPE$8 = "usb-update-container-model";
@@ -21905,12 +21957,14 @@ const getKosLocalizationDescriptor = (context) => async () => {
21905
21957
  return response.data[context];
21906
21958
  };
21907
21959
  const CONTEXT_LANG_RESOLVER = "langResolver";
21960
+ var __defProp$6 = Object.defineProperty;
21908
21961
  var __getOwnPropDesc$8 = Object.getOwnPropertyDescriptor;
21909
21962
  var __decorateClass$8 = (decorators, target, key, kind) => {
21910
21963
  var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc$8(target, key) : target;
21911
21964
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
21912
21965
  if (decorator = decorators[i])
21913
- result = decorator(result) || result;
21966
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
21967
+ if (kind && result) __defProp$6(target, key, result);
21914
21968
  return result;
21915
21969
  };
21916
21970
  const MODEL_TYPE$7 = "translation-model";
@@ -22177,17 +22231,16 @@ let TranslationModelImpl = class {
22177
22231
  */
22178
22232
  async ready() {
22179
22233
  this.logger.debug(`ready translation ${this.id}`);
22180
- this.disposer = mobx.reaction(
22181
- () => this.currentLocale,
22182
- (value, previous) => {
22183
- this.logger.info(
22184
- `translation langs for namespace ${this.id} changed from ${previous} to ${value}`
22185
- );
22186
- this.loadTranslations();
22187
- }
22188
- );
22234
+ }
22235
+ async handleCurrentLocaleChange() {
22236
+ await this.loadTranslations();
22189
22237
  }
22190
22238
  };
22239
+ __decorateClass$8([
22240
+ kosModelEffect({
22241
+ dependencies: (model) => [model.currentLocale]
22242
+ })
22243
+ ], TranslationModelImpl.prototype, "handleCurrentLocaleChange", 1);
22191
22244
  TranslationModelImpl = __decorateClass$8([
22192
22245
  kosParentAware(),
22193
22246
  kosModel(MODEL_TYPE$7)
@@ -23771,11 +23824,11 @@ const loadingDot = react.css`
23771
23824
  `;
23772
23825
  const Portal = ({ children }) => reactDom.createPortal(children, document.body);
23773
23826
  function LoadingMessage({
23774
- message = "Wait a moment while we load your app.",
23827
+ message: message2 = "Wait a moment while we load your app.",
23775
23828
  theme = "light"
23776
23829
  }) {
23777
23830
  return /* @__PURE__ */ jsxRuntime.jsx(Portal, { children: /* @__PURE__ */ jsxRuntime.jsxs(MessageContainer, { theme, children: [
23778
- message,
23831
+ message2,
23779
23832
  /* @__PURE__ */ jsxRuntime.jsx("div", { css: loadingDot, children: "." })
23780
23833
  ] }) });
23781
23834
  }
@@ -23975,32 +24028,6 @@ const KosModelLoaderDisplay = (props) => {
23975
24028
  const loader = props.loading || /* @__PURE__ */ jsxRuntime.jsx(DefaultLoader, {});
23976
24029
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: model && isReady ? props.children : loader });
23977
24030
  };
23978
- const DEFAULT_TRANSLATIONS = {
23979
- header: {
23980
- title: "Model",
23981
- createLabel: "Create new Model",
23982
- deleteLabel: "Delete"
23983
- },
23984
- createModal: {
23985
- okText: "OK",
23986
- cancelText: "Cancel",
23987
- title: "Create New Model"
23988
- }
23989
- };
23990
- const CreateModelTranslationsContext = React.createContext(DEFAULT_TRANSLATIONS);
23991
- const CreateModelTranslationsProvider = ({
23992
- translations = DEFAULT_TRANSLATIONS,
23993
- children
23994
- }) => {
23995
- const merged = {
23996
- header: { ...DEFAULT_TRANSLATIONS.header, ...translations.header },
23997
- createModal: {
23998
- ...DEFAULT_TRANSLATIONS.createModal,
23999
- ...translations.createModal
24000
- }
24001
- };
24002
- return /* @__PURE__ */ jsxRuntime.jsx(CreateModelTranslationsContext.Provider, { value: merged, children });
24003
- };
24004
24031
  function fetchKosCore(registration, alias) {
24005
24032
  const kosCore = KosCore.create(registration, false, alias);
24006
24033
  const promise = kosCore.whenReady().then(() => kosCore);
@@ -24020,7 +24047,11 @@ const initKosProvider = (registration = { models: {}, preloadModels: [] }, alias
24020
24047
  disposer();
24021
24048
  };
24022
24049
  }, [kosCore]);
24023
- return /* @__PURE__ */ jsxRuntime.jsx(KosContext.Provider, { value: { kosCore, online }, children });
24050
+ const value = React.useMemo(
24051
+ () => ({ kosCore, online }),
24052
+ [kosCore, online]
24053
+ );
24054
+ return /* @__PURE__ */ jsxRuntime.jsx(KosContext.Provider, { value, children });
24024
24055
  };
24025
24056
  return { KosCoreContextProvider: mobxReactLite.observer(KosCoreContextProvider) };
24026
24057
  };
@@ -24031,6 +24062,202 @@ const useKosCore = () => {
24031
24062
  }
24032
24063
  return context;
24033
24064
  };
24065
+ const KOS_RECOVERING_SESSION_KEY = "kos:recovering";
24066
+ const DEFAULT_GRACE_MS = 3e3;
24067
+ const defaultReloadFn = () => {
24068
+ window.location.reload();
24069
+ };
24070
+ const ReloadOnDisconnectPolicy = ({
24071
+ graceMs = DEFAULT_GRACE_MS,
24072
+ onBeforeReload,
24073
+ reloadFn = defaultReloadFn
24074
+ }) => {
24075
+ const pendingReloadRef = React.useRef(null);
24076
+ React.useEffect(() => {
24077
+ const { unsubscribe } = subscribe(
24078
+ WebSocketEvents.DISCONNECTED,
24079
+ (msg) => {
24080
+ if (pendingReloadRef.current) {
24081
+ return;
24082
+ }
24083
+ const payload = msg?.body;
24084
+ if (!payload || typeof payload.code !== "number") {
24085
+ return;
24086
+ }
24087
+ const info = {
24088
+ code: payload.code,
24089
+ reason: payload.reason,
24090
+ wasClean: payload.wasClean,
24091
+ at: Date.now()
24092
+ };
24093
+ try {
24094
+ sessionStorage.setItem(
24095
+ KOS_RECOVERING_SESSION_KEY,
24096
+ JSON.stringify(info)
24097
+ );
24098
+ } catch (err) {
24099
+ KosLog.warn(
24100
+ "ReloadOnDisconnectPolicy: failed to write sessionStorage",
24101
+ err
24102
+ );
24103
+ }
24104
+ KosLog.warn(
24105
+ `ReloadOnDisconnectPolicy: scheduling reload in ${graceMs}ms (code=${info.code}, wasClean=${info.wasClean})`
24106
+ );
24107
+ pendingReloadRef.current = setTimeout(() => {
24108
+ pendingReloadRef.current = null;
24109
+ try {
24110
+ onBeforeReload?.(info);
24111
+ } catch (err) {
24112
+ KosLog.error(
24113
+ "ReloadOnDisconnectPolicy: onBeforeReload threw",
24114
+ err
24115
+ );
24116
+ }
24117
+ reloadFn();
24118
+ }, graceMs);
24119
+ }
24120
+ );
24121
+ return () => {
24122
+ unsubscribe();
24123
+ if (pendingReloadRef.current) {
24124
+ clearTimeout(pendingReloadRef.current);
24125
+ pendingReloadRef.current = null;
24126
+ }
24127
+ };
24128
+ }, [graceMs, onBeforeReload, reloadFn]);
24129
+ return null;
24130
+ };
24131
+ const defaultIsReady = ({ online }) => online;
24132
+ const readRecoveringInfo = () => {
24133
+ try {
24134
+ const raw = sessionStorage.getItem(KOS_RECOVERING_SESSION_KEY);
24135
+ if (!raw) return null;
24136
+ sessionStorage.removeItem(KOS_RECOVERING_SESSION_KEY);
24137
+ const parsed = JSON.parse(raw);
24138
+ if (parsed && typeof parsed === "object" && typeof parsed.code === "number") {
24139
+ return parsed;
24140
+ }
24141
+ } catch {
24142
+ }
24143
+ return null;
24144
+ };
24145
+ const useReconnectingOverlayState = (options = {}) => {
24146
+ const { isReady = defaultIsReady, readSessionStorage = true } = options;
24147
+ const { online } = useKosCore();
24148
+ const [info, setInfo] = React.useState(
24149
+ () => readSessionStorage ? readRecoveringInfo() : null
24150
+ );
24151
+ const [dismissed, setDismissed] = React.useState(false);
24152
+ React.useEffect(() => {
24153
+ const { unsubscribe } = subscribe(
24154
+ WebSocketEvents.DISCONNECTED,
24155
+ (msg) => {
24156
+ const payload = msg?.body;
24157
+ if (!payload || typeof payload.code !== "number") return;
24158
+ setInfo({
24159
+ code: payload.code,
24160
+ reason: payload.reason,
24161
+ wasClean: payload.wasClean,
24162
+ at: Date.now()
24163
+ });
24164
+ setDismissed(false);
24165
+ }
24166
+ );
24167
+ return () => {
24168
+ unsubscribe();
24169
+ };
24170
+ }, []);
24171
+ const ready = isReady({ online, info });
24172
+ const visible = !dismissed && !!info && !ready;
24173
+ return {
24174
+ visible,
24175
+ info,
24176
+ sinceMs: info ? Date.now() - info.at : null,
24177
+ dismiss: () => setDismissed(true)
24178
+ };
24179
+ };
24180
+ const spin = react.keyframes`
24181
+ to { transform: rotate(360deg); }
24182
+ `;
24183
+ const overlayRoot = react.css`
24184
+ position: fixed;
24185
+ inset: 0;
24186
+ display: flex;
24187
+ flex-direction: column;
24188
+ align-items: center;
24189
+ justify-content: center;
24190
+ gap: 16px;
24191
+ background: rgba(0, 0, 0, 0.72);
24192
+ color: #ffffff;
24193
+ font-family: system-ui, -apple-system, "Segoe UI", sans-serif;
24194
+ z-index: 2147483647;
24195
+ pointer-events: auto;
24196
+ user-select: none;
24197
+ `;
24198
+ const spinner = react.css`
24199
+ width: 48px;
24200
+ height: 48px;
24201
+ border-radius: 50%;
24202
+ border: 4px solid rgba(255, 255, 255, 0.25);
24203
+ border-top-color: #ffffff;
24204
+ animation: ${spin} 1s linear infinite;
24205
+ `;
24206
+ const message = react.css`
24207
+ font-size: 18px;
24208
+ font-weight: 500;
24209
+ letter-spacing: 0.02em;
24210
+ `;
24211
+ const ReconnectingOverlay = ({
24212
+ messageText = "Reconnecting…",
24213
+ renderContent,
24214
+ className,
24215
+ isReady,
24216
+ readSessionStorage
24217
+ }) => {
24218
+ const state = useReconnectingOverlayState({ isReady, readSessionStorage });
24219
+ if (!state.visible) return null;
24220
+ return /* @__PURE__ */ jsxRuntime.jsx(
24221
+ "div",
24222
+ {
24223
+ css: overlayRoot,
24224
+ className,
24225
+ role: "alertdialog",
24226
+ "aria-live": "assertive",
24227
+ "aria-label": "Reconnecting",
24228
+ children: renderContent ? renderContent(state) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
24229
+ /* @__PURE__ */ jsxRuntime.jsx("div", { css: spinner, "aria-hidden": "true" }),
24230
+ /* @__PURE__ */ jsxRuntime.jsx("div", { css: message, children: messageText })
24231
+ ] })
24232
+ }
24233
+ );
24234
+ };
24235
+ const DEFAULT_TRANSLATIONS = {
24236
+ header: {
24237
+ title: "Model",
24238
+ createLabel: "Create new Model",
24239
+ deleteLabel: "Delete"
24240
+ },
24241
+ createModal: {
24242
+ okText: "OK",
24243
+ cancelText: "Cancel",
24244
+ title: "Create New Model"
24245
+ }
24246
+ };
24247
+ const CreateModelTranslationsContext = React.createContext(DEFAULT_TRANSLATIONS);
24248
+ const CreateModelTranslationsProvider = ({
24249
+ translations = DEFAULT_TRANSLATIONS,
24250
+ children
24251
+ }) => {
24252
+ const merged = {
24253
+ header: { ...DEFAULT_TRANSLATIONS.header, ...translations.header },
24254
+ createModal: {
24255
+ ...DEFAULT_TRANSLATIONS.createModal,
24256
+ ...translations.createModal
24257
+ }
24258
+ };
24259
+ return /* @__PURE__ */ jsxRuntime.jsx(CreateModelTranslationsContext.Provider, { value: merged, children });
24260
+ };
24034
24261
  const MAX_RETRIES = 8;
24035
24262
  const waitForRetry = (depth = 0) => new Promise((resolve) => {
24036
24263
  setTimeout(() => {
@@ -24269,11 +24496,13 @@ const KosTranslationProvider = ({
24269
24496
  locale = "en",
24270
24497
  resolver,
24271
24498
  rootUrl,
24272
- descriptorResolver
24499
+ descriptorResolver,
24500
+ excludeNamespaces = []
24273
24501
  }) => {
24274
24502
  const [ready, setReady] = React.useState(false);
24275
24503
  const [localization, setLocalization] = React.useState();
24276
24504
  const [translations, setTranslations] = React.useState();
24505
+ const [allLocales, setAllLocales] = React.useState([]);
24277
24506
  const resolvedRootUrl = rootUrl || getDefaultHost();
24278
24507
  const _appContext = React.useMemo(() => appContext ?? "app/system", [appContext]);
24279
24508
  React.useEffect(() => {
@@ -24303,6 +24532,24 @@ const KosTranslationProvider = ({
24303
24532
  };
24304
24533
  }, {});
24305
24534
  setLocalization(localizationDescriptor);
24535
+ const _allLocales = descriptors.reduce((acc, curr) => {
24536
+ Object.keys(curr.namespaces).filter((ns) => !excludeNamespaces.includes(ns)).forEach((namespaceKey) => {
24537
+ const namespace = curr.namespaces[namespaceKey];
24538
+ Object.keys(namespace.locales).forEach((localeKey) => {
24539
+ acc.add(localeKey);
24540
+ });
24541
+ });
24542
+ return acc;
24543
+ }, /* @__PURE__ */ new Set());
24544
+ const localeList = Array.from(_allLocales).map((locale2) => {
24545
+ return {
24546
+ locale: locale2,
24547
+ label: new Intl.DisplayNames([locale2], { type: "language" }).of(
24548
+ locale2
24549
+ )
24550
+ };
24551
+ });
24552
+ setAllLocales(localeList);
24306
24553
  }
24307
24554
  initTools();
24308
24555
  }, [_appContext, descriptorResolver]);
@@ -24330,13 +24577,15 @@ const KosTranslationProvider = ({
24330
24577
  if (translations) {
24331
24578
  translations.currentLocale = locale2;
24332
24579
  }
24333
- }
24580
+ },
24581
+ allLocales
24334
24582
  };
24335
24583
  }
24336
24584
  return {
24337
24585
  setLocale: () => {
24338
24586
  throw new Error("Translations not ready");
24339
- }
24587
+ },
24588
+ allLocales: []
24340
24589
  };
24341
24590
  }, [ready, translations]);
24342
24591
  const content = ready ? children : null;
@@ -25059,6 +25308,36 @@ const useConfigProperty = ({
25059
25308
  error
25060
25309
  };
25061
25310
  };
25311
+ const useConnectionState = () => {
25312
+ const { online } = useKosCore();
25313
+ const [lastDisconnect, setLastDisconnect] = React.useState(
25314
+ null
25315
+ );
25316
+ React.useEffect(() => {
25317
+ const { unsubscribe } = subscribe(
25318
+ WebSocketEvents.DISCONNECTED,
25319
+ (msg) => {
25320
+ const payload = msg?.body;
25321
+ if (payload && typeof payload === "object" && typeof payload.code === "number") {
25322
+ setLastDisconnect({
25323
+ code: payload.code,
25324
+ reason: payload.reason,
25325
+ wasClean: payload.wasClean,
25326
+ at: Date.now()
25327
+ });
25328
+ }
25329
+ }
25330
+ );
25331
+ return () => {
25332
+ unsubscribe();
25333
+ };
25334
+ }, []);
25335
+ return {
25336
+ online,
25337
+ lastDisconnect,
25338
+ sinceLastDisconnectMs: lastDisconnect ? Date.now() - lastDisconnect.at : null
25339
+ };
25340
+ };
25062
25341
  function getDaysInMonth(month, year) {
25063
25342
  const yearToUse = year ?? (/* @__PURE__ */ new Date()).getFullYear();
25064
25343
  const daysInEachMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
@@ -26204,6 +26483,7 @@ exports.HEADER_WORK_TRACKER = HEADER_WORK_TRACKER;
26204
26483
  exports.HttpRouteHandlers = HttpRouteHandlers;
26205
26484
  exports.KOS_EXECUTION_CONTEXT = KOS_EXECUTION_CONTEXT;
26206
26485
  exports.KOS_MODEL_ID = KOS_MODEL_ID;
26486
+ exports.KOS_RECOVERING_SESSION_KEY = KOS_RECOVERING_SESSION_KEY;
26207
26487
  exports.KOS_SERVICE = service$4;
26208
26488
  exports.KOS_SERVICE_1_6_5 = service$6;
26209
26489
  exports.KOS_SERVICE_1_8_1 = service$5;
@@ -26294,12 +26574,14 @@ exports.PROFILE_TOOLS_PREVIEW = PROFILE_TOOLS_PREVIEW;
26294
26574
  exports.ParentModel = ParentModel;
26295
26575
  exports.PluginExtensionManager = PluginExtensionManager;
26296
26576
  exports.ProgressBar = ProgressBar;
26577
+ exports.ReconnectingOverlay = ReconnectingOverlay;
26297
26578
  exports.ReferenceConfig = ReferenceConfig;
26298
26579
  exports.RegionInfo = Registration$1;
26299
26580
  exports.RegionServices = index$f;
26300
26581
  exports.RegistrationManager = RegistrationManager;
26301
26582
  exports.Registry = Registry;
26302
26583
  exports.ReloadAwareSetup = ReloadAwareSetup;
26584
+ exports.ReloadOnDisconnectPolicy = ReloadOnDisconnectPolicy;
26303
26585
  exports.ReplayStrategy = ReplayStrategy;
26304
26586
  exports.ResponseRetention = ResponseRetention;
26305
26587
  exports.STATUS = STATUS;
@@ -26579,6 +26861,7 @@ exports.useAmPmValues = useAmPmValues;
26579
26861
  exports.useCalendarDayArray = useCalendarDayArray;
26580
26862
  exports.useConfigBean = useConfigBean;
26581
26863
  exports.useConfigProperty = useConfigProperty;
26864
+ exports.useConnectionState = useConnectionState;
26582
26865
  exports.useContextModel = useContextModel;
26583
26866
  exports.useContextModelHierarchy = useContextModelHierarchy;
26584
26867
  exports.useDateArrays = useDateArrays;
@@ -26612,6 +26895,7 @@ exports.useNetworkInterfaceContainer = useNetworkInterfaceContainer;
26612
26895
  exports.useOta = useOta;
26613
26896
  exports.usePressGesture = usePressGesture;
26614
26897
  exports.useProjectReload = useProjectReload;
26898
+ exports.useReconnectingOverlayState = useReconnectingOverlayState;
26615
26899
  exports.useRegionTimeProps = useRegionTimeProps;
26616
26900
  exports.useRegionalTimeDate = useRegionalTimeDate;
26617
26901
  exports.useSoftwareInfo = useSoftwareInfo;