@morscherlab/mint-sdk 1.1.9 → 1.1.11

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 (28) hide show
  1. package/dist/__tests__/components/AppTopBarPresence.test.d.ts +1 -0
  2. package/dist/__tests__/composables/usePresenceHeartbeat.test.d.ts +1 -0
  3. package/dist/components/AutoGroupModal.adapter.d.ts +12 -1
  4. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +2 -2
  5. package/dist/components/index.js +1 -1
  6. package/dist/{components-BbtUpCTv.js → components-DjJsjKqe.js} +43 -18
  7. package/dist/components-DjJsjKqe.js.map +1 -0
  8. package/dist/composables/index.d.ts +1 -0
  9. package/dist/composables/index.js +2 -2
  10. package/dist/composables/usePresenceHeartbeat.d.ts +44 -0
  11. package/dist/index.js +3 -3
  12. package/dist/install.js +1 -1
  13. package/dist/{useProtocolTemplates-BWfNaynA.js → useProtocolTemplates-CIzDGj2R.js} +112 -10
  14. package/dist/useProtocolTemplates-CIzDGj2R.js.map +1 -0
  15. package/package.json +1 -1
  16. package/src/__tests__/components/AppTopBarPresence.test.ts +47 -0
  17. package/src/__tests__/components/AutoGroupModal.adapter.test.ts +31 -1
  18. package/src/__tests__/components/SampleSelector.test.ts +35 -0
  19. package/src/__tests__/composables/autoGroup/groupByOrder.test.ts +31 -2
  20. package/src/__tests__/composables/usePresenceHeartbeat.test.ts +147 -0
  21. package/src/components/AppTopBar.vue +6 -0
  22. package/src/components/AutoGroupModal.adapter.ts +52 -1
  23. package/src/components/AutoGroupModal.vue +6 -4
  24. package/src/composables/index.ts +7 -0
  25. package/src/composables/useAutoGroup.ts +11 -7
  26. package/src/composables/usePresenceHeartbeat.ts +194 -0
  27. package/dist/components-BbtUpCTv.js.map +0 -1
  28. package/dist/useProtocolTemplates-BWfNaynA.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { AutoGroupResult, ColumnInfo, ColumnRole } from '../types/auto-group';
1
+ import { AutoGroupResult, ClassSchema, ColumnInfo, ColumnRole } from '../types/auto-group';
2
2
  import { SampleGroup } from '../types';
3
3
  import { FieldRecipeGroup, QcRoute, SmartGroupField } from './SmartGroupFieldRecipe.groups';
4
4
  import { ManualSample } from './SmartGroupManual.cohorts';
@@ -22,6 +22,17 @@ export declare function engineFieldsToCards(columns: ColumnInfo[], groupBy: read
22
22
  enabled: boolean[];
23
23
  layers: (number | null)[];
24
24
  };
25
+ /**
26
+ * Build the batch-wide field recipe from every class schema. The active schema
27
+ * stays first for a stable card order; fields and enabled hierarchy layers that
28
+ * only exist in another token-length/class split are appended instead of being
29
+ * hidden from the controlled UI.
30
+ */
31
+ export declare function engineSchemasToCards(schemas: Record<string, ClassSchema>, activeClassKey: string): {
32
+ fields: SmartGroupField[];
33
+ enabled: boolean[];
34
+ layers: (number | null)[];
35
+ };
25
36
  /** Map engine sample groups to the live preview rail shape. */
26
37
  export declare function engineGroupsToRail(groups: SampleGroup[]): FieldRecipeGroup[];
27
38
  /** Map the Field Recipe QC label to the engine's class disposition routing. */
@@ -5,8 +5,8 @@ declare const _default: import('vue').DefineComponent<SmartGroupFieldRecipeProps
5
5
  cancel: () => any;
6
6
  close: () => any;
7
7
  move: (index: number, direction: "up" | "down") => any;
8
- manual: () => any;
9
8
  apply: (payload: FieldRecipeApplyPayload) => any;
9
+ manual: () => any;
10
10
  "update:route": (route: QcRoute) => any;
11
11
  "csv-file": (file: File) => any;
12
12
  "download-template": () => any;
@@ -16,8 +16,8 @@ declare const _default: import('vue').DefineComponent<SmartGroupFieldRecipeProps
16
16
  onCancel?: (() => any) | undefined;
17
17
  onClose?: (() => any) | undefined;
18
18
  onMove?: ((index: number, direction: "up" | "down") => any) | undefined;
19
- onManual?: (() => any) | undefined;
20
19
  onApply?: ((payload: FieldRecipeApplyPayload) => any) | undefined;
20
+ onManual?: (() => any) | undefined;
21
21
  "onUpdate:route"?: ((route: QcRoute) => any) | undefined;
22
22
  "onCsv-file"?: ((file: File) => any) | undefined;
23
23
  "onDownload-template"?: (() => any) | undefined;
@@ -1,7 +1,7 @@
1
1
  import { f as BaseModal_default, m as BaseButton_default } from "../experiment-utils-CLnzPPq5.js";
2
2
  import { a as BaseSelect_default, i as BasePill_default, n as Skeleton_default, s as BaseInput_default, t as EmptyState_default } from "../EmptyState-p90quq8Z.js";
3
3
  import { At as BaseCheckbox_default, Ct as DatePicker_default, Dt as BaseSlider_default, It as BaseTextarea_default, L as GeneratedPathInput_default, M as SequenceInput_default, O as ConcentrationInput_default, Ot as BaseRadioGroup_default, P as FormulaInput_default, at as TagsInput_default, it as NumberInput_default, j as MoleculeInput_default, jt as Tooltip_default, k as UnitInput_default, kt as BaseToggle_default, nt as AlertBox_default, ot as TimePicker_default, rt as FileUploader_default, tt as DateTimePicker_default, wt as MultiSelect_default, z as ArtifactSelectorModal_default } from "../useControlSchema-BMVb2XIQ.js";
4
- import { $ as SmartGroupFieldRecipe_default, A as ProtocolStepEditor_default, At as AppToastContainer_default, B as Breadcrumb_default, Ct as AppPluginSwitcher_default, Dt as ThemeToggle_default, Et as CollapsibleCard_default, F as RackEditor_default, Ft as BaseTabs_default, G as AppContainer_default, H as ProgressBar_default, I as BioTemplatePresetWorkspaceView_default, It as ColorSlider_default, J as ComponentBindingRenderer_default, K as DoseDesignWorkspaceView_default, L as BioTemplatePackWorkspaceView_default, M as ReagentEditor_default, Mt as Calendar_default, N as SmartGroupModal_default, Nt as DropdownButton_default, O as ChemicalFormula_default, Ot as ActionMenu_default, P as GroupAssigner_default, Pt as SegmentedControl_default, Q as SmartGroupManual_default, R as BioTemplateExperimentWorkspaceView_default, St as AppTopBar_default, Tt as PluginIcon_default, U as StatusIndicator_default, V as Avatar_default, W as Divider_default, X as SampleSelector_default, Y as ScheduleCalendar_default, Z as AutoGroupModal_default, _t as AppLayout_default, a as ResourceCard_default, at as DoseCalculator_default, b as InstrumentAlertLog_default, bt as FormActions_default, c as BatchProgressList_default, ct as GeneratedResultRenderer_default, dt as LoadingSpinner_default, et as ReagentList_default, gt as MobileSupportGate_default, ht as PluginWorkspaceView_default, i as SectionCard_default, it as ExperimentTimeline_default, j as SampleHierarchyTree_default, jt as DataFrame_default, k as ScientificNumber_default, kt as IconButton_default, l as AuditTrail_default, lt as GeneratedPlotlyResult_default, n as FitPanel_default, nt as SampleLegend_default, o as TimeRangeInput_default, ot as GeneratedPluginView_default, q as ControlWorkspaceView_default, r as ArtifactSaveDialog_default, rt as WellPlate_default, s as ExperimentDataViewer_default, st as JobsStatusTray_default, tt as PlateMapEditor_default, u as LcmsSequenceTable_default, ut as ChartContainer_default, v as InstrumentStatusCard_default, vt as AppSidebar_default, wt as AppAvatarMenu_default, x as SequenceProgressBar_default, xt as StepWizard_default, y as InstrumentStateBadge_default, yt as FormBuilder_default, z as BioTemplateRenderer_default } from "../components-BbtUpCTv.js";
4
+ import { $ as SmartGroupFieldRecipe_default, A as ProtocolStepEditor_default, At as AppToastContainer_default, B as Breadcrumb_default, Ct as AppPluginSwitcher_default, Dt as ThemeToggle_default, Et as CollapsibleCard_default, F as RackEditor_default, Ft as BaseTabs_default, G as AppContainer_default, H as ProgressBar_default, I as BioTemplatePresetWorkspaceView_default, It as ColorSlider_default, J as ComponentBindingRenderer_default, K as DoseDesignWorkspaceView_default, L as BioTemplatePackWorkspaceView_default, M as ReagentEditor_default, Mt as Calendar_default, N as SmartGroupModal_default, Nt as DropdownButton_default, O as ChemicalFormula_default, Ot as ActionMenu_default, P as GroupAssigner_default, Pt as SegmentedControl_default, Q as SmartGroupManual_default, R as BioTemplateExperimentWorkspaceView_default, St as AppTopBar_default, Tt as PluginIcon_default, U as StatusIndicator_default, V as Avatar_default, W as Divider_default, X as SampleSelector_default, Y as ScheduleCalendar_default, Z as AutoGroupModal_default, _t as AppLayout_default, a as ResourceCard_default, at as DoseCalculator_default, b as InstrumentAlertLog_default, bt as FormActions_default, c as BatchProgressList_default, ct as GeneratedResultRenderer_default, dt as LoadingSpinner_default, et as ReagentList_default, gt as MobileSupportGate_default, ht as PluginWorkspaceView_default, i as SectionCard_default, it as ExperimentTimeline_default, j as SampleHierarchyTree_default, jt as DataFrame_default, k as ScientificNumber_default, kt as IconButton_default, l as AuditTrail_default, lt as GeneratedPlotlyResult_default, n as FitPanel_default, nt as SampleLegend_default, o as TimeRangeInput_default, ot as GeneratedPluginView_default, q as ControlWorkspaceView_default, r as ArtifactSaveDialog_default, rt as WellPlate_default, s as ExperimentDataViewer_default, st as JobsStatusTray_default, tt as PlateMapEditor_default, u as LcmsSequenceTable_default, ut as ChartContainer_default, v as InstrumentStatusCard_default, vt as AppSidebar_default, wt as AppAvatarMenu_default, x as SequenceProgressBar_default, xt as StepWizard_default, y as InstrumentStateBadge_default, yt as FormBuilder_default, z as BioTemplateRenderer_default } from "../components-DjJsjKqe.js";
5
5
  import { s as FormField_default, t as SettingsModal_default } from "../SettingsModal-D7LFUokT.js";
6
6
  import { r as ConfirmDialog_default, t as ExperimentPopover_default } from "../ExperimentPopover-tLwJ7XF4.js";
7
7
  import { r as ExperimentCodeBadge_default, t as ExperimentSelectorModal_default } from "../ExperimentSelectorModal-B6P2msT4.js";
@@ -4,7 +4,7 @@ import { a as BaseSelect_default, i as BasePill_default, n as Skeleton_default,
4
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
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";
6
6
  import { t as useDropdownState } from "./useDropdownState-DSb3BC3N.js";
7
- import { B as useDoseCalculator, C as getSampleGroupParentPath, G as useMobileSupportGate, J as useTheme, K as APP_EXPERIMENT_KEY, N as useAutoGroup, P as parseCSV, Q as useTextSearch, R as DEFAULT_COLORS, S as getSampleGroupMajorPrefix, U as usePluginJobCenter, W as DEFAULT_MOBILE_VIEWPORT_QUERY, Y as useToast, _ as useScheduleDrag, a as useReagentSeries, b as useExpansionSet, c as useBioTemplatePresetWorkspace, et as useSortedItems, k as readFileAsText, l as useBioTemplatePackWorkspace, n as DEFAULT_PRESETS, 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-BWfNaynA.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";
8
8
  import { r as useApi } from "./useApi-CDBq6z23.js";
9
9
  import { i as usePlatformContext, t as useFormBuilder } from "./useFormBuilder-DG3HOFGA.js";
10
10
  import { t as ANALYSIS_FILE_ARTIFACT_SCHEMA } from "./analysisArtifactTypes-DQ0MjwHZ.js";
@@ -3218,6 +3218,10 @@ var AppTopBar_default = /* @__PURE__ */ defineComponent({
3218
3218
  const settingsOpen = ref(false);
3219
3219
  const { isIntegrated, plugin } = usePlatformContext();
3220
3220
  const isStandalone = computed(() => !isIntegrated.value);
3221
+ usePresenceHeartbeat({
3222
+ enabled: isIntegrated,
3223
+ scope: computed(() => plugin.value?.id || plugin.value?.name || "")
3224
+ });
3221
3225
  const appExperiment = inject(APP_EXPERIMENT_KEY, null);
3222
3226
  const canBindExperiment = computed(() => plugin.value?.plugin_type !== "static");
3223
3227
  const pluginIcon = computed(() => {
@@ -10408,23 +10412,45 @@ function candidateColumns(columns, groupBy) {
10408
10412
  return columns.filter((c) => c.role === "factor" || c.role === "replicate" || enabled.has(c.index));
10409
10413
  }
10410
10414
  /**
10411
- * Map engine columns to Field Recipe cards + their on/off state (same order).
10412
- * `layers` aligns with the cards: the column's 1-based position in the
10413
- * `groupBy` layer order, or `null` when the column is not grouped by.
10415
+ * Build the batch-wide field recipe from every class schema. The active schema
10416
+ * stays first for a stable card order; fields and enabled hierarchy layers that
10417
+ * only exist in another token-length/class split are appended instead of being
10418
+ * hidden from the controlled UI.
10414
10419
  */
10415
- function engineFieldsToCards(columns, groupBy) {
10416
- const candidates = candidateColumns(columns, groupBy);
10420
+ function engineSchemasToCards(schemas, activeClassKey) {
10421
+ const entries = Object.entries(schemas);
10422
+ const active = entries.find(([key]) => key === activeClassKey);
10423
+ const ordered = active ? [active, ...entries.filter(([key]) => key !== activeClassKey)] : entries;
10424
+ const candidates = /* @__PURE__ */ new Map();
10425
+ const enabledOrder = [];
10426
+ const enabled = /* @__PURE__ */ new Set();
10427
+ for (const [, schema] of ordered) {
10428
+ for (const index of schema.groupBy) {
10429
+ const column = schema.columns.find((candidate) => candidate.index === index);
10430
+ if (!column) continue;
10431
+ const identity = column.displayName ?? column.name;
10432
+ if (!enabled.has(identity)) {
10433
+ enabled.add(identity);
10434
+ enabledOrder.push(identity);
10435
+ }
10436
+ }
10437
+ for (const column of candidateColumns(schema.columns, schema.groupBy)) {
10438
+ const identity = column.displayName ?? column.name;
10439
+ if (!candidates.has(identity)) candidates.set(identity, column);
10440
+ }
10441
+ }
10442
+ const cards = [...candidates.entries()];
10417
10443
  return {
10418
- fields: candidates.map((c) => ({
10419
- key: c.displayName ?? c.name,
10420
- role: roleLabel(c.role),
10421
- vals: c.uniqueValues.join(", "),
10422
- rep: c.role === "replicate"
10444
+ fields: cards.map(([key, column]) => ({
10445
+ key,
10446
+ role: roleLabel(column.role),
10447
+ vals: column.uniqueValues.join(", "),
10448
+ rep: column.role === "replicate"
10423
10449
  })),
10424
- enabled: candidates.map((c) => groupBy.includes(c.index)),
10425
- layers: candidates.map((c) => {
10426
- const pos = groupBy.indexOf(c.index);
10427
- return pos === -1 ? null : pos + 1;
10450
+ enabled: cards.map(([key]) => enabled.has(key)),
10451
+ layers: cards.map(([key]) => {
10452
+ const position = enabledOrder.indexOf(key);
10453
+ return position === -1 ? null : position + 1;
10428
10454
  })
10429
10455
  };
10430
10456
  }
@@ -10600,8 +10626,7 @@ var AutoGroupModal_default = /* @__PURE__ */ defineComponent({
10600
10626
  excludeQc.value = value === "exclude";
10601
10627
  autoGroup.setClassDispositions((c) => c.kind !== "biological" && c.kind !== "unknown", value === "exclude" ? "exclude" : value === "overlay" ? "overlay" : "group");
10602
10628
  }
10603
- const groupByOrder = computed(() => autoGroup.activeSchema.value?.groupBy ?? []);
10604
- const fieldCards = computed(() => engineFieldsToCards(autoGroup.fields.value, groupByOrder.value));
10629
+ const fieldCards = computed(() => engineSchemasToCards(autoGroup.schemas.value, autoGroup.activeClassKey.value));
10605
10630
  const railGroups = computed(() => engineGroupsToRail(autoGroup.result.value.experimentalGroups ?? autoGroup.groups.value));
10606
10631
  const qcSampleCount = computed(() => autoGroup.classes.value.filter((c) => c.kind !== "biological" && c.kind !== "unknown").reduce((acc, c) => acc + c.members.length, 0));
10607
10632
  const qcChip = computed(() => qcRouting.value !== "mix" && qcSampleCount.value > 0 ? {
@@ -18248,4 +18273,4 @@ var components_exports = /* @__PURE__ */ __exportAll({
18248
18273
  //#endregion
18249
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 };
18250
18275
 
18251
- //# sourceMappingURL=components-BbtUpCTv.js.map
18276
+ //# sourceMappingURL=components-DjJsjKqe.js.map