@morscherlab/mint-sdk 1.1.13 → 1.1.14

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 (42) hide show
  1. package/dist/{SettingsModal-D7LFUokT.js → SettingsModal-Brvcqz4a.js} +3 -3
  2. package/dist/{SettingsModal-D7LFUokT.js.map → SettingsModal-Brvcqz4a.js.map} +1 -1
  3. package/dist/__tests__/components/RuntimeUpdateNotice.test.d.ts +1 -0
  4. package/dist/__tests__/composables/useRuntimeAlignment.test.d.ts +1 -0
  5. package/dist/components/RuntimeUpdateNotice.vue.d.ts +9 -0
  6. package/dist/components/index.d.ts +1 -0
  7. package/dist/components/index.js +4 -4
  8. package/dist/{components-DjJsjKqe.js → components-DIciVip2.js} +87 -23
  9. package/dist/components-DIciVip2.js.map +1 -0
  10. package/dist/composables/index.d.ts +2 -1
  11. package/dist/composables/index.js +6 -6
  12. package/dist/composables/usePlatformContext.d.ts +3 -0
  13. package/dist/composables/usePresenceHeartbeat.d.ts +5 -0
  14. package/dist/composables/useRuntimeAlignment.d.ts +44 -0
  15. package/dist/{composables-CRR_JxQD.js → composables-CPv3k1Yh.js} +3 -3
  16. package/dist/{composables-CRR_JxQD.js.map → composables-CPv3k1Yh.js.map} +1 -1
  17. package/dist/index.js +8 -8
  18. package/dist/install.js +3 -3
  19. package/dist/styles.css +27 -0
  20. package/dist/templates/index.js +2 -2
  21. package/dist/{templates-Cr-48-u2.js → templates-Dyyjr6wD.js} +2 -2
  22. package/dist/{templates-Cr-48-u2.js.map → templates-Dyyjr6wD.js.map} +1 -1
  23. package/dist/types/platform.d.ts +2 -0
  24. package/dist/{useControlSchema-BMVb2XIQ.js → useControlSchema-B6-PO0F6.js} +13 -14
  25. package/dist/{useControlSchema-BMVb2XIQ.js.map → useControlSchema-B6-PO0F6.js.map} +1 -1
  26. package/dist/{useFormBuilder-DG3HOFGA.js → useFormBuilder-Pgb9Td6h.js} +2 -2
  27. package/dist/{useFormBuilder-DG3HOFGA.js.map → useFormBuilder-Pgb9Td6h.js.map} +1 -1
  28. package/dist/{useProtocolTemplates-CIzDGj2R.js → useProtocolTemplates-CYCnwGtY.js} +112 -5
  29. package/dist/useProtocolTemplates-CYCnwGtY.js.map +1 -0
  30. package/package.json +1 -1
  31. package/src/__tests__/components/RuntimeUpdateNotice.test.ts +14 -0
  32. package/src/__tests__/composables/usePresenceHeartbeat.test.ts +17 -0
  33. package/src/__tests__/composables/useRuntimeAlignment.test.ts +145 -0
  34. package/src/components/AppTopBar.vue +14 -0
  35. package/src/components/RuntimeUpdateNotice.vue +51 -0
  36. package/src/components/index.ts +1 -0
  37. package/src/composables/index.ts +8 -0
  38. package/src/composables/usePresenceHeartbeat.ts +8 -1
  39. package/src/composables/useRuntimeAlignment.ts +184 -0
  40. package/src/types/platform.ts +2 -0
  41. package/dist/components-DjJsjKqe.js.map +0 -1
  42. package/dist/useProtocolTemplates-CIzDGj2R.js.map +0 -1
@@ -1,19 +1,19 @@
1
1
  import { n as __exportAll, r as __toESM } from "./chunk-BoAXSpZd.js";
2
2
  import { f as BaseModal_default, m as BaseButton_default, p as useEventListener } from "./experiment-utils-CLnzPPq5.js";
3
3
  import { a as BaseSelect_default, i as BasePill_default, n as Skeleton_default, o as normalizeOptionInput, r as useRequestSyncState, s as BaseInput_default, t as EmptyState_default } from "./EmptyState-p90quq8Z.js";
4
- import { A as useConcentrationUnits, At as BaseCheckbox_default, Ct as DatePicker_default, Dt as BaseSlider_default, Ft as shift, H as getInjectedPlatformContext, I as useChemicalFormula, It as BaseTextarea_default, L as GeneratedPathInput_default, M as SequenceInput_default, Mt as computePosition, Nt as flip, O as ConcentrationInput_default, Ot as BaseRadioGroup_default, P as FormulaInput_default, Pt as offset, Q as normalizeJobPercent, R as _plugin_vue_export_helper_default, T as getDefaultControlView, Tt as useListSelection, W as resolveCurrentExperimentId, Z as jobStatusLabel, _ as controlsToFormSchema, at as TagsInput_default, ct as compareTime, f as resolveControlModel, ft as formatDuration, g as mergeControlWorkspaceOptions, h as controlValuesToComponentProps, it as NumberInput_default, j as MoleculeInput_default, jt as Tooltip_default, k as UnitInput_default, kt as BaseToggle_default, lt as durationMinutes, m as controlValuesToComponentBindingsById, nt as AlertBox_default, o as defineDoseDesignControlModel, ot as TimePicker_default, p as controlValuesToComponentBindings, pt as formatTime, q as useGeneratedAnalysis, r as getControlDefaults, rt as FileUploader_default, tt as DateTimePicker_default, u as useControlWorkspace, w as controlsToViewItems, wt as MultiSelect_default, x as controlsToSidebarPanels, y as controlsToSectionFormSchemas, z as ArtifactSelectorModal_default } from "./useControlSchema-BMVb2XIQ.js";
5
- import { a as pickExistingRecordKeys, c as normalizeItemInput, i as formSchemaFieldNames, l as normalizeLabelItemInput, o as recordValuesEqualForKeys, r as FormFieldRendererInternal_default, s as FormField_default, t as SettingsModal_default } from "./SettingsModal-D7LFUokT.js";
4
+ import { A as useConcentrationUnits, At as BaseCheckbox_default, Ct as DatePicker_default, Dt as BaseSlider_default, Ft as shift, I as useChemicalFormula, It as BaseTextarea_default, K as useGeneratedAnalysis, L as GeneratedPathInput_default, M as SequenceInput_default, Mt as computePosition, Nt as flip, O as ConcentrationInput_default, Ot as BaseRadioGroup_default, P as FormulaInput_default, Pt as offset, R as ArtifactSelectorModal_default, T as getDefaultControlView, Tt as useListSelection, U as resolveCurrentExperimentId, V as getInjectedPlatformContext, X as jobStatusLabel, Z as normalizeJobPercent, _ as controlsToFormSchema, at as TagsInput_default, ct as compareTime, et as DateTimePicker_default, f as resolveControlModel, ft as formatDuration, g as mergeControlWorkspaceOptions, h as controlValuesToComponentProps, it as NumberInput_default, j as MoleculeInput_default, jt as Tooltip_default, k as UnitInput_default, kt as BaseToggle_default, lt as durationMinutes, m as controlValuesToComponentBindingsById, nt as AlertBox_default, o as defineDoseDesignControlModel, ot as TimePicker_default, p as controlValuesToComponentBindings, pt as formatTime, r as getControlDefaults, rt as FileUploader_default, tt as _plugin_vue_export_helper_default, u as useControlWorkspace, w as controlsToViewItems, wt as MultiSelect_default, x as controlsToSidebarPanels, y as controlsToSectionFormSchemas } from "./useControlSchema-B6-PO0F6.js";
5
+ import { a as pickExistingRecordKeys, c as normalizeItemInput, i as formSchemaFieldNames, l as normalizeLabelItemInput, o as recordValuesEqualForKeys, r as FormFieldRendererInternal_default, s as FormField_default, t as SettingsModal_default } from "./SettingsModal-Brvcqz4a.js";
6
6
  import { t as useDropdownState } from "./useDropdownState-DSb3BC3N.js";
7
- import { B as useDoseCalculator, C as getSampleGroupParentPath, G as useMobileSupportGate, K as APP_EXPERIMENT_KEY, N as useAutoGroup, P as parseCSV, R as DEFAULT_COLORS, S as getSampleGroupMajorPrefix, U as usePluginJobCenter, W as DEFAULT_MOBILE_VIEWPORT_QUERY, X as useTheme, Y as usePresenceHeartbeat, Z as useToast, _ as useScheduleDrag, a as useReagentSeries, b as useExpansionSet, c as useBioTemplatePresetWorkspace, et as useTextSearch, k as readFileAsText, l as useBioTemplatePackWorkspace, n as DEFAULT_PRESETS, nt as useSortedItems, o as useGroupAssignment, q as useAppExperiment, r as DEFAULT_UNITS, s as useRackEditor, t as useProtocolTemplates, v as useExperimentSamples, x as useSampleGroups, y as useExperimentData, z as useWellPlateEditor } from "./useProtocolTemplates-CIzDGj2R.js";
7
+ import { $ as useToast, B as useDoseCalculator, C as getSampleGroupParentPath, G as useMobileSupportGate, J as getInjectedFrontendRevision, K as APP_EXPERIMENT_KEY, N as useAutoGroup, P as parseCSV, Q as useTheme, R as DEFAULT_COLORS, S as getSampleGroupMajorPrefix, U as usePluginJobCenter, W as DEFAULT_MOBILE_VIEWPORT_QUERY, Y as useRuntimeAlignment, Z as usePresenceHeartbeat, _ as useScheduleDrag, a as useReagentSeries, b as useExpansionSet, c as useBioTemplatePresetWorkspace, it as useSortedItems, k as readFileAsText, l as useBioTemplatePackWorkspace, n as DEFAULT_PRESETS, nt as useTextSearch, o as useGroupAssignment, q as useAppExperiment, r as DEFAULT_UNITS, s as useRackEditor, t as useProtocolTemplates, v as useExperimentSamples, x as useSampleGroups, y as useExperimentData, z as useWellPlateEditor } from "./useProtocolTemplates-CYCnwGtY.js";
8
8
  import { r as useApi } from "./useApi-CDBq6z23.js";
9
- import { i as usePlatformContext, t as useFormBuilder } from "./useFormBuilder-DG3HOFGA.js";
9
+ import { i as usePlatformContext, t as useFormBuilder } from "./useFormBuilder-Pgb9Td6h.js";
10
10
  import { t as ANALYSIS_FILE_ARTIFACT_SCHEMA } from "./analysisArtifactTypes-DQ0MjwHZ.js";
11
11
  import { r as ConfirmDialog_default, t as ExperimentPopover_default } from "./ExperimentPopover-tLwJ7XF4.js";
12
- import { B as toBioTemplateComponentProps, F as getBioTemplateComponentProps, H as toBioTemplateComponentPropsById, L as toBioTemplateComponentBindings, R as toBioTemplateComponentBindingsById, V as toBioTemplateComponentPropsByComponent, dn as extractTemplateCollection } from "./templates-Cr-48-u2.js";
12
+ import { B as toBioTemplateComponentProps, F as getBioTemplateComponentProps, H as toBioTemplateComponentPropsById, L as toBioTemplateComponentBindings, R as toBioTemplateComponentBindingsById, V as toBioTemplateComponentPropsByComponent, dn as extractTemplateCollection } from "./templates-Dyyjr6wD.js";
13
13
  import { r as ExperimentCodeBadge_default, t as ExperimentSelectorModal_default } from "./ExperimentSelectorModal-B6P2msT4.js";
14
14
  import { Fragment, Teleport, Transition, TransitionGroup, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createStaticVNode, createTextVNode, createVNode, defineAsyncComponent, defineComponent, effectScope, guardReactiveProps, h, inject, mergeModels, mergeProps, nextTick, normalizeClass, normalizeProps, normalizeStyle, onBeforeUnmount, onMounted, onScopeDispose, onUnmounted, openBlock, reactive, ref, renderList, renderSlot, resolveComponent, resolveDynamicComponent, shallowRef, toDisplayString, toHandlers, toRaw, toRef, unref, useId, useModel, useSlots, vModelCheckbox, vModelSelect, vModelText, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
15
15
  //#region src/components/ColorSlider.vue?vue&type=script&setup=true&lang.ts
16
- var _hoisted_1$76 = { class: "mint-color-slider__row" };
16
+ var _hoisted_1$77 = { class: "mint-color-slider__row" };
17
17
  var _hoisted_2$68 = { class: "mint-color-slider__track" };
18
18
  var _hoisted_3$61 = [
19
19
  "value",
@@ -130,7 +130,7 @@ var ColorSlider_default = /* @__PURE__ */ defineComponent({
130
130
  emit("update:modelValue", Number(target.value));
131
131
  }
132
132
  return (_ctx, _cache) => {
133
- return openBlock(), createElementBlock("div", { class: normalizeClass(["mint-color-slider", { "mint-color-slider--disabled": __props.disabled }]) }, [createElementVNode("div", _hoisted_1$76, [createElementVNode("div", _hoisted_2$68, [createElementVNode("input", {
133
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["mint-color-slider", { "mint-color-slider--disabled": __props.disabled }]) }, [createElementVNode("div", _hoisted_1$77, [createElementVNode("div", _hoisted_2$68, [createElementVNode("input", {
134
134
  type: "range",
135
135
  value: currentValue.value,
136
136
  min: __props.min,
@@ -166,7 +166,7 @@ var ColorSlider_default = /* @__PURE__ */ defineComponent({
166
166
  });
167
167
  //#endregion
168
168
  //#region src/components/BaseTabs.vue?vue&type=script&setup=true&lang.ts
169
- var _hoisted_1$75 = [
169
+ var _hoisted_1$76 = [
170
170
  "aria-selected",
171
171
  "aria-disabled",
172
172
  "onClick"
@@ -246,14 +246,14 @@ var BaseTabs_default = /* @__PURE__ */ defineComponent({
246
246
  }, null, 8, _hoisted_5$54))])) : tab.icon ? (openBlock(), createElementBlock("span", _hoisted_6$50, toDisplayString(tab.icon), 1)) : createCommentVNode("", true),
247
247
  createTextVNode(" " + toDisplayString(tab.label) + " ", 1),
248
248
  tab.badge !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_7$44, toDisplayString(tab.badge), 1)) : createCommentVNode("", true)
249
- ])], 10, _hoisted_1$75);
249
+ ])], 10, _hoisted_1$76);
250
250
  }), 128))], 2);
251
251
  };
252
252
  }
253
253
  });
254
254
  //#endregion
255
255
  //#region src/components/SegmentedControl.vue?vue&type=script&setup=true&lang.ts
256
- var _hoisted_1$74 = [
256
+ var _hoisted_1$75 = [
257
257
  "aria-checked",
258
258
  "disabled",
259
259
  "onClick",
@@ -332,14 +332,14 @@ var SegmentedControl_default = /* @__PURE__ */ defineComponent({
332
332
  ]),
333
333
  onClick: ($event) => handleSelect(option),
334
334
  onKeydown: ($event) => handleKeydown($event, option)
335
- }, [createElementVNode("span", _hoisted_2$66, toDisplayString(option.label), 1), option.description && __props.variant === "card" ? (openBlock(), createElementBlock("span", _hoisted_3$59, toDisplayString(option.description), 1)) : createCommentVNode("", true)], 42, _hoisted_1$74);
335
+ }, [createElementVNode("span", _hoisted_2$66, toDisplayString(option.label), 1), option.description && __props.variant === "card" ? (openBlock(), createElementBlock("span", _hoisted_3$59, toDisplayString(option.description), 1)) : createCommentVNode("", true)], 42, _hoisted_1$75);
336
336
  }), 128))], 2);
337
337
  };
338
338
  }
339
339
  });
340
340
  //#endregion
341
341
  //#region src/components/DropdownButton.vue?vue&type=script&setup=true&lang.ts
342
- var _hoisted_1$73 = ["disabled", "aria-expanded"];
342
+ var _hoisted_1$74 = ["disabled", "aria-expanded"];
343
343
  var _hoisted_2$65 = {
344
344
  key: 0,
345
345
  class: "mint-dropdown-button__spinner",
@@ -458,7 +458,7 @@ var DropdownButton_default = /* @__PURE__ */ defineComponent({
458
458
  "stroke-linecap": "round",
459
459
  "stroke-linejoin": "round"
460
460
  }, [..._cache[1] || (_cache[1] = [createElementVNode("path", { d: "m6 9 6 6 6-6" }, null, -1)])], 2))
461
- ], 10, _hoisted_1$73), createVNode(Transition, { name: "mint-dropdown-button-menu" }, {
461
+ ], 10, _hoisted_1$74), createVNode(Transition, { name: "mint-dropdown-button-menu" }, {
462
462
  default: withCtx(() => [unref(isOpen) ? (openBlock(), createElementBlock("ul", {
463
463
  key: 0,
464
464
  class: "mint-dropdown-button__menu",
@@ -489,7 +489,7 @@ var DropdownButton_default = /* @__PURE__ */ defineComponent({
489
489
  });
490
490
  //#endregion
491
491
  //#region src/components/Calendar.vue?vue&type=script&setup=true&lang.ts
492
- var _hoisted_1$72 = { class: "mint-calendar" };
492
+ var _hoisted_1$73 = { class: "mint-calendar" };
493
493
  var _hoisted_2$64 = {
494
494
  key: 0,
495
495
  class: "mint-calendar__header"
@@ -723,7 +723,7 @@ var Calendar_default = /* @__PURE__ */ defineComponent({
723
723
  emit("navigate", "next", currentMonth.value, currentYear.value);
724
724
  }
725
725
  return (_ctx, _cache) => {
726
- return openBlock(), createElementBlock("div", _hoisted_1$72, [
726
+ return openBlock(), createElementBlock("div", _hoisted_1$73, [
727
727
  __props.showNavigation ? (openBlock(), createElementBlock("div", _hoisted_2$64, [
728
728
  createElementVNode("button", {
729
729
  type: "button",
@@ -797,7 +797,7 @@ var Calendar_default = /* @__PURE__ */ defineComponent({
797
797
  });
798
798
  //#endregion
799
799
  //#region src/components/DataFrame.vue?vue&type=script&setup=true&lang.ts
800
- var _hoisted_1$71 = {
800
+ var _hoisted_1$72 = {
801
801
  key: 0,
802
802
  class: "mint-dataframe__header"
803
803
  };
@@ -1092,7 +1092,7 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1092
1092
  });
1093
1093
  return (_ctx, _cache) => {
1094
1094
  return openBlock(), createElementBlock("div", { class: normalizeClass(["mint-dataframe", { "mint-dataframe--bordered": __props.bordered }]) }, [
1095
- __props.searchable ? (openBlock(), createElementBlock("div", _hoisted_1$71, [createElementVNode("div", _hoisted_2$63, [_cache[5] || (_cache[5] = createElementVNode("svg", {
1095
+ __props.searchable ? (openBlock(), createElementBlock("div", _hoisted_1$72, [createElementVNode("div", _hoisted_2$63, [_cache[5] || (_cache[5] = createElementVNode("svg", {
1096
1096
  class: "mint-dataframe__search-icon",
1097
1097
  viewBox: "0 0 24 24",
1098
1098
  fill: "none",
@@ -1289,7 +1289,7 @@ var DataFrame_default = /* @__PURE__ */ defineComponent({
1289
1289
  });
1290
1290
  //#endregion
1291
1291
  //#region src/components/AppToastContainer.vue?vue&type=script&setup=true&lang.ts
1292
- var _hoisted_1$70 = { class: "mint-toast__container" };
1292
+ var _hoisted_1$71 = { class: "mint-toast__container" };
1293
1293
  var _hoisted_2$62 = ["onClick"];
1294
1294
  var _hoisted_3$55 = { class: "mint-toast__message" };
1295
1295
  //#endregion
@@ -1306,7 +1306,7 @@ var AppToastContainer_default = /* @__PURE__ */ defineComponent({
1306
1306
  info: "#3B82F6"
1307
1307
  };
1308
1308
  return (_ctx, _cache) => {
1309
- return openBlock(), createBlock(Teleport, { to: "body" }, [createElementVNode("div", _hoisted_1$70, [createVNode(TransitionGroup, { name: "toast" }, {
1309
+ return openBlock(), createBlock(Teleport, { to: "body" }, [createElementVNode("div", _hoisted_1$71, [createVNode(TransitionGroup, { name: "toast" }, {
1310
1310
  default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(toasts), (toast) => {
1311
1311
  return openBlock(), createElementBlock("div", {
1312
1312
  key: toast.id,
@@ -1539,6 +1539,62 @@ var Ellipsis = createLucideIcon("ellipsis", [
1539
1539
  }]
1540
1540
  ]);
1541
1541
  //#endregion
1542
+ //#region ../../node_modules/.bun/lucide-vue-next@1.0.0+710994de3992b4e0/node_modules/lucide-vue-next/dist/esm/icons/refresh-cw.js
1543
+ /**
1544
+ * @license lucide-vue-next v1.0.0 - ISC
1545
+ *
1546
+ * This source code is licensed under the ISC license.
1547
+ * See the LICENSE file in the root directory of this source tree.
1548
+ */
1549
+ var RefreshCw = createLucideIcon("refresh-cw", [
1550
+ ["path", {
1551
+ d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",
1552
+ key: "v9h5vc"
1553
+ }],
1554
+ ["path", {
1555
+ d: "M21 3v5h-5",
1556
+ key: "1q7to0"
1557
+ }],
1558
+ ["path", {
1559
+ d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",
1560
+ key: "3uifl3"
1561
+ }],
1562
+ ["path", {
1563
+ d: "M8 16H3v5",
1564
+ key: "1cv678"
1565
+ }]
1566
+ ]);
1567
+ //#endregion
1568
+ //#region src/components/RuntimeUpdateNotice.vue?vue&type=script&setup=true&lang.ts
1569
+ var _hoisted_1$70 = {
1570
+ key: 0,
1571
+ class: "mint-runtime-update",
1572
+ role: "status"
1573
+ };
1574
+ //#endregion
1575
+ //#region src/components/RuntimeUpdateNotice.vue
1576
+ var RuntimeUpdateNotice_default = /* @__PURE__ */ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
1577
+ __name: "RuntimeUpdateNotice",
1578
+ props: { visible: { type: Boolean } },
1579
+ emits: ["reload"],
1580
+ setup(__props, { emit: __emit }) {
1581
+ const emit = __emit;
1582
+ return (_ctx, _cache) => {
1583
+ return __props.visible ? (openBlock(), createElementBlock("div", _hoisted_1$70, [
1584
+ createVNode(unref(RefreshCw), {
1585
+ size: 16,
1586
+ "aria-hidden": "true"
1587
+ }),
1588
+ _cache[1] || (_cache[1] = createElementVNode("span", null, "A new version is ready.", -1)),
1589
+ createElementVNode("button", {
1590
+ type: "button",
1591
+ onClick: _cache[0] || (_cache[0] = ($event) => emit("reload"))
1592
+ }, " Reload now ")
1593
+ ])) : createCommentVNode("", true);
1594
+ };
1595
+ }
1596
+ }), [["__scopeId", "data-v-a368205e"]]);
1597
+ //#endregion
1542
1598
  //#region src/components/IconButton.vue?vue&type=script&setup=true&lang.ts
1543
1599
  var _hoisted_1$69 = [
1544
1600
  "disabled",
@@ -3211,16 +3267,19 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
3211
3267
  setup(__props, { emit: __emit }) {
3212
3268
  /** Full application top bar with brand logo, page selector or plugin switcher, centered pill nav, experiment popover, and avatar menu. */
3213
3269
  const props = __props;
3214
- const SettingsModal = defineAsyncComponent(() => import("./SettingsModal-D7LFUokT.js").then((n) => n.n));
3270
+ const SettingsModal = defineAsyncComponent(() => import("./SettingsModal-Brvcqz4a.js").then((n) => n.n));
3215
3271
  const ExperimentPopover = defineAsyncComponent(() => import("./ExperimentPopover-tLwJ7XF4.js").then((n) => n.n));
3216
3272
  const ExperimentSelectorModal = defineAsyncComponent(() => import("./ExperimentSelectorModal-B6P2msT4.js").then((n) => n.n));
3217
3273
  const emit = __emit;
3218
3274
  const settingsOpen = ref(false);
3219
3275
  const { isIntegrated, plugin } = usePlatformContext();
3220
3276
  const isStandalone = computed(() => !isIntegrated.value);
3277
+ const presenceScope = computed(() => plugin.value?.id || plugin.value?.name || "");
3278
+ const runtimeAlignment = useRuntimeAlignment({ currentRevision: getInjectedFrontendRevision() });
3221
3279
  usePresenceHeartbeat({
3222
3280
  enabled: isIntegrated,
3223
- scope: computed(() => plugin.value?.id || plugin.value?.name || "")
3281
+ scope: presenceScope,
3282
+ onResponse: runtimeAlignment.observe
3224
3283
  });
3225
3284
  const appExperiment = inject(APP_EXPERIMENT_KEY, null);
3226
3285
  const canBindExperiment = computed(() => plugin.value?.plugin_type !== "static");
@@ -3426,6 +3485,10 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
3426
3485
  ])) : createCommentVNode("", true)
3427
3486
  ])
3428
3487
  ])], 2),
3488
+ createVNode(RuntimeUpdateNotice_default, {
3489
+ visible: unref(runtimeAlignment).updateAvailable.value,
3490
+ onReload: unref(runtimeAlignment).reload
3491
+ }, null, 8, ["visible", "onReload"]),
3429
3492
  __props.showSettings && settingsOpen.value ? (openBlock(), createBlock(unref(SettingsModal), {
3430
3493
  key: 0,
3431
3494
  modelValue: settingsOpen.value,
@@ -18246,6 +18309,7 @@ var components_exports = /* @__PURE__ */ __exportAll({
18246
18309
  ReagentEditor: () => ReagentEditor_default,
18247
18310
  ReagentList: () => ReagentList_default,
18248
18311
  ResourceCard: () => ResourceCard_default,
18312
+ RuntimeUpdateNotice: () => RuntimeUpdateNotice_default,
18249
18313
  SampleHierarchyTree: () => SampleHierarchyTree_default,
18250
18314
  SampleLegend: () => SampleLegend_default,
18251
18315
  SampleSelector: () => SampleSelector_default,
@@ -18271,6 +18335,6 @@ var components_exports = /* @__PURE__ */ __exportAll({
18271
18335
  WellPlate: () => WellPlate_default
18272
18336
  });
18273
18337
  //#endregion
18274
- export { SmartGroupFieldRecipe_default as $, ProtocolStepEditor_default as A, AppToastContainer_default as At, Breadcrumb_default as B, estimateSequenceRemainingSeconds as C, AppPluginSwitcher_default as Ct, sequenceSamplesRemaining as D, ThemeToggle_default as Dt, sequenceProgressPercent as E, CollapsibleCard_default as Et, RackEditor_default as F, BaseTabs_default as Ft, AppContainer_default as G, ProgressBar_default as H, BioTemplatePresetWorkspaceView_default as I, ColorSlider_default as It, ComponentBindingRenderer_default as J, DoseDesignWorkspaceView_default as K, BioTemplatePackWorkspaceView_default as L, ReagentEditor_default as M, Calendar_default as Mt, SmartGroupModal_default as N, DropdownButton_default as Nt, ChemicalFormula_default as O, ActionMenu_default as Ot, GroupAssigner_default as P, SegmentedControl_default as Pt, SmartGroupManual_default as Q, BioTemplateExperimentWorkspaceView_default as R, estimateSequenceFinishDate as S, AppTopBar_default as St, formatSequenceRemaining as T, PluginIcon_default as Tt, StatusIndicator_default as U, Avatar_default as V, Divider_default as W, SampleSelector_default as X, ScheduleCalendar_default as Y, AutoGroupModal_default as Z, reconstructLcmsPlateCellsFromSequenceItems as _, AppLayout_default as _t, ResourceCard_default as a, DoseCalculator_default as at, InstrumentAlertLog_default as b, FormActions_default as bt, BatchProgressList_default as c, GeneratedResultRenderer_default as ct, DEFAULT_LCMS_SEQUENCE_COLUMNS as d, LoadingSpinner_default as dt, ReagentList_default as et, basenameFromWindowsPath as f, generatedJobDefaults as ft, lcmsWellIdFromPosition as g, MobileSupportGate_default as gt, inferLcmsPlateTypeFromWellIds as h, PluginWorkspaceView_default as ht, SectionCard_default as i, ExperimentTimeline_default as it, SampleHierarchyTree_default as j, DataFrame_default as jt, ScientificNumber_default as k, IconButton_default as kt, AuditTrail_default as l, GeneratedPlotlyResult_default as lt, extractLcmsSampleName as m, normalizeGeneratedJobInput as mt, FitPanel_default as n, SampleLegend_default as nt, TimeRangeInput_default as o, GeneratedPluginView_default as ot, extractLcmsCommonPrefix as p, generatedJobFormSchema as pt, ControlWorkspaceView_default as q, ArtifactSaveDialog_default as r, WellPlate_default as rt, ExperimentDataViewer_default as s, JobsStatusTray_default as st, components_exports as t, PlateMapEditor_default as tt, LcmsSequenceTable_default as u, ChartContainer_default as ut, InstrumentStatusCard_default as v, AppSidebar_default as vt, formatSequenceEta as w, AppAvatarMenu_default as wt, SequenceProgressBar_default as x, StepWizard_default as xt, InstrumentStateBadge_default as y, FormBuilder_default as yt, BioTemplateRenderer_default as z };
18338
+ export { SmartGroupFieldRecipe_default as $, ProtocolStepEditor_default as A, RuntimeUpdateNotice_default as At, Breadcrumb_default as B, estimateSequenceRemainingSeconds as C, AppPluginSwitcher_default as Ct, sequenceSamplesRemaining as D, ThemeToggle_default as Dt, sequenceProgressPercent as E, CollapsibleCard_default as Et, RackEditor_default as F, SegmentedControl_default as Ft, AppContainer_default as G, ProgressBar_default as H, BioTemplatePresetWorkspaceView_default as I, BaseTabs_default as It, ComponentBindingRenderer_default as J, DoseDesignWorkspaceView_default as K, BioTemplatePackWorkspaceView_default as L, ColorSlider_default as Lt, ReagentEditor_default as M, DataFrame_default as Mt, SmartGroupModal_default as N, Calendar_default as Nt, ChemicalFormula_default as O, ActionMenu_default as Ot, GroupAssigner_default as P, DropdownButton_default as Pt, SmartGroupManual_default as Q, BioTemplateExperimentWorkspaceView_default as R, estimateSequenceFinishDate as S, AppTopBar_default as St, formatSequenceRemaining as T, PluginIcon_default as Tt, StatusIndicator_default as U, Avatar_default as V, Divider_default as W, SampleSelector_default as X, ScheduleCalendar_default as Y, AutoGroupModal_default as Z, reconstructLcmsPlateCellsFromSequenceItems as _, AppLayout_default as _t, ResourceCard_default as a, DoseCalculator_default as at, InstrumentAlertLog_default as b, FormActions_default as bt, BatchProgressList_default as c, GeneratedResultRenderer_default as ct, DEFAULT_LCMS_SEQUENCE_COLUMNS as d, LoadingSpinner_default as dt, ReagentList_default as et, basenameFromWindowsPath as f, generatedJobDefaults as ft, lcmsWellIdFromPosition as g, MobileSupportGate_default as gt, inferLcmsPlateTypeFromWellIds as h, PluginWorkspaceView_default as ht, SectionCard_default as i, ExperimentTimeline_default as it, SampleHierarchyTree_default as j, AppToastContainer_default as jt, ScientificNumber_default as k, IconButton_default as kt, AuditTrail_default as l, GeneratedPlotlyResult_default as lt, extractLcmsSampleName as m, normalizeGeneratedJobInput as mt, FitPanel_default as n, SampleLegend_default as nt, TimeRangeInput_default as o, GeneratedPluginView_default as ot, extractLcmsCommonPrefix as p, generatedJobFormSchema as pt, ControlWorkspaceView_default as q, ArtifactSaveDialog_default as r, WellPlate_default as rt, ExperimentDataViewer_default as s, JobsStatusTray_default as st, components_exports as t, PlateMapEditor_default as tt, LcmsSequenceTable_default as u, ChartContainer_default as ut, InstrumentStatusCard_default as v, AppSidebar_default as vt, formatSequenceEta as w, AppAvatarMenu_default as wt, SequenceProgressBar_default as x, StepWizard_default as xt, InstrumentStateBadge_default as y, FormBuilder_default as yt, BioTemplateRenderer_default as z };
18275
18339
 
18276
- //# sourceMappingURL=components-DjJsjKqe.js.map
18340
+ //# sourceMappingURL=components-DIciVip2.js.map