@morscherlab/mint-sdk 1.3.0-beta.1 → 1.3.0-beta.10

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 (134) hide show
  1. package/README.md +23 -140
  2. package/dist/{ResourcePickerListInternal-c3IT8PIu.js → ResourcePickerListInternal-CFAw4vTZ.js} +26 -19
  3. package/dist/ResourcePickerListInternal-CFAw4vTZ.js.map +1 -0
  4. package/dist/components/FilePicker.vue.d.ts +4 -1
  5. package/dist/components/SettingsModal.schema.d.ts +1 -1
  6. package/dist/components/SettingsModal.vue.d.ts +2 -0
  7. package/dist/components/WellPlate.colors.d.ts +1 -5
  8. package/dist/components/WellPlate.rendering.d.ts +5 -2
  9. package/dist/components/index.d.ts +32 -17
  10. package/dist/components/index.js +3 -3
  11. package/dist/components/internal/FilePickerListInternal.vue.d.ts +2 -0
  12. package/dist/components/internal/ResourcePickerListInternal.vue.d.ts +9 -3
  13. package/dist/{components-CvY105kJ.js → components-GDDvof8D.js} +414 -368
  14. package/dist/components-GDDvof8D.js.map +1 -0
  15. package/dist/composables/createFilePickerAdapter.d.ts +5 -1
  16. package/dist/composables/filePicker/usePickerNavigation.d.ts +3 -2
  17. package/dist/composables/index.d.ts +0 -3
  18. package/dist/composables/index.js +4 -4
  19. package/dist/composables/useAutoGroup.d.ts +1 -1
  20. package/dist/composables/useBioTemplateComponents.d.ts +15 -3
  21. package/dist/composables/useBioTemplateControls.d.ts +5 -1
  22. package/dist/composables/useBioTemplatePackWorkspace.d.ts +2 -0
  23. package/dist/composables/useBioTemplatePresetWorkspace.d.ts +5 -1
  24. package/dist/composables/useBioTemplateWorkspace.d.ts +5 -1
  25. package/dist/composables/useExperimentSave.d.ts +5 -1
  26. package/dist/composables/useFilePicker.d.ts +4 -1
  27. package/dist/composables/useGroupAssignment.d.ts +5 -1
  28. package/dist/composables/usePlatformContext.d.ts +3 -0
  29. package/dist/composables/useTemplateCollection.d.ts +5 -1
  30. package/dist/composables-D6uqp0UF.js +591 -0
  31. package/dist/composables-D6uqp0UF.js.map +1 -0
  32. package/dist/index.js +24 -24
  33. package/dist/index.js.map +1 -1
  34. package/dist/install.js +1 -1
  35. package/dist/lcms.d.ts +11 -11
  36. package/dist/styles.css +170 -200
  37. package/dist/templates/index.js +1 -1
  38. package/dist/{templates-Bj9hZ7iV.js → templates-BU1pet28.js} +31 -44
  39. package/dist/templates-BU1pet28.js.map +1 -0
  40. package/dist/types/auth.d.ts +0 -27
  41. package/dist/types/components.d.ts +8 -0
  42. package/dist/types/fileBrowserTypes.d.ts +13 -0
  43. package/dist/types/filePicker.d.ts +8 -1
  44. package/dist/types/index.d.ts +2 -2
  45. package/dist/types/platform.d.ts +2 -0
  46. package/dist/utils/rack.d.ts +16 -16
  47. package/dist/{validation-B4Y8_eEe.js → validation-Dmp9Q5W0.js} +50 -12
  48. package/dist/validation-Dmp9Q5W0.js.map +1 -0
  49. package/package.json +1 -6
  50. package/src/__tests__/components/ActionMenu.test.ts +10 -0
  51. package/src/__tests__/components/AppTopBar.test.ts +24 -8
  52. package/src/__tests__/components/EmptyState.test.ts +15 -0
  53. package/src/__tests__/components/ExperimentSelectorModal.test.ts +12 -5
  54. package/src/__tests__/components/FilePicker.test.ts +65 -1
  55. package/src/__tests__/components/FileUploader.test.ts +6 -9
  56. package/src/__tests__/components/ResourcePickerListInternal.test.ts +23 -4
  57. package/src/__tests__/components/SettingsModal.test.ts +22 -0
  58. package/src/__tests__/components/WellPlate.decoration.test.ts +4 -28
  59. package/src/__tests__/components/WellPlate.rendering.test.ts +20 -33
  60. package/src/__tests__/components/WellPlate.sampleTypeIndicator.test.ts +7 -7
  61. package/src/__tests__/composables/createFilePickerAdapter.test.ts +92 -1
  62. package/src/__tests__/composables/usePickerNavigation.test.ts +61 -1
  63. package/src/__tests__/composables/usePlatformFilePickerAdapter.test.ts +18 -6
  64. package/src/__tests__/docs/frontendDocsCatalog.test.ts +2 -2
  65. package/src/__tests__/styles/controlRefreshRules.test.ts +21 -8
  66. package/src/__tests__/styles/menusShellRefresh.test.ts +20 -5
  67. package/src/__tests__/templates/templatesDeprecation.test.ts +58 -11
  68. package/src/components/ActionMenu.vue +10 -2
  69. package/src/components/AppTopBar.vue +6 -4
  70. package/src/components/EmptyState.vue +3 -1
  71. package/src/components/ExperimentSelectorModal.vue +4 -1
  72. package/src/components/FilePicker.vue +42 -0
  73. package/src/components/FileUploader.vue +30 -46
  74. package/src/components/SettingsModal.schema.ts +4 -2
  75. package/src/components/SettingsModal.vue +4 -2
  76. package/src/components/WellPlate.colors.ts +6 -10
  77. package/src/components/WellPlate.legend.ts +4 -4
  78. package/src/components/WellPlate.rendering.ts +9 -8
  79. package/src/components/WellPlate.vue +5 -22
  80. package/src/components/index.ts +32 -17
  81. package/src/components/internal/FilePickerListInternal.vue +11 -2
  82. package/src/components/internal/ResourcePickerListInternal.vue +21 -27
  83. package/src/composables/autoGroup/index.ts +1 -1
  84. package/src/composables/createFilePickerAdapter.ts +82 -22
  85. package/src/composables/filePicker/usePickerNavigation.ts +29 -2
  86. package/src/composables/index.ts +0 -7
  87. package/src/composables/useAutoGroup.ts +1 -1
  88. package/src/composables/useBioTemplateComponents.ts +15 -3
  89. package/src/composables/useBioTemplateControls.ts +5 -1
  90. package/src/composables/useBioTemplatePackWorkspace.ts +2 -0
  91. package/src/composables/useBioTemplatePresetWorkspace.ts +5 -1
  92. package/src/composables/useBioTemplateWorkspace.ts +5 -1
  93. package/src/composables/useExperimentSave.ts +5 -1
  94. package/src/composables/useFilePicker.ts +8 -1
  95. package/src/composables/useGroupAssignment.ts +5 -1
  96. package/src/composables/usePlatformFilePickerAdapter.ts +26 -4
  97. package/src/composables/useTemplateCollection.ts +5 -1
  98. package/src/index.ts +1 -1
  99. package/src/lcms.ts +11 -11
  100. package/src/styles/components/action-menu.css +10 -0
  101. package/src/styles/components/app-page-selector.css +3 -3
  102. package/src/styles/components/app-pill-nav.css +1 -1
  103. package/src/styles/components/app-top-bar.css +18 -38
  104. package/src/styles/components/empty-state.css +3 -2
  105. package/src/styles/components/experiment-selector-modal.css +3 -9
  106. package/src/styles/components/file-picker.css +23 -1
  107. package/src/styles/components/file-uploader.css +22 -55
  108. package/src/styles/components/resource-picker-list.css +70 -36
  109. package/src/styles/components/well-plate.css +18 -55
  110. package/src/types/auth.ts +0 -37
  111. package/src/types/components.ts +8 -0
  112. package/src/types/fileBrowserTypes.ts +15 -0
  113. package/src/types/filePicker.ts +8 -1
  114. package/src/types/index.ts +2 -5
  115. package/src/types/platform.ts +2 -0
  116. package/src/utils/rack.ts +16 -16
  117. package/dist/ResourcePickerListInternal-c3IT8PIu.js.map +0 -1
  118. package/dist/__tests__/composables/useAuth.test.d.ts +0 -1
  119. package/dist/__tests__/composables/usePasskey.test.d.ts +0 -1
  120. package/dist/components-CvY105kJ.js.map +0 -1
  121. package/dist/composables/useAuth.d.ts +0 -47
  122. package/dist/composables/usePasskey.d.ts +0 -10
  123. package/dist/composables/useWellPlateEditor.d.ts +0 -33
  124. package/dist/composables-DL4Vca7L.js +0 -1193
  125. package/dist/composables-DL4Vca7L.js.map +0 -1
  126. package/dist/plotly.min-D6Ge6qgX.js +0 -168582
  127. package/dist/plotly.min-D6Ge6qgX.js.map +0 -1
  128. package/dist/templates-Bj9hZ7iV.js.map +0 -1
  129. package/dist/validation-B4Y8_eEe.js.map +0 -1
  130. package/src/__tests__/composables/useAuth.test.ts +0 -290
  131. package/src/__tests__/composables/usePasskey.test.ts +0 -38
  132. package/src/composables/useAuth.ts +0 -470
  133. package/src/composables/usePasskey.ts +0 -216
  134. package/src/composables/useWellPlateEditor.ts +0 -415
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composables-D6uqp0UF.js","names":[],"sources":["../src/composables/pluginFrontendBase.ts","../src/composables/useManualLayoutResize.ts","../src/composables/useFileBrowser.ts","../src/composables/analysisArtifactTarget.ts","../src/composables/createFilePickerAdapter.ts","../src/composables/usePlatformFilePickerAdapter.ts"],"sourcesContent":["import { getInjectedPlatformContext } from './platformContextHelpers'\n\nfunction normalizePluginRoutePrefix(prefix: string | undefined): string | undefined {\n const candidate = prefix?.trim()\n if (!candidate) return undefined\n\n const path = candidate.split('/').filter(Boolean).join('/')\n return path ? `/${path}/` : '/'\n}\n\n/**\n * Resolve the Vue Router base for a plugin frontend.\n *\n * Integrated plugins use the platform-injected mount prefix. Standalone and\n * development builds retain the caller's Vite base unchanged.\n */\nexport function resolvePluginFrontendBase(fallbackBase: string = '/'): string {\n const context = getInjectedPlatformContext()\n if (!context?.isIntegrated) return fallbackBase\n\n return normalizePluginRoutePrefix(context.plugin?.route_prefix) ?? fallbackBase\n}\n","import { computed, onBeforeUnmount, shallowRef, toValue, watch, type MaybeRefOrGetter } from 'vue'\n\nexport interface ResizePanelWidthConstraints {\n minWidth: number\n maxWidth: number\n mainMinWidth?: number\n layoutGap?: number\n}\n\nexport interface ResizePercentConstraints {\n minPercent: number\n maxPercent: number\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value))\n}\n\nfunction availablePanelWidth(\n containerWidth: number,\n constraints: ResizePanelWidthConstraints,\n): number {\n return Math.min(\n constraints.maxWidth,\n containerWidth - (constraints.mainMinWidth ?? 0) - (constraints.layoutGap ?? 0),\n )\n}\n\nexport function resizedLeadingPanelWidth(\n startWidth: number,\n deltaX: number,\n containerWidth: number,\n constraints: ResizePanelWidthConstraints,\n): number {\n return Math.round(clamp(\n startWidth + deltaX,\n constraints.minWidth,\n Math.max(constraints.minWidth, availablePanelWidth(containerWidth, constraints)),\n ))\n}\n\nexport function resizedTrailingPanelWidth(\n startWidth: number,\n deltaX: number,\n containerWidth: number,\n constraints: ResizePanelWidthConstraints,\n): number {\n return resizedLeadingPanelWidth(startWidth, -deltaX, containerWidth, constraints)\n}\n\nexport function resizedVerticalSplitPercent(\n startPercent: number,\n deltaY: number,\n containerHeight: number,\n constraints: ResizePercentConstraints,\n): number {\n if (containerHeight <= 0) return startPercent\n return Math.round(clamp(\n startPercent + (deltaY / containerHeight) * 100,\n constraints.minPercent,\n constraints.maxPercent,\n ))\n}\n\nexport interface ManualLayoutResizeContext<TKind extends string> {\n kind: TKind\n startValue: number\n deltaX: number\n deltaY: number\n containerRect: DOMRectReadOnly\n secondaryRect: DOMRectReadOnly | null\n}\n\nexport interface ManualLayoutResizeTarget<TKind extends string> {\n cursor?: string\n getContainerElement: () => HTMLElement | null\n getSecondaryElement?: () => HTMLElement | null\n getStartValue: () => number\n onResize: (context: ManualLayoutResizeContext<TKind>) => void\n}\n\n/** Coordinates pointer-driven resizing for one or more layout splitters. */\nexport function useManualLayoutResize<TKind extends string>(options: {\n enabled: MaybeRefOrGetter<boolean>\n resolveTarget: (kind: TKind) => ManualLayoutResizeTarget<TKind> | null\n}) {\n const activeResize = shallowRef<{\n kind: TKind\n startClientX: number\n startClientY: number\n startValue: number\n containerRect: DOMRectReadOnly\n secondaryRect: DOMRectReadOnly | null\n cursor: string\n } | null>(null)\n const isResizing = computed(() => activeResize.value !== null)\n let previousBodyCursor = ''\n let previousBodyUserSelect = ''\n\n function stopResize(): void {\n if (!activeResize.value) return\n activeResize.value = null\n window.removeEventListener('pointermove', handlePointerMove)\n window.removeEventListener('pointerup', stopResize)\n window.removeEventListener('pointercancel', stopResize)\n if (typeof document !== 'undefined') {\n document.body.style.cursor = previousBodyCursor\n document.body.style.userSelect = previousBodyUserSelect\n }\n }\n\n function handlePointerMove(event: PointerEvent): void {\n const state = activeResize.value\n if (!state) return\n options.resolveTarget(state.kind)?.onResize({\n kind: state.kind,\n startValue: state.startValue,\n deltaX: event.clientX - state.startClientX,\n deltaY: event.clientY - state.startClientY,\n containerRect: state.containerRect,\n secondaryRect: state.secondaryRect,\n })\n }\n\n function startResize(kind: TKind, event: PointerEvent): void {\n if (!toValue(options.enabled) || event.button !== 0) return\n const target = options.resolveTarget(kind)\n const containerRect = target?.getContainerElement()?.getBoundingClientRect()\n if (!target || !containerRect) return\n\n event.preventDefault()\n if (event.currentTarget instanceof HTMLElement) {\n event.currentTarget.setPointerCapture(event.pointerId)\n }\n const secondary = target.getSecondaryElement?.() ?? null\n activeResize.value = {\n kind,\n startClientX: event.clientX,\n startClientY: event.clientY,\n startValue: target.getStartValue(),\n containerRect,\n secondaryRect: secondary?.getBoundingClientRect() ?? null,\n cursor: target.cursor ?? 'col-resize',\n }\n\n if (typeof document !== 'undefined') {\n previousBodyCursor = document.body.style.cursor\n previousBodyUserSelect = document.body.style.userSelect\n document.body.style.cursor = activeResize.value.cursor\n document.body.style.userSelect = 'none'\n }\n window.addEventListener('pointermove', handlePointerMove)\n window.addEventListener('pointerup', stopResize)\n window.addEventListener('pointercancel', stopResize)\n }\n\n function isResizingKind(kind: TKind): boolean {\n return activeResize.value?.kind === kind\n }\n\n watch(() => toValue(options.enabled), enabled => { if (!enabled) stopResize() })\n onBeforeUnmount(stopResize)\n\n return { activeResize, isResizing, isResizingKind, startResize, stopResize }\n}\n","import {\n computed,\n getCurrentScope,\n onScopeDispose,\n ref,\n shallowRef,\n toValue,\n watch,\n type ComputedRef,\n type MaybeRefOrGetter,\n type Ref,\n} from 'vue'\n\nimport type {\n FileBrowserSortKey,\n FileDirectoryListing,\n FileEntry,\n FilePathCrumb,\n FileSelection,\n ServerMount,\n} from '../types/fileBrowserTypes'\nimport { useApi } from './useApi'\nimport { getInjectedPlatformContext } from './platformContextHelpers'\nimport { useRequestSyncState } from './useRequestSyncState'\n\nexport interface UseFileBrowserOptions {\n /** Extensions the caller cares about; entries are flagged, never removed. */\n typeRules?: MaybeRefOrGetter<string[] | undefined>\n /** Mount to open first; defaults to the first available one. */\n initialMountId?: MaybeRefOrGetter<string | undefined>\n /** Override the platform API base URL (standalone plugin dev). */\n apiBaseUrl?: string\n}\n\nexport interface UseFileBrowserReturn {\n /** Every configured mount, offline ones included. */\n mounts: Ref<ServerMount[]>\n /** Mount the current listing belongs to. */\n mountId: Ref<string>\n /** Mount-relative path of the current listing. */\n path: Ref<string>\n /** Parent path, or null at a mount root. */\n parent: Ref<string | null>\n entries: Ref<FileEntry[]>\n breadcrumbs: Ref<FilePathCrumb[]>\n /** Directory size before any search filter. */\n totalCount: Ref<number | null>\n /** How many entries satisfy the type rules. */\n matchCount: Ref<number | null>\n /** How many rows this listing carries, after search and any cap. */\n shownCount: Ref<number | null>\n /** True when the server capped the listing. */\n truncated: Ref<boolean>\n search: Ref<string>\n sort: Ref<FileBrowserSortKey>\n /** Paths the user has picked, keyed by mount and path. */\n selected: Ref<FileSelection[]>\n isLoading: ComputedRef<boolean>\n error: Ref<string | null>\n /** Load the mount list and open the first available mount. */\n init: () => Promise<void>\n /** Open a directory, or a mount root when path is empty. */\n navigate: (location: { mount_id: string; path: string }) => Promise<void>\n /** Re-read the current directory. */\n refresh: () => Promise<void>\n /** Take the directory currently being viewed as the input. */\n selectCurrentFolder: () => void\n clear: () => void\n}\n\n/**\n * Browses the platform's `/api/filesystem` routes for a custom file UI. For the\n * ready-made dialog, use `FilePicker` with `usePlatformFilePickerAdapter()`.\n *\n * Requires the `filesystem.browse` permission and a deployment that declares\n * mounts; with none configured the routes are absent and `mounts` stays empty.\n */\nexport function useFileBrowser(options: UseFileBrowserOptions = {}): UseFileBrowserReturn {\n const injectedContext = getInjectedPlatformContext()\n const api = useApi({ baseUrl: options.apiBaseUrl ?? injectedContext?.platformApiUrl })\n const sync = useRequestSyncState('Could not read the server mounts.')\n\n const mounts = ref<ServerMount[]>([])\n const mountId = shallowRef('')\n const path = shallowRef('')\n const parent = ref<string | null>(null)\n const entries = ref<FileEntry[]>([])\n const breadcrumbs = ref<FilePathCrumb[]>([])\n const totalCount = ref<number | null>(null)\n const matchCount = ref<number | null>(null)\n const shownCount = ref<number | null>(null)\n const truncated = ref(false)\n const search = shallowRef('')\n const sort = shallowRef<FileBrowserSortKey>('name')\n const selected = ref<FileSelection[]>([])\n\n const mountsLoading = shallowRef(false)\n const listingLoading = shallowRef(false)\n const listingReady = shallowRef(false)\n const isLoading = computed(() => mountsLoading.value || listingLoading.value)\n let listToken = 0\n let mountsToken = 0\n let disposed = false\n let listingController: AbortController | undefined\n let mountsController: AbortController | undefined\n let searchTimer: ReturnType<typeof setTimeout> | undefined\n\n function resetListing(): void {\n listingReady.value = false\n entries.value = []\n breadcrumbs.value = []\n parent.value = null\n totalCount.value = null\n matchCount.value = null\n shownCount.value = null\n truncated.value = false\n }\n\n function typeRuleParams(): string {\n const rules = toValue(options.typeRules) ?? []\n return rules.map((rule) => `&type_rules=${encodeURIComponent(rule)}`).join('')\n }\n\n /** Prefer the API's own `detail` over axios's \"Request failed with status N\". */\n function describe(cause: unknown, fallback: string): string {\n const detail = (cause as { response?: { data?: { detail?: unknown } } })?.response?.data?.detail\n return typeof detail === 'string' && detail ? detail : sync.readErrorMessage(cause, fallback)\n }\n\n function fail(cause: unknown, fallback: string): void {\n sync.setError(new Error(describe(cause, fallback)), fallback)\n }\n\n function statusOf(cause: unknown): number | undefined {\n return (cause as { response?: { status?: number } })?.response?.status\n }\n\n async function loadMounts(): Promise<boolean> {\n const token = ++mountsToken\n mountsController?.abort()\n mountsController = new AbortController()\n mountsLoading.value = true\n try {\n const data = await api.get<{ mounts: ServerMount[] }>('/filesystem/mounts', {\n signal: mountsController.signal,\n })\n if (disposed || token !== mountsToken) return false\n mounts.value = data.mounts ?? []\n sync.clearError()\n sync.markLoaded()\n return true\n } catch (cause) {\n if (disposed || token !== mountsToken) return false\n // The platform only registers these routes once mounts are configured, so\n // a 404 means \"none declared\" — an empty sidebar, not a failure.\n if (statusOf(cause) === 404) {\n mounts.value = []\n sync.clearError()\n sync.markLoaded()\n return true\n }\n mounts.value = []\n fail(cause, 'Could not read the server mounts.')\n return false\n } finally {\n if (token === mountsToken) mountsLoading.value = false\n }\n }\n\n async function navigate(location: { mount_id: string; path: string }, refresh = false): Promise<void> {\n if (disposed || !location.mount_id) return\n clearTimeout(searchTimer)\n const token = ++listToken\n listingController?.abort()\n listingController = new AbortController()\n listingLoading.value = true\n mountId.value = location.mount_id\n path.value = location.path\n resetListing()\n sync.clearError()\n try {\n const query =\n `mount_id=${encodeURIComponent(location.mount_id)}` +\n `&path=${encodeURIComponent(location.path)}` +\n `&sort=${sort.value}` +\n (refresh ? '&refresh=true' : '') +\n (search.value ? `&search=${encodeURIComponent(search.value)}` : '') +\n typeRuleParams()\n const listing = await api.get<FileDirectoryListing>(`/filesystem/browse?${query}`, {\n signal: listingController.signal,\n })\n if (disposed || token !== listToken) return\n mountId.value = listing.mount_id\n path.value = listing.path\n parent.value = listing.parent ?? null\n entries.value = listing.entries ?? []\n breadcrumbs.value = listing.breadcrumbs ?? []\n totalCount.value = listing.total_count ?? null\n matchCount.value = listing.match_count ?? null\n shownCount.value = listing.shown_count ?? listing.entries?.length ?? null\n truncated.value = listing.truncated ?? false\n listingReady.value = true\n sync.clearError()\n sync.markLoaded()\n } catch (cause) {\n if (disposed || token !== listToken) return\n entries.value = []\n fail(cause, 'Could not read that folder.')\n } finally {\n if (token === listToken) listingLoading.value = false\n }\n }\n\n async function init(): Promise<void> {\n if (disposed) return\n const navigationToken = listToken\n if (!(await loadMounts()) || disposed || navigationToken !== listToken) return\n const preferred = toValue(options.initialMountId)\n // An offline mount is not navigable, so a remembered preference for one\n // falls through to the first reachable mount instead of opening on an error.\n const reachable = (mount: ServerMount): boolean => mount.available !== false\n const target =\n mounts.value.find((mount) => mount.id === preferred && reachable(mount)) ??\n mounts.value.find(reachable)\n if (target) await navigate({ mount_id: target.id, path: '' })\n else {\n mountId.value = ''\n path.value = ''\n resetListing()\n }\n }\n\n async function refresh(): Promise<void> {\n if (disposed) return\n if (mountId.value) await navigate({ mount_id: mountId.value, path: path.value }, true)\n else await init()\n }\n\n function selectCurrentFolder(): void {\n if (!mountId.value || !listingReady.value || isLoading.value || sync.error.value) return\n const crumb = breadcrumbs.value[breadcrumbs.value.length - 1]\n const key = JSON.stringify([mountId.value, path.value])\n if (selected.value.some((item) => JSON.stringify([item.mount_id, item.path]) === key)) return\n selected.value = [\n ...selected.value,\n {\n mount_id: mountId.value,\n path: path.value,\n name: crumb?.label ?? path.value,\n kind: 'directory',\n child_count: totalCount.value,\n },\n ]\n }\n\n function clear(): void {\n selected.value = []\n }\n\n // Both controls are server-side, so they only take effect on a re-fetch.\n // Without these watchers the search box and sort button look live but are\n // inert until the user happens to navigate.\n watch(search, () => {\n if (!mountId.value) return\n clearTimeout(searchTimer)\n // Debounced: search changes on every keystroke.\n searchTimer = setTimeout(() => {\n void navigate({ mount_id: mountId.value, path: path.value })\n }, 250)\n })\n\n watch(sort, () => {\n if (mountId.value) void navigate({ mount_id: mountId.value, path: path.value })\n })\n\n watch(\n () => toValue(options.typeRules),\n () => {\n if (mountId.value) void navigate({ mount_id: mountId.value, path: path.value })\n },\n { deep: true },\n )\n\n if (getCurrentScope())\n onScopeDispose(() => {\n disposed = true\n ++listToken\n ++mountsToken\n clearTimeout(searchTimer)\n listingController?.abort()\n mountsController?.abort()\n })\n\n return {\n mounts,\n mountId,\n path,\n parent,\n entries,\n breadcrumbs,\n totalCount,\n matchCount,\n shownCount,\n truncated,\n search,\n sort,\n selected,\n isLoading,\n error: sync.error,\n init,\n navigate,\n refresh,\n selectCurrentFolder,\n clear,\n }\n}\n","import type { AnalysisArtifactTarget } from '../types/analysisArtifactTypes'\n\nconst EXPERIMENT_ID = 'experiment_id'\nconst ARTIFACT_PLUGIN_ID = 'artifact_plugin_id'\nconst ARTIFACT_KEY = 'artifact_key'\nconst ARTIFACT_ID = 'artifact_id'\n\nfunction parsePositiveInteger(value: string | null): number | undefined {\n if (value === null || !/^\\d+$/.test(value)) return undefined\n const parsed = Number(value)\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined\n}\n\n/** Build the canonical query used to open one analysis artifact in a plugin. */\nexport function buildAnalysisArtifactTargetQuery(\n target: AnalysisArtifactTarget,\n): URLSearchParams {\n const query = new URLSearchParams()\n query.set(EXPERIMENT_ID, String(target.experimentId))\n query.set(ARTIFACT_PLUGIN_ID, target.artifactPluginId)\n query.set(ARTIFACT_KEY, target.artifactKey)\n if (target.artifactId !== undefined) {\n query.set(ARTIFACT_ID, String(target.artifactId))\n }\n return query\n}\n\n/** Parse a complete canonical target. Incomplete or invalid input is not guessed. */\nexport function parseAnalysisArtifactTarget(\n query: URLSearchParams,\n): AnalysisArtifactTarget | null {\n const experimentId = parsePositiveInteger(query.get(EXPERIMENT_ID))\n const artifactPluginId = query.get(ARTIFACT_PLUGIN_ID)?.trim()\n const artifactKey = query.get(ARTIFACT_KEY)?.trim()\n const rawArtifactId = query.get(ARTIFACT_ID)\n const artifactId = parsePositiveInteger(rawArtifactId)\n\n if (\n experimentId === undefined\n || !artifactPluginId\n || !artifactKey\n || (rawArtifactId !== null && artifactId === undefined)\n ) {\n return null\n }\n\n return {\n experimentId,\n artifactPluginId,\n artifactKey,\n ...(artifactId === undefined ? {} : { artifactId }),\n }\n}\n","import type { PickerAdapter, PickerNode, PickerRequest, PickerSearchResult } from '../types/filePicker'\nimport type {\n FileBrowserLocation,\n FileDirectoryListing,\n FileDirectoryTree,\n FileEntry,\n FileSearchResult,\n ServerMount,\n} from '../types/fileBrowserTypes'\nimport { pickerFormat } from './filePicker/validation'\n\nexport interface FilePickerTransport {\n listMounts(request?: PickerRequest): Promise<ServerMount[]>\n browse(location: FileBrowserLocation, request?: PickerRequest): Promise<FileDirectoryListing>\n /** `GET …/filesystem/tree`: one request fills the cache for the subfolders too. */\n tree?(location: FileBrowserLocation, request?: PickerRequest): Promise<FileDirectoryTree>\n /** `GET …/filesystem/search`: replaces the folder-by-folder search walk. */\n search?(\n location: FileBrowserLocation,\n query: string,\n recursive: boolean,\n request?: PickerRequest,\n ): Promise<FileSearchResult>\n}\nexport interface FilePickerAdapterOptions {\n /** Show this directory's contents directly and prevent navigation outside it. */\n rootLocation?: FileBrowserLocation\n}\n\n/** Opaque picker identity; decode before passing a selection to a mount-scoped API. */\nexport function encodePlatformPickerPath(mountId: string, path = ''): string {\n return JSON.stringify([mountId, path])\n}\nexport function decodePlatformPickerPath(path: string): { mountId: string; path: string } {\n const decoded: unknown = JSON.parse(path)\n if (\n !Array.isArray(decoded) || decoded.length !== 2 ||\n !decoded.every((item) => typeof item === 'string') || !decoded[0]\n ) throw new Error('Invalid platform picker path.')\n return { mountId: decoded[0], path: decoded[1] }\n}\n\nfunction isRelativePath(path: string): boolean {\n return path === '' || (!/^[a-z]:/i.test(path) && !/[\\\\\\x00-\\x1f\\x7f]/.test(path) &&\n path.split('/').every((part) => part !== '' && part !== '.' && part !== '..'))\n}\n\n/** Mount browsing and search shared by platform and generated plugin clients. */\nexport function createFilePickerAdapter(\n transport: FilePickerTransport,\n options: FilePickerAdapterOptions = {},\n): PickerAdapter {\n const root = options.rootLocation && { ...options.rootLocation }\n const mountLabels = new Map<string, string>()\n // Per picker instance: never share permission-sensitive listings across clients.\n const listings = new Map<string, PickerNode[]>()\n let generation = 0\n\n function invalidate(): void {\n generation++\n listings.clear()\n mountLabels.clear()\n }\n\n function validateLocation(location: FileBrowserLocation) {\n if (!location.mount_id || !isRelativePath(location.path) || (root && (\n location.mount_id !== root.mount_id ||\n (root.path !== '' && location.path !== root.path && !location.path.startsWith(`${root.path}/`))\n ))) throw new Error('Invalid file picker location.')\n }\n if (root) validateLocation(root)\n function begin(request?: PickerRequest): number {\n request?.signal?.throwIfAborted()\n if (request?.refresh) invalidate()\n return generation\n }\n function check(request: PickerRequest | undefined, token: number) {\n request?.signal?.throwIfAborted()\n if (token !== generation) throw new DOMException('Cancelled', 'AbortError')\n }\n async function read(path: string, request: PickerRequest | undefined, token: number): Promise<PickerNode[]> {\n check(request, token)\n const decoded = path ? decodePlatformPickerPath(path) : undefined\n const location = decoded ? { mount_id: decoded.mountId, path: decoded.path } : root\n if (location) validateLocation(location)\n const key = location ? encodePlatformPickerPath(location.mount_id, location.path) : ''\n const cached = listings.get(key)\n if (cached) return cached\n let nodes: PickerNode[]\n if (!location) {\n const mounts = await transport.listMounts(request)\n check(request, token)\n nodes = mounts.map((mount) => {\n mountLabels.set(mount.id, mount.label)\n return {\n kind: 'folder', path: encodePlatformPickerPath(mount.id), name: mount.label,\n parentPath: null, parentName: 'Server mounts',\n unavailableReason: mount.available === false ? 'This mount is offline.' : undefined,\n }\n })\n } else if (transport.tree) {\n const tree = await transport.tree(location, request)\n check(request, token)\n for (const listing of tree.listings ?? []) {\n const at = { mount_id: listing.mount_id, path: listing.path }\n validateLocation(at)\n if (at.mount_id !== location.mount_id) throw new Error('Invalid file picker directory entry.')\n // A capped subfolder is read on its own when opened, and reports the cap then.\n if (!listing.truncated) listings.set(encodePlatformPickerPath(at.mount_id, at.path), toNodes(at, listing))\n }\n const cached = listings.get(key)\n if (!cached)\n throw new Error('This directory exceeds the server listing limit. Choose a smaller data directory.')\n return cached\n } else {\n const listing = await transport.browse(location, request)\n check(request, token)\n if (listing.truncated)\n throw new Error('This directory exceeds the server listing limit. Choose a smaller data directory.')\n nodes = toNodes(location, listing)\n }\n listings.set(key, nodes)\n return nodes\n }\n function toNodes(location: FileBrowserLocation, listing: FileDirectoryListing): PickerNode[] {\n return (listing.entries ?? []).map((entry) => {\n if (entry.path !== `${location.path ? `${location.path}/` : ''}${entry.name}`)\n throw new Error('Invalid file picker directory entry.')\n return toNode(location.mount_id, entry)\n })\n }\n /** One entry, parented on the folder its mount-relative path names. */\n function toNode(mountId: string, entry: FileEntry): PickerNode {\n if (!isRelativePath(entry.path) || !entry.name || entry.name.includes('/') ||\n (entry.path !== entry.name && !entry.path.endsWith(`/${entry.name}`)))\n throw new Error('Invalid file picker directory entry.')\n const parent = entry.path.slice(0, Math.max(0, entry.path.length - entry.name.length - 1))\n const atRoot = root && mountId === root.mount_id && parent === root.path\n const common = {\n path: encodePlatformPickerPath(mountId, entry.path),\n parentPath: atRoot ? null : encodePlatformPickerPath(mountId, parent),\n parentName: `${mountLabels.get(mountId) ?? mountId}${parent ? ` / ${parent}` : ''}`,\n name: entry.name, bytes: entry.size_bytes, modifiedAt: entry.modified_at,\n }\n return entry.kind === 'directory'\n // Counts may include only matching formats, not nested directories.\n ? { ...common, kind: 'folder' }\n : { ...common, kind: 'file', format: pickerFormat(entry.name) }\n }\n async function serverSearch(\n query: string,\n scope: { path: string; recursive: boolean },\n request: PickerRequest | undefined,\n ): Promise<PickerNode[] | PickerSearchResult> {\n const token = begin(request)\n const decoded = scope.path ? decodePlatformPickerPath(scope.path) : undefined\n const location = decoded ? { mount_id: decoded.mountId, path: decoded.path } : root!\n validateLocation(location)\n const result = await transport.search!(location, query, scope.recursive, request)\n check(request, token)\n const prefix = location.path ? `${location.path}/` : ''\n const nodes = (result.entries ?? []).map((entry) => {\n // \"This folder\" searches may return direct children only.\n if (!entry.path.startsWith(prefix) || (!scope.recursive && entry.path.slice(prefix.length).includes('/')))\n throw new Error('Invalid file picker directory entry.')\n return toNode(location.mount_id, entry)\n })\n return result.truncated ? { nodes, truncated: true } : nodes\n }\n return {\n mounts: !root,\n mountOf(path) {\n try {\n return encodePlatformPickerPath(decodePlatformPickerPath(path).mountId)\n } catch {\n return undefined // initialPath is caller input; the listing reports a bad one.\n }\n },\n invalidate,\n listRoot: async (request) => read('', request, begin(request)),\n listChildren: async (path, request) => read(path, request, begin(request)),\n async search(query, scope, request) {\n // The mount list itself has no server to search, so it keeps the walk.\n if (transport.search && (scope.path || root)) return serverSearch(query, scope, request)\n const token = begin(request)\n const matches: PickerNode[] = []\n const queue = [scope.path]\n const visited = new Set<string>()\n const needle = query.toLowerCase()\n let currentRequest = request\n while (queue.length) {\n check(request, token)\n const path = queue.shift()!\n if (visited.has(path)) continue\n visited.add(path)\n if (visited.size > 500) return { nodes: matches, truncated: true }\n const nodes = await read(path, currentRequest, token)\n check(request, token)\n if (currentRequest?.refresh) {\n currentRequest = { ...currentRequest }\n delete currentRequest.refresh\n }\n for (const node of nodes) {\n if (node.name.toLowerCase().includes(needle)) matches.push(node)\n if (scope.recursive && node.kind === 'folder' && !node.unavailableReason)\n queue.push(node.path)\n }\n if (matches.length > 10000) return { nodes: matches.slice(0, 10000), truncated: true }\n }\n return matches\n },\n }\n}\n","import type { PickerAdapter } from '../types/filePicker'\nimport type {\n FileBrowserLocation,\n FileDirectoryListing,\n FileDirectoryTree,\n FileSearchResult,\n ServerMount,\n} from '../types/fileBrowserTypes'\nimport type { PickerRequest } from '../types/filePicker'\nimport { useApi } from './useApi'\nimport { getInjectedPlatformContext } from './platformContextHelpers'\nimport { createFilePickerAdapter, type FilePickerAdapterOptions } from './createFilePickerAdapter'\n\nexport { encodePlatformPickerPath, decodePlatformPickerPath } from './createFilePickerAdapter'\n\nfunction query(location: FileBrowserLocation, request?: PickerRequest): URLSearchParams {\n const params = new URLSearchParams({ mount_id: location.mount_id, path: location.path })\n if (request?.refresh) params.set('refresh', 'true')\n return params\n}\n\n/** Adapt the authenticated MINT mount API without exposing absolute host paths. */\nexport function usePlatformFilePickerAdapter(\n options: FilePickerAdapterOptions & { apiBaseUrl?: string } = {},\n): PickerAdapter {\n const api = useApi({\n baseUrl: options.apiBaseUrl ?? getInjectedPlatformContext()?.platformApiUrl,\n })\n return createFilePickerAdapter({\n async listMounts(request) {\n try {\n const url = `/filesystem/mounts${request?.refresh ? '?refresh=true' : ''}`\n const { mounts } = await api.get<{ mounts: ServerMount[] }>(url, {\n signal: request?.signal,\n })\n return mounts\n } catch (cause) {\n if ((cause as { response?: { status?: number } }).response?.status === 404) return []\n throw cause\n }\n },\n browse(location, request) {\n return api.get<FileDirectoryListing>(`/filesystem/browse?${query(location, request)}`, {\n signal: request?.signal,\n })\n },\n tree(location, request) {\n return api.get<FileDirectoryTree>(`/filesystem/tree?${query(location, request)}`, {\n signal: request?.signal,\n })\n },\n search(location, text, recursive, request) {\n const params = query(location, request)\n params.set('q', text)\n params.set('recursive', String(recursive))\n return api.get<FileSearchResult>(`/filesystem/search?${params}`, { signal: request?.signal })\n },\n }, options)\n}\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,17 +1,17 @@
1
- import { $ as PlateEditor_default, A as SampleLegend_default, At as AppToastContainer_default, B as StatusIndicator_default, C as ChemicalFormula_default, Ct as AppAvatarMenu_default, D as ReagentEditor_default, Dt as ActionMenu_default, E as SampleHierarchyTree_default, Et as ThemeToggle_default, F as SettingsModal_default, Ft as Calendar_default, G as ControlWorkspaceView_default, H as LayoutResizeHandle_default, I as AdductText_default, It as BasePill_default, J as SampleSelector_default, K as ComponentBindingRenderer_default, L as Breadcrumb_default, Lt as SegmentedControl_default, M as BioTemplatePackWorkspaceView_default, Mt as FormField_default, N as BioTemplateExperimentWorkspaceView_default, Nt as DataFrame_default, O as SmartGroupModal_default, Ot as IconButton_default, P as BioTemplateRenderer_default, Pt as LoadingSpinner_default, Q as ReagentList_default, R as Avatar_default, Rt as BaseTabs_default, S as sequenceSamplesRemaining, St as AppTopBar_default, T as ProtocolStepEditor_default, Tt as CollapsibleCard_default, U as AppContainer_default, V as Divider_default, W as DoseDesignWorkspaceView_default, X as SmartGroupManual_default, Y as AutoGroupModal_default, Z as SmartGroupFieldRecipe_default, _ as estimateSequenceFinishDate, _t as AppLayout_default, a as ArtifactSaveDialog_default, at as GeneratedPluginView_default, b as formatSequenceRemaining, bt as FormActions_default, c as SectionCard_default, ct as GeneratedPlotlyResult_default, d as ExperimentCodeBadge_default, dt as ChartContainer_default, et as ConfirmDialog_default, f as ExperimentDataViewer_default, ft as generatedJobDefaults, g as SequenceProgressBar_default, gt as MobileSupportGate_default, h as InstrumentStateBadge_default, ht as PluginWorkspaceView_default, i as ExperimentPopover_default, it as DoseCalculator_default, j as BioTemplatePresetWorkspaceView_default, jt as AlertBox_default, k as GroupAssigner_default, kt as RuntimeUpdateNotice_default, l as ResourceCard_default, lt as PlotlyChart_default, m as AuditTrail_default, mt as normalizeGeneratedJobInput, n as FilePicker_default, nt as sampleTypeMarker, o as ArtifactSelectorModal_default, ot as JobsStatusTray_default, p as BatchProgressList_default, pt as generatedJobFormSchema, q as ScheduleCalendar_default, r as FitPanel_default, rt as ExperimentTimeline_default, s as ExperimentSelectorModal_default, st as GeneratedResultRenderer_default, tt as WellPlate_default, u as TimeRangeInput_default, ut as mintPlotlyTemplate, v as estimateSequenceRemainingSeconds, vt as AppSidebar_default, w as ScientificNumber_default, wt as PluginIcon_default, x as sequenceProgressPercent, xt as StepWizard_default, y as formatSequenceEta, yt as FormBuilder_default, z as ProgressBar_default, zt as SearchableSelect_default } from "./components-CvY105kJ.js";
1
+ import { $ as PlateEditor_default, A as SampleLegend_default, At as AppToastContainer_default, B as StatusIndicator_default, C as ChemicalFormula_default, Ct as AppAvatarMenu_default, D as ReagentEditor_default, Dt as ActionMenu_default, E as SampleHierarchyTree_default, Et as ThemeToggle_default, F as SettingsModal_default, Ft as Calendar_default, G as ControlWorkspaceView_default, H as LayoutResizeHandle_default, I as AdductText_default, It as BasePill_default, J as SampleSelector_default, K as ComponentBindingRenderer_default, L as Breadcrumb_default, Lt as SegmentedControl_default, M as BioTemplatePackWorkspaceView_default, Mt as FormField_default, N as BioTemplateExperimentWorkspaceView_default, Nt as DataFrame_default, O as SmartGroupModal_default, Ot as IconButton_default, P as BioTemplateRenderer_default, Pt as LoadingSpinner_default, Q as ReagentList_default, R as Avatar_default, Rt as BaseTabs_default, S as sequenceSamplesRemaining, St as AppTopBar_default, T as ProtocolStepEditor_default, Tt as CollapsibleCard_default, U as AppContainer_default, V as Divider_default, W as DoseDesignWorkspaceView_default, X as SmartGroupManual_default, Y as AutoGroupModal_default, Z as SmartGroupFieldRecipe_default, _ as estimateSequenceFinishDate, _t as AppLayout_default, a as ArtifactSaveDialog_default, at as GeneratedPluginView_default, b as formatSequenceRemaining, bt as FormActions_default, c as SectionCard_default, ct as GeneratedPlotlyResult_default, d as ExperimentCodeBadge_default, dt as ChartContainer_default, et as ConfirmDialog_default, f as ExperimentDataViewer_default, ft as generatedJobDefaults, g as SequenceProgressBar_default, gt as MobileSupportGate_default, h as InstrumentStateBadge_default, ht as PluginWorkspaceView_default, i as ExperimentPopover_default, it as DoseCalculator_default, j as BioTemplatePresetWorkspaceView_default, jt as AlertBox_default, k as GroupAssigner_default, kt as RuntimeUpdateNotice_default, l as ResourceCard_default, lt as PlotlyChart_default, m as AuditTrail_default, mt as normalizeGeneratedJobInput, n as FilePicker_default, nt as sampleTypeMarker, o as ArtifactSelectorModal_default, ot as JobsStatusTray_default, p as BatchProgressList_default, pt as generatedJobFormSchema, q as ScheduleCalendar_default, r as FitPanel_default, rt as ExperimentTimeline_default, s as ExperimentSelectorModal_default, st as GeneratedResultRenderer_default, tt as WellPlate_default, u as TimeRangeInput_default, ut as mintPlotlyTemplate, v as estimateSequenceRemainingSeconds, vt as AppSidebar_default, w as ScientificNumber_default, wt as PluginIcon_default, x as sequenceProgressPercent, xt as StepWizard_default, y as formatSequenceEta, yt as FormBuilder_default, z as ProgressBar_default, zt as SearchableSelect_default } from "./components-GDDvof8D.js";
2
2
  import { a as tryUseSettingsStore, c as mintApiErrorFromResponse, i as tableDensityToSize, n as colorPalettes, o as useSettingsStore, r as paletteCssVariables, s as MintApiError, t as PALETTE_CSS_VARIABLES } from "./settings-BLr8lzw6.js";
3
3
  import { a as SORT_OPTIONS, c as formatExperimentDate, d as resolveExperimentCode, f as BaseModal_default, h as BaseButton_default, i as EXPERIMENT_STATUS_VARIANT_MAP, l as formatExperimentStatus, m as useEventListener, n as EXPERIMENT_STATUS_LABELS, o as datePresetToISO, p as useFocusTrap, r as EXPERIMENT_STATUS_OPTIONS, s as experimentIdFromRoute, t as DATE_PRESET_OPTIONS, u as getExperimentStatusVariant } from "./experiment-utils-DTANyVKV.js";
4
- import { i as BaseSelect_default, n as Skeleton_default, o as BaseInput_default, r as EmptyState_default } from "./ResourcePickerListInternal-c3IT8PIu.js";
5
- import { $ as toTimeCourseDataFrame, $n as FormulaInput_default, $r as snapToSlot, $t as getBioTemplatePackInfo, A as createSamplePrepTemplate, An as getControlDefaults, Ar as isPluginSecretLocked, At as toCalibrationCurveDataFrame, B as toBioTemplateComponentProps, Bn as getDefaultControlView, Br as addMinutes, Bt as validateInstrumentRunData, C as createFlowCytometryPanelTemplate, Cr as FileUploader_default, Ct as toInstrumentRunRows, D as createTimeCourseTemplate, Dn as hslToHex, Dr as PLUGIN_SECRET_FORMAT_REF, Dt as toFlowPanelDataFrame, E as createProtocolStepsTemplate, En as hexToHsl, Er as PLUGIN_SECRET_FORMAT_KEY, Et as toFlowPanelColumns, Fn as controlsToSettingsSchema, Fr as pluginSecretState, Ft as toAssayMatrixSampleOptions, G as toTemplateDataFrame, Gn as getFieldRegistryEntry, Gr as formatDuration, Gt as validateSamplePrepData, H as toBioTemplateComponentPropsById, Hr as durationMinutes, Ht as validateProtocolStepsData, I as listBioTemplateComponentBindings, In as controlsToSidebarPanels, Ir as setPluginSecret, It as validateAssayMatrixData, J as toDoseConditions, Jn as UnitInput_default, Jr as fromMinutes, Jt as bioTemplatePresets, K as toWellMapArray, Kn as getTypeDefault, Kr as formatTime, Kt as validateSampleSheetData, L as toBioTemplateComponentBindings, Ln as controlsToTopBarSettingsConfig, Lr as usesPluginSecretReferences, Lt as validateCalibrationCurveData, M as createPlateMapTemplate, Mn as controlsToFormSchema, Mr as keepPluginSecret, Mt as toAssayMatrixColumns, N as bioTemplatePresetControlValuesToOptions, Nn as controlsToSectionFormSchema, Nr as pluginSecretId, Nt as toAssayMatrixDataFrame, O as createCalibrationCurveTemplate, On as defineControlComponentBindings, Or as PLUGIN_SECRET_REF_KEY, Ot as toFlowPanelRows, P as getBioTemplateComponentBindings, Pn as controlsToSectionFormSchemas, Pr as pluginSecretLabel, Pt as toAssayMatrixRows, Q as toTimeCourseColumns, Qn as useSequenceUtils, Qr as rangesOverlap, Qt as bioTemplatePacks, R as toBioTemplateComponentBindingsById, Rn as controlsToViewIds, Rr as TagsInput_default, Rt as validateDoseResponseData, S as createInstrumentRunTemplate, St as toInstrumentRunDataFrame, T as createAssayMatrixTemplate, Tn as deriveShade, Tr as SecretInput_default, Tt as toInstrumentRunSteps, U as toBioTemplateComponentSnippets, Ur as findAvailableSlots, Ut as validateQpcrPlateData, Vr as compareTime, Vt as validatePlateMapData, W as toBioTemplateComponentUsage, Wr as findNearestTimeSlotIndex, Wt as validateReagentListData, X as toPlateMapEditorState, Xn as MoleculeInput_default, Xr as isTimeInRange, Xt as listBioTemplatePresets, Y as toDoseLayoutState, Yn as useConcentrationUnits, Yr as generateTimeSlots, Yt as getBioTemplatePresetInfo, Z as toWellPlateWells, Zn as SequenceInput_default, Zr as parseTime, Zt as searchBioTemplatePresets, _ as createElisaAssayCollection, _r as resolveJobCapabilities, _t as toProtocolColumns, a as getBioTemplateControlDefaults, ai as useListSelection, an as searchBioTemplateCatalog, at as toSampleRows, b as createQpcrExpressionCollection, bt as toProtocolSteps, c as listBioTemplatePresetControlSchemas, ci as BaseRadioGroup_default, cn as createTemplateCollection, cr as resolveCurrentPluginId, ct as toSamplePrepRows, d as createBioTemplatePresetCollectionFromControls, di as Tooltip_default, dn as ensureTemplateFromCollection, dr as usePluginJobs, dt as toReagentListItems, ei as toMinutes, en as listBioTemplatePacks, er as ATOMIC_WEIGHTS, et as toTimeCourseRows, f as createWellPlateScreenCollection, fi as BaseTextarea_default, fn as extractTemplateCollection, fr as isActiveJobStatus, ft as toReagentRows, g as createFlowCytometryAssayCollection, gr as normalizeJobState, gt as toQpcrWellPlateWells, h as createWesternBlotAssayCollection, hr as normalizeJobPercent, ht as toQpcrRows, i as createBioTemplateControlToolkit, ii as MultiSelect_default, in as listBioTemplateCatalog, it as toSampleOptions, j as createSampleSheetTemplate, jn as useControlSchema, jr as isPluginSecretRef, jt as toCalibrationCurveRows, k as createDoseResponseTemplate, kn as defineControls, kr as clearPluginSecret, kt as toCalibrationCurveColumns, l as requireBioTemplateControlSchema, li as BaseToggle_default, ln as createTemplateEnvelope, lr as createGeneratedAnalysisTransport, lt as toReagentColumns, m as createDefaultBioTemplate, mr as jobStatusLabel, mt as toQpcrDataFrame, n as bioTemplateControlsToSectionFormSchemas, ni as DatePicker_default, nn as bioTemplateCatalog, nr as GeneratedPathInput_default, nt as toSampleColumns, o as getBioTemplateControlSchema, oi as useSelectionLimit, on as TEMPLATE_COLLECTION_KEY, ot as toSamplePrepColumns, p as createBioTemplatePackCollection, pn as getTemplateData, pr as isTerminalJobStatus, pt as toQpcrColumns, q as racksFromPlateState, qn as ConcentrationInput_default, qr as formatTimeSlot, qt as validateTimeCourseData, r as bioTemplateControlsToSidebarPanels, rn as getBioTemplateInfo, rt as toSampleDataFrame, s as listBioTemplateControlSchemas, si as BaseSlider_default, sn as assertTemplateEnvelope, st as toSamplePrepDataFrame, t as bioTemplateControlsToFormSchema, ti as useTimeUtils, tn as searchBioTemplatePacks, tr as useChemicalFormula, tt as toTimeCourseSteps, u as createBioTemplatePresetCollection, ui as BaseCheckbox_default, un as ensureTemplateEnvelope, ur as useGeneratedAnalysis, ut as toReagentDataFrame, v as createTargetedMetabolomicsCollection, vt as toProtocolDataFrame, w as createReagentListTemplate, wr as NumberInput_default, wt as toInstrumentRunScheduleEvents, x as createQpcrPlateTemplate, xr as useMenuKeyboard, xt as toInstrumentRunColumns, y as createLcmsBatchCollection, yr as DateTimePicker_default, yt as toProtocolRows, z as toBioTemplateComponentImports, zn as controlsToViewItems, zr as TimePicker_default, zt as validateFlowCytometryPanelData } from "./templates-Bj9hZ7iV.js";
6
- import { $ as pluginFormDataFromPayload, A as parseDelimitedText, At as getPresenceClientId, B as useRackEditor, Bt as useRovingFocus, C as useExperimentSamples, Ct as controlValuesToComponentBindingsById, Dt as useAppExperiment, E as useSampleGroups, Et as APP_EXPERIMENT_KEY, F as useAutoGroup, Ft as candidateMatchesSearch, G as useDoseCalculator, H as reorderList, I as extractSampleNamesFromDesignData, It as normalizeSearchQuery, J as usePluginJobCenter, K as combinePluginJobSources, L as extractSampleOptionsFromDesignData, Lt as useTextSearch, M as useFileImport, Mt as usePlatformContext, N as validateImportFile, Nt as useTheme, Ot as getInjectedFrontendRevision, P as extractSamplesFromDesignData, Pt as useToast, Q as getPluginPageSelectorItems, R as unwrapExperimentDesignData, Rt as compareSortValues, S as useScheduleDrag, St as controlValuesToComponentBindings, T as useExpansionSet, U as useListReorder, V as REORDER_ANNOUNCER_STYLE, W as useReorderAnnouncer, X as downloadBlob, Y as createPluginClient, Z as downloadPluginEndpoint, _ as toBioTemplateComponentPropsByComponent, _t as defineWellPlateDoseComponentBindings, a as useExperimentSelector, at as buildPluginEndpointUrl, b as useTemplateCollection, bt as defineControlModel, c as DEFAULT_PRESETS, ct as usePluginWorkspace, d as useReagentSeries, dt as useFormBuilder, et as uploadPluginEndpoint, f as useGroupAssignment, ft as evaluateCondition, g as getBioTemplateComponentProps, gt as defineWellPlateControlProps, h as useBioTemplateWorkspace, ht as defineDoseDesignControlModel, i as useAnalysisArtifacts, it as usePluginSettings, j as readFileAsText, jt as usePresenceHeartbeat, k as detectDelimiter, kt as useRuntimeAlignment, l as DEFAULT_UNITS, lt as DEFAULT_MOBILE_VIEWPORT_QUERY, m as useBioTemplatePackWorkspace, mt as defineDoseCalculatorControlProps, nt as usePluginClient, o as useDebouncedWatch, ot as resolvePluginBaseUrl, p as useBioTemplatePresetWorkspace, pt as useForm, q as useJobsStatusTray, rt as usePluginEventStream, s as useProtocolTemplates, st as useRequestSyncState, tt as useCurrentExperiment, u as generateDilutionSeries, ut as useMobileSupportGate, v as useBioTemplateComponents, vt as defineWellPlateDoseControlProps, w as useExperimentData, wt as controlValuesToComponentProps, x as useExperimentSave, y as useBioTemplateControls, yt as useControlWorkspace, z as DEFAULT_COLORS, zt as useSortedItems } from "./validation-B4Y8_eEe.js";
4
+ import { i as BaseSelect_default, n as Skeleton_default, o as BaseInput_default, r as EmptyState_default } from "./ResourcePickerListInternal-CFAw4vTZ.js";
5
+ import { $ as toTimeCourseDataFrame, $n as FormulaInput_default, $r as snapToSlot, $t as getBioTemplatePackInfo, A as createSamplePrepTemplate, An as getControlDefaults, Ar as isPluginSecretLocked, At as toCalibrationCurveDataFrame, B as toBioTemplateComponentProps, Bn as getDefaultControlView, Br as addMinutes, Bt as validateInstrumentRunData, C as createFlowCytometryPanelTemplate, Cr as FileUploader_default, Ct as toInstrumentRunRows, D as createTimeCourseTemplate, Dn as hslToHex, Dr as PLUGIN_SECRET_FORMAT_REF, Dt as toFlowPanelDataFrame, E as createProtocolStepsTemplate, En as hexToHsl, Er as PLUGIN_SECRET_FORMAT_KEY, Et as toFlowPanelColumns, Fn as controlsToSettingsSchema, Fr as pluginSecretState, Ft as toAssayMatrixSampleOptions, G as toTemplateDataFrame, Gn as getFieldRegistryEntry, Gr as formatDuration, Gt as validateSamplePrepData, H as toBioTemplateComponentPropsById, Hr as durationMinutes, Ht as validateProtocolStepsData, I as listBioTemplateComponentBindings, In as controlsToSidebarPanels, Ir as setPluginSecret, It as validateAssayMatrixData, J as toDoseConditions, Jn as UnitInput_default, Jr as fromMinutes, Jt as bioTemplatePresets, K as toWellMapArray, Kn as getTypeDefault, Kr as formatTime, Kt as validateSampleSheetData, L as toBioTemplateComponentBindings, Ln as controlsToTopBarSettingsConfig, Lr as usesPluginSecretReferences, Lt as validateCalibrationCurveData, M as createPlateMapTemplate, Mn as controlsToFormSchema, Mr as keepPluginSecret, Mt as toAssayMatrixColumns, N as bioTemplatePresetControlValuesToOptions, Nn as controlsToSectionFormSchema, Nr as pluginSecretId, Nt as toAssayMatrixDataFrame, O as createCalibrationCurveTemplate, On as defineControlComponentBindings, Or as PLUGIN_SECRET_REF_KEY, Ot as toFlowPanelRows, P as getBioTemplateComponentBindings, Pn as controlsToSectionFormSchemas, Pr as pluginSecretLabel, Pt as toAssayMatrixRows, Q as toTimeCourseColumns, Qn as useSequenceUtils, Qr as rangesOverlap, Qt as bioTemplatePacks, R as toBioTemplateComponentBindingsById, Rn as controlsToViewIds, Rr as TagsInput_default, Rt as validateDoseResponseData, S as createInstrumentRunTemplate, St as toInstrumentRunDataFrame, T as createAssayMatrixTemplate, Tn as deriveShade, Tr as SecretInput_default, Tt as toInstrumentRunSteps, U as toBioTemplateComponentSnippets, Ur as findAvailableSlots, Ut as validateQpcrPlateData, Vr as compareTime, Vt as validatePlateMapData, W as toBioTemplateComponentUsage, Wr as findNearestTimeSlotIndex, Wt as validateReagentListData, X as toPlateMapEditorState, Xn as MoleculeInput_default, Xr as isTimeInRange, Xt as listBioTemplatePresets, Y as toDoseLayoutState, Yn as useConcentrationUnits, Yr as generateTimeSlots, Yt as getBioTemplatePresetInfo, Z as toWellPlateWells, Zn as SequenceInput_default, Zr as parseTime, Zt as searchBioTemplatePresets, _ as createElisaAssayCollection, _r as resolveJobCapabilities, _t as toProtocolColumns, a as getBioTemplateControlDefaults, ai as useListSelection, an as searchBioTemplateCatalog, at as toSampleRows, b as createQpcrExpressionCollection, bt as toProtocolSteps, c as listBioTemplatePresetControlSchemas, ci as BaseRadioGroup_default, cn as createTemplateCollection, cr as resolveCurrentPluginId, ct as toSamplePrepRows, d as createBioTemplatePresetCollectionFromControls, di as Tooltip_default, dn as ensureTemplateFromCollection, dr as usePluginJobs, dt as toReagentListItems, ei as toMinutes, en as listBioTemplatePacks, er as ATOMIC_WEIGHTS, et as toTimeCourseRows, f as createWellPlateScreenCollection, fi as BaseTextarea_default, fn as extractTemplateCollection, fr as isActiveJobStatus, ft as toReagentRows, g as createFlowCytometryAssayCollection, gr as normalizeJobState, gt as toQpcrWellPlateWells, h as createWesternBlotAssayCollection, hr as normalizeJobPercent, ht as toQpcrRows, i as createBioTemplateControlToolkit, ii as MultiSelect_default, in as listBioTemplateCatalog, it as toSampleOptions, j as createSampleSheetTemplate, jn as useControlSchema, jr as isPluginSecretRef, jt as toCalibrationCurveRows, k as createDoseResponseTemplate, kn as defineControls, kr as clearPluginSecret, kt as toCalibrationCurveColumns, l as requireBioTemplateControlSchema, li as BaseToggle_default, ln as createTemplateEnvelope, lr as createGeneratedAnalysisTransport, lt as toReagentColumns, m as createDefaultBioTemplate, mr as jobStatusLabel, mt as toQpcrDataFrame, n as bioTemplateControlsToSectionFormSchemas, ni as DatePicker_default, nn as bioTemplateCatalog, nr as GeneratedPathInput_default, nt as toSampleColumns, o as getBioTemplateControlSchema, oi as useSelectionLimit, on as TEMPLATE_COLLECTION_KEY, ot as toSamplePrepColumns, p as createBioTemplatePackCollection, pn as getTemplateData, pr as isTerminalJobStatus, pt as toQpcrColumns, q as racksFromPlateState, qn as ConcentrationInput_default, qr as formatTimeSlot, qt as validateTimeCourseData, r as bioTemplateControlsToSidebarPanels, rn as getBioTemplateInfo, rt as toSampleDataFrame, s as listBioTemplateControlSchemas, si as BaseSlider_default, sn as assertTemplateEnvelope, st as toSamplePrepDataFrame, t as bioTemplateControlsToFormSchema, ti as useTimeUtils, tn as searchBioTemplatePacks, tr as useChemicalFormula, tt as toTimeCourseSteps, u as createBioTemplatePresetCollection, ui as BaseCheckbox_default, un as ensureTemplateEnvelope, ur as useGeneratedAnalysis, ut as toReagentDataFrame, v as createTargetedMetabolomicsCollection, vt as toProtocolDataFrame, w as createReagentListTemplate, wr as NumberInput_default, wt as toInstrumentRunScheduleEvents, x as createQpcrPlateTemplate, xr as useMenuKeyboard, xt as toInstrumentRunColumns, y as createLcmsBatchCollection, yr as DateTimePicker_default, yt as toProtocolRows, z as toBioTemplateComponentImports, zn as controlsToViewItems, zr as TimePicker_default, zt as validateFlowCytometryPanelData } from "./templates-BU1pet28.js";
6
+ import { $ as pluginFormDataFromPayload, A as parseDelimitedText, At as getPresenceClientId, B as useRackEditor, Bt as useRovingFocus, C as useExperimentSamples, Ct as controlValuesToComponentBindingsById, Dt as useAppExperiment, E as useSampleGroups, Et as APP_EXPERIMENT_KEY, F as useAutoGroup, Ft as candidateMatchesSearch, G as useDoseCalculator, H as reorderList, I as extractSampleNamesFromDesignData, It as normalizeSearchQuery, J as usePluginJobCenter, K as combinePluginJobSources, L as extractSampleOptionsFromDesignData, Lt as useTextSearch, M as useFileImport, Mt as usePlatformContext, N as validateImportFile, Nt as useTheme, Ot as getInjectedFrontendRevision, P as extractSamplesFromDesignData, Pt as useToast, Q as getPluginPageSelectorItems, R as unwrapExperimentDesignData, Rt as compareSortValues, S as useScheduleDrag, St as controlValuesToComponentBindings, T as useExpansionSet, U as useListReorder, V as REORDER_ANNOUNCER_STYLE, W as useReorderAnnouncer, X as downloadBlob, Y as createPluginClient, Z as downloadPluginEndpoint, _ as toBioTemplateComponentPropsByComponent, _t as defineWellPlateDoseComponentBindings, a as useExperimentSelector, at as buildPluginEndpointUrl, b as useTemplateCollection, bt as defineControlModel, c as DEFAULT_PRESETS, ct as usePluginWorkspace, d as useReagentSeries, dt as useFormBuilder, et as uploadPluginEndpoint, f as useGroupAssignment, ft as evaluateCondition, g as getBioTemplateComponentProps, gt as defineWellPlateControlProps, h as useBioTemplateWorkspace, ht as defineDoseDesignControlModel, i as useAnalysisArtifacts, it as usePluginSettings, j as readFileAsText, jt as usePresenceHeartbeat, k as detectDelimiter, kt as useRuntimeAlignment, l as DEFAULT_UNITS, lt as DEFAULT_MOBILE_VIEWPORT_QUERY, m as useBioTemplatePackWorkspace, mt as defineDoseCalculatorControlProps, nt as usePluginClient, o as useDebouncedWatch, ot as resolvePluginBaseUrl, p as useBioTemplatePresetWorkspace, pt as useForm, q as useJobsStatusTray, rt as usePluginEventStream, s as useProtocolTemplates, st as useRequestSyncState, tt as useCurrentExperiment, u as generateDilutionSeries, ut as useMobileSupportGate, v as useBioTemplateComponents, vt as defineWellPlateDoseControlProps, w as useExperimentData, wt as controlValuesToComponentProps, x as useExperimentSave, y as useBioTemplateControls, yt as useControlWorkspace, z as DEFAULT_COLORS, zt as useSortedItems } from "./validation-Dmp9Q5W0.js";
7
7
  import { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, canAccessAdmin, canAccessByPolicy, canAccessPlugin, getAccessAudience, getRoleInfo, getUserPermissions, hasAllPermissions, hasAnyPermission, isAdminRole, isAdminUser } from "./permissions.js";
8
8
  import { a as useApi, o as useAuthStore, r as AuthenticationRequiredError, t as useExperimentStore } from "./experiment-DgllIc3I.js";
9
9
  import { t as ANALYSIS_FILE_ARTIFACT_SCHEMA } from "./analysisArtifactTypes-Cy3D0Ipg.js";
10
10
  import { MINTSdk } from "./install.js";
11
- import { a as buildAnalysisArtifactTargetQuery, c as resizedLeadingPanelWidth, d as useManualLayoutResize, f as useWellPlateEditor, h as useAuth, i as encodePlatformPickerPath, l as resizedTrailingPanelWidth, m as usePasskey, n as createFilePickerAdapter, o as parseAnalysisArtifactTarget, p as resolvePluginFrontendBase, r as decodePlatformPickerPath, s as useFileBrowser, t as usePlatformFilePickerAdapter, u as resizedVerticalSplitPercent } from "./composables-DL4Vca7L.js";
11
+ import { a as buildAnalysisArtifactTargetQuery, c as resizedLeadingPanelWidth, d as useManualLayoutResize, f as resolvePluginFrontendBase, i as encodePlatformPickerPath, l as resizedTrailingPanelWidth, n as createFilePickerAdapter, o as parseAnalysisArtifactTarget, r as decodePlatformPickerPath, s as useFileBrowser, t as usePlatformFilePickerAdapter, u as resizedVerticalSplitPercent } from "./composables-D6uqp0UF.js";
12
12
  import "./stores/index.js";
13
13
  //#region src/lcms.ts
14
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
14
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
15
15
  var DEFAULT_LCMS_SEQUENCE_COLUMNS = [
16
16
  {
17
17
  key: "index",
@@ -39,7 +39,7 @@ var DEFAULT_LCMS_SEQUENCE_COLUMNS = [
39
39
  align: "right"
40
40
  }
41
41
  ];
42
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
42
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
43
43
  function extractLcmsCommonPrefix(fileNames) {
44
44
  if (fileNames.length === 0) return "";
45
45
  const prefixes = fileNames.map((fileName) => fileName.replace(/_\d{3}$/, "")).map((fileName) => {
@@ -53,18 +53,18 @@ function extractLcmsCommonPrefix(fileNames) {
53
53
  }
54
54
  return common;
55
55
  }
56
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
56
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
57
57
  function extractLcmsSampleName(fileName, prefix = "") {
58
58
  let name = fileName.replace(/_\d{3}$/, "");
59
59
  if (prefix && name.startsWith(prefix)) name = name.substring(prefix.length).replace(/^_+/, "");
60
60
  name = name.replace(/^(POS|NEG)_/i, "");
61
61
  return name || fileName;
62
62
  }
63
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
63
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
64
64
  function lcmsWellIdFromPosition(position) {
65
65
  return position.includes(":") ? position.split(":").pop() ?? position : position;
66
66
  }
67
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
67
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
68
68
  function inferLcmsPlateTypeFromWellIds(wellIds) {
69
69
  let maxCol = 0;
70
70
  let maxRow = 0;
@@ -77,7 +77,7 @@ function inferLcmsPlateTypeFromWellIds(wellIds) {
77
77
  if (maxCol === 0 && maxRow === 0) return null;
78
78
  return maxCol <= 9 && maxRow <= 6 ? "54vial" : "96well";
79
79
  }
80
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
80
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
81
81
  function reconstructLcmsPlateCellsFromSequenceItems(items) {
82
82
  const unknownItems = items.filter((item) => item.sample_type === "Unknown");
83
83
  if (unknownItems.length === 0) return null;
@@ -104,14 +104,14 @@ function reconstructLcmsPlateCellsFromSequenceItems(items) {
104
104
  plateType
105
105
  };
106
106
  }
107
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
107
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
108
108
  function basenameFromWindowsPath(path) {
109
109
  if (!path) return "";
110
110
  return path.split(/[\\/]/).pop() ?? path;
111
111
  }
112
112
  //#endregion
113
113
  //#region src/utils/rack.ts
114
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
114
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
115
115
  var LCMS_DEFAULT_CONTROL_POSITIONS = {
116
116
  "96well": {
117
117
  blank: {
@@ -148,21 +148,21 @@ var SLOT_ORDER = [
148
148
  "B",
149
149
  "Y"
150
150
  ];
151
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
151
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
152
152
  function lcmsPlateTypeToRackFormat(plateType) {
153
153
  return plateType === "96well" ? 96 : 54;
154
154
  }
155
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
155
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
156
156
  function rackFormatToLcmsPlateType(format) {
157
157
  if (format === 96) return "96well";
158
158
  if (format === 54) return "54vial";
159
159
  throw new Error(`LCMS plate cells support only 54-vial racks and 96-well plates; received format ${format}.`);
160
160
  }
161
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
161
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
162
162
  function lcmsWellId(row, column) {
163
163
  return `${row.toUpperCase()}${column}`;
164
164
  }
165
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
165
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
166
166
  function parseLcmsWellId(wellId) {
167
167
  const match = /^([A-Za-z]+)(\d+)$/.exec(wellId.trim());
168
168
  if (!match) throw new Error(`Invalid well id "${wellId}". Expected a row letter followed by a column number, e.g. A1.`);
@@ -171,7 +171,7 @@ function parseLcmsWellId(wellId) {
171
171
  column: Number(match[2])
172
172
  };
173
173
  }
174
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
174
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
175
175
  function lcmsPlateCellsToRack(cells, options = {}) {
176
176
  const format = options.format ?? (options.plateType ? lcmsPlateTypeToRackFormat(options.plateType) : inferRackFormat(cells));
177
177
  const slot = options.slot ?? cells.find((cell) => cell.slot)?.slot ?? "R";
@@ -200,7 +200,7 @@ function lcmsPlateCellsToRack(cells, options = {}) {
200
200
  }))
201
201
  };
202
202
  }
203
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
203
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
204
204
  function lcmsPlateCellsToRacks(cells, options = {}) {
205
205
  const bySlot = /* @__PURE__ */ new Map();
206
206
  const defaultSlot = options.defaultSlot ?? "R";
@@ -217,20 +217,20 @@ function lcmsPlateCellsToRacks(cells, options = {}) {
217
217
  rackName: options.rackName?.(slot, index) ?? `Rack ${slot}`
218
218
  }));
219
219
  }
220
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
220
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
221
221
  function rackToLcmsPlateCells(rack) {
222
222
  return Object.entries(rack.wells).map(([wellId, well]) => wellToLcmsPlateCell(rack, wellId, well)).filter((cell) => cell !== null).sort(comparePlateCells);
223
223
  }
224
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
224
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
225
225
  function racksToLcmsPlateCells(racks) {
226
226
  return racks.flatMap(rackToLcmsPlateCells);
227
227
  }
228
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
228
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
229
229
  function getLcmsDefaultControlWellId(plateType, sampleType) {
230
230
  const position = LCMS_DEFAULT_CONTROL_POSITIONS[plateType][sampleType];
231
231
  return lcmsWellId(position.row, position.column);
232
232
  }
233
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
233
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
234
234
  function createLcmsControlWellEditData(sampleType, options = {}) {
235
235
  const plateType = options.plateType ?? "54vial";
236
236
  return {
@@ -281,6 +281,6 @@ function comparePlateCells(a, b) {
281
281
  return rowDiff === 0 ? a.column - b.column : rowDiff;
282
282
  }
283
283
  //#endregion
284
- export { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, ANALYSIS_FILE_ARTIFACT_SCHEMA, APP_EXPERIMENT_KEY, ATOMIC_WEIGHTS, ActionMenu_default as ActionMenu, AdductText_default as AdductText, AlertBox_default as AlertBox, AppAvatarMenu_default as AppAvatarMenu, AppContainer_default as AppContainer, AppLayout_default as AppLayout, AppSidebar_default as AppSidebar, AppToastContainer_default as AppToastContainer, AppTopBar_default as AppTopBar, ArtifactSaveDialog_default as ArtifactSaveDialog, ArtifactSelectorModal_default as ArtifactSelectorModal, AuditTrail_default as AuditTrail, AuthenticationRequiredError, AutoGroupModal_default as AutoGroupModal, Avatar_default as Avatar, BaseButton_default as BaseButton, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseModal_default as BaseModal, BasePill_default as BasePill, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSlider_default as BaseSlider, BaseTabs_default as BaseTabs, BaseTextarea_default as BaseTextarea, BaseToggle_default as BaseToggle, BatchProgressList_default as BatchProgressList, BioTemplateExperimentWorkspaceView_default as BioTemplateExperimentWorkspaceView, BioTemplatePackWorkspaceView_default as BioTemplatePackWorkspaceView, BioTemplatePresetWorkspaceView_default as BioTemplatePresetWorkspaceView, BioTemplateRenderer_default as BioTemplateRenderer, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, CollapsibleCard_default as CollapsibleCard, ComponentBindingRenderer_default as ComponentBindingRenderer, ConcentrationInput_default as ConcentrationInput, ConfirmDialog_default as ConfirmDialog, ControlWorkspaceView_default as ControlWorkspaceView, DATE_PRESET_OPTIONS, DEFAULT_COLORS, DEFAULT_LCMS_SEQUENCE_COLUMNS, DEFAULT_MOBILE_VIEWPORT_QUERY, DEFAULT_PRESETS, DEFAULT_UNITS, DataFrame_default as DataFrame, DatePicker_default as DatePicker, DateTimePicker_default as DateTimePicker, Divider_default as Divider, DoseCalculator_default as DoseCalculator, DoseDesignWorkspaceView_default as DoseDesignWorkspaceView, EXPERIMENT_STATUS_LABELS, EXPERIMENT_STATUS_OPTIONS, EXPERIMENT_STATUS_VARIANT_MAP, EmptyState_default as EmptyState, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentDataViewer_default as ExperimentDataViewer, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, ExperimentTimeline_default as ExperimentTimeline, FilePicker_default as FilePicker, FileUploader_default as FileUploader, FitPanel_default as FitPanel, FormActions_default as FormActions, FormBuilder_default as FormBuilder, FormField_default as FormField, FormulaInput_default as FormulaInput, GeneratedPathInput_default as GeneratedPathInput, GeneratedPlotlyResult_default as GeneratedPlotlyResult, GeneratedPluginView_default as GeneratedPluginView, GeneratedResultRenderer_default as GeneratedResultRenderer, GroupAssigner_default as GroupAssigner, IconButton_default as IconButton, InstrumentStateBadge_default as InstrumentStateBadge, JobsStatusTray_default as JobsStatusTray, LCMS_DEFAULT_CONTROL_POSITIONS, LayoutResizeHandle_default as LayoutResizeHandle, LoadingSpinner_default as LoadingSpinner, MINTSdk, MINTSdk as default, MintApiError, MobileSupportGate_default as MobileSupportGate, MoleculeInput_default as MoleculeInput, MultiSelect_default as MultiSelect, NumberInput_default as NumberInput, PALETTE_CSS_VARIABLES, PLUGIN_SECRET_FORMAT_KEY, PLUGIN_SECRET_FORMAT_REF, PLUGIN_SECRET_REF_KEY, PlateEditor_default as PlateEditor, PlotlyChart_default as PlotlyChart, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, ProtocolStepEditor_default as ProtocolStepEditor, REORDER_ANNOUNCER_STYLE, ReagentEditor_default as ReagentEditor, ReagentList_default as ReagentList, ResourceCard_default as ResourceCard, RuntimeUpdateNotice_default as RuntimeUpdateNotice, SORT_OPTIONS, SampleHierarchyTree_default as SampleHierarchyTree, SampleLegend_default as SampleLegend, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SearchableSelect_default as SearchableSelect, SecretInput_default as SecretInput, SectionCard_default as SectionCard, SegmentedControl_default as SegmentedControl, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, SmartGroupFieldRecipe_default as SmartGroupFieldRecipe, SmartGroupManual_default as SmartGroupManual, SmartGroupModal_default as SmartGroupModal, StatusIndicator_default as StatusIndicator, StepWizard_default as StepWizard, TEMPLATE_COLLECTION_KEY, TagsInput_default as TagsInput, ThemeToggle_default as ThemeToggle, TimePicker_default as TimePicker, TimeRangeInput_default as TimeRangeInput, Tooltip_default as Tooltip, UnitInput_default as UnitInput, WellPlate_default as WellPlate, addMinutes, assertTemplateEnvelope, basenameFromWindowsPath, bioTemplateCatalog, bioTemplateControlsToFormSchema, bioTemplateControlsToSectionFormSchemas, bioTemplateControlsToSidebarPanels, bioTemplatePacks, bioTemplatePresetControlValuesToOptions, bioTemplatePresets, buildAnalysisArtifactTargetQuery, buildPluginEndpointUrl, canAccessAdmin, canAccessByPolicy, canAccessPlugin, candidateMatchesSearch, clearPluginSecret, colorPalettes, combinePluginJobSources, compareSortValues, compareTime, controlValuesToComponentBindings, controlValuesToComponentBindingsById, controlValuesToComponentProps, controlsToFormSchema, controlsToSectionFormSchema, controlsToSectionFormSchemas, controlsToSettingsSchema, controlsToSidebarPanels, controlsToTopBarSettingsConfig, controlsToViewIds, controlsToViewItems, createAssayMatrixTemplate, createBioTemplateControlToolkit, createBioTemplatePackCollection, createBioTemplatePresetCollection, createBioTemplatePresetCollectionFromControls, createCalibrationCurveTemplate, createDefaultBioTemplate, createDoseResponseTemplate, createElisaAssayCollection, createFilePickerAdapter, createFlowCytometryAssayCollection, createFlowCytometryPanelTemplate, createGeneratedAnalysisTransport, createInstrumentRunTemplate, createLcmsBatchCollection, createLcmsControlWellEditData, createPlateMapTemplate, createPluginClient, createProtocolStepsTemplate, createQpcrExpressionCollection, createQpcrPlateTemplate, createReagentListTemplate, createSamplePrepTemplate, createSampleSheetTemplate, createTargetedMetabolomicsCollection, createTemplateCollection, createTemplateEnvelope, createTimeCourseTemplate, createWellPlateScreenCollection, createWesternBlotAssayCollection, datePresetToISO, decodePlatformPickerPath, defineControlComponentBindings, defineControlModel, defineControls, defineDoseCalculatorControlProps, defineDoseDesignControlModel, defineWellPlateControlProps, defineWellPlateDoseComponentBindings, defineWellPlateDoseControlProps, deriveShade, detectDelimiter, downloadBlob, downloadPluginEndpoint, durationMinutes, encodePlatformPickerPath, ensureTemplateEnvelope, ensureTemplateFromCollection, estimateSequenceFinishDate, estimateSequenceRemainingSeconds, evaluateCondition, experimentIdFromRoute, extractLcmsCommonPrefix, extractLcmsSampleName, extractSampleNamesFromDesignData, extractSampleOptionsFromDesignData, extractSamplesFromDesignData, extractTemplateCollection, findAvailableSlots, findNearestTimeSlotIndex, formatDuration, formatExperimentDate, formatExperimentStatus, formatSequenceEta, formatSequenceRemaining, formatTime, formatTimeSlot, fromMinutes, generateDilutionSeries, generateTimeSlots, generatedJobDefaults, generatedJobFormSchema, getAccessAudience, getBioTemplateComponentBindings, getBioTemplateComponentProps, getBioTemplateControlDefaults, getBioTemplateControlSchema, getBioTemplateInfo, getBioTemplatePackInfo, getBioTemplatePresetInfo, getControlDefaults, getDefaultControlView, getExperimentStatusVariant, getFieldRegistryEntry, getInjectedFrontendRevision, getLcmsDefaultControlWellId, getPluginPageSelectorItems, getPresenceClientId, getRoleInfo, getTemplateData, getTypeDefault, getUserPermissions, hasAllPermissions, hasAnyPermission, hexToHsl, hslToHex, inferLcmsPlateTypeFromWellIds, isActiveJobStatus, isAdminRole, isAdminUser, isPluginSecretLocked, isPluginSecretRef, isTerminalJobStatus, isTimeInRange, jobStatusLabel, keepPluginSecret, lcmsPlateCellsToRack, lcmsPlateCellsToRacks, lcmsPlateTypeToRackFormat, lcmsWellId, lcmsWellIdFromPosition, listBioTemplateCatalog, listBioTemplateComponentBindings, listBioTemplateControlSchemas, listBioTemplatePacks, listBioTemplatePresetControlSchemas, listBioTemplatePresets, mintApiErrorFromResponse, mintPlotlyTemplate, normalizeGeneratedJobInput, normalizeJobPercent, normalizeJobState, normalizeSearchQuery, paletteCssVariables, parseAnalysisArtifactTarget, parseDelimitedText, parseLcmsWellId, parseTime, pluginFormDataFromPayload, pluginSecretId, pluginSecretLabel, pluginSecretState, rackFormatToLcmsPlateType, rackToLcmsPlateCells, racksFromPlateState, racksToLcmsPlateCells, rangesOverlap, readFileAsText, reconstructLcmsPlateCellsFromSequenceItems, reorderList, requireBioTemplateControlSchema, resizedLeadingPanelWidth, resizedTrailingPanelWidth, resizedVerticalSplitPercent, resolveCurrentPluginId, resolveExperimentCode, resolveJobCapabilities, resolvePluginBaseUrl, resolvePluginFrontendBase, sampleTypeMarker, searchBioTemplateCatalog, searchBioTemplatePacks, searchBioTemplatePresets, sequenceProgressPercent, sequenceSamplesRemaining, setPluginSecret, snapToSlot, tableDensityToSize, toAssayMatrixColumns, toAssayMatrixDataFrame, toAssayMatrixRows, toAssayMatrixSampleOptions, toBioTemplateComponentBindings, toBioTemplateComponentBindingsById, toBioTemplateComponentImports, toBioTemplateComponentProps, toBioTemplateComponentPropsByComponent, toBioTemplateComponentPropsById, toBioTemplateComponentSnippets, toBioTemplateComponentUsage, toCalibrationCurveColumns, toCalibrationCurveDataFrame, toCalibrationCurveRows, toDoseConditions, toDoseLayoutState, toFlowPanelColumns, toFlowPanelDataFrame, toFlowPanelRows, toInstrumentRunColumns, toInstrumentRunDataFrame, toInstrumentRunRows, toInstrumentRunScheduleEvents, toInstrumentRunSteps, toMinutes, toPlateMapEditorState, toProtocolColumns, toProtocolDataFrame, toProtocolRows, toProtocolSteps, toQpcrColumns, toQpcrDataFrame, toQpcrRows, toQpcrWellPlateWells, toReagentColumns, toReagentDataFrame, toReagentListItems, toReagentRows, toSampleColumns, toSampleDataFrame, toSampleOptions, toSamplePrepColumns, toSamplePrepDataFrame, toSamplePrepRows, toSampleRows, toTemplateDataFrame, toTimeCourseColumns, toTimeCourseDataFrame, toTimeCourseRows, toTimeCourseSteps, toWellMapArray, toWellPlateWells, tryUseSettingsStore, unwrapExperimentDesignData, uploadPluginEndpoint, useAnalysisArtifacts, useApi, useAppExperiment, useAuth, useAuthStore, useAutoGroup, useBioTemplateComponents, useBioTemplateControls, useBioTemplatePackWorkspace, useBioTemplatePresetWorkspace, useBioTemplateWorkspace, useChemicalFormula, useConcentrationUnits, useControlSchema, useControlWorkspace, useCurrentExperiment, useDebouncedWatch, useDoseCalculator, useEventListener, useExpansionSet, useExperimentData, useExperimentSamples, useExperimentSave, useExperimentSelector, useExperimentStore, useFileBrowser, useFileImport, useFocusTrap, useForm, useFormBuilder, useGeneratedAnalysis, useGroupAssignment, useJobsStatusTray, useListReorder, useListSelection, useManualLayoutResize, useMenuKeyboard, useMobileSupportGate, usePasskey, usePlatformContext, usePlatformFilePickerAdapter, usePluginClient, usePluginEventStream, usePluginJobCenter, usePluginJobs, usePluginSettings, usePluginWorkspace, usePresenceHeartbeat, useProtocolTemplates, useRackEditor, useReagentSeries, useReorderAnnouncer, useRequestSyncState, useRovingFocus, useRuntimeAlignment, useSampleGroups, useScheduleDrag, useSelectionLimit, useSequenceUtils, useSettingsStore, useSortedItems, useTemplateCollection, useTextSearch, useTheme, useTimeUtils, useToast, useWellPlateEditor, usesPluginSecretReferences, validateAssayMatrixData, validateCalibrationCurveData, validateDoseResponseData, validateFlowCytometryPanelData, validateImportFile, validateInstrumentRunData, validatePlateMapData, validateProtocolStepsData, validateQpcrPlateData, validateReagentListData, validateSamplePrepData, validateSampleSheetData, validateTimeCourseData };
284
+ export { ADMIN_PANEL_PERMISSIONS, ADMIN_ROLE, ANALYSIS_FILE_ARTIFACT_SCHEMA, APP_EXPERIMENT_KEY, ATOMIC_WEIGHTS, ActionMenu_default as ActionMenu, AdductText_default as AdductText, AlertBox_default as AlertBox, AppAvatarMenu_default as AppAvatarMenu, AppContainer_default as AppContainer, AppLayout_default as AppLayout, AppSidebar_default as AppSidebar, AppToastContainer_default as AppToastContainer, AppTopBar_default as AppTopBar, ArtifactSaveDialog_default as ArtifactSaveDialog, ArtifactSelectorModal_default as ArtifactSelectorModal, AuditTrail_default as AuditTrail, AuthenticationRequiredError, AutoGroupModal_default as AutoGroupModal, Avatar_default as Avatar, BaseButton_default as BaseButton, BaseCheckbox_default as BaseCheckbox, BaseInput_default as BaseInput, BaseModal_default as BaseModal, BasePill_default as BasePill, BaseRadioGroup_default as BaseRadioGroup, BaseSelect_default as BaseSelect, BaseSlider_default as BaseSlider, BaseTabs_default as BaseTabs, BaseTextarea_default as BaseTextarea, BaseToggle_default as BaseToggle, BatchProgressList_default as BatchProgressList, BioTemplateExperimentWorkspaceView_default as BioTemplateExperimentWorkspaceView, BioTemplatePackWorkspaceView_default as BioTemplatePackWorkspaceView, BioTemplatePresetWorkspaceView_default as BioTemplatePresetWorkspaceView, BioTemplateRenderer_default as BioTemplateRenderer, Breadcrumb_default as Breadcrumb, Calendar_default as Calendar, ChartContainer_default as ChartContainer, ChemicalFormula_default as ChemicalFormula, CollapsibleCard_default as CollapsibleCard, ComponentBindingRenderer_default as ComponentBindingRenderer, ConcentrationInput_default as ConcentrationInput, ConfirmDialog_default as ConfirmDialog, ControlWorkspaceView_default as ControlWorkspaceView, DATE_PRESET_OPTIONS, DEFAULT_COLORS, DEFAULT_LCMS_SEQUENCE_COLUMNS, DEFAULT_MOBILE_VIEWPORT_QUERY, DEFAULT_PRESETS, DEFAULT_UNITS, DataFrame_default as DataFrame, DatePicker_default as DatePicker, DateTimePicker_default as DateTimePicker, Divider_default as Divider, DoseCalculator_default as DoseCalculator, DoseDesignWorkspaceView_default as DoseDesignWorkspaceView, EXPERIMENT_STATUS_LABELS, EXPERIMENT_STATUS_OPTIONS, EXPERIMENT_STATUS_VARIANT_MAP, EmptyState_default as EmptyState, ExperimentCodeBadge_default as ExperimentCodeBadge, ExperimentDataViewer_default as ExperimentDataViewer, ExperimentPopover_default as ExperimentPopover, ExperimentSelectorModal_default as ExperimentSelectorModal, ExperimentTimeline_default as ExperimentTimeline, FilePicker_default as FilePicker, FileUploader_default as FileUploader, FitPanel_default as FitPanel, FormActions_default as FormActions, FormBuilder_default as FormBuilder, FormField_default as FormField, FormulaInput_default as FormulaInput, GeneratedPathInput_default as GeneratedPathInput, GeneratedPlotlyResult_default as GeneratedPlotlyResult, GeneratedPluginView_default as GeneratedPluginView, GeneratedResultRenderer_default as GeneratedResultRenderer, GroupAssigner_default as GroupAssigner, IconButton_default as IconButton, InstrumentStateBadge_default as InstrumentStateBadge, JobsStatusTray_default as JobsStatusTray, LCMS_DEFAULT_CONTROL_POSITIONS, LayoutResizeHandle_default as LayoutResizeHandle, LoadingSpinner_default as LoadingSpinner, MINTSdk, MINTSdk as default, MintApiError, MobileSupportGate_default as MobileSupportGate, MoleculeInput_default as MoleculeInput, MultiSelect_default as MultiSelect, NumberInput_default as NumberInput, PALETTE_CSS_VARIABLES, PLUGIN_SECRET_FORMAT_KEY, PLUGIN_SECRET_FORMAT_REF, PLUGIN_SECRET_REF_KEY, PlateEditor_default as PlateEditor, PlotlyChart_default as PlotlyChart, PluginIcon_default as PluginIcon, PluginWorkspaceView_default as PluginWorkspaceView, ProgressBar_default as ProgressBar, ProtocolStepEditor_default as ProtocolStepEditor, REORDER_ANNOUNCER_STYLE, ReagentEditor_default as ReagentEditor, ReagentList_default as ReagentList, ResourceCard_default as ResourceCard, RuntimeUpdateNotice_default as RuntimeUpdateNotice, SORT_OPTIONS, SampleHierarchyTree_default as SampleHierarchyTree, SampleLegend_default as SampleLegend, SampleSelector_default as SampleSelector, ScheduleCalendar_default as ScheduleCalendar, ScientificNumber_default as ScientificNumber, SearchableSelect_default as SearchableSelect, SecretInput_default as SecretInput, SectionCard_default as SectionCard, SegmentedControl_default as SegmentedControl, SequenceInput_default as SequenceInput, SequenceProgressBar_default as SequenceProgressBar, SettingsModal_default as SettingsModal, Skeleton_default as Skeleton, SmartGroupFieldRecipe_default as SmartGroupFieldRecipe, SmartGroupManual_default as SmartGroupManual, SmartGroupModal_default as SmartGroupModal, StatusIndicator_default as StatusIndicator, StepWizard_default as StepWizard, TEMPLATE_COLLECTION_KEY, TagsInput_default as TagsInput, ThemeToggle_default as ThemeToggle, TimePicker_default as TimePicker, TimeRangeInput_default as TimeRangeInput, Tooltip_default as Tooltip, UnitInput_default as UnitInput, WellPlate_default as WellPlate, addMinutes, assertTemplateEnvelope, basenameFromWindowsPath, bioTemplateCatalog, bioTemplateControlsToFormSchema, bioTemplateControlsToSectionFormSchemas, bioTemplateControlsToSidebarPanels, bioTemplatePacks, bioTemplatePresetControlValuesToOptions, bioTemplatePresets, buildAnalysisArtifactTargetQuery, buildPluginEndpointUrl, canAccessAdmin, canAccessByPolicy, canAccessPlugin, candidateMatchesSearch, clearPluginSecret, colorPalettes, combinePluginJobSources, compareSortValues, compareTime, controlValuesToComponentBindings, controlValuesToComponentBindingsById, controlValuesToComponentProps, controlsToFormSchema, controlsToSectionFormSchema, controlsToSectionFormSchemas, controlsToSettingsSchema, controlsToSidebarPanels, controlsToTopBarSettingsConfig, controlsToViewIds, controlsToViewItems, createAssayMatrixTemplate, createBioTemplateControlToolkit, createBioTemplatePackCollection, createBioTemplatePresetCollection, createBioTemplatePresetCollectionFromControls, createCalibrationCurveTemplate, createDefaultBioTemplate, createDoseResponseTemplate, createElisaAssayCollection, createFilePickerAdapter, createFlowCytometryAssayCollection, createFlowCytometryPanelTemplate, createGeneratedAnalysisTransport, createInstrumentRunTemplate, createLcmsBatchCollection, createLcmsControlWellEditData, createPlateMapTemplate, createPluginClient, createProtocolStepsTemplate, createQpcrExpressionCollection, createQpcrPlateTemplate, createReagentListTemplate, createSamplePrepTemplate, createSampleSheetTemplate, createTargetedMetabolomicsCollection, createTemplateCollection, createTemplateEnvelope, createTimeCourseTemplate, createWellPlateScreenCollection, createWesternBlotAssayCollection, datePresetToISO, decodePlatformPickerPath, defineControlComponentBindings, defineControlModel, defineControls, defineDoseCalculatorControlProps, defineDoseDesignControlModel, defineWellPlateControlProps, defineWellPlateDoseComponentBindings, defineWellPlateDoseControlProps, deriveShade, detectDelimiter, downloadBlob, downloadPluginEndpoint, durationMinutes, encodePlatformPickerPath, ensureTemplateEnvelope, ensureTemplateFromCollection, estimateSequenceFinishDate, estimateSequenceRemainingSeconds, evaluateCondition, experimentIdFromRoute, extractLcmsCommonPrefix, extractLcmsSampleName, extractSampleNamesFromDesignData, extractSampleOptionsFromDesignData, extractSamplesFromDesignData, extractTemplateCollection, findAvailableSlots, findNearestTimeSlotIndex, formatDuration, formatExperimentDate, formatExperimentStatus, formatSequenceEta, formatSequenceRemaining, formatTime, formatTimeSlot, fromMinutes, generateDilutionSeries, generateTimeSlots, generatedJobDefaults, generatedJobFormSchema, getAccessAudience, getBioTemplateComponentBindings, getBioTemplateComponentProps, getBioTemplateControlDefaults, getBioTemplateControlSchema, getBioTemplateInfo, getBioTemplatePackInfo, getBioTemplatePresetInfo, getControlDefaults, getDefaultControlView, getExperimentStatusVariant, getFieldRegistryEntry, getInjectedFrontendRevision, getLcmsDefaultControlWellId, getPluginPageSelectorItems, getPresenceClientId, getRoleInfo, getTemplateData, getTypeDefault, getUserPermissions, hasAllPermissions, hasAnyPermission, hexToHsl, hslToHex, inferLcmsPlateTypeFromWellIds, isActiveJobStatus, isAdminRole, isAdminUser, isPluginSecretLocked, isPluginSecretRef, isTerminalJobStatus, isTimeInRange, jobStatusLabel, keepPluginSecret, lcmsPlateCellsToRack, lcmsPlateCellsToRacks, lcmsPlateTypeToRackFormat, lcmsWellId, lcmsWellIdFromPosition, listBioTemplateCatalog, listBioTemplateComponentBindings, listBioTemplateControlSchemas, listBioTemplatePacks, listBioTemplatePresetControlSchemas, listBioTemplatePresets, mintApiErrorFromResponse, mintPlotlyTemplate, normalizeGeneratedJobInput, normalizeJobPercent, normalizeJobState, normalizeSearchQuery, paletteCssVariables, parseAnalysisArtifactTarget, parseDelimitedText, parseLcmsWellId, parseTime, pluginFormDataFromPayload, pluginSecretId, pluginSecretLabel, pluginSecretState, rackFormatToLcmsPlateType, rackToLcmsPlateCells, racksFromPlateState, racksToLcmsPlateCells, rangesOverlap, readFileAsText, reconstructLcmsPlateCellsFromSequenceItems, reorderList, requireBioTemplateControlSchema, resizedLeadingPanelWidth, resizedTrailingPanelWidth, resizedVerticalSplitPercent, resolveCurrentPluginId, resolveExperimentCode, resolveJobCapabilities, resolvePluginBaseUrl, resolvePluginFrontendBase, sampleTypeMarker, searchBioTemplateCatalog, searchBioTemplatePacks, searchBioTemplatePresets, sequenceProgressPercent, sequenceSamplesRemaining, setPluginSecret, snapToSlot, tableDensityToSize, toAssayMatrixColumns, toAssayMatrixDataFrame, toAssayMatrixRows, toAssayMatrixSampleOptions, toBioTemplateComponentBindings, toBioTemplateComponentBindingsById, toBioTemplateComponentImports, toBioTemplateComponentProps, toBioTemplateComponentPropsByComponent, toBioTemplateComponentPropsById, toBioTemplateComponentSnippets, toBioTemplateComponentUsage, toCalibrationCurveColumns, toCalibrationCurveDataFrame, toCalibrationCurveRows, toDoseConditions, toDoseLayoutState, toFlowPanelColumns, toFlowPanelDataFrame, toFlowPanelRows, toInstrumentRunColumns, toInstrumentRunDataFrame, toInstrumentRunRows, toInstrumentRunScheduleEvents, toInstrumentRunSteps, toMinutes, toPlateMapEditorState, toProtocolColumns, toProtocolDataFrame, toProtocolRows, toProtocolSteps, toQpcrColumns, toQpcrDataFrame, toQpcrRows, toQpcrWellPlateWells, toReagentColumns, toReagentDataFrame, toReagentListItems, toReagentRows, toSampleColumns, toSampleDataFrame, toSampleOptions, toSamplePrepColumns, toSamplePrepDataFrame, toSamplePrepRows, toSampleRows, toTemplateDataFrame, toTimeCourseColumns, toTimeCourseDataFrame, toTimeCourseRows, toTimeCourseSteps, toWellMapArray, toWellPlateWells, tryUseSettingsStore, unwrapExperimentDesignData, uploadPluginEndpoint, useAnalysisArtifacts, useApi, useAppExperiment, useAuthStore, useAutoGroup, useBioTemplateComponents, useBioTemplateControls, useBioTemplatePackWorkspace, useBioTemplatePresetWorkspace, useBioTemplateWorkspace, useChemicalFormula, useConcentrationUnits, useControlSchema, useControlWorkspace, useCurrentExperiment, useDebouncedWatch, useDoseCalculator, useEventListener, useExpansionSet, useExperimentData, useExperimentSamples, useExperimentSave, useExperimentSelector, useExperimentStore, useFileBrowser, useFileImport, useFocusTrap, useForm, useFormBuilder, useGeneratedAnalysis, useGroupAssignment, useJobsStatusTray, useListReorder, useListSelection, useManualLayoutResize, useMenuKeyboard, useMobileSupportGate, usePlatformContext, usePlatformFilePickerAdapter, usePluginClient, usePluginEventStream, usePluginJobCenter, usePluginJobs, usePluginSettings, usePluginWorkspace, usePresenceHeartbeat, useProtocolTemplates, useRackEditor, useReagentSeries, useReorderAnnouncer, useRequestSyncState, useRovingFocus, useRuntimeAlignment, useSampleGroups, useScheduleDrag, useSelectionLimit, useSequenceUtils, useSettingsStore, useSortedItems, useTemplateCollection, useTextSearch, useTheme, useTimeUtils, useToast, usesPluginSecretReferences, validateAssayMatrixData, validateCalibrationCurveData, validateDoseResponseData, validateFlowCytometryPanelData, validateImportFile, validateInstrumentRunData, validatePlateMapData, validateProtocolStepsData, validateQpcrPlateData, validateReagentListData, validateSamplePrepData, validateSampleSheetData, validateTimeCourseData };
285
285
 
286
286
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/lcms.ts","../src/utils/rack.ts"],"sourcesContent":["import type { LcmsPlateCell, LcmsPlateType } from './utils/rack'\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport type LcmsPolarity = 'POS' | 'NEG' | 'BOTH'\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport type LcmsContainerType = 'VIAL' | 'PLATE'\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport interface LcmsSequenceItem {\n sample_type: string\n file_name: string\n sample_id: string\n path: string\n instrument_method: string\n position: string\n injection_volume: number\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport interface LcmsSequenceTableColumn {\n key: keyof LcmsSequenceItem | 'index' | 'actions'\n label: string\n align?: 'left' | 'right'\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport const DEFAULT_LCMS_SEQUENCE_COLUMNS: LcmsSequenceTableColumn[] = [\n { key: 'index', label: '#' },\n { key: 'sample_type', label: 'Type' },\n { key: 'file_name', label: 'File Name' },\n { key: 'position', label: 'Position' },\n { key: 'instrument_method', label: 'Method' },\n { key: 'injection_volume', label: 'Inj Vol', align: 'right' },\n]\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function extractLcmsCommonPrefix(fileNames: readonly string[]): string {\n if (fileNames.length === 0) return ''\n const stripped = fileNames.map(fileName => fileName.replace(/_\\d{3}$/, ''))\n const prefixes = stripped.map((fileName) => {\n const match = fileName.match(/^(.+?)_(POS|NEG)_/i)\n return match ? match[1] : fileName.replace(/_[^_]+$/, '')\n })\n\n let common = prefixes[0] ?? ''\n for (const prefix of prefixes.slice(1)) {\n while (common && !prefix.startsWith(common)) {\n const index = common.lastIndexOf('_')\n common = index > 0 ? common.substring(0, index) : common.substring(0, common.length - 1)\n }\n }\n return common\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function extractLcmsSampleName(fileName: string, prefix = ''): string {\n let name = fileName.replace(/_\\d{3}$/, '')\n if (prefix && name.startsWith(prefix)) {\n name = name.substring(prefix.length).replace(/^_+/, '')\n }\n name = name.replace(/^(POS|NEG)_/i, '')\n return name || fileName\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function lcmsWellIdFromPosition(position: string): string {\n return position.includes(':') ? position.split(':').pop() ?? position : position\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function inferLcmsPlateTypeFromWellIds(wellIds: readonly string[]): LcmsPlateType | null {\n let maxCol = 0\n let maxRow = 0\n for (const wellId of wellIds) {\n const match = wellId.match(/^([A-Z])(\\d+)$/i)\n if (!match) continue\n maxRow = Math.max(maxRow, match[1].toUpperCase().charCodeAt(0) - 64)\n maxCol = Math.max(maxCol, Number(match[2]))\n }\n if (maxCol === 0 && maxRow === 0) return null\n return maxCol <= 9 && maxRow <= 6 ? '54vial' : '96well'\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function reconstructLcmsPlateCellsFromSequenceItems(\n items: readonly LcmsSequenceItem[],\n): { cells: LcmsPlateCell[]; plateType: LcmsPlateType } | null {\n const unknownItems = items.filter(item => item.sample_type === 'Unknown')\n if (unknownItems.length === 0) return null\n\n const prefix = extractLcmsCommonPrefix(unknownItems.map(item => item.file_name))\n const seen = new Set<string>()\n const cells: LcmsPlateCell[] = []\n\n for (const item of unknownItems) {\n const wellId = lcmsWellIdFromPosition(item.position)\n if (seen.has(wellId)) continue\n seen.add(wellId)\n\n const match = wellId.match(/^([A-Z])(\\d+)$/i)\n if (!match) continue\n cells.push({\n row: match[1].toUpperCase(),\n column: Number(match[2]),\n sample_name: extractLcmsSampleName(item.file_name, prefix),\n })\n }\n\n if (cells.length === 0) return null\n const plateType = inferLcmsPlateTypeFromWellIds(cells.map(cell => `${cell.row}${cell.column}`))\n if (!plateType) return null\n return { cells, plateType }\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function basenameFromWindowsPath(path: string | null | undefined): string {\n if (!path) return ''\n return path.split(/[\\\\/]/).pop() ?? path\n}\n","import type { Rack, SlotPosition, Well, WellEditData, WellPlateFormat } from '../types'\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport type LcmsPlateType = '96well' | '54vial'\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport type LcmsControlSampleType = 'blank' | 'qc' | 'iqc'\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport interface LcmsPlateCell {\n row: string\n column: number\n sample_name: string\n sample_type?: string | null\n injection_volume?: number | null\n injection_count?: number | null\n custom_method?: string | null\n slot?: SlotPosition | null\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport interface LcmsPlateCellsToRackOptions {\n rackId?: string\n rackName?: string\n format?: WellPlateFormat\n plateType?: LcmsPlateType\n slot?: SlotPosition\n injectionVolume?: number\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport interface LcmsPlateCellsToRacksOptions extends Omit<LcmsPlateCellsToRackOptions, 'rackId' | 'rackName' | 'slot'> {\n defaultSlot?: SlotPosition\n rackId?: (slot: SlotPosition, index: number) => string\n rackName?: (slot: SlotPosition, index: number) => string\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport const LCMS_DEFAULT_CONTROL_POSITIONS: Record<LcmsPlateType, Record<LcmsControlSampleType, { row: string; column: number }>> = {\n '96well': {\n blank: { row: 'H', column: 12 },\n qc: { row: 'H', column: 11 },\n iqc: { row: 'H', column: 10 },\n },\n '54vial': {\n blank: { row: 'F', column: 9 },\n qc: { row: 'F', column: 8 },\n iqc: { row: 'F', column: 7 },\n },\n}\n\nconst SLOT_ORDER: SlotPosition[] = ['R', 'G', 'B', 'Y']\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function lcmsPlateTypeToRackFormat(plateType: LcmsPlateType): WellPlateFormat {\n return plateType === '96well' ? 96 : 54\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function rackFormatToLcmsPlateType(format: WellPlateFormat): LcmsPlateType {\n if (format === 96) return '96well'\n if (format === 54) return '54vial'\n throw new Error(`LCMS plate cells support only 54-vial racks and 96-well plates; received format ${format}.`)\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function lcmsWellId(row: string, column: number): string {\n return `${row.toUpperCase()}${column}`\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function parseLcmsWellId(wellId: string): { row: string; column: number } {\n const match = /^([A-Za-z]+)(\\d+)$/.exec(wellId.trim())\n if (!match) {\n throw new Error(`Invalid well id \"${wellId}\". Expected a row letter followed by a column number, e.g. A1.`)\n }\n\n return {\n row: match[1].toUpperCase(),\n column: Number(match[2]),\n }\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function lcmsPlateCellsToRack(cells: LcmsPlateCell[], options: LcmsPlateCellsToRackOptions = {}): Rack {\n const format = options.format ?? (options.plateType ? lcmsPlateTypeToRackFormat(options.plateType) : inferRackFormat(cells))\n const slot = options.slot ?? cells.find(cell => cell.slot)?.slot ?? 'R'\n const injectionVolume = options.injectionVolume ?? inferInjectionVolume(cells) ?? 5\n\n return {\n id: options.rackId ?? `rack-${slot}`,\n name: options.rackName ?? `Rack ${slot}`,\n format,\n slot,\n injectionVolume,\n wells: Object.fromEntries(\n cells\n .filter(cell => cell.sample_name.trim())\n .map((cell) => {\n const wellId = lcmsWellId(cell.row, cell.column)\n const well: Partial<Well> = {\n id: wellId,\n row: rowIndex(cell.row),\n col: cell.column - 1,\n state: 'filled',\n sampleType: cell.sample_type ?? 'sample',\n metadata: {\n label: cell.sample_name.trim(),\n injectionVolume: cell.injection_volume ?? injectionVolume,\n injectionCount: cell.injection_count ?? 1,\n customMethod: cell.custom_method ?? null,\n },\n }\n return [wellId, well]\n }),\n ),\n }\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function lcmsPlateCellsToRacks(cells: LcmsPlateCell[], options: LcmsPlateCellsToRacksOptions = {}): Rack[] {\n const bySlot = new Map<SlotPosition, LcmsPlateCell[]>()\n const defaultSlot = options.defaultSlot ?? 'R'\n\n for (const cell of cells) {\n const slot = cell.slot ?? defaultSlot\n const slotCells = bySlot.get(slot) ?? []\n slotCells.push(cell)\n bySlot.set(slot, slotCells)\n }\n\n return Array.from(bySlot.entries())\n .sort(([a], [b]) => SLOT_ORDER.indexOf(a) - SLOT_ORDER.indexOf(b))\n .map(([slot, slotCells], index) => lcmsPlateCellsToRack(slotCells, {\n ...options,\n slot,\n rackId: options.rackId?.(slot, index) ?? `rack-${slot}`,\n rackName: options.rackName?.(slot, index) ?? `Rack ${slot}`,\n }))\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function rackToLcmsPlateCells(rack: Rack): LcmsPlateCell[] {\n return Object.entries(rack.wells)\n .map(([wellId, well]) => wellToLcmsPlateCell(rack, wellId, well))\n .filter((cell): cell is LcmsPlateCell => cell !== null)\n .sort(comparePlateCells)\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function racksToLcmsPlateCells(racks: Rack[]): LcmsPlateCell[] {\n return racks.flatMap(rackToLcmsPlateCells)\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function getLcmsDefaultControlWellId(plateType: LcmsPlateType, sampleType: LcmsControlSampleType): string {\n const position = LCMS_DEFAULT_CONTROL_POSITIONS[plateType][sampleType]\n return lcmsWellId(position.row, position.column)\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */\nexport function createLcmsControlWellEditData(\n sampleType: LcmsControlSampleType,\n options: {\n wellId?: string\n plateType?: LcmsPlateType\n injectionVolume?: number\n } = {},\n): WellEditData {\n const plateType = options.plateType ?? '54vial'\n return {\n wellId: options.wellId ?? getLcmsDefaultControlWellId(plateType, sampleType),\n label: sampleType === 'blank' ? 'Blank' : sampleType.toUpperCase(),\n sampleType,\n injectionVolume: options.injectionVolume ?? 5,\n injectionCount: 1,\n customMethod: '',\n }\n}\n\nfunction wellToLcmsPlateCell(rack: Rack, wellId: string, well: Partial<Well>): LcmsPlateCell | null {\n const metadata = well.metadata ?? {}\n const label = getString(metadata.label)\n if (!label) return null\n\n const parsed = parseLcmsWellId(well.id ?? wellId)\n return {\n row: parsed.row,\n column: parsed.column,\n sample_name: label,\n sample_type: well.sampleType ?? null,\n injection_volume: getNumber(metadata.injectionVolume) ?? rack.injectionVolume,\n injection_count: getNumber(metadata.injectionCount) ?? 1,\n custom_method: getNullableString(metadata.customMethod),\n slot: rack.slot,\n }\n}\n\nfunction inferRackFormat(cells: LcmsPlateCell[]): WellPlateFormat {\n return cells.some(cell => rowIndex(cell.row) > 5 || cell.column > 9) ? 96 : 54\n}\n\nfunction inferInjectionVolume(cells: LcmsPlateCell[]): number | undefined {\n return cells.find(cell => typeof cell.injection_volume === 'number')?.injection_volume ?? undefined\n}\n\nfunction rowIndex(row: string): number {\n return row.toUpperCase().charCodeAt(0) - 65\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined\n}\n\nfunction getNullableString(value: unknown): string | null {\n return typeof value === 'string' && value.trim() ? value.trim() : null\n}\n\nfunction getNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction comparePlateCells(a: LcmsPlateCell, b: LcmsPlateCell): number {\n const rowDiff = rowIndex(a.row) - rowIndex(b.row)\n return rowDiff === 0 ? a.column - b.column : rowDiff\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/lcms.ts","../src/utils/rack.ts"],"sourcesContent":["import type { LcmsPlateCell, LcmsPlateType } from './utils/rack'\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport type LcmsPolarity = 'POS' | 'NEG' | 'BOTH'\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport type LcmsContainerType = 'VIAL' | 'PLATE'\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport interface LcmsSequenceItem {\n sample_type: string\n file_name: string\n sample_id: string\n path: string\n instrument_method: string\n position: string\n injection_volume: number\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport interface LcmsSequenceTableColumn {\n key: keyof LcmsSequenceItem | 'index' | 'actions'\n label: string\n align?: 'left' | 'right'\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport const DEFAULT_LCMS_SEQUENCE_COLUMNS: LcmsSequenceTableColumn[] = [\n { key: 'index', label: '#' },\n { key: 'sample_type', label: 'Type' },\n { key: 'file_name', label: 'File Name' },\n { key: 'position', label: 'Position' },\n { key: 'instrument_method', label: 'Method' },\n { key: 'injection_volume', label: 'Inj Vol', align: 'right' },\n]\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function extractLcmsCommonPrefix(fileNames: readonly string[]): string {\n if (fileNames.length === 0) return ''\n const stripped = fileNames.map(fileName => fileName.replace(/_\\d{3}$/, ''))\n const prefixes = stripped.map((fileName) => {\n const match = fileName.match(/^(.+?)_(POS|NEG)_/i)\n return match ? match[1] : fileName.replace(/_[^_]+$/, '')\n })\n\n let common = prefixes[0] ?? ''\n for (const prefix of prefixes.slice(1)) {\n while (common && !prefix.startsWith(common)) {\n const index = common.lastIndexOf('_')\n common = index > 0 ? common.substring(0, index) : common.substring(0, common.length - 1)\n }\n }\n return common\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function extractLcmsSampleName(fileName: string, prefix = ''): string {\n let name = fileName.replace(/_\\d{3}$/, '')\n if (prefix && name.startsWith(prefix)) {\n name = name.substring(prefix.length).replace(/^_+/, '')\n }\n name = name.replace(/^(POS|NEG)_/i, '')\n return name || fileName\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function lcmsWellIdFromPosition(position: string): string {\n return position.includes(':') ? position.split(':').pop() ?? position : position\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function inferLcmsPlateTypeFromWellIds(wellIds: readonly string[]): LcmsPlateType | null {\n let maxCol = 0\n let maxRow = 0\n for (const wellId of wellIds) {\n const match = wellId.match(/^([A-Z])(\\d+)$/i)\n if (!match) continue\n maxRow = Math.max(maxRow, match[1].toUpperCase().charCodeAt(0) - 64)\n maxCol = Math.max(maxCol, Number(match[2]))\n }\n if (maxCol === 0 && maxRow === 0) return null\n return maxCol <= 9 && maxRow <= 6 ? '54vial' : '96well'\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function reconstructLcmsPlateCellsFromSequenceItems(\n items: readonly LcmsSequenceItem[],\n): { cells: LcmsPlateCell[]; plateType: LcmsPlateType } | null {\n const unknownItems = items.filter(item => item.sample_type === 'Unknown')\n if (unknownItems.length === 0) return null\n\n const prefix = extractLcmsCommonPrefix(unknownItems.map(item => item.file_name))\n const seen = new Set<string>()\n const cells: LcmsPlateCell[] = []\n\n for (const item of unknownItems) {\n const wellId = lcmsWellIdFromPosition(item.position)\n if (seen.has(wellId)) continue\n seen.add(wellId)\n\n const match = wellId.match(/^([A-Z])(\\d+)$/i)\n if (!match) continue\n cells.push({\n row: match[1].toUpperCase(),\n column: Number(match[2]),\n sample_name: extractLcmsSampleName(item.file_name, prefix),\n })\n }\n\n if (cells.length === 0) return null\n const plateType = inferLcmsPlateTypeFromWellIds(cells.map(cell => `${cell.row}${cell.column}`))\n if (!plateType) return null\n return { cells, plateType }\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function basenameFromWindowsPath(path: string | null | undefined): string {\n if (!path) return ''\n return path.split(/[\\\\/]/).pop() ?? path\n}\n","import type { Rack, SlotPosition, Well, WellEditData, WellPlateFormat } from '../types'\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport type LcmsPlateType = '96well' | '54vial'\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport type LcmsControlSampleType = 'blank' | 'qc' | 'iqc'\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport interface LcmsPlateCell {\n row: string\n column: number\n sample_name: string\n sample_type?: string | null\n injection_volume?: number | null\n injection_count?: number | null\n custom_method?: string | null\n slot?: SlotPosition | null\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport interface LcmsPlateCellsToRackOptions {\n rackId?: string\n rackName?: string\n format?: WellPlateFormat\n plateType?: LcmsPlateType\n slot?: SlotPosition\n injectionVolume?: number\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport interface LcmsPlateCellsToRacksOptions extends Omit<LcmsPlateCellsToRackOptions, 'rackId' | 'rackName' | 'slot'> {\n defaultSlot?: SlotPosition\n rackId?: (slot: SlotPosition, index: number) => string\n rackName?: (slot: SlotPosition, index: number) => string\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport const LCMS_DEFAULT_CONTROL_POSITIONS: Record<LcmsPlateType, Record<LcmsControlSampleType, { row: string; column: number }>> = {\n '96well': {\n blank: { row: 'H', column: 12 },\n qc: { row: 'H', column: 11 },\n iqc: { row: 'H', column: 10 },\n },\n '54vial': {\n blank: { row: 'F', column: 9 },\n qc: { row: 'F', column: 8 },\n iqc: { row: 'F', column: 7 },\n },\n}\n\nconst SLOT_ORDER: SlotPosition[] = ['R', 'G', 'B', 'Y']\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function lcmsPlateTypeToRackFormat(plateType: LcmsPlateType): WellPlateFormat {\n return plateType === '96well' ? 96 : 54\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function rackFormatToLcmsPlateType(format: WellPlateFormat): LcmsPlateType {\n if (format === 96) return '96well'\n if (format === 54) return '54vial'\n throw new Error(`LCMS plate cells support only 54-vial racks and 96-well plates; received format ${format}.`)\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function lcmsWellId(row: string, column: number): string {\n return `${row.toUpperCase()}${column}`\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function parseLcmsWellId(wellId: string): { row: string; column: number } {\n const match = /^([A-Za-z]+)(\\d+)$/.exec(wellId.trim())\n if (!match) {\n throw new Error(`Invalid well id \"${wellId}\". Expected a row letter followed by a column number, e.g. A1.`)\n }\n\n return {\n row: match[1].toUpperCase(),\n column: Number(match[2]),\n }\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function lcmsPlateCellsToRack(cells: LcmsPlateCell[], options: LcmsPlateCellsToRackOptions = {}): Rack {\n const format = options.format ?? (options.plateType ? lcmsPlateTypeToRackFormat(options.plateType) : inferRackFormat(cells))\n const slot = options.slot ?? cells.find(cell => cell.slot)?.slot ?? 'R'\n const injectionVolume = options.injectionVolume ?? inferInjectionVolume(cells) ?? 5\n\n return {\n id: options.rackId ?? `rack-${slot}`,\n name: options.rackName ?? `Rack ${slot}`,\n format,\n slot,\n injectionVolume,\n wells: Object.fromEntries(\n cells\n .filter(cell => cell.sample_name.trim())\n .map((cell) => {\n const wellId = lcmsWellId(cell.row, cell.column)\n const well: Partial<Well> = {\n id: wellId,\n row: rowIndex(cell.row),\n col: cell.column - 1,\n state: 'filled',\n sampleType: cell.sample_type ?? 'sample',\n metadata: {\n label: cell.sample_name.trim(),\n injectionVolume: cell.injection_volume ?? injectionVolume,\n injectionCount: cell.injection_count ?? 1,\n customMethod: cell.custom_method ?? null,\n },\n }\n return [wellId, well]\n }),\n ),\n }\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function lcmsPlateCellsToRacks(cells: LcmsPlateCell[], options: LcmsPlateCellsToRacksOptions = {}): Rack[] {\n const bySlot = new Map<SlotPosition, LcmsPlateCell[]>()\n const defaultSlot = options.defaultSlot ?? 'R'\n\n for (const cell of cells) {\n const slot = cell.slot ?? defaultSlot\n const slotCells = bySlot.get(slot) ?? []\n slotCells.push(cell)\n bySlot.set(slot, slotCells)\n }\n\n return Array.from(bySlot.entries())\n .sort(([a], [b]) => SLOT_ORDER.indexOf(a) - SLOT_ORDER.indexOf(b))\n .map(([slot, slotCells], index) => lcmsPlateCellsToRack(slotCells, {\n ...options,\n slot,\n rackId: options.rackId?.(slot, index) ?? `rack-${slot}`,\n rackName: options.rackName?.(slot, index) ?? `Rack ${slot}`,\n }))\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function rackToLcmsPlateCells(rack: Rack): LcmsPlateCell[] {\n return Object.entries(rack.wells)\n .map(([wellId, well]) => wellToLcmsPlateCell(rack, wellId, well))\n .filter((cell): cell is LcmsPlateCell => cell !== null)\n .sort(comparePlateCells)\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function racksToLcmsPlateCells(racks: Rack[]): LcmsPlateCell[] {\n return racks.flatMap(rackToLcmsPlateCells)\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function getLcmsDefaultControlWellId(plateType: LcmsPlateType, sampleType: LcmsControlSampleType): string {\n const position = LCMS_DEFAULT_CONTROL_POSITIONS[plateType][sampleType]\n return lcmsWellId(position.row, position.column)\n}\n\n/** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */\nexport function createLcmsControlWellEditData(\n sampleType: LcmsControlSampleType,\n options: {\n wellId?: string\n plateType?: LcmsPlateType\n injectionVolume?: number\n } = {},\n): WellEditData {\n const plateType = options.plateType ?? '54vial'\n return {\n wellId: options.wellId ?? getLcmsDefaultControlWellId(plateType, sampleType),\n label: sampleType === 'blank' ? 'Blank' : sampleType.toUpperCase(),\n sampleType,\n injectionVolume: options.injectionVolume ?? 5,\n injectionCount: 1,\n customMethod: '',\n }\n}\n\nfunction wellToLcmsPlateCell(rack: Rack, wellId: string, well: Partial<Well>): LcmsPlateCell | null {\n const metadata = well.metadata ?? {}\n const label = getString(metadata.label)\n if (!label) return null\n\n const parsed = parseLcmsWellId(well.id ?? wellId)\n return {\n row: parsed.row,\n column: parsed.column,\n sample_name: label,\n sample_type: well.sampleType ?? null,\n injection_volume: getNumber(metadata.injectionVolume) ?? rack.injectionVolume,\n injection_count: getNumber(metadata.injectionCount) ?? 1,\n custom_method: getNullableString(metadata.customMethod),\n slot: rack.slot,\n }\n}\n\nfunction inferRackFormat(cells: LcmsPlateCell[]): WellPlateFormat {\n return cells.some(cell => rowIndex(cell.row) > 5 || cell.column > 9) ? 96 : 54\n}\n\nfunction inferInjectionVolume(cells: LcmsPlateCell[]): number | undefined {\n return cells.find(cell => typeof cell.injection_volume === 'number')?.injection_volume ?? undefined\n}\n\nfunction rowIndex(row: string): number {\n return row.toUpperCase().charCodeAt(0) - 65\n}\n\nfunction getString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined\n}\n\nfunction getNullableString(value: unknown): string | null {\n return typeof value === 'string' && value.trim() ? value.trim() : null\n}\n\nfunction getNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\nfunction comparePlateCells(a: LcmsPlateCell, b: LcmsPlateCell): number {\n const rowDiff = rowIndex(a.row) - rowIndex(b.row)\n return rowDiff === 0 ? a.column - b.column : rowDiff\n}\n"],"mappings":"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"}
package/dist/install.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as components_exports } from "./components-CvY105kJ.js";
1
+ import { t as components_exports } from "./components-GDDvof8D.js";
2
2
  //#region src/install.ts
3
3
  /**
4
4
  * Vue plugin that registers all MINT SDK components globally.
package/dist/lcms.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { LcmsPlateCell, LcmsPlateType } from './utils/rack';
2
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
2
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
3
3
  export type LcmsPolarity = 'POS' | 'NEG' | 'BOTH';
4
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
4
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
5
5
  export type LcmsContainerType = 'VIAL' | 'PLATE';
6
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
6
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
7
7
  export interface LcmsSequenceItem {
8
8
  sample_type: string;
9
9
  file_name: string;
@@ -13,26 +13,26 @@ export interface LcmsSequenceItem {
13
13
  position: string;
14
14
  injection_volume: number;
15
15
  }
16
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
16
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
17
17
  export interface LcmsSequenceTableColumn {
18
18
  key: keyof LcmsSequenceItem | 'index' | 'actions';
19
19
  label: string;
20
20
  align?: 'left' | 'right';
21
21
  }
22
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
22
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
23
23
  export declare const DEFAULT_LCMS_SEQUENCE_COLUMNS: LcmsSequenceTableColumn[];
24
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
24
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
25
25
  export declare function extractLcmsCommonPrefix(fileNames: readonly string[]): string;
26
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
26
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
27
27
  export declare function extractLcmsSampleName(fileName: string, prefix?: string): string;
28
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
28
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
29
29
  export declare function lcmsWellIdFromPosition(position: string): string;
30
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
30
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
31
31
  export declare function inferLcmsPlateTypeFromWellIds(wellIds: readonly string[]): LcmsPlateType | null;
32
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
32
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
33
33
  export declare function reconstructLcmsPlateCellsFromSequenceItems(items: readonly LcmsSequenceItem[]): {
34
34
  cells: LcmsPlateCell[];
35
35
  plateType: LcmsPlateType;
36
36
  } | null;
37
- /** @deprecated Scheduled for removal in MINT 1.4; LC-MS helpers move to the mld-ms plugins. */
37
+ /** @deprecated Scheduled for removal in MINT 1.4; no SDK replacement. */
38
38
  export declare function basenameFromWindowsPath(path: string | null | undefined): string;