@morscherlab/mint-sdk 1.0.61 → 1.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +101 -2
  2. package/dist/EmptyState-D1c4RdC7.js +638 -0
  3. package/dist/EmptyState-D1c4RdC7.js.map +1 -0
  4. package/dist/{ExperimentPopover-BbPkIFsI.js → ExperimentPopover-BFw3QX8L.js} +10 -9
  5. package/dist/{ExperimentPopover-BbPkIFsI.js.map → ExperimentPopover-BFw3QX8L.js.map} +1 -1
  6. package/dist/{ExperimentSelectorModal-DZeSd-yr.js → ExperimentSelectorModal-B7w6k3Y8.js} +12 -216
  7. package/dist/ExperimentSelectorModal-B7w6k3Y8.js.map +1 -0
  8. package/dist/{SettingsModal-CJgLadsN.js → SettingsModal-DPDwCbXK.js} +12 -9
  9. package/dist/{SettingsModal-CJgLadsN.js.map → SettingsModal-DPDwCbXK.js.map} +1 -1
  10. package/dist/__tests__/components/GeneratedPathInput.test.d.ts +1 -0
  11. package/dist/__tests__/components/GeneratedPlotlyResult.test.d.ts +1 -0
  12. package/dist/__tests__/components/GeneratedPluginView.test.d.ts +1 -0
  13. package/dist/__tests__/components/GeneratedResultRenderer.test.d.ts +1 -0
  14. package/dist/__tests__/components/InstrumentAlertLog.test.d.ts +1 -0
  15. package/dist/__tests__/composables/useGeneratedAnalysis.test.d.ts +1 -0
  16. package/dist/__tests__/generatedUi.test.d.ts +1 -0
  17. package/dist/{analysisArtifactTypes-Cu40dzSG.js → analysisArtifactTypes-ejqR8MX3.js} +1 -1
  18. package/dist/{analysisArtifactTypes-Cu40dzSG.js.map → analysisArtifactTypes-ejqR8MX3.js.map} +1 -1
  19. package/dist/{auth-DZAwEeis.js → auth-B87xM--s.js} +1 -1
  20. package/dist/{auth-DZAwEeis.js.map → auth-B87xM--s.js.map} +1 -1
  21. package/dist/chunk-BoAXSpZd.js +33 -0
  22. package/dist/components/AppSidebar.vue.d.ts +1 -1
  23. package/dist/components/AutoGroupModal.vue.d.ts +2 -2
  24. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  25. package/dist/components/CollapsibleCard.vue.d.ts +1 -1
  26. package/dist/components/ComponentBindingRenderer.vue.d.ts +1 -1
  27. package/dist/components/ConfirmDialog.vue.d.ts +1 -1
  28. package/dist/components/ExperimentDataViewer.vue.d.ts +1 -1
  29. package/dist/components/ExperimentTimeline.vue.d.ts +1 -1
  30. package/dist/components/FileUploader.vue.d.ts +4 -2
  31. package/dist/components/FitPanel.vue.d.ts +1 -1
  32. package/dist/components/FormActions.vue.d.ts +1 -1
  33. package/dist/components/FormBuilder.vue.d.ts +1 -1
  34. package/dist/components/GeneratedPathInput.vue.d.ts +12 -0
  35. package/dist/components/GeneratedPlotlyResult.vue.d.ts +11 -0
  36. package/dist/components/GeneratedPluginView.vue.d.ts +10 -0
  37. package/dist/components/GeneratedResultRenderer.vue.d.ts +6 -0
  38. package/dist/components/JobsStatusTray.vue.d.ts +5 -1
  39. package/dist/components/LcmsSequenceTable.vue.d.ts +1 -1
  40. package/dist/components/SampleLegend.vue.d.ts +1 -1
  41. package/dist/components/SampleSelector.vue.d.ts +2 -2
  42. package/dist/components/SettingsModal.vue.d.ts +1 -1
  43. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +2 -2
  44. package/dist/components/index.d.ts +4 -0
  45. package/dist/components/index.js +8 -9
  46. package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +2 -2
  47. package/dist/{components-CpnOaPbP.js → components-UfkPN1bK.js} +2255 -2303
  48. package/dist/components-UfkPN1bK.js.map +1 -0
  49. package/dist/composables/index.d.ts +2 -1
  50. package/dist/composables/index.js +10 -11
  51. package/dist/composables/useGeneratedAnalysis.d.ts +62 -0
  52. package/dist/composables/useJobsStatusTray.d.ts +48 -4
  53. package/dist/composables/usePluginClient.d.ts +6 -3
  54. package/dist/{composables-OYTD0Y3r.js → composables-F4JFK9K1.js} +37 -15
  55. package/dist/{composables-OYTD0Y3r.js.map → composables-F4JFK9K1.js.map} +1 -1
  56. package/dist/experiment-utils-CxkruZ3G.js +392 -0
  57. package/dist/experiment-utils-CxkruZ3G.js.map +1 -0
  58. package/dist/generated/schema.d.ts +7 -0
  59. package/dist/generated-ui/main.d.ts +0 -0
  60. package/dist/index.d.ts +1 -0
  61. package/dist/index.js +15 -18
  62. package/dist/index.js.map +1 -1
  63. package/dist/install.js +7 -8
  64. package/dist/install.js.map +1 -1
  65. package/dist/plotly.min-BR53hja4.js +180634 -0
  66. package/dist/plotly.min-BR53hja4.js.map +1 -0
  67. package/dist/stores/auth.d.ts +2 -2
  68. package/dist/stores/index.js +1 -1
  69. package/dist/styles.css +10543 -10404
  70. package/dist/templates/index.js +4 -3
  71. package/dist/templates/packs.d.ts +0 -1
  72. package/dist/{templates-CNbPQNID.js → templates-Cttbjbyc.js} +2 -4
  73. package/dist/templates-Cttbjbyc.js.map +1 -0
  74. package/dist/types/form-builder.d.ts +1 -1
  75. package/dist/types/generated-ui.d.ts +170 -0
  76. package/dist/types/index.d.ts +1 -0
  77. package/dist/types/index.js +1 -1
  78. package/dist/types/instrument.d.ts +1 -0
  79. package/dist/types/jobs.d.ts +7 -1
  80. package/dist/{useControlSchema-BZNdalmL.js → useControlSchema-Dallso-L.js} +1852 -171
  81. package/dist/useControlSchema-Dallso-L.js.map +1 -0
  82. package/dist/{useDropdownState-Bb-c_PeE.js → useDropdownState-gVaMXtwW.js} +2 -2
  83. package/dist/{useDropdownState-Bb-c_PeE.js.map → useDropdownState-gVaMXtwW.js.map} +1 -1
  84. package/dist/{useExperimentSelector-DRbj6vse.js → useExperimentSelector-BMjzNcf2.js} +4 -255
  85. package/dist/useExperimentSelector-BMjzNcf2.js.map +1 -0
  86. package/dist/{useFormBuilder-DKekvXRs.js → useFormBuilder-BXaaDI41.js} +2 -2
  87. package/dist/{useFormBuilder-DKekvXRs.js.map → useFormBuilder-BXaaDI41.js.map} +1 -1
  88. package/dist/{useAnalysisArtifacts-Ob8UtVwl.js → useProtocolTemplates-BP7_4RGQ.js} +307 -449
  89. package/dist/useProtocolTemplates-BP7_4RGQ.js.map +1 -0
  90. package/package.json +7 -3
  91. package/src/__tests__/components/GeneratedPathInput.test.ts +132 -0
  92. package/src/__tests__/components/GeneratedPlotlyResult.test.ts +117 -0
  93. package/src/__tests__/components/GeneratedPluginView.test.ts +230 -0
  94. package/src/__tests__/components/GeneratedResultRenderer.test.ts +93 -0
  95. package/src/__tests__/components/InstrumentAlertLog.test.ts +59 -0
  96. package/src/__tests__/composables/formBuilderRegistry.test.ts +5 -1
  97. package/src/__tests__/composables/useApi.test.ts +8 -0
  98. package/src/__tests__/composables/useGeneratedAnalysis.test.ts +1740 -0
  99. package/src/__tests__/composables/useJobsStatusTray.test.ts +179 -1
  100. package/src/__tests__/composables/usePluginClient.test.ts +132 -1
  101. package/src/__tests__/docs/extractDocsTemplates.test.ts +0 -1
  102. package/src/__tests__/generatedUi.test.ts +119 -0
  103. package/src/__tests__/templates/templates.test.ts +1 -1
  104. package/src/components/FileUploader.vue +49 -11
  105. package/src/components/GeneratedPathInput.vue +218 -0
  106. package/src/components/GeneratedPlotlyResult.vue +87 -0
  107. package/src/components/GeneratedPluginView.vue +279 -0
  108. package/src/components/GeneratedResultRenderer.vue +137 -0
  109. package/src/components/InstrumentAlertLog.vue +2 -2
  110. package/src/components/JobsStatusTray.vue +14 -8
  111. package/src/components/index.ts +4 -0
  112. package/src/composables/formBuilderRegistry.ts +2 -0
  113. package/src/composables/index.ts +18 -0
  114. package/src/composables/useApi.ts +1 -0
  115. package/src/composables/useGeneratedAnalysis.ts +1252 -0
  116. package/src/composables/useJobsStatusTray.ts +234 -45
  117. package/src/composables/usePluginClient.ts +54 -14
  118. package/src/generated/schema.ts +130 -0
  119. package/src/generated-ui/main.ts +21 -0
  120. package/src/index.ts +3 -0
  121. package/src/jobs.ts +5 -0
  122. package/src/plotly-dist.d.ts +3 -0
  123. package/src/templates/packs.ts +0 -3
  124. package/src/types/form-builder.ts +1 -0
  125. package/src/types/generated-ui.ts +176 -0
  126. package/src/types/index.ts +2 -0
  127. package/src/types/instrument.ts +1 -0
  128. package/src/types/jobs.ts +10 -1
  129. package/dist/BaseButton-Dgqrze41.js +0 -74
  130. package/dist/BaseButton-Dgqrze41.js.map +0 -1
  131. package/dist/BaseModal-B9UA8Y_I.js +0 -165
  132. package/dist/BaseModal-B9UA8Y_I.js.map +0 -1
  133. package/dist/BaseSelect-ekgr9fDo.js +0 -179
  134. package/dist/BaseSelect-ekgr9fDo.js.map +0 -1
  135. package/dist/ExperimentPopover-Ryusjrhv.js +0 -4
  136. package/dist/ExperimentSelectorModal-Cg4-LXBD.js +0 -5
  137. package/dist/ExperimentSelectorModal-DZeSd-yr.js.map +0 -1
  138. package/dist/SettingsModal-Bl_9w2Y3.js +0 -5
  139. package/dist/components-CpnOaPbP.js.map +0 -1
  140. package/dist/experiment-utils-Bfa7CwPU.js +0 -108
  141. package/dist/experiment-utils-Bfa7CwPU.js.map +0 -1
  142. package/dist/templates-CNbPQNID.js.map +0 -1
  143. package/dist/useAnalysisArtifacts-Ob8UtVwl.js.map +0 -1
  144. package/dist/useControlSchema-BZNdalmL.js.map +0 -1
  145. package/dist/useEventListener-CfVkP9Xz.js +0 -57
  146. package/dist/useEventListener-CfVkP9Xz.js.map +0 -1
  147. package/dist/useExperimentSelector-DRbj6vse.js.map +0 -1
@@ -20,6 +20,7 @@ export { useEventListener, type EventListenerEnabled, type EventFor, type EventL
20
20
  export { DEFAULT_MOBILE_VIEWPORT_QUERY, useMobileSupportGate, type MobileSupportSource, type MobileViewportQuerySource, type UseMobileSupportGateOptions, type UseMobileSupportGateReturn, } from './useMobileSupportGate';
21
21
  export { useDebouncedWatch, type DebouncedWatchCallback, type DebouncedWatchCleanup, type DebouncedWatchSource, type UseDebouncedWatchOptions, type UseDebouncedWatchReturn, } from './useDebouncedWatch';
22
22
  export { useFormBuilder, evaluateCondition } from './useFormBuilder';
23
+ export { createGeneratedAnalysisTransport, useGeneratedAnalysis, usePluginJobs, type GeneratedAnalysisTransport, type GeneratedAnalysisOptions, type PluginJobRequestOptions, type PluginJobWaitOptions, type UsePluginJobsOptions, type UsePluginJobsReturn, type UseGeneratedAnalysisReturn, } from './useGeneratedAnalysis';
23
24
  export { useAutoGroup, DEFAULT_COLORS, extractSamplesFromDesignData } from './useAutoGroup';
24
25
  export { useReagentSeries, generateDilutionSeries, DEFAULT_PRESETS, DEFAULT_UNITS, type LevelEntry, type DilutionPreset, type UseReagentSeriesReturn, } from './useReagentSeries';
25
26
  export { usePluginConfig, type UsePluginConfigReturn } from './usePluginConfig';
@@ -55,4 +56,4 @@ export { useBioTemplateWorkspace, type BioTemplateRendererBinding, type BioTempl
55
56
  export { useBioTemplatePresetWorkspace, type BioTemplatePresetWorkspaceBindings, type UseBioTemplatePresetWorkspaceOptions, type UseBioTemplatePresetWorkspaceReturn, } from './useBioTemplatePresetWorkspace';
56
57
  export { useBioTemplatePackWorkspace, type UseBioTemplatePackWorkspaceOptions, type UseBioTemplatePackWorkspaceReturn, } from './useBioTemplatePackWorkspace';
57
58
  export { buildPluginEndpointUrl, createPluginClient, downloadBlob, downloadPluginEndpoint, getPluginPageSelectorItems, pluginFormDataFromPayload, resolvePluginBaseUrl, uploadPluginEndpoint, usePluginClient, usePluginEventStream, usePluginSettings, useCurrentExperiment, type BuildPluginEndpointUrlOptions, type DownloadBlobOptions, type DownloadPluginEndpointOptions, type PluginContract, type PluginClientRequestOptions, type PluginEndpointContract, type PluginEndpointDefinition, type PluginHttpMethod, type PluginNavItemContract, type PluginEndpointRequestOptions, type PluginEventStreamMessage, type PluginEventStreamOptions, type PluginFormDataPayload, type PluginFormDataValue, type CreatePluginClientOptions, type UseCurrentExperimentOptions, type UseCurrentExperimentReturn, type UsePluginEventStreamReturn, type UsePluginSettingsOptions, type UsePluginSettingsReturn, } from './usePluginClient';
58
- export { useJobsStatusTray, type JobsStatusTrayAdapter, type JobsStatusTrayTab, type JobStreamMessage, type UseJobsStatusTrayOptions, type UseJobsStatusTrayReturn, } from './useJobsStatusTray';
59
+ export { combinePluginJobSources, usePluginJobCenter, useJobsStatusTray, type CombinedPluginJobCenterSource, type PluginJobCenterSource, type JobsStatusTrayAdapter, type JobsStatusTrayTab, type JobStreamMessage, type UsePluginJobCenterOptions, type UsePluginJobCenterReturn, type UseJobsStatusTrayOptions, type UseJobsStatusTrayReturn, } from './useJobsStatusTray';
@@ -1,11 +1,10 @@
1
- import "../BaseSelect-ekgr9fDo.js";
2
- import { $ as parseTime, A as useConcentrationUnits, C as controlsToViewIds, D as getTypeDefault, E as getFieldRegistryEntry, F as ATOMIC_WEIGHTS, G as findAvailableSlots, H as addMinutes, I as useChemicalFormula, J as formatTime, K as findNearestTimeSlotIndex, N as useSequenceUtils, Q as isTimeInRange, S as controlsToTopBarSettingsConfig, T as getDefaultControlView, U as compareTime, W as durationMinutes, X as fromMinutes, Y as formatTimeSlot, Z as generateTimeSlots, _ as controlsToFormSchema, a as defineDoseCalculatorControlProps, b as controlsToSettingsSchema, c as defineWellPlateDoseComponentBindings, d as defineControlModel, et as rangesOverlap, h as controlValuesToComponentProps, i as useControlSchema, l as defineWellPlateDoseControlProps, m as controlValuesToComponentBindingsById, n as defineControls, nt as toMinutes, o as defineDoseDesignControlModel, ot as useListSelection, p as controlValuesToComponentBindings, q as formatDuration, r as getControlDefaults, rt as useTimeUtils, s as defineWellPlateControlProps, st as useSelectionLimit, t as defineControlComponentBindings, tt as snapToSlot, u as useControlWorkspace, v as controlsToSectionFormSchema, w as controlsToViewItems, x as controlsToSidebarPanels, y as controlsToSectionFormSchemas } from "../useControlSchema-BZNdalmL.js";
3
- import { t as useEventListener } from "../useEventListener-CfVkP9Xz.js";
4
- import { $ as useAppExperiment, B as validateImportFile, C as useTemplateCollection, D as useExperimentData, E as useExperimentSamples, G as extractSampleOptionsFromDesignData, H as useAutoGroup, I as detectDelimiter, J as useWellPlateEditor, K as unwrapExperimentDesignData, L as parseDelimitedText, M as useSampleGroups, Q as APP_EXPERIMENT_KEY, R as readFileAsText, S as useBioTemplateControls, T as useScheduleDrag, V as extractSamplesFromDesignData, W as extractSampleNamesFromDesignData, X as DEFAULT_MOBILE_VIEWPORT_QUERY, Y as useDoseCalculator, Z as useMobileSupportGate, _ as useBioTemplatePackWorkspace, at as compareSortValues, b as toBioTemplateComponentPropsByComponent, d as DEFAULT_UNITS, et as useTheme, f as generateDilutionSeries, g as useBioTemplatePresetWorkspace, h as useRackEditor, it as useTextSearch, j as useExpansionSet, l as useProtocolTemplates, m as useGroupAssignment, n as useJobsStatusTray, nt as candidateMatchesSearch, ot as useSortedItems, p as useReagentSeries, q as DEFAULT_COLORS, rt as normalizeSearchQuery, t as useAnalysisArtifacts, tt as useToast, u as DEFAULT_PRESETS, v as useBioTemplateWorkspace, w as useExperimentSave, x as useBioTemplateComponents, y as getBioTemplateComponentProps, z as useFileImport } from "../useAnalysisArtifacts-Ob8UtVwl.js";
5
- import { i as usePlatformContext, n as evaluateCondition, r as useForm, t as useFormBuilder } from "../useFormBuilder-DKekvXRs.js";
6
- import { a as SORT_OPTIONS, c as formatExperimentStatus, i as EXPERIMENT_STATUS_VARIANT_MAP, l as getExperimentStatusVariant, n as EXPERIMENT_STATUS_LABELS, o as datePresetToISO, r as EXPERIMENT_STATUS_OPTIONS, s as formatExperimentDate, t as DATE_PRESET_OPTIONS, u as resolveExperimentCode } from "../experiment-utils-Bfa7CwPU.js";
7
- import { i as AuthenticationRequiredError, n as useDebouncedWatch, o as useApi, r as useRequestSyncState, t as useExperimentSelector } from "../useExperimentSelector-DRbj6vse.js";
8
- import { B as toBioTemplateComponentProps, H as toBioTemplateComponentPropsById, L as toBioTemplateComponentBindings, P as getBioTemplateComponentBindings, R as toBioTemplateComponentBindingsById, l as requireBioTemplateControlSchema, o as getBioTemplateControlSchema } from "../templates-CNbPQNID.js";
9
- import { t as ANALYSIS_FILE_ARTIFACT_SCHEMA } from "../analysisArtifactTypes-Cu40dzSG.js";
10
- import { A as resolvePluginFrontendBase, C as createPluginResourceClient, D as usePluginConfig, E as useCommandHistory, M as useAuth, O as useAsync, S as wellIdsInRectangle, T as useOptimisticMutation, _ as createWellPlateWells, a as pluginFormDataFromPayload, b as useWellPainting, c as usePluginClient, d as buildPluginEndpointUrl, f as resolvePluginBaseUrl, g as createRowConditions, h as createColumnConditions, i as getPluginPageSelectorItems, j as usePasskey, k as useAsyncBatch, l as usePluginEventStream, m as useWellPlateValidation, n as downloadBlob, o as uploadPluginEndpoint, p as runWellPlateValidation, r as downloadPluginEndpoint, s as useCurrentExperiment, t as createPluginClient, u as usePluginSettings, v as useWellPlateAdapter, w as useResourceCrud, x as wellIdToCoordinate, y as coordinateToWellId } from "../composables-OYTD0Y3r.js";
11
- export { ANALYSIS_FILE_ARTIFACT_SCHEMA, APP_EXPERIMENT_KEY, ATOMIC_WEIGHTS, AuthenticationRequiredError, DATE_PRESET_OPTIONS, DEFAULT_COLORS, DEFAULT_MOBILE_VIEWPORT_QUERY, DEFAULT_PRESETS, DEFAULT_UNITS, EXPERIMENT_STATUS_LABELS, EXPERIMENT_STATUS_OPTIONS, EXPERIMENT_STATUS_VARIANT_MAP, SORT_OPTIONS, addMinutes, buildPluginEndpointUrl, candidateMatchesSearch, compareSortValues, compareTime, controlValuesToComponentBindings, controlValuesToComponentBindingsById, controlValuesToComponentProps, controlsToFormSchema, controlsToSectionFormSchema, controlsToSectionFormSchemas, controlsToSettingsSchema, controlsToSidebarPanels, controlsToTopBarSettingsConfig, controlsToViewIds, controlsToViewItems, coordinateToWellId, createColumnConditions, createPluginClient, createPluginResourceClient, createRowConditions, createWellPlateWells, datePresetToISO, defineControlComponentBindings, defineControlModel, defineControls, defineDoseCalculatorControlProps, defineDoseDesignControlModel, defineWellPlateControlProps, defineWellPlateDoseComponentBindings, defineWellPlateDoseControlProps, detectDelimiter, downloadBlob, downloadPluginEndpoint, durationMinutes, evaluateCondition, extractSampleNamesFromDesignData, extractSampleOptionsFromDesignData, extractSamplesFromDesignData, findAvailableSlots, findNearestTimeSlotIndex, formatDuration, formatExperimentDate, formatExperimentStatus, formatTime, formatTimeSlot, fromMinutes, generateDilutionSeries, generateTimeSlots, getBioTemplateComponentBindings, getBioTemplateComponentProps, getBioTemplateControlSchema, getControlDefaults, getDefaultControlView, getExperimentStatusVariant, getFieldRegistryEntry, getPluginPageSelectorItems, getTypeDefault, isTimeInRange, normalizeSearchQuery, parseDelimitedText, parseTime, pluginFormDataFromPayload, rangesOverlap, readFileAsText, requireBioTemplateControlSchema, resolveExperimentCode, resolvePluginBaseUrl, resolvePluginFrontendBase, runWellPlateValidation, snapToSlot, toBioTemplateComponentBindings, toBioTemplateComponentBindingsById, toBioTemplateComponentProps, toBioTemplateComponentPropsByComponent, toBioTemplateComponentPropsById, toMinutes, unwrapExperimentDesignData, uploadPluginEndpoint, useAnalysisArtifacts, useApi, useAppExperiment, useAsync, useAsyncBatch, useAuth, useAutoGroup, useBioTemplateComponents, useBioTemplateControls, useBioTemplatePackWorkspace, useBioTemplatePresetWorkspace, useBioTemplateWorkspace, useChemicalFormula, useCommandHistory, useConcentrationUnits, useControlSchema, useControlWorkspace, useCurrentExperiment, useDebouncedWatch, useDoseCalculator, useEventListener, useExpansionSet, useExperimentData, useExperimentSamples, useExperimentSave, useExperimentSelector, useFileImport, useForm, useFormBuilder, useGroupAssignment, useJobsStatusTray, useListSelection, useMobileSupportGate, useOptimisticMutation, usePasskey, usePlatformContext, usePluginClient, usePluginConfig, usePluginEventStream, usePluginSettings, useProtocolTemplates, useRackEditor, useReagentSeries, useRequestSyncState, useResourceCrud, useSampleGroups, useScheduleDrag, useSelectionLimit, useSequenceUtils, useSortedItems, useTemplateCollection, useTextSearch, useTheme, useTimeUtils, useToast, useWellPainting, useWellPlateAdapter, useWellPlateEditor, useWellPlateValidation, validateImportFile, wellIdToCoordinate, wellIdsInRectangle };
1
+ import { a as SORT_OPTIONS, c as formatExperimentStatus, f as useEventListener, i as EXPERIMENT_STATUS_VARIANT_MAP, l as getExperimentStatusVariant, n as EXPERIMENT_STATUS_LABELS, o as datePresetToISO, r as EXPERIMENT_STATUS_OPTIONS, s as formatExperimentDate, t as DATE_PRESET_OPTIONS, u as resolveExperimentCode } from "../experiment-utils-CxkruZ3G.js";
2
+ import { i as AuthenticationRequiredError, o as useApi, r as useRequestSyncState } from "../EmptyState-D1c4RdC7.js";
3
+ import { A as useConcentrationUnits, B as useAnalysisArtifacts, C as controlsToViewIds, D as getTypeDefault, E as getFieldRegistryEntry, F as ATOMIC_WEIGHTS, G as createGeneratedAnalysisTransport, I as useChemicalFormula, K as useGeneratedAnalysis, N as useSequenceUtils, S as controlsToTopBarSettingsConfig, T as getDefaultControlView, Tt as useSelectionLimit, _ as controlsToFormSchema, _t as parseTime, a as defineDoseCalculatorControlProps, b as controlsToSettingsSchema, bt as toMinutes, c as defineWellPlateDoseComponentBindings, ct as durationMinutes, d as defineControlModel, dt as formatDuration, ft as formatTime, gt as isTimeInRange, h as controlValuesToComponentProps, ht as generateTimeSlots, i as useControlSchema, l as defineWellPlateDoseControlProps, lt as findAvailableSlots, m as controlValuesToComponentBindingsById, mt as fromMinutes, n as defineControls, o as defineDoseDesignControlModel, ot as addMinutes, p as controlValuesToComponentBindings, pt as formatTimeSlot, q as usePluginJobs, r as getControlDefaults, s as defineWellPlateControlProps, st as compareTime, t as defineControlComponentBindings, u as useControlWorkspace, ut as findNearestTimeSlotIndex, v as controlsToSectionFormSchema, vt as rangesOverlap, w as controlsToViewItems, wt as useListSelection, x as controlsToSidebarPanels, xt as useTimeUtils, y as controlsToSectionFormSchemas, yt as snapToSlot } from "../useControlSchema-Dallso-L.js";
4
+ import { A as extractSamplesFromDesignData, B as useJobsStatusTray, D as readFileAsText, E as parseDelimitedText, F as unwrapExperimentDesignData, G as useAppExperiment, H as DEFAULT_MOBILE_VIEWPORT_QUERY, I as DEFAULT_COLORS, J as candidateMatchesSearch, K as useTheme, L as useWellPlateEditor, N as extractSampleNamesFromDesignData, O as useFileImport, P as extractSampleOptionsFromDesignData, Q as useSortedItems, R as useDoseCalculator, T as detectDelimiter, U as useMobileSupportGate, V as usePluginJobCenter, W as APP_EXPERIMENT_KEY, X as useTextSearch, Y as normalizeSearchQuery, Z as compareSortValues, _ as useScheduleDrag, a as useReagentSeries, b as useExpansionSet, c as useBioTemplatePresetWorkspace, d as getBioTemplateComponentProps, f as toBioTemplateComponentPropsByComponent, g as useExperimentSave, h as useTemplateCollection, i as generateDilutionSeries, j as useAutoGroup, k as validateImportFile, l as useBioTemplatePackWorkspace, m as useBioTemplateControls, n as DEFAULT_PRESETS, o as useGroupAssignment, p as useBioTemplateComponents, q as useToast, r as DEFAULT_UNITS, s as useRackEditor, t as useProtocolTemplates, u as useBioTemplateWorkspace, v as useExperimentSamples, x as useSampleGroups, y as useExperimentData, z as combinePluginJobSources } from "../useProtocolTemplates-BP7_4RGQ.js";
5
+ import { i as usePlatformContext, n as evaluateCondition, r as useForm, t as useFormBuilder } from "../useFormBuilder-BXaaDI41.js";
6
+ import { t as ANALYSIS_FILE_ARTIFACT_SCHEMA } from "../analysisArtifactTypes-ejqR8MX3.js";
7
+ import { B as toBioTemplateComponentProps, H as toBioTemplateComponentPropsById, L as toBioTemplateComponentBindings, P as getBioTemplateComponentBindings, R as toBioTemplateComponentBindingsById, l as requireBioTemplateControlSchema, o as getBioTemplateControlSchema } from "../templates-Cttbjbyc.js";
8
+ import { n as useDebouncedWatch, t as useExperimentSelector } from "../useExperimentSelector-BMjzNcf2.js";
9
+ import { A as resolvePluginFrontendBase, C as createPluginResourceClient, D as usePluginConfig, E as useCommandHistory, M as useAuth, O as useAsync, S as wellIdsInRectangle, T as useOptimisticMutation, _ as createWellPlateWells, a as pluginFormDataFromPayload, b as useWellPainting, c as usePluginClient, d as buildPluginEndpointUrl, f as resolvePluginBaseUrl, g as createRowConditions, h as createColumnConditions, i as getPluginPageSelectorItems, j as usePasskey, k as useAsyncBatch, l as usePluginEventStream, m as useWellPlateValidation, n as downloadBlob, o as uploadPluginEndpoint, p as runWellPlateValidation, r as downloadPluginEndpoint, s as useCurrentExperiment, t as createPluginClient, u as usePluginSettings, v as useWellPlateAdapter, w as useResourceCrud, x as wellIdToCoordinate, y as coordinateToWellId } from "../composables-F4JFK9K1.js";
10
+ export { ANALYSIS_FILE_ARTIFACT_SCHEMA, APP_EXPERIMENT_KEY, ATOMIC_WEIGHTS, AuthenticationRequiredError, DATE_PRESET_OPTIONS, DEFAULT_COLORS, DEFAULT_MOBILE_VIEWPORT_QUERY, DEFAULT_PRESETS, DEFAULT_UNITS, EXPERIMENT_STATUS_LABELS, EXPERIMENT_STATUS_OPTIONS, EXPERIMENT_STATUS_VARIANT_MAP, SORT_OPTIONS, addMinutes, buildPluginEndpointUrl, candidateMatchesSearch, combinePluginJobSources, compareSortValues, compareTime, controlValuesToComponentBindings, controlValuesToComponentBindingsById, controlValuesToComponentProps, controlsToFormSchema, controlsToSectionFormSchema, controlsToSectionFormSchemas, controlsToSettingsSchema, controlsToSidebarPanels, controlsToTopBarSettingsConfig, controlsToViewIds, controlsToViewItems, coordinateToWellId, createColumnConditions, createGeneratedAnalysisTransport, createPluginClient, createPluginResourceClient, createRowConditions, createWellPlateWells, datePresetToISO, defineControlComponentBindings, defineControlModel, defineControls, defineDoseCalculatorControlProps, defineDoseDesignControlModel, defineWellPlateControlProps, defineWellPlateDoseComponentBindings, defineWellPlateDoseControlProps, detectDelimiter, downloadBlob, downloadPluginEndpoint, durationMinutes, evaluateCondition, extractSampleNamesFromDesignData, extractSampleOptionsFromDesignData, extractSamplesFromDesignData, findAvailableSlots, findNearestTimeSlotIndex, formatDuration, formatExperimentDate, formatExperimentStatus, formatTime, formatTimeSlot, fromMinutes, generateDilutionSeries, generateTimeSlots, getBioTemplateComponentBindings, getBioTemplateComponentProps, getBioTemplateControlSchema, getControlDefaults, getDefaultControlView, getExperimentStatusVariant, getFieldRegistryEntry, getPluginPageSelectorItems, getTypeDefault, isTimeInRange, normalizeSearchQuery, parseDelimitedText, parseTime, pluginFormDataFromPayload, rangesOverlap, readFileAsText, requireBioTemplateControlSchema, resolveExperimentCode, resolvePluginBaseUrl, resolvePluginFrontendBase, runWellPlateValidation, snapToSlot, toBioTemplateComponentBindings, toBioTemplateComponentBindingsById, toBioTemplateComponentProps, toBioTemplateComponentPropsByComponent, toBioTemplateComponentPropsById, toMinutes, unwrapExperimentDesignData, uploadPluginEndpoint, useAnalysisArtifacts, useApi, useAppExperiment, useAsync, useAsyncBatch, useAuth, useAutoGroup, useBioTemplateComponents, useBioTemplateControls, useBioTemplatePackWorkspace, useBioTemplatePresetWorkspace, useBioTemplateWorkspace, useChemicalFormula, useCommandHistory, useConcentrationUnits, useControlSchema, useControlWorkspace, useCurrentExperiment, useDebouncedWatch, useDoseCalculator, useEventListener, useExpansionSet, useExperimentData, useExperimentSamples, useExperimentSave, useExperimentSelector, useFileImport, useForm, useFormBuilder, useGeneratedAnalysis, useGroupAssignment, useJobsStatusTray, useListSelection, useMobileSupportGate, useOptimisticMutation, usePasskey, usePlatformContext, usePluginClient, usePluginConfig, usePluginEventStream, usePluginJobCenter, usePluginJobs, usePluginSettings, useProtocolTemplates, useRackEditor, useReagentSeries, useRequestSyncState, useResourceCrud, useSampleGroups, useScheduleDrag, useSelectionLimit, useSequenceUtils, useSortedItems, useTemplateCollection, useTextSearch, useTheme, useTimeUtils, useToast, useWellPainting, useWellPlateAdapter, useWellPlateEditor, useWellPlateValidation, validateImportFile, wellIdToCoordinate, wellIdsInRectangle };
@@ -0,0 +1,62 @@
1
+ import { ComputedRef, Ref, ShallowRef } from 'vue';
2
+ import { JobsStatusTrayAdapter, PluginJobCenterSource } from './useJobsStatusTray';
3
+ import { GeneratedAnalysisJob, GeneratedAnalysisResult, GeneratedSession, GeneratedAnalysisManifest, PluginJobPathInput, PluginJobPathUpload, PluginJobStagedPartInput, PluginJobStagedPartUploadResult, PluginJobStaging, PluginJobStagingPagination } from '../types/generated-ui';
4
+ export type GeneratedAnalysisTransport = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
5
+ export interface GeneratedAnalysisTransportOptions {
6
+ fetcher?: typeof fetch;
7
+ getAccessToken?: () => string | null | undefined;
8
+ }
9
+ export interface UsePluginJobsOptions {
10
+ baseUrl: string;
11
+ transport?: GeneratedAnalysisTransport;
12
+ storage?: Storage;
13
+ createId?: () => string;
14
+ pollInterval?: number;
15
+ stream?: boolean;
16
+ streamReconnectDelay?: number;
17
+ immediate?: boolean;
18
+ }
19
+ export type GeneratedAnalysisOptions = UsePluginJobsOptions;
20
+ export interface PluginJobWaitOptions {
21
+ signal?: AbortSignal;
22
+ rejectOnFailure?: boolean;
23
+ }
24
+ export interface PluginJobRequestOptions {
25
+ signal?: AbortSignal;
26
+ }
27
+ export interface UsePluginJobsReturn extends PluginJobCenterSource {
28
+ manifest: ShallowRef<GeneratedAnalysisManifest | null>;
29
+ session: ShallowRef<GeneratedSession | null>;
30
+ jobs: ShallowRef<GeneratedAnalysisJob[]>;
31
+ latestResult: ComputedRef<GeneratedAnalysisResult | null>;
32
+ isLoading: Ref<boolean>;
33
+ isSubmitting: Ref<boolean>;
34
+ error: ShallowRef<string | null>;
35
+ status: ShallowRef<'idle' | 'initializing' | 'ready' | 'paused' | 'error' | 'disposed'>;
36
+ initialize: () => Promise<void>;
37
+ ready: () => Promise<void>;
38
+ uploadPath: (input: PluginJobPathInput) => Promise<PluginJobPathUpload>;
39
+ uploadStagedPart: <Metadata>(input: PluginJobStagedPartInput<Metadata>) => Promise<PluginJobStagedPartUploadResult<Metadata>>;
40
+ getJobStaging: <Metadata = unknown>(job: GeneratedAnalysisJob | string, pagination?: PluginJobStagingPagination) => Promise<PluginJobStaging<Metadata>>;
41
+ sealJob: (job: GeneratedAnalysisJob | string) => Promise<GeneratedAnalysisJob>;
42
+ submit: (definitionId: string, inputs: Record<string, unknown>) => Promise<GeneratedAnalysisJob>;
43
+ loadResult: (job: GeneratedAnalysisJob) => Promise<GeneratedAnalysisResult | null>;
44
+ resultForJob: (jobId: string) => GeneratedAnalysisResult | null;
45
+ refreshJobs: () => Promise<GeneratedAnalysisJob[]>;
46
+ refresh: () => Promise<GeneratedAnalysisJob[]>;
47
+ getJob: (jobId: string, options?: PluginJobRequestOptions) => Promise<GeneratedAnalysisJob>;
48
+ waitForJob: (job: GeneratedAnalysisJob | string, options?: PluginJobWaitOptions) => Promise<GeneratedAnalysisJob>;
49
+ jobsFor: (definitionId: string) => GeneratedAnalysisJob[];
50
+ cancelJob: (job: GeneratedAnalysisJob | string) => Promise<GeneratedAnalysisJob>;
51
+ deleteJob: (job: GeneratedAnalysisJob | string) => Promise<boolean>;
52
+ clearFinishedJobs: (definitionId?: string) => Promise<number>;
53
+ pause: () => void;
54
+ resume: () => void;
55
+ dispose: () => void;
56
+ /** @deprecated Pass the runtime itself to SDK job UI as its source. */
57
+ jobsAdapter: JobsStatusTrayAdapter;
58
+ }
59
+ export type UseGeneratedAnalysisReturn = UsePluginJobsReturn;
60
+ export declare function createGeneratedAnalysisTransport(options?: GeneratedAnalysisTransportOptions): GeneratedAnalysisTransport;
61
+ export declare function useGeneratedAnalysis(options: GeneratedAnalysisOptions): UseGeneratedAnalysisReturn;
62
+ export declare function usePluginJobs(options: UsePluginJobsOptions): UsePluginJobsReturn;
@@ -2,28 +2,64 @@ import { ComputedRef, MaybeRefOrGetter, Ref, ShallowRef } from 'vue';
2
2
  import { JobListPayload, JobState, JobStateInput, JobStreamData } from '../types/jobs';
3
3
  import { UsePluginEventStreamReturn } from './usePluginClient';
4
4
  export type JobsStatusTrayTab = 'active' | 'history';
5
+ /**
6
+ * The canonical owner of a collection of plugin jobs.
7
+ *
8
+ * Sources, rather than job-center UI, own polling, event streams, and all job
9
+ * mutations. This keeps components and consumers on one reactive job graph.
10
+ */
11
+ export interface PluginJobCenterSource {
12
+ jobs: MaybeRefOrGetter<readonly JobStateInput[]>;
13
+ refreshJobs?: () => Promise<JobListPayload | readonly JobStateInput[] | void>;
14
+ cancelJob?: (jobId: string) => Promise<JobStateInput | void>;
15
+ deleteJob?: (jobId: string) => Promise<boolean | void>;
16
+ clearFinishedJobs?: () => Promise<number | void>;
17
+ dispose?: () => void;
18
+ }
19
+ export interface CombinedPluginJobCenterSource extends PluginJobCenterSource {
20
+ jobs: ComputedRef<readonly JobStateInput[]>;
21
+ }
22
+ /**
23
+ * Combines independent job runtimes without copying their reactive state.
24
+ *
25
+ * Job ids must be globally unique across the sources. A duplicate id throws
26
+ * when jobs are read or an id-routed action is requested, rather than silently
27
+ * dispatching a mutation to the wrong owner.
28
+ */
29
+ export declare function combinePluginJobSources(sources: readonly PluginJobCenterSource[]): CombinedPluginJobCenterSource;
30
+ /** @deprecated Prefer a {@link PluginJobCenterSource}. */
5
31
  export interface JobsStatusTrayAdapter {
6
32
  listJobs?: () => Promise<JobListPayload | readonly JobStateInput[]>;
7
33
  cancelJob?: (job: JobState) => Promise<JobStateInput | void>;
8
34
  deleteJob?: (job: JobState) => Promise<boolean | void>;
9
35
  clearFinishedJobs?: (jobs: readonly JobState[]) => Promise<number | void>;
10
36
  }
11
- export interface UseJobsStatusTrayOptions {
37
+ export interface UsePluginJobCenterOptions {
38
+ source?: MaybeRefOrGetter<PluginJobCenterSource | undefined>;
39
+ /** @deprecated Pass a source with its canonical jobs ref. */
12
40
  jobs?: MaybeRefOrGetter<readonly JobStateInput[] | undefined>;
41
+ /** @deprecated Pass source actions instead. */
13
42
  adapter?: MaybeRefOrGetter<JobsStatusTrayAdapter | undefined>;
43
+ /** @deprecated Event handling belongs to the source runtime. */
14
44
  eventStream?: MaybeRefOrGetter<UsePluginEventStreamReturn<JobStreamData> | undefined>;
15
45
  loadOnMount?: boolean;
16
46
  }
47
+ export interface UseJobsStatusTrayOptions extends UsePluginJobCenterOptions {
48
+ }
17
49
  export interface JobStreamMessage {
18
50
  event: string;
19
51
  data: JobStreamData;
20
52
  }
21
- export interface UseJobsStatusTrayReturn {
22
- jobs: ShallowRef<JobState[]>;
53
+ export interface UsePluginJobCenterReturn {
54
+ jobs: ComputedRef<JobState[]>;
23
55
  activeJobs: ComputedRef<JobState[]>;
24
56
  historyJobs: ComputedRef<JobState[]>;
25
57
  deletableJobs: ComputedRef<JobState[]>;
26
58
  featuredJob: ComputedRef<JobState | null>;
59
+ canRefresh: ComputedRef<boolean>;
60
+ canCancel: ComputedRef<boolean>;
61
+ canDelete: ComputedRef<boolean>;
62
+ canClearFinished: ComputedRef<boolean>;
27
63
  isOpen: Ref<boolean>;
28
64
  activeTab: Ref<JobsStatusTrayTab>;
29
65
  isLoading: Ref<boolean>;
@@ -39,5 +75,13 @@ export interface UseJobsStatusTrayReturn {
39
75
  clearFinished: () => Promise<boolean>;
40
76
  isPending: (job: JobState) => boolean;
41
77
  }
42
- /** Headless state and action controller for the standard SDK jobs tray. */
78
+ export type UseJobsStatusTrayReturn = UsePluginJobCenterReturn;
79
+ /**
80
+ * Headless controller for plugin job presentation and actions.
81
+ *
82
+ * When a source is supplied, every job list is derived directly from that
83
+ * source. The controller never mirrors source jobs into another ref.
84
+ */
85
+ export declare function usePluginJobCenter(options?: UsePluginJobCenterOptions): UsePluginJobCenterReturn;
86
+ /** Backward-compatible name for the plugin job-center controller. */
43
87
  export declare function useJobsStatusTray(options?: UseJobsStatusTrayOptions): UseJobsStatusTrayReturn;
@@ -1,11 +1,12 @@
1
1
  import { ComputedRef, Ref } from 'vue';
2
- import { ExperimentSummary, PageSelectorItem, SettingsModalSchema, TopBarSettingsConfig } from '../types';
2
+ import { ExperimentSummary, GeneratedJobDefinition, PageSelectorItem, SettingsModalSchema, TopBarSettingsConfig } from '../types';
3
3
  export { buildPluginEndpointUrl, resolvePluginBaseUrl, } from './pluginEndpointBuilder';
4
4
  export type PluginHttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete';
5
5
  export interface PluginEndpointContract {
6
6
  name: string;
7
7
  method: PluginHttpMethod;
8
8
  path: string;
9
+ requiresAuth?: boolean;
9
10
  pathParams?: PluginEndpointParamContract[];
10
11
  queryParams?: PluginEndpointParamContract[];
11
12
  requestType?: string | null;
@@ -52,11 +53,13 @@ export interface PluginContract {
52
53
  schema?: SettingsModalSchema | null;
53
54
  };
54
55
  endpoints: PluginEndpointContract[];
56
+ jobs?: GeneratedJobDefinition[];
55
57
  hash: string;
56
58
  }
57
59
  export interface PluginEndpointDefinition {
58
60
  method: PluginHttpMethod;
59
61
  path: string;
62
+ requiresAuth?: boolean;
60
63
  pathParams?: PluginEndpointParamDefinition[];
61
64
  queryParams?: PluginEndpointParamDefinition[];
62
65
  hasBody?: boolean;
@@ -109,7 +112,7 @@ export interface UsePluginSettingsOptions {
109
112
  apiBaseUrl?: string;
110
113
  /** Platform API base URL for /plugins/{name}/config. Defaults to the injected platform API URL. */
111
114
  platformApiBaseUrl?: string;
112
- /** SettingsModal schema generated from the backend settings_model. */
115
+ /** SettingsModal schema generated from the backend plugin config model. */
113
116
  schema?: SettingsModalSchema | null;
114
117
  /** SettingsModal title when using settingsConfig. */
115
118
  title?: string;
@@ -205,7 +208,7 @@ export type GeneratedPluginClient = Record<string, (...args: any[]) => Promise<a
205
208
  export declare function pluginFormDataFromPayload(payload: unknown): FormData;
206
209
  /** Trigger a browser download for an already-created Blob. */
207
210
  export declare function downloadBlob(blob: Blob, filename: string, options?: DownloadBlobOptions): void;
208
- /** Convert PluginMetadata.nav_items into AppTopBar pageSelector items for topbar page switches and homepage PluginCards. */
211
+ /** Convert resolved @mint_plugin nav_items into page selectors for the topbar and homepage PluginCards. */
209
212
  export declare function getPluginPageSelectorItems(contract: PluginContract): PageSelectorItem[];
210
213
  /** Create a typed plugin API client from a generated MINT plugin contract. */
211
214
  export declare function createPluginClient<TClient extends object = GeneratedPluginClient>(contract: PluginContract, options: CreatePluginClientOptions): TClient;
@@ -1,7 +1,7 @@
1
- import { A as resolveCurrentExperimentId, O as currentExperimentFromContext, k as getInjectedPlatformContext } from "./useAnalysisArtifacts-Ob8UtVwl.js";
2
- import { r as useSettingsStore, t as useAuthStore } from "./auth-DZAwEeis.js";
3
- import { i as usePlatformContext } from "./useFormBuilder-DKekvXRs.js";
4
- import { a as authenticationRequiredError, i as AuthenticationRequiredError, o as useApi, r as useRequestSyncState } from "./useExperimentSelector-DRbj6vse.js";
1
+ import { a as authenticationRequiredError, i as AuthenticationRequiredError, o as useApi, r as useRequestSyncState } from "./EmptyState-D1c4RdC7.js";
2
+ import { H as getInjectedPlatformContext, V as currentExperimentFromContext, W as resolveCurrentExperimentId } from "./useControlSchema-Dallso-L.js";
3
+ import { r as useSettingsStore, t as useAuthStore } from "./auth-B87xM--s.js";
4
+ import { i as usePlatformContext } from "./useFormBuilder-BXaaDI41.js";
5
5
  import { computed, getCurrentInstance, onMounted, onUnmounted, ref, shallowRef, toValue, watch } from "vue";
6
6
  import axios from "axios";
7
7
  //#region src/composables/useAuth.ts
@@ -1437,7 +1437,7 @@ function pluginPageIdFromPath(path, fallbackIndex) {
1437
1437
  if (normalizedPath === "/") return "dashboard";
1438
1438
  return normalizedPath.replace(/^\/+/, "").replace(/\/+/g, "-") || `page-${fallbackIndex + 1}`;
1439
1439
  }
1440
- /** Convert PluginMetadata.nav_items into AppTopBar pageSelector items for topbar page switches and homepage PluginCards. */
1440
+ /** Convert resolved @mint_plugin nav_items into page selectors for the topbar and homepage PluginCards. */
1441
1441
  function getPluginPageSelectorItems(contract) {
1442
1442
  const pluginIcon = contract.plugin.icon ?? "";
1443
1443
  return (contract.plugin.navItems ?? []).map((item, index) => ({
@@ -1455,7 +1455,10 @@ function createPluginClient(contract, options) {
1455
1455
  const payload = hasPayload ? payloadOrOptions : void 0;
1456
1456
  const callOptions = hasPayload ? explicitOptions : payloadOrOptions ?? explicitOptions;
1457
1457
  const parts = pluginEndpointRequestParts(contract, endpoint, payload, options.baseUrl);
1458
- const api = useApi({ baseUrl: parts.baseUrl });
1458
+ const api = useApi({
1459
+ baseUrl: parts.baseUrl,
1460
+ withAuth: endpoint.requiresAuth !== false
1461
+ });
1459
1462
  const config = endpointRequestConfig(endpoint, parts.query, callOptions);
1460
1463
  if (endpoint.method === "get") return api.get(parts.path, config);
1461
1464
  if (endpoint.method === "delete") {
@@ -1483,7 +1486,10 @@ async function uploadPluginEndpoint(contract, endpoint, payload, options = {}) {
1483
1486
  "patch"
1484
1487
  ].includes(endpoint.method)) throw new Error(`[MINT SDK] Plugin upload endpoints must use POST, PUT, or PATCH; got ${endpoint.method}`);
1485
1488
  const parts = pluginEndpointRequestParts(contract, endpoint, payload, options.baseUrl);
1486
- const api = useApi({ baseUrl: parts.baseUrl });
1489
+ const api = useApi({
1490
+ baseUrl: parts.baseUrl,
1491
+ withAuth: endpoint.requiresAuth !== false
1492
+ });
1487
1493
  const body = endpoint.hasBody ? requestBodyFromPayload(payload, parts.requestPayload, endpoint) : payload;
1488
1494
  if (endpoint.requestContentType === OCTET_STREAM) {
1489
1495
  const config = endpointRequestConfig(endpoint, parts.query, { signal: options.signal });
@@ -1503,12 +1509,28 @@ async function uploadPluginEndpoint(contract, endpoint, payload, options = {}) {
1503
1509
  }
1504
1510
  /** Fetch a generated plugin endpoint as a Blob and optionally trigger a browser download. */
1505
1511
  async function downloadPluginEndpoint(contract, endpoint, payload, options = {}) {
1512
+ if (endpoint.requestContentType === MULTIPART_FORM_DATA) throw new Error("[MINT SDK] Plugin download endpoints do not support multipart request bodies");
1506
1513
  const parts = pluginEndpointRequestParts(contract, endpoint, payload, options.baseUrl);
1507
- const blob = await useApi({ baseUrl: parts.baseUrl }).get(parts.path, {
1508
- ...queryConfig(parts.query) ?? {},
1509
- ...options.signal ? { signal: options.signal } : {},
1514
+ const api = useApi({
1515
+ baseUrl: parts.baseUrl,
1516
+ withAuth: endpoint.requiresAuth !== false
1517
+ });
1518
+ const config = {
1519
+ ...endpointRequestConfig(endpoint, parts.query, { signal: options.signal }) ?? {},
1510
1520
  responseType: "blob"
1521
+ };
1522
+ const rawBody = requestBodyFromPayload(payload, parts.requestPayload, endpoint);
1523
+ const body = rawBody === void 0 ? void 0 : endpointRequestBody(endpoint, rawBody);
1524
+ let blob;
1525
+ if (endpoint.method === "get") blob = await api.get(parts.path, config);
1526
+ else if (endpoint.method === "post") blob = await api.post(parts.path, body, config);
1527
+ else if (endpoint.method === "put") blob = await api.put(parts.path, body, config);
1528
+ else if (endpoint.method === "patch") blob = await api.patch(parts.path, body, config);
1529
+ else if (endpoint.method === "delete") blob = await api.delete(parts.path, body === void 0 ? config : {
1530
+ ...config,
1531
+ data: body
1511
1532
  });
1533
+ else throw new Error(`[MINT SDK] Unsupported plugin endpoint method: ${endpoint.method}`);
1512
1534
  if (options.filename) downloadBlob(blob, options.filename, { revokeObjectUrlDelayMs: options.revokeObjectUrlDelayMs });
1513
1535
  return blob;
1514
1536
  }
@@ -1616,13 +1638,13 @@ function usePluginSettings(options = {}) {
1616
1638
  reset
1617
1639
  };
1618
1640
  }
1619
- function streamRequestAuth(options) {
1641
+ function streamRequestAuth(options, policy) {
1620
1642
  const headers = new Headers(options.headers);
1621
1643
  const authStore = useAuthStore();
1622
1644
  if (!authStore.isInitialized) authStore.initialize();
1623
- if (authStore.token && !headers.has("Authorization")) headers.set("Authorization", `Bearer ${authStore.token}`);
1645
+ if (policy.requiresAuth && authStore.token && !headers.has("Authorization")) headers.set("Authorization", `Bearer ${authStore.token}`);
1624
1646
  headers.set("Accept", "text/event-stream");
1625
- const token = authStore.token;
1647
+ const token = policy.requiresAuth ? authStore.token : void 0;
1626
1648
  return {
1627
1649
  headers,
1628
1650
  token: token && headers.get("Authorization") === `Bearer ${token}` ? token : void 0
@@ -1718,7 +1740,7 @@ function usePluginEventStream(contract, endpoint, payloadOrOptions, maybeOptions
1718
1740
  let authenticationFailed = false;
1719
1741
  try {
1720
1742
  const url = buildPluginEndpointUrl(contract, endpoint, payload, { baseUrl: options.baseUrl });
1721
- const requestAuth = streamRequestAuth(options);
1743
+ const requestAuth = streamRequestAuth(options, { requiresAuth: endpoint.requiresAuth !== false });
1722
1744
  const response = await fetch(url, {
1723
1745
  method: "GET",
1724
1746
  headers: requestAuth.headers,
@@ -1877,4 +1899,4 @@ function useCurrentExperiment(options = {}) {
1877
1899
  //#endregion
1878
1900
  export { resolvePluginFrontendBase as A, createPluginResourceClient as C, usePluginConfig as D, useCommandHistory as E, useAuth as M, useAsync as O, wellIdsInRectangle as S, useOptimisticMutation as T, createWellPlateWells as _, pluginFormDataFromPayload as a, useWellPainting as b, usePluginClient as c, buildPluginEndpointUrl as d, resolvePluginBaseUrl as f, createRowConditions as g, createColumnConditions as h, getPluginPageSelectorItems as i, usePasskey as j, useAsyncBatch as k, usePluginEventStream as l, useWellPlateValidation as m, downloadBlob as n, uploadPluginEndpoint as o, runWellPlateValidation as p, downloadPluginEndpoint as r, useCurrentExperiment as s, createPluginClient as t, usePluginSettings as u, useWellPlateAdapter as v, useResourceCrud as w, wellIdToCoordinate as x, coordinateToWellId as y };
1879
1901
 
1880
- //# sourceMappingURL=composables-OYTD0Y3r.js.map
1902
+ //# sourceMappingURL=composables-F4JFK9K1.js.map