@morscherlab/mint-sdk 1.2.0-beta.3 → 1.2.0-beta.5

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 (1063) hide show
  1. package/README.md +8 -2
  2. package/dist/{EmptyState-p90quq8Z.js → EmptyState-NBqf2_8z.js} +3 -1
  3. package/dist/EmptyState-NBqf2_8z.js.map +1 -0
  4. package/dist/{ExperimentPopover-Bn6PIGHE.js → ExperimentPopover-CfOdh5Rm.js} +11 -6
  5. package/dist/ExperimentPopover-CfOdh5Rm.js.map +1 -0
  6. package/dist/{ExperimentSelectorModal-DGhrJSSV.js → ExperimentSelectorModal-DvIagrxY.js} +13 -8
  7. package/dist/ExperimentSelectorModal-DvIagrxY.js.map +1 -0
  8. package/dist/{SettingsModal-wF2btHu6.js → SettingsModal-W3TYfnP9.js} +13 -11
  9. package/dist/SettingsModal-W3TYfnP9.js.map +1 -0
  10. package/dist/__stories__/experiment-helpers.d.ts +28 -0
  11. package/dist/__tests__/components/ActionItem.test.d.ts +1 -0
  12. package/dist/__tests__/components/ActionMenu.test.d.ts +1 -0
  13. package/dist/__tests__/components/AppAvatarMenu.test.d.ts +1 -0
  14. package/dist/__tests__/components/AppLayout.test.d.ts +1 -0
  15. package/dist/__tests__/components/AppPluginSwitcher.test.d.ts +1 -0
  16. package/dist/__tests__/components/AppSidebar.test.d.ts +1 -0
  17. package/dist/__tests__/components/AppToastContainer.test.d.ts +1 -0
  18. package/dist/__tests__/components/AppTopBar.navigation.test.d.ts +1 -0
  19. package/dist/__tests__/components/AppTopBar.test.d.ts +1 -0
  20. package/dist/__tests__/components/AppTopBarPageSelector.test.d.ts +1 -0
  21. package/dist/__tests__/components/AppTopBarPillNav.test.d.ts +1 -0
  22. package/dist/__tests__/components/AppTopBarPresence.test.d.ts +1 -0
  23. package/dist/__tests__/components/ArtifactSaveDialog.test.d.ts +1 -0
  24. package/dist/__tests__/components/ArtifactSelectorModal.test.d.ts +1 -0
  25. package/dist/__tests__/components/AutoGroupModal.adapter.test.d.ts +1 -0
  26. package/dist/__tests__/components/BaseInput.test.d.ts +1 -0
  27. package/dist/__tests__/components/BaseModal.test.d.ts +1 -0
  28. package/dist/__tests__/components/BasePill.test.d.ts +1 -0
  29. package/dist/__tests__/components/BaseRadioGroup.test.d.ts +1 -0
  30. package/dist/__tests__/components/BaseSelect.test.d.ts +1 -0
  31. package/dist/__tests__/components/BaseTabs.test.d.ts +1 -0
  32. package/dist/__tests__/components/BaseToggle.test.d.ts +1 -0
  33. package/dist/__tests__/components/BatchProgressList.test.d.ts +1 -0
  34. package/dist/__tests__/components/BioTemplateExperimentWorkspaceView.test.d.ts +1 -0
  35. package/dist/__tests__/components/BioTemplatePackWorkspaceView.test.d.ts +1 -0
  36. package/dist/__tests__/components/BioTemplatePresetWorkspaceView.test.d.ts +1 -0
  37. package/dist/__tests__/components/BioTemplateRenderer.test.d.ts +1 -0
  38. package/dist/__tests__/components/Breadcrumb.test.d.ts +1 -0
  39. package/dist/__tests__/components/Calendar.test.d.ts +1 -0
  40. package/dist/__tests__/components/CalendarGridPanel.test.d.ts +1 -0
  41. package/dist/__tests__/components/CollapsibleCard.test.d.ts +1 -0
  42. package/dist/__tests__/components/ComponentBindingRenderer.test.d.ts +1 -0
  43. package/dist/__tests__/components/ConcentrationInput.test.d.ts +1 -0
  44. package/dist/__tests__/components/ControlWorkspaceView.test.d.ts +1 -0
  45. package/dist/__tests__/components/DataFrame.test.d.ts +1 -0
  46. package/dist/__tests__/components/DatePicker.test.d.ts +1 -0
  47. package/dist/__tests__/components/DateTimePicker.test.d.ts +1 -0
  48. package/dist/__tests__/components/DoseCalculatorVolumeField.test.d.ts +1 -0
  49. package/dist/__tests__/components/DoseDesignWorkspaceView.test.d.ts +1 -0
  50. package/dist/__tests__/components/DropdownButton.test.d.ts +1 -0
  51. package/dist/__tests__/components/EmptyState.test.d.ts +1 -0
  52. package/dist/__tests__/components/ExperimentPopover.test.d.ts +1 -0
  53. package/dist/__tests__/components/ExperimentSelectorModal.test.d.ts +1 -0
  54. package/dist/__tests__/components/FormBuilder.test.d.ts +1 -0
  55. package/dist/__tests__/components/GeneratedPathInput.test.d.ts +1 -0
  56. package/dist/__tests__/components/GeneratedPlotlyResult.test.d.ts +1 -0
  57. package/dist/__tests__/components/GeneratedPluginView.test.d.ts +1 -0
  58. package/dist/__tests__/components/GeneratedResultRenderer.test.d.ts +1 -0
  59. package/dist/__tests__/components/GroupAssigner.test.d.ts +1 -0
  60. package/dist/__tests__/components/InstrumentAlertLog.test.d.ts +1 -0
  61. package/dist/__tests__/components/JobsStatusTray.test.d.ts +1 -0
  62. package/dist/__tests__/components/LcmsSequenceTable.test.d.ts +1 -0
  63. package/dist/__tests__/components/MobileSupportGate.test.d.ts +1 -0
  64. package/dist/__tests__/components/MultiSelect.test.d.ts +1 -0
  65. package/dist/__tests__/components/PlateMapEditorToolbarInternal.test.d.ts +1 -0
  66. package/dist/__tests__/components/PluginIcon.test.d.ts +1 -0
  67. package/dist/__tests__/components/PluginWorkspaceView.controls.test.d.ts +1 -0
  68. package/dist/__tests__/components/PluginWorkspaceView.internal.test.d.ts +1 -0
  69. package/dist/__tests__/components/PluginWorkspaceView.navigation.test.d.ts +1 -0
  70. package/dist/__tests__/components/PluginWorkspaceView.shell.test.d.ts +1 -0
  71. package/dist/__tests__/components/PluginWorkspaceView.test.d.ts +1 -0
  72. package/dist/__tests__/components/ProgressBar.test.d.ts +1 -0
  73. package/dist/__tests__/components/ProtocolStep.presentation.test.d.ts +1 -0
  74. package/dist/__tests__/components/ProtocolStepEditor.state.test.d.ts +1 -0
  75. package/dist/__tests__/components/ProtocolStepEditor.test.d.ts +1 -0
  76. package/dist/__tests__/components/ProtocolStepParameterField.test.d.ts +1 -0
  77. package/dist/__tests__/components/RackEditor.test.d.ts +1 -0
  78. package/dist/__tests__/components/ReagentList.presentation.test.d.ts +1 -0
  79. package/dist/__tests__/components/ReagentList.test.d.ts +1 -0
  80. package/dist/__tests__/components/RetiredStyles.test.d.ts +1 -0
  81. package/dist/__tests__/components/RuntimeUpdateNotice.test.d.ts +1 -0
  82. package/dist/__tests__/components/SampleHierarchyTree.test.d.ts +1 -0
  83. package/dist/__tests__/components/SampleSelector.colors.test.d.ts +1 -0
  84. package/dist/__tests__/components/SampleSelector.drag.test.d.ts +1 -0
  85. package/dist/__tests__/components/SampleSelector.groups.test.d.ts +1 -0
  86. package/dist/__tests__/components/SampleSelector.selection.test.d.ts +1 -0
  87. package/dist/__tests__/components/SampleSelector.test.d.ts +1 -0
  88. package/dist/__tests__/components/SampleSelectorSampleRow.test.d.ts +1 -0
  89. package/dist/__tests__/components/ScheduleCalendar.test.d.ts +1 -0
  90. package/dist/__tests__/components/SecretInput.test.d.ts +1 -0
  91. package/dist/__tests__/components/SectionCard.test.d.ts +1 -0
  92. package/dist/__tests__/components/SegmentedControl.test.d.ts +1 -0
  93. package/dist/__tests__/components/SequenceProgressBar.test.d.ts +1 -0
  94. package/dist/__tests__/components/SettingsModal.schema.test.d.ts +1 -0
  95. package/dist/__tests__/components/SettingsModal.test.d.ts +1 -0
  96. package/dist/__tests__/components/SmartGroupFieldRecipe.groups.test.d.ts +1 -0
  97. package/dist/__tests__/components/SmartGroupManual.cohorts.test.d.ts +1 -0
  98. package/dist/__tests__/components/TagsInput.test.d.ts +1 -0
  99. package/dist/__tests__/components/ThemeToggle.test.d.ts +1 -0
  100. package/dist/__tests__/components/TimePicker.test.d.ts +1 -0
  101. package/dist/__tests__/components/WellEditPopupInternal.test.d.ts +1 -0
  102. package/dist/__tests__/components/WellPlate.colors.test.d.ts +1 -0
  103. package/dist/__tests__/components/WellPlate.conditions.test.d.ts +1 -0
  104. package/dist/__tests__/components/WellPlate.geometry.test.d.ts +1 -0
  105. package/dist/__tests__/components/WellPlate.interaction.test.d.ts +1 -0
  106. package/dist/__tests__/components/WellPlate.legend.test.d.ts +1 -0
  107. package/dist/__tests__/components/WellPlate.rendering.test.d.ts +1 -0
  108. package/dist/__tests__/components/WellPlate.sampleDrop.test.d.ts +1 -0
  109. package/dist/__tests__/composables/analysisArtifactTarget.test.d.ts +1 -0
  110. package/dist/__tests__/composables/autoGroup/classKey.test.d.ts +1 -0
  111. package/dist/__tests__/composables/autoGroup/classify.test.d.ts +1 -0
  112. package/dist/__tests__/composables/autoGroup/columns.test.d.ts +1 -0
  113. package/dist/__tests__/composables/autoGroup/compose.test.d.ts +1 -0
  114. package/dist/__tests__/composables/autoGroup/cooccurrence.test.d.ts +1 -0
  115. package/dist/__tests__/composables/autoGroup/fingerprint.test.d.ts +1 -0
  116. package/dist/__tests__/composables/autoGroup/groupByOrder.test.d.ts +1 -0
  117. package/dist/__tests__/composables/autoGroup/groupTree.test.d.ts +1 -0
  118. package/dist/__tests__/composables/autoGroup/integration.test.d.ts +1 -0
  119. package/dist/__tests__/composables/autoGroup/template.test.d.ts +1 -0
  120. package/dist/__tests__/composables/autoGroup/tokenLength.test.d.ts +1 -0
  121. package/dist/__tests__/composables/autoGroup/tokenize.test.d.ts +1 -0
  122. package/dist/__tests__/composables/experiment-utils.test.d.ts +1 -0
  123. package/dist/__tests__/composables/formBuilderRegistry.test.d.ts +1 -0
  124. package/dist/__tests__/composables/resolvePluginFrontendBase.test.d.ts +1 -0
  125. package/dist/__tests__/composables/useAnalysisArtifacts.test.d.ts +1 -0
  126. package/dist/__tests__/composables/useApi.test.d.ts +1 -0
  127. package/dist/__tests__/composables/useAppExperiment.test.d.ts +1 -0
  128. package/dist/__tests__/composables/useAuth.test.d.ts +1 -0
  129. package/dist/__tests__/composables/useAutoGroup.test.d.ts +1 -0
  130. package/dist/__tests__/composables/useAutoGroupInputSources.test.d.ts +1 -0
  131. package/dist/__tests__/composables/useBioTemplatePackWorkspace.test.d.ts +1 -0
  132. package/dist/__tests__/composables/useBioTemplatePresetWorkspace.test.d.ts +1 -0
  133. package/dist/__tests__/composables/useBioTemplateWorkspace.test.d.ts +1 -0
  134. package/dist/__tests__/composables/useCalendarGrid.test.d.ts +1 -0
  135. package/dist/__tests__/composables/useCommandHistory.test.d.ts +1 -0
  136. package/dist/__tests__/composables/useControlSchema.test.d.ts +1 -0
  137. package/dist/__tests__/composables/useDebouncedWatch.test.d.ts +1 -0
  138. package/dist/__tests__/composables/useDropdownState.test.d.ts +1 -0
  139. package/dist/__tests__/composables/useEventListener.test.d.ts +1 -0
  140. package/dist/__tests__/composables/useEventStream.test.d.ts +1 -0
  141. package/dist/__tests__/composables/useExpansionSet.test.d.ts +1 -0
  142. package/dist/__tests__/composables/useExperimentData.test.d.ts +14 -0
  143. package/dist/__tests__/composables/useExperimentSamples.test.d.ts +1 -0
  144. package/dist/__tests__/composables/useExperimentSave.test.d.ts +1 -0
  145. package/dist/__tests__/composables/useExperimentSelector.test.d.ts +1 -0
  146. package/dist/__tests__/composables/useFileImport.test.d.ts +1 -0
  147. package/dist/__tests__/composables/useForm.test.d.ts +1 -0
  148. package/dist/__tests__/composables/useFormBuilder.test.d.ts +1 -0
  149. package/dist/__tests__/composables/useGeneratedAnalysis.test.d.ts +1 -0
  150. package/dist/__tests__/composables/useGroupAssignment.test.d.ts +1 -0
  151. package/dist/__tests__/composables/useJobsStatusTray.test.d.ts +1 -0
  152. package/dist/__tests__/composables/useListSelection.test.d.ts +1 -0
  153. package/dist/__tests__/composables/useMobileSupportGate.test.d.ts +1 -0
  154. package/dist/__tests__/composables/useOptimisticMutation.test.d.ts +1 -0
  155. package/dist/__tests__/composables/usePlatformContext.test.d.ts +1 -0
  156. package/dist/__tests__/composables/usePluginClient.test.d.ts +1 -0
  157. package/dist/__tests__/composables/usePluginConfig.test.d.ts +15 -0
  158. package/dist/__tests__/composables/usePresenceHeartbeat.test.d.ts +1 -0
  159. package/dist/__tests__/composables/useProtocolTemplates.test.d.ts +1 -0
  160. package/dist/__tests__/composables/useRequestSyncState.test.d.ts +1 -0
  161. package/dist/__tests__/composables/useResourceCrud.test.d.ts +1 -0
  162. package/dist/__tests__/composables/useRuntimeAlignment.test.d.ts +1 -0
  163. package/dist/__tests__/composables/useSampleGroups.test.d.ts +1 -0
  164. package/dist/__tests__/composables/useSampleGroups.tree.test.d.ts +1 -0
  165. package/dist/__tests__/composables/useScheduleCalendarLayout.test.d.ts +1 -0
  166. package/dist/__tests__/composables/useSelectionLimit.test.d.ts +1 -0
  167. package/dist/__tests__/composables/useSortedItems.test.d.ts +1 -0
  168. package/dist/__tests__/composables/useTemplateCollection.test.d.ts +1 -0
  169. package/dist/__tests__/composables/useTextSearch.test.d.ts +1 -0
  170. package/dist/__tests__/composables/useTheme.test.d.ts +1 -0
  171. package/dist/__tests__/composables/useTimeUtils.test.d.ts +1 -0
  172. package/dist/__tests__/composables/useWellPainting.test.d.ts +1 -0
  173. package/dist/__tests__/composables/useWellPlateAdapter.test.d.ts +1 -0
  174. package/dist/__tests__/composables/useWellPlateValidation.test.d.ts +1 -0
  175. package/dist/__tests__/docs/extractDocsComponents.test.d.ts +1 -0
  176. package/dist/__tests__/docs/extractDocsExports.test.d.ts +1 -0
  177. package/dist/__tests__/docs/extractDocsParsing.test.d.ts +1 -0
  178. package/dist/__tests__/docs/extractDocsTemplates.test.d.ts +1 -0
  179. package/dist/__tests__/docs/extractDocsTheme.test.d.ts +1 -0
  180. package/dist/__tests__/docs/frontendDocsCatalog.test.d.ts +1 -0
  181. package/dist/__tests__/generatedUi.test.d.ts +1 -0
  182. package/dist/__tests__/stores/experiment.test.d.ts +1 -0
  183. package/dist/__tests__/stores/settings.test.d.ts +1 -0
  184. package/dist/__tests__/templates/templates.test.d.ts +1 -0
  185. package/dist/__tests__/types/GeneratedJsonSchema.test.d.ts +1 -0
  186. package/dist/__tests__/utils/color.test.d.ts +1 -0
  187. package/dist/__tests__/utils/instrument.test.d.ts +1 -0
  188. package/dist/__tests__/utils/jobs.test.d.ts +1 -0
  189. package/dist/__tests__/utils/lcms.test.d.ts +1 -0
  190. package/dist/__tests__/utils/permissions.test.d.ts +1 -0
  191. package/dist/__tests__/utils/rack.test.d.ts +1 -0
  192. package/dist/{analysisArtifactTypes-ejqR8MX3.js → analysisArtifactTypes-DQ0MjwHZ.js} +2 -0
  193. package/dist/analysisArtifactTypes-DQ0MjwHZ.js.map +1 -0
  194. package/dist/chunk-BoAXSpZd.js +33 -0
  195. package/dist/components/AppAvatarMenu.vue.d.ts +4 -0
  196. package/dist/components/AppSidebar.vue.d.ts +1 -1
  197. package/dist/components/AuditTrail.vue.d.ts +38 -0
  198. package/dist/components/AutoGroupModal.vue.d.ts +1 -1
  199. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  200. package/dist/components/ColorSlider.vue.d.ts +34 -0
  201. package/dist/components/DoseDesignWorkspaceView.vue.d.ts +149 -0
  202. package/dist/components/DropdownButton.vue.d.ts +2 -0
  203. package/dist/components/FitPanel.vue.d.ts +46 -0
  204. package/dist/components/GroupAssigner.vue.d.ts +25 -0
  205. package/dist/components/JobsStatusTray.vue.d.ts +11 -2
  206. package/dist/components/PluginWorkspaceView.props.d.ts +29 -1
  207. package/dist/components/PluginWorkspaceView.vue.d.ts +5 -5
  208. package/dist/components/RackEditor.vue.d.ts +78 -0
  209. package/dist/components/ReagentEditor.vue.d.ts +30 -0
  210. package/dist/components/ResourceCard.vue.d.ts +50 -0
  211. package/dist/components/SampleLegend.vue.d.ts +1 -1
  212. package/dist/components/SampleSelector.vue.d.ts +1 -1
  213. package/dist/components/ScientificNumber.vue.d.ts +14 -0
  214. package/dist/components/SecretInput.vue.d.ts +28 -0
  215. package/dist/components/SettingsModal.vue.d.ts +1 -1
  216. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +3 -3
  217. package/dist/components/SmartGroupManual.vue.d.ts +2 -2
  218. package/dist/components/WellPlate.vue.d.ts +1 -1
  219. package/dist/components/index.d.ts +18 -0
  220. package/dist/components/index.js +8 -8
  221. package/dist/components/internal/WellEditPopupInternal.vue.d.ts +3 -1
  222. package/dist/components/internal/WorkspaceControlsInternal.vue.d.ts +23 -0
  223. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +70 -0
  224. package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +43 -0
  225. package/dist/{components-DpyzaeIc.js → components-B80gV0P6.js} +3729 -1800
  226. package/dist/components-B80gV0P6.js.map +1 -0
  227. package/dist/composables/autoGroupConstants.d.ts +1 -0
  228. package/dist/composables/autoGroupGrouping.d.ts +3 -0
  229. package/dist/composables/flattenWorkspaceBindings.d.ts +61 -0
  230. package/dist/composables/index.d.ts +15 -2
  231. package/dist/composables/index.js +11 -11
  232. package/dist/composables/pluginWorkspaceModel.d.ts +164 -0
  233. package/dist/composables/useAnalysisArtifacts.d.ts +2 -0
  234. package/dist/composables/useAsync.d.ts +132 -0
  235. package/dist/composables/useAuth.d.ts +2 -0
  236. package/dist/composables/useAutoGroup.d.ts +30 -1
  237. package/dist/composables/useAutoGroupInputSources.d.ts +32 -0
  238. package/dist/composables/useBioTemplateWorkspace.d.ts +4 -20
  239. package/dist/composables/useCommandHistory.d.ts +33 -0
  240. package/dist/composables/useFocusTrap.d.ts +21 -0
  241. package/dist/composables/useGeneratedAnalysis.d.ts +5 -1
  242. package/dist/composables/useGroupAssignment.d.ts +31 -0
  243. package/dist/composables/useJobsStatusTray.d.ts +41 -4
  244. package/dist/composables/useMenuKeyboard.d.ts +29 -0
  245. package/dist/composables/useOptimisticMutation.d.ts +5 -1
  246. package/dist/composables/usePluginClient.d.ts +4 -0
  247. package/dist/composables/usePluginConfig.d.ts +25 -0
  248. package/dist/composables/usePluginWorkspace.d.ts +51 -0
  249. package/dist/composables/useRackEditor.d.ts +31 -0
  250. package/dist/composables/useResourceCrud.d.ts +44 -0
  251. package/dist/composables/useRovingFocus.d.ts +24 -0
  252. package/dist/composables/useWellPainting.d.ts +39 -0
  253. package/dist/composables/useWellPlateAdapter.d.ts +40 -0
  254. package/dist/composables/useWellPlateValidation.d.ts +5 -1
  255. package/dist/composables/workspaceRecipes.d.ts +188 -0
  256. package/dist/{composables-yz8bTkEV.js → composables-C8mmD5ta.js} +821 -68
  257. package/dist/composables-C8mmD5ta.js.map +1 -0
  258. package/dist/{experiment-D08H_TIH.js → experiment-Y9Iz7KYi.js} +3 -1
  259. package/dist/experiment-Y9Iz7KYi.js.map +1 -0
  260. package/dist/{experiment-utils-CLnzPPq5.js → experiment-utils-DV3DrvE_.js} +71 -50
  261. package/dist/experiment-utils-DV3DrvE_.js.map +1 -0
  262. package/dist/histoire.setup.d.ts +1 -0
  263. package/dist/index.d.ts +1 -0
  264. package/dist/index.js +20 -35
  265. package/dist/index.js.map +1 -0
  266. package/dist/install.js +28 -0
  267. package/dist/install.js.map +1 -0
  268. package/dist/jobs.d.ts +15 -1
  269. package/dist/permissions.d.ts +5 -0
  270. package/dist/permissions.js +4 -2
  271. package/dist/permissions.js.map +1 -0
  272. package/dist/plotly.min-c2Sez60c.js +180634 -0
  273. package/dist/plotly.min-c2Sez60c.js.map +1 -0
  274. package/dist/stores/auth.d.ts +6 -0
  275. package/dist/stores/index.js +2 -2
  276. package/dist/styles.css +2917 -300
  277. package/dist/tailwind.preset.js +2 -0
  278. package/dist/tailwind.preset.js.map +1 -0
  279. package/dist/templates/builderReadUtils.d.ts +1 -1
  280. package/dist/templates/catalog.d.ts +4 -4
  281. package/dist/templates/index.js +4 -4
  282. package/dist/templates/presets.d.ts +2 -2
  283. package/dist/{templates-Pbxjdqlh.js → templates-CK72aKO1.js} +34 -26
  284. package/dist/templates-CK72aKO1.js.map +1 -0
  285. package/dist/types/auth.d.ts +1 -0
  286. package/dist/types/auto-group.d.ts +7 -0
  287. package/dist/types/componentWorkflowTypes.d.ts +22 -0
  288. package/dist/types/components.d.ts +1 -1
  289. package/dist/types/form-builder.d.ts +1 -1
  290. package/dist/types/generated-ui.d.ts +11 -2
  291. package/dist/types/index.d.ts +4 -4
  292. package/dist/types/index.js +1 -1
  293. package/dist/types/jobs.d.ts +11 -3
  294. package/dist/{useApi-yE0re8k-.js → useApi-CDBq6z23.js} +15 -0
  295. package/dist/useApi-CDBq6z23.js.map +1 -0
  296. package/dist/{useControlSchema-Ds4VeFxt.js → useControlSchema-_OVhavKq.js} +381 -69
  297. package/dist/useControlSchema-_OVhavKq.js.map +1 -0
  298. package/dist/{useDropdownState-WIGW6Rr-.js → useDropdownState-D5G4UvWd.js} +3 -1
  299. package/dist/useDropdownState-D5G4UvWd.js.map +1 -0
  300. package/dist/{useExperimentSelector-DXqsZuSk.js → useExperimentSelector-DSEckf_g.js} +5 -3
  301. package/dist/useExperimentSelector-DSEckf_g.js.map +1 -0
  302. package/dist/{useFormBuilder-1so6QSQL.js → useFormBuilder-Bd714C7y.js} +3 -1
  303. package/dist/useFormBuilder-Bd714C7y.js.map +1 -0
  304. package/dist/{useProtocolTemplates-Cv0ca1AM.js → useProtocolTemplates-Dq5Pzwyd.js} +1055 -83
  305. package/dist/useProtocolTemplates-Dq5Pzwyd.js.map +1 -0
  306. package/dist/utils/pluginSecrets.d.ts +53 -0
  307. package/dist/utils/records.d.ts +4 -0
  308. package/package.json +8 -2
  309. package/src/__stories__/experiment-helpers.ts +86 -0
  310. package/src/__tests__/components/ActionItem.test.ts +99 -0
  311. package/src/__tests__/components/ActionMenu.test.ts +120 -0
  312. package/src/__tests__/components/AppAvatarMenu.test.ts +161 -0
  313. package/src/__tests__/components/AppLayout.test.ts +207 -0
  314. package/src/__tests__/components/AppPluginSwitcher.test.ts +44 -0
  315. package/src/__tests__/components/AppSidebar.test.ts +857 -0
  316. package/src/__tests__/components/AppToastContainer.test.ts +37 -0
  317. package/src/__tests__/components/AppTopBar.navigation.test.ts +68 -0
  318. package/src/__tests__/components/AppTopBar.test.ts +1256 -0
  319. package/src/__tests__/components/AppTopBarPageSelector.test.ts +156 -0
  320. package/src/__tests__/components/AppTopBarPillNav.test.ts +125 -0
  321. package/src/__tests__/components/AppTopBarPresence.test.ts +47 -0
  322. package/src/__tests__/components/ArtifactSaveDialog.test.ts +566 -0
  323. package/src/__tests__/components/ArtifactSelectorModal.test.ts +178 -0
  324. package/src/__tests__/components/AutoGroupModal.adapter.test.ts +204 -0
  325. package/src/__tests__/components/BaseInput.test.ts +99 -0
  326. package/src/__tests__/components/BaseModal.test.ts +133 -0
  327. package/src/__tests__/components/BasePill.test.ts +291 -0
  328. package/src/__tests__/components/BaseRadioGroup.test.ts +25 -0
  329. package/src/__tests__/components/BaseSelect.test.ts +73 -0
  330. package/src/__tests__/components/BaseTabs.test.ts +107 -0
  331. package/src/__tests__/components/BaseToggle.test.ts +40 -0
  332. package/src/__tests__/components/BatchProgressList.test.ts +52 -0
  333. package/src/__tests__/components/BioTemplateExperimentWorkspaceView.test.ts +159 -0
  334. package/src/__tests__/components/BioTemplatePackWorkspaceView.test.ts +192 -0
  335. package/src/__tests__/components/BioTemplatePresetWorkspaceView.test.ts +328 -0
  336. package/src/__tests__/components/BioTemplateRenderer.test.ts +96 -0
  337. package/src/__tests__/components/Breadcrumb.test.ts +23 -0
  338. package/src/__tests__/components/Calendar.test.ts +566 -0
  339. package/src/__tests__/components/CalendarGridPanel.test.ts +36 -0
  340. package/src/__tests__/components/CollapsibleCard.test.ts +571 -0
  341. package/src/__tests__/components/ComponentBindingRenderer.test.ts +278 -0
  342. package/src/__tests__/components/ConcentrationInput.test.ts +45 -0
  343. package/src/__tests__/components/ControlWorkspaceView.test.ts +1102 -0
  344. package/src/__tests__/components/DataFrame.test.ts +915 -0
  345. package/src/__tests__/components/DatePicker.test.ts +45 -0
  346. package/src/__tests__/components/DateTimePicker.test.ts +48 -0
  347. package/src/__tests__/components/DoseCalculatorVolumeField.test.ts +53 -0
  348. package/src/__tests__/components/DoseDesignWorkspaceView.test.ts +185 -0
  349. package/src/__tests__/components/DropdownButton.test.ts +628 -0
  350. package/src/__tests__/components/EmptyState.test.ts +23 -0
  351. package/src/__tests__/components/ExperimentPopover.test.ts +143 -0
  352. package/src/__tests__/components/ExperimentSelectorModal.test.ts +143 -0
  353. package/src/__tests__/components/FormBuilder.test.ts +353 -0
  354. package/src/__tests__/components/GeneratedPathInput.test.ts +132 -0
  355. package/src/__tests__/components/GeneratedPlotlyResult.test.ts +117 -0
  356. package/src/__tests__/components/GeneratedPluginView.test.ts +235 -0
  357. package/src/__tests__/components/GeneratedResultRenderer.test.ts +93 -0
  358. package/src/__tests__/components/GroupAssigner.test.ts +48 -0
  359. package/src/__tests__/components/InstrumentAlertLog.test.ts +59 -0
  360. package/src/__tests__/components/JobsStatusTray.test.ts +165 -0
  361. package/src/__tests__/components/LcmsSequenceTable.test.ts +57 -0
  362. package/src/__tests__/components/MobileSupportGate.test.ts +120 -0
  363. package/src/__tests__/components/MultiSelect.test.ts +48 -0
  364. package/src/__tests__/components/PlateMapEditorToolbarInternal.test.ts +54 -0
  365. package/src/__tests__/components/PluginIcon.test.ts +215 -0
  366. package/src/__tests__/components/PluginWorkspaceView.controls.test.ts +156 -0
  367. package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +230 -0
  368. package/src/__tests__/components/PluginWorkspaceView.navigation.test.ts +102 -0
  369. package/src/__tests__/components/PluginWorkspaceView.shell.test.ts +43 -0
  370. package/src/__tests__/components/PluginWorkspaceView.test.ts +719 -0
  371. package/src/__tests__/components/ProgressBar.test.ts +18 -0
  372. package/src/__tests__/components/ProtocolStep.presentation.test.ts +31 -0
  373. package/src/__tests__/components/ProtocolStepEditor.state.test.ts +165 -0
  374. package/src/__tests__/components/ProtocolStepEditor.test.ts +33 -0
  375. package/src/__tests__/components/ProtocolStepParameterField.test.ts +44 -0
  376. package/src/__tests__/components/RackEditor.test.ts +125 -0
  377. package/src/__tests__/components/ReagentList.presentation.test.ts +68 -0
  378. package/src/__tests__/components/ReagentList.test.ts +82 -0
  379. package/src/__tests__/components/RetiredStyles.test.ts +82 -0
  380. package/src/__tests__/components/RuntimeUpdateNotice.test.ts +14 -0
  381. package/src/__tests__/components/SampleHierarchyTree.test.ts +53 -0
  382. package/src/__tests__/components/SampleSelector.colors.test.ts +49 -0
  383. package/src/__tests__/components/SampleSelector.drag.test.ts +126 -0
  384. package/src/__tests__/components/SampleSelector.groups.test.ts +94 -0
  385. package/src/__tests__/components/SampleSelector.selection.test.ts +56 -0
  386. package/src/__tests__/components/SampleSelector.test.ts +466 -0
  387. package/src/__tests__/components/SampleSelectorSampleRow.test.ts +40 -0
  388. package/src/__tests__/components/ScheduleCalendar.test.ts +44 -0
  389. package/src/__tests__/components/SecretInput.test.ts +87 -0
  390. package/src/__tests__/components/SectionCard.test.ts +181 -0
  391. package/src/__tests__/components/SegmentedControl.test.ts +69 -0
  392. package/src/__tests__/components/SequenceProgressBar.test.ts +39 -0
  393. package/src/__tests__/components/SettingsModal.schema.test.ts +97 -0
  394. package/src/__tests__/components/SettingsModal.test.ts +407 -0
  395. package/src/__tests__/components/SmartGroupFieldRecipe.groups.test.ts +101 -0
  396. package/src/__tests__/components/SmartGroupManual.cohorts.test.ts +97 -0
  397. package/src/__tests__/components/TagsInput.test.ts +75 -0
  398. package/src/__tests__/components/ThemeToggle.test.ts +47 -0
  399. package/src/__tests__/components/TimePicker.test.ts +38 -0
  400. package/src/__tests__/components/WellEditPopupInternal.test.ts +108 -0
  401. package/src/__tests__/components/WellPlate.colors.test.ts +28 -0
  402. package/src/__tests__/components/WellPlate.conditions.test.ts +68 -0
  403. package/src/__tests__/components/WellPlate.geometry.test.ts +54 -0
  404. package/src/__tests__/components/WellPlate.interaction.test.ts +171 -0
  405. package/src/__tests__/components/WellPlate.legend.test.ts +13 -0
  406. package/src/__tests__/components/WellPlate.rendering.test.ts +122 -0
  407. package/src/__tests__/components/WellPlate.sampleDrop.test.ts +70 -0
  408. package/src/__tests__/composables/analysisArtifactTarget.test.ts +77 -0
  409. package/src/__tests__/composables/autoGroup/classKey.test.ts +25 -0
  410. package/src/__tests__/composables/autoGroup/classify.test.ts +107 -0
  411. package/src/__tests__/composables/autoGroup/columns.test.ts +135 -0
  412. package/src/__tests__/composables/autoGroup/compose.test.ts +226 -0
  413. package/src/__tests__/composables/autoGroup/cooccurrence.test.ts +91 -0
  414. package/src/__tests__/composables/autoGroup/fingerprint.test.ts +122 -0
  415. package/src/__tests__/composables/autoGroup/groupByOrder.test.ts +278 -0
  416. package/src/__tests__/composables/autoGroup/groupTree.test.ts +99 -0
  417. package/src/__tests__/composables/autoGroup/integration.test.ts +75 -0
  418. package/src/__tests__/composables/autoGroup/template.test.ts +70 -0
  419. package/src/__tests__/composables/autoGroup/tokenLength.test.ts +85 -0
  420. package/src/__tests__/composables/autoGroup/tokenize.test.ts +33 -0
  421. package/src/__tests__/composables/experiment-utils.test.ts +63 -0
  422. package/src/__tests__/composables/formBuilderRegistry.test.ts +191 -0
  423. package/src/__tests__/composables/resolvePluginFrontendBase.test.ts +65 -0
  424. package/src/__tests__/composables/useAnalysisArtifacts.test.ts +740 -0
  425. package/src/__tests__/composables/useApi.test.ts +157 -0
  426. package/src/__tests__/composables/useAppExperiment.test.ts +899 -0
  427. package/src/__tests__/composables/useAuth.test.ts +233 -0
  428. package/src/__tests__/composables/useAutoGroup.test.ts +524 -0
  429. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +127 -0
  430. package/src/__tests__/composables/useBioTemplatePackWorkspace.test.ts +125 -0
  431. package/src/__tests__/composables/useBioTemplatePresetWorkspace.test.ts +199 -0
  432. package/src/__tests__/composables/useBioTemplateWorkspace.test.ts +104 -0
  433. package/src/__tests__/composables/useCalendarGrid.test.ts +38 -0
  434. package/src/__tests__/composables/useCommandHistory.test.ts +43 -0
  435. package/src/__tests__/composables/useControlSchema.test.ts +1060 -0
  436. package/src/__tests__/composables/useDebouncedWatch.test.ts +93 -0
  437. package/src/__tests__/composables/useDropdownState.test.ts +95 -0
  438. package/src/__tests__/composables/useEventListener.test.ts +116 -0
  439. package/src/__tests__/composables/useEventStream.test.ts +140 -0
  440. package/src/__tests__/composables/useExpansionSet.test.ts +62 -0
  441. package/src/__tests__/composables/useExperimentData.test.ts +154 -0
  442. package/src/__tests__/composables/useExperimentSamples.test.ts +91 -0
  443. package/src/__tests__/composables/useExperimentSave.test.ts +542 -0
  444. package/src/__tests__/composables/useExperimentSelector.test.ts +338 -0
  445. package/src/__tests__/composables/useFileImport.test.ts +44 -0
  446. package/src/__tests__/composables/useForm.test.ts +263 -0
  447. package/src/__tests__/composables/useFormBuilder.test.ts +994 -0
  448. package/src/__tests__/composables/useGeneratedAnalysis.test.ts +1903 -0
  449. package/src/__tests__/composables/useGroupAssignment.test.ts +73 -0
  450. package/src/__tests__/composables/useJobsStatusTray.test.ts +283 -0
  451. package/src/__tests__/composables/useListSelection.test.ts +66 -0
  452. package/src/__tests__/composables/useMobileSupportGate.test.ts +74 -0
  453. package/src/__tests__/composables/useOptimisticMutation.test.ts +40 -0
  454. package/src/__tests__/composables/usePlatformContext.test.ts +148 -0
  455. package/src/__tests__/composables/usePluginClient.test.ts +1912 -0
  456. package/src/__tests__/composables/usePluginConfig.test.ts +497 -0
  457. package/src/__tests__/composables/usePresenceHeartbeat.test.ts +164 -0
  458. package/src/__tests__/composables/useProtocolTemplates.test.ts +64 -0
  459. package/src/__tests__/composables/useRequestSyncState.test.ts +92 -0
  460. package/src/__tests__/composables/useResourceCrud.test.ts +56 -0
  461. package/src/__tests__/composables/useRuntimeAlignment.test.ts +145 -0
  462. package/src/__tests__/composables/useSampleGroups.test.ts +66 -0
  463. package/src/__tests__/composables/useSampleGroups.tree.test.ts +145 -0
  464. package/src/__tests__/composables/useScheduleCalendarLayout.test.ts +89 -0
  465. package/src/__tests__/composables/useSelectionLimit.test.ts +41 -0
  466. package/src/__tests__/composables/useSortedItems.test.ts +87 -0
  467. package/src/__tests__/composables/useTemplateCollection.test.ts +147 -0
  468. package/src/__tests__/composables/useTextSearch.test.ts +55 -0
  469. package/src/__tests__/composables/useTheme.test.ts +91 -0
  470. package/src/__tests__/composables/useTimeUtils.test.ts +35 -0
  471. package/src/__tests__/composables/useWellPainting.test.ts +52 -0
  472. package/src/__tests__/composables/useWellPlateAdapter.test.ts +50 -0
  473. package/src/__tests__/composables/useWellPlateValidation.test.ts +42 -0
  474. package/src/__tests__/docs/extractDocsComponents.test.ts +156 -0
  475. package/src/__tests__/docs/extractDocsExports.test.ts +92 -0
  476. package/src/__tests__/docs/extractDocsParsing.test.ts +91 -0
  477. package/src/__tests__/docs/extractDocsTemplates.test.ts +53 -0
  478. package/src/__tests__/docs/extractDocsTheme.test.ts +89 -0
  479. package/src/__tests__/docs/frontendDocsCatalog.test.ts +436 -0
  480. package/src/__tests__/fixtures/auto-group/mixed-lc-ms-batch.txt +187 -0
  481. package/src/__tests__/fixtures/templates/dose-response.json +81 -0
  482. package/src/__tests__/fixtures/templates/plate-map.json +54 -0
  483. package/src/__tests__/fixtures/templates/qpcr-plate.json +96 -0
  484. package/src/__tests__/fixtures/templates/sample-sheet.json +71 -0
  485. package/src/__tests__/generatedUi.test.ts +119 -0
  486. package/src/__tests__/stores/experiment.test.ts +300 -0
  487. package/src/__tests__/stores/settings.test.ts +78 -0
  488. package/src/__tests__/templates/templates.test.ts +1185 -0
  489. package/src/__tests__/types/GeneratedJsonSchema.test.ts +62 -0
  490. package/src/__tests__/utils/color.test.ts +96 -0
  491. package/src/__tests__/utils/instrument.test.ts +47 -0
  492. package/src/__tests__/utils/jobs.test.ts +95 -0
  493. package/src/__tests__/utils/lcms.test.ts +73 -0
  494. package/src/__tests__/utils/permissions.test.ts +62 -0
  495. package/src/__tests__/utils/rack.test.ts +120 -0
  496. package/src/components/ActionMenu.story.vue +26 -0
  497. package/src/components/ActionMenu.vue +209 -0
  498. package/src/components/AlertBox.story.vue +204 -0
  499. package/src/components/AlertBox.vue +88 -0
  500. package/src/components/AppAvatarMenu.story.vue +155 -0
  501. package/src/components/AppAvatarMenu.vue +164 -0
  502. package/src/components/AppContainer.story.vue +104 -0
  503. package/src/components/AppContainer.vue +34 -0
  504. package/src/components/AppLayout.story.vue +331 -0
  505. package/src/components/AppLayout.vue +156 -0
  506. package/src/components/AppPluginSwitcher.vue +137 -0
  507. package/src/components/AppSidebar.story.vue +584 -0
  508. package/src/components/AppSidebar.vue +471 -0
  509. package/src/components/AppToastContainer.story.vue +157 -0
  510. package/src/components/AppToastContainer.vue +62 -0
  511. package/src/components/AppTopBar.navigation.ts +60 -0
  512. package/src/components/AppTopBar.story.vue +280 -0
  513. package/src/components/AppTopBar.vue +474 -0
  514. package/src/components/ArtifactSaveDialog.story.vue +319 -0
  515. package/src/components/ArtifactSaveDialog.vue +434 -0
  516. package/src/components/ArtifactSelectorModal.story.vue +295 -0
  517. package/src/components/ArtifactSelectorModal.vue +333 -0
  518. package/src/components/AuditTrail.story.vue +163 -0
  519. package/src/components/AuditTrail.vue +151 -0
  520. package/src/components/AutoGroupModal.adapter.ts +203 -0
  521. package/src/components/AutoGroupModal.story.vue +458 -0
  522. package/src/components/AutoGroupModal.vue +294 -0
  523. package/src/components/Avatar.story.vue +115 -0
  524. package/src/components/Avatar.vue +79 -0
  525. package/src/components/BaseButton.story.vue +96 -0
  526. package/src/components/BaseButton.vue +75 -0
  527. package/src/components/BaseCheckbox.story.vue +100 -0
  528. package/src/components/BaseCheckbox.vue +131 -0
  529. package/src/components/BaseInput.story.vue +98 -0
  530. package/src/components/BaseInput.vue +76 -0
  531. package/src/components/BaseModal.story.vue +335 -0
  532. package/src/components/BaseModal.vue +280 -0
  533. package/src/components/BasePill.story.vue +142 -0
  534. package/src/components/BasePill.vue +89 -0
  535. package/src/components/BaseRadioGroup.story.vue +145 -0
  536. package/src/components/BaseRadioGroup.vue +128 -0
  537. package/src/components/BaseSelect.story.vue +120 -0
  538. package/src/components/BaseSelect.vue +89 -0
  539. package/src/components/BaseSlider.story.vue +122 -0
  540. package/src/components/BaseSlider.vue +126 -0
  541. package/src/components/BaseTabs.story.vue +127 -0
  542. package/src/components/BaseTabs.vue +107 -0
  543. package/src/components/BaseTextarea.story.vue +91 -0
  544. package/src/components/BaseTextarea.vue +62 -0
  545. package/src/components/BaseToggle.story.vue +108 -0
  546. package/src/components/BaseToggle.vue +143 -0
  547. package/src/components/BatchProgressList.story.vue +92 -0
  548. package/src/components/BatchProgressList.vue +181 -0
  549. package/src/components/BioTemplateExperimentWorkspaceView.story.vue +123 -0
  550. package/src/components/BioTemplateExperimentWorkspaceView.vue +339 -0
  551. package/src/components/BioTemplatePackWorkspaceView.story.vue +107 -0
  552. package/src/components/BioTemplatePackWorkspaceView.vue +180 -0
  553. package/src/components/BioTemplatePresetWorkspaceView.story.vue +163 -0
  554. package/src/components/BioTemplatePresetWorkspaceView.vue +403 -0
  555. package/src/components/BioTemplateRenderer.story.vue +57 -0
  556. package/src/components/BioTemplateRenderer.vue +64 -0
  557. package/src/components/Breadcrumb.story.vue +106 -0
  558. package/src/components/Breadcrumb.vue +81 -0
  559. package/src/components/Calendar.story.vue +106 -0
  560. package/src/components/Calendar.vue +367 -0
  561. package/src/components/ChartContainer.story.vue +113 -0
  562. package/src/components/ChartContainer.vue +64 -0
  563. package/src/components/ChemicalFormula.story.vue +102 -0
  564. package/src/components/ChemicalFormula.vue +39 -0
  565. package/src/components/CollapsibleCard.story.vue +135 -0
  566. package/src/components/CollapsibleCard.vue +245 -0
  567. package/src/components/ColorSlider.story.vue +120 -0
  568. package/src/components/ColorSlider.vue +164 -0
  569. package/src/components/ComponentBindingRenderer.story.vue +87 -0
  570. package/src/components/ComponentBindingRenderer.vue +322 -0
  571. package/src/components/ConcentrationInput.story.vue +77 -0
  572. package/src/components/ConcentrationInput.vue +149 -0
  573. package/src/components/ConfirmDialog.story.vue +248 -0
  574. package/src/components/ConfirmDialog.vue +100 -0
  575. package/src/components/ControlWorkspaceView.story.vue +347 -0
  576. package/src/components/ControlWorkspaceView.vue +370 -0
  577. package/src/components/DataFrame.story.vue +148 -0
  578. package/src/components/DataFrame.vue +520 -0
  579. package/src/components/DatePicker.story.vue +119 -0
  580. package/src/components/DatePicker.vue +197 -0
  581. package/src/components/DateTimePicker.story.vue +112 -0
  582. package/src/components/DateTimePicker.vue +271 -0
  583. package/src/components/Divider.story.vue +80 -0
  584. package/src/components/Divider.vue +49 -0
  585. package/src/components/DoseCalculator.story.vue +68 -0
  586. package/src/components/DoseCalculator.vue +416 -0
  587. package/src/components/DoseCalculatorVolumeField.vue +61 -0
  588. package/src/components/DoseDesignWorkspaceView.story.vue +77 -0
  589. package/src/components/DoseDesignWorkspaceView.vue +243 -0
  590. package/src/components/DropdownButton.story.vue +102 -0
  591. package/src/components/DropdownButton.vue +193 -0
  592. package/src/components/EmptyState.story.vue +135 -0
  593. package/src/components/EmptyState.vue +71 -0
  594. package/src/components/ExperimentCodeBadge.story.vue +77 -0
  595. package/src/components/ExperimentCodeBadge.vue +64 -0
  596. package/src/components/ExperimentDataViewer.story.vue +174 -0
  597. package/src/components/ExperimentDataViewer.vue +293 -0
  598. package/src/components/ExperimentPopover.story.vue +442 -0
  599. package/src/components/ExperimentPopover.vue +312 -0
  600. package/src/components/ExperimentSelectorModal.story.vue +381 -0
  601. package/src/components/ExperimentSelectorModal.vue +432 -0
  602. package/src/components/ExperimentTimeline.story.vue +161 -0
  603. package/src/components/ExperimentTimeline.vue +357 -0
  604. package/src/components/FileUploader.story.vue +107 -0
  605. package/src/components/FileUploader.vue +424 -0
  606. package/src/components/FitPanel.story.vue +125 -0
  607. package/src/components/FitPanel.vue +120 -0
  608. package/src/components/FormActions.vue +92 -0
  609. package/src/components/FormBuilder.story.vue +203 -0
  610. package/src/components/FormBuilder.vue +311 -0
  611. package/src/components/FormField.story.vue +132 -0
  612. package/src/components/FormField.vue +59 -0
  613. package/src/components/FormulaInput.story.vue +96 -0
  614. package/src/components/FormulaInput.vue +125 -0
  615. package/src/components/GeneratedPathInput.vue +218 -0
  616. package/src/components/GeneratedPlotlyResult.vue +87 -0
  617. package/src/components/GeneratedPluginView.vue +289 -0
  618. package/src/components/GeneratedResultRenderer.vue +147 -0
  619. package/src/components/GroupAssigner.story.vue +83 -0
  620. package/src/components/GroupAssigner.vue +257 -0
  621. package/src/components/IconButton.story.vue +140 -0
  622. package/src/components/IconButton.vue +73 -0
  623. package/src/components/InstrumentAlertLog.vue +191 -0
  624. package/src/components/InstrumentStateBadge.vue +50 -0
  625. package/src/components/InstrumentStatusCard.vue +188 -0
  626. package/src/components/JobsStatusTray.story.vue +126 -0
  627. package/src/components/JobsStatusTray.vue +407 -0
  628. package/src/components/LcmsSequenceTable.vue +191 -0
  629. package/src/components/LoadingSpinner.story.vue +70 -0
  630. package/src/components/LoadingSpinner.vue +50 -0
  631. package/src/components/MobileSupportGate.story.vue +52 -0
  632. package/src/components/MobileSupportGate.vue +115 -0
  633. package/src/components/MoleculeInput.story.vue +66 -0
  634. package/src/components/MoleculeInput.vue +426 -0
  635. package/src/components/MultiSelect.story.vue +132 -0
  636. package/src/components/MultiSelect.vue +123 -0
  637. package/src/components/NumberInput.story.vue +122 -0
  638. package/src/components/NumberInput.vue +162 -0
  639. package/src/components/PlateMapEditor.story.vue +92 -0
  640. package/src/components/PlateMapEditor.vue +434 -0
  641. package/src/components/PluginIcon.story.vue +103 -0
  642. package/src/components/PluginIcon.vue +158 -0
  643. package/src/components/PluginWorkspaceView.controls.ts +182 -0
  644. package/src/components/PluginWorkspaceView.navigation.ts +106 -0
  645. package/src/components/PluginWorkspaceView.props.ts +207 -0
  646. package/src/components/PluginWorkspaceView.shell.ts +67 -0
  647. package/src/components/PluginWorkspaceView.story.vue +341 -0
  648. package/src/components/PluginWorkspaceView.vue +224 -0
  649. package/src/components/ProgressBar.story.vue +148 -0
  650. package/src/components/ProgressBar.vue +117 -0
  651. package/src/components/ProtocolStep.presentation.ts +31 -0
  652. package/src/components/ProtocolStepEditor.state.ts +104 -0
  653. package/src/components/ProtocolStepEditor.story.vue +69 -0
  654. package/src/components/ProtocolStepEditor.vue +382 -0
  655. package/src/components/ProtocolStepParameterField.vue +134 -0
  656. package/src/components/RackEditor.story.vue +100 -0
  657. package/src/components/RackEditor.vue +442 -0
  658. package/src/components/ReagentEditor.story.vue +153 -0
  659. package/src/components/ReagentEditor.vue +418 -0
  660. package/src/components/ReagentList.presentation.ts +105 -0
  661. package/src/components/ReagentList.story.vue +137 -0
  662. package/src/components/ReagentList.vue +392 -0
  663. package/src/components/ResourceCard.story.vue +150 -0
  664. package/src/components/ResourceCard.vue +161 -0
  665. package/src/components/RuntimeUpdateNotice.vue +51 -0
  666. package/src/components/SampleHierarchyTree.story.vue +161 -0
  667. package/src/components/SampleHierarchyTree.vue +246 -0
  668. package/src/components/SampleLegend.story.vue +91 -0
  669. package/src/components/SampleLegend.vue +119 -0
  670. package/src/components/SampleSelector.colors.ts +48 -0
  671. package/src/components/SampleSelector.drag.ts +164 -0
  672. package/src/components/SampleSelector.groups.ts +109 -0
  673. package/src/components/SampleSelector.selection.ts +64 -0
  674. package/src/components/SampleSelector.story.vue +192 -0
  675. package/src/components/SampleSelector.tree.ts +48 -0
  676. package/src/components/SampleSelector.vue +451 -0
  677. package/src/components/SampleSelectorGroupNode.vue +197 -0
  678. package/src/components/SampleSelectorSampleRow.vue +68 -0
  679. package/src/components/ScheduleCalendar.story.vue +195 -0
  680. package/src/components/ScheduleCalendar.vue +414 -0
  681. package/src/components/ScientificNumber.story.vue +127 -0
  682. package/src/components/ScientificNumber.vue +197 -0
  683. package/src/components/SecretInput.story.vue +79 -0
  684. package/src/components/SecretInput.vue +150 -0
  685. package/src/components/SectionCard.story.vue +163 -0
  686. package/src/components/SectionCard.vue +98 -0
  687. package/src/components/SegmentedControl.story.vue +149 -0
  688. package/src/components/SegmentedControl.vue +94 -0
  689. package/src/components/SequenceInput.story.vue +119 -0
  690. package/src/components/SequenceInput.vue +209 -0
  691. package/src/components/SequenceProgressBar.vue +71 -0
  692. package/src/components/SettingsModal.schema.ts +74 -0
  693. package/src/components/SettingsModal.story.vue +524 -0
  694. package/src/components/SettingsModal.vue +399 -0
  695. package/src/components/Skeleton.story.vue +141 -0
  696. package/src/components/Skeleton.vue +74 -0
  697. package/src/components/SmartGroup.types.ts +98 -0
  698. package/src/components/SmartGroupFieldRecipe.groups.ts +109 -0
  699. package/src/components/SmartGroupFieldRecipe.story.vue +58 -0
  700. package/src/components/SmartGroupFieldRecipe.vue +499 -0
  701. package/src/components/SmartGroupManual.cohorts.ts +112 -0
  702. package/src/components/SmartGroupManual.story.vue +55 -0
  703. package/src/components/SmartGroupManual.vue +398 -0
  704. package/src/components/SmartGroupModal.story.vue +61 -0
  705. package/src/components/SmartGroupModal.vue +61 -0
  706. package/src/components/StatusIndicator.story.vue +99 -0
  707. package/src/components/StatusIndicator.vue +40 -0
  708. package/src/components/StepWizard.story.vue +155 -0
  709. package/src/components/StepWizard.vue +223 -0
  710. package/src/components/TagsInput.story.vue +155 -0
  711. package/src/components/TagsInput.vue +280 -0
  712. package/src/components/ThemeToggle.story.vue +36 -0
  713. package/src/components/ThemeToggle.vue +56 -0
  714. package/src/components/TimePicker.story.vue +96 -0
  715. package/src/components/TimePicker.vue +251 -0
  716. package/src/components/TimeRangeInput.story.vue +104 -0
  717. package/src/components/TimeRangeInput.vue +122 -0
  718. package/src/components/Tooltip.story.vue +138 -0
  719. package/src/components/Tooltip.vue +114 -0
  720. package/src/components/UnitInput.story.vue +194 -0
  721. package/src/components/UnitInput.vue +217 -0
  722. package/src/components/WellPlate.colors.ts +56 -0
  723. package/src/components/WellPlate.conditions.ts +100 -0
  724. package/src/components/WellPlate.geometry.ts +91 -0
  725. package/src/components/WellPlate.interaction.ts +272 -0
  726. package/src/components/WellPlate.legend.ts +8 -0
  727. package/src/components/WellPlate.rendering.ts +105 -0
  728. package/src/components/WellPlate.sampleDrop.ts +73 -0
  729. package/src/components/WellPlate.story.vue +282 -0
  730. package/src/components/WellPlate.vue +497 -0
  731. package/src/components/index.ts +148 -0
  732. package/src/components/internal/ActionItemInternal.vue +82 -0
  733. package/src/components/internal/AppTopBarPageSelectorInternal.vue +127 -0
  734. package/src/components/internal/AppTopBarPillNavInternal.vue +194 -0
  735. package/src/components/internal/CalendarGridPanelInternal.vue +120 -0
  736. package/src/components/internal/FormFieldRendererInternal.vue +68 -0
  737. package/src/components/internal/FormSectionRenderer.vue +78 -0
  738. package/src/components/internal/PlateMapEditorToolbarInternal.vue +128 -0
  739. package/src/components/internal/WellEditPopupInternal.vue +249 -0
  740. package/src/components/internal/WorkspaceControlsInternal.vue +20 -0
  741. package/src/components/internal/WorkspaceShellInternal.vue +125 -0
  742. package/src/components/internal/WorkspaceSidebarInternal.vue +82 -0
  743. package/src/composables/analysisArtifactTarget.ts +53 -0
  744. package/src/composables/autoGroup/classKey.ts +8 -0
  745. package/src/composables/autoGroup/classify.ts +205 -0
  746. package/src/composables/autoGroup/colors.ts +6 -0
  747. package/src/composables/autoGroup/columns.ts +226 -0
  748. package/src/composables/autoGroup/compose.ts +244 -0
  749. package/src/composables/autoGroup/cooccurrence.ts +46 -0
  750. package/src/composables/autoGroup/csv-shim.ts +44 -0
  751. package/src/composables/autoGroup/fingerprint.ts +63 -0
  752. package/src/composables/autoGroup/index.ts +22 -0
  753. package/src/composables/autoGroup/replicatePreGroup.ts +124 -0
  754. package/src/composables/autoGroup/template.ts +126 -0
  755. package/src/composables/autoGroup/tokenLength.ts +53 -0
  756. package/src/composables/autoGroup/tokenize.ts +41 -0
  757. package/src/composables/autoGroup/vocab.json +66 -0
  758. package/src/composables/autoGroupConstants.ts +4 -0
  759. package/src/composables/autoGroupGrouping.ts +148 -0
  760. package/src/composables/controlComponentBindings.ts +80 -0
  761. package/src/composables/controlSchemaAdapters.ts +199 -0
  762. package/src/composables/controlSchemaDoseDesign.ts +222 -0
  763. package/src/composables/controlSchemaFormFields.ts +64 -0
  764. package/src/composables/controlSchemaLayout.ts +59 -0
  765. package/src/composables/controlSchemaModel.ts +172 -0
  766. package/src/composables/controlSchemaNormalize.ts +101 -0
  767. package/src/composables/controlSchemaTypes.ts +372 -0
  768. package/src/composables/controlSchemaUtils.ts +36 -0
  769. package/src/composables/controlWorkspaceOptions.ts +21 -0
  770. package/src/composables/experiment-utils.ts +105 -0
  771. package/src/composables/experimentDesignData.ts +180 -0
  772. package/src/composables/flattenWorkspaceBindings.ts +104 -0
  773. package/src/composables/formBuilderRegistry.ts +86 -0
  774. package/src/composables/formBuilderSchema.ts +153 -0
  775. package/src/composables/index.ts +556 -0
  776. package/src/composables/platformContextHelpers.ts +81 -0
  777. package/src/composables/pluginEndpointBuilder.ts +267 -0
  778. package/src/composables/pluginFrontendBase.ts +22 -0
  779. package/src/composables/pluginWorkspaceModel.ts +182 -0
  780. package/src/composables/protocolTemplateCatalog.ts +325 -0
  781. package/src/composables/useAnalysisArtifacts.ts +361 -0
  782. package/src/composables/useApi.ts +319 -0
  783. package/src/composables/useAppExperiment.ts +228 -0
  784. package/src/composables/useAsync.ts +327 -0
  785. package/src/composables/useAuth.ts +458 -0
  786. package/src/composables/useAutoGroup.ts +682 -0
  787. package/src/composables/useAutoGroupInputSources.ts +147 -0
  788. package/src/composables/useBioTemplateComponents.ts +105 -0
  789. package/src/composables/useBioTemplateControls.ts +41 -0
  790. package/src/composables/useBioTemplatePackWorkspace.ts +199 -0
  791. package/src/composables/useBioTemplatePresetWorkspace.ts +325 -0
  792. package/src/composables/useBioTemplateWorkspace.ts +116 -0
  793. package/src/composables/useCalendarGrid.ts +140 -0
  794. package/src/composables/useChemicalFormula.ts +275 -0
  795. package/src/composables/useCommandHistory.ts +117 -0
  796. package/src/composables/useConcentrationUnits.ts +246 -0
  797. package/src/composables/useControlSchema.ts +135 -0
  798. package/src/composables/useControlWorkspace.ts +209 -0
  799. package/src/composables/useDebouncedWatch.ts +119 -0
  800. package/src/composables/useDoseCalculator.ts +370 -0
  801. package/src/composables/useDropdownState.ts +83 -0
  802. package/src/composables/useEventListener.ts +111 -0
  803. package/src/composables/useEventStream.ts +314 -0
  804. package/src/composables/useExpansionSet.ts +117 -0
  805. package/src/composables/useExperimentData.ts +136 -0
  806. package/src/composables/useExperimentSamples.ts +142 -0
  807. package/src/composables/useExperimentSave.ts +344 -0
  808. package/src/composables/useExperimentSelector.ts +408 -0
  809. package/src/composables/useFileImport.ts +231 -0
  810. package/src/composables/useFocusTrap.ts +91 -0
  811. package/src/composables/useForm.ts +279 -0
  812. package/src/composables/useFormBuilder.ts +292 -0
  813. package/src/composables/useFormValidation.ts +154 -0
  814. package/src/composables/useGeneratedAnalysis.ts +1227 -0
  815. package/src/composables/useGroupAssignment.ts +148 -0
  816. package/src/composables/useJobsStatusTray.ts +493 -0
  817. package/src/composables/useListSelection.ts +158 -0
  818. package/src/composables/useMenuKeyboard.ts +90 -0
  819. package/src/composables/useMobileSupportGate.ts +80 -0
  820. package/src/composables/useOptimisticMutation.ts +111 -0
  821. package/src/composables/usePasskey.ts +216 -0
  822. package/src/composables/usePlatformContext.ts +299 -0
  823. package/src/composables/usePluginClient.ts +1006 -0
  824. package/src/composables/usePluginConfig.ts +250 -0
  825. package/src/composables/usePluginWorkspace.ts +208 -0
  826. package/src/composables/usePresenceHeartbeat.ts +201 -0
  827. package/src/composables/useProtocolTemplates.ts +212 -0
  828. package/src/composables/useRackEditor.ts +223 -0
  829. package/src/composables/useReagentSeries.ts +91 -0
  830. package/src/composables/useRequestSyncState.ts +126 -0
  831. package/src/composables/useResourceCrud.ts +249 -0
  832. package/src/composables/useRovingFocus.ts +66 -0
  833. package/src/composables/useRuntimeAlignment.ts +184 -0
  834. package/src/composables/useSampleGroups.ts +211 -0
  835. package/src/composables/useScheduleCalendarLayout.ts +287 -0
  836. package/src/composables/useScheduleDrag.ts +245 -0
  837. package/src/composables/useSelectionLimit.ts +57 -0
  838. package/src/composables/useSequenceUtils.ts +105 -0
  839. package/src/composables/useSortedItems.ts +118 -0
  840. package/src/composables/useTemplateCollection.ts +229 -0
  841. package/src/composables/useTextSearch.ts +60 -0
  842. package/src/composables/useTheme.ts +32 -0
  843. package/src/composables/useTimeUtils.ts +155 -0
  844. package/src/composables/useToast.ts +40 -0
  845. package/src/composables/useWellPainting.ts +191 -0
  846. package/src/composables/useWellPlateAdapter.ts +151 -0
  847. package/src/composables/useWellPlateEditor.ts +425 -0
  848. package/src/composables/useWellPlateValidation.ts +89 -0
  849. package/src/composables/workspaceRecipes.ts +267 -0
  850. package/src/generated/schema.ts +130 -0
  851. package/src/generated-ui/main.ts +21 -0
  852. package/src/histoire.setup.ts +17 -0
  853. package/src/index.ts +83 -0
  854. package/src/install.ts +39 -0
  855. package/src/instrument.ts +90 -0
  856. package/src/jobs.ts +80 -0
  857. package/src/lcms.ts +108 -0
  858. package/src/permissions.ts +144 -0
  859. package/src/plotly-dist.d.ts +3 -0
  860. package/src/stores/auth.ts +206 -0
  861. package/src/stores/experiment.ts +120 -0
  862. package/src/stores/index.ts +3 -0
  863. package/src/stores/settings.ts +232 -0
  864. package/src/styles/components/action-menu.css +59 -0
  865. package/src/styles/components/alert-box.css +150 -0
  866. package/src/styles/components/app-avatar-menu.css +156 -0
  867. package/src/styles/components/app-container.css +33 -0
  868. package/src/styles/components/app-layout.css +180 -0
  869. package/src/styles/components/app-page-selector.css +212 -0
  870. package/src/styles/components/app-pill-nav.css +133 -0
  871. package/src/styles/components/app-plugin-switcher.css +196 -0
  872. package/src/styles/components/app-sidebar.css +392 -0
  873. package/src/styles/components/app-top-bar.css +249 -0
  874. package/src/styles/components/artifact-save-dialog.css +17 -0
  875. package/src/styles/components/artifact-selector-modal.css +216 -0
  876. package/src/styles/components/audit-trail.css +143 -0
  877. package/src/styles/components/avatar.css +73 -0
  878. package/src/styles/components/batch-progress-list.css +196 -0
  879. package/src/styles/components/breadcrumb.css +64 -0
  880. package/src/styles/components/button.css +192 -0
  881. package/src/styles/components/calendar.css +192 -0
  882. package/src/styles/components/chart-container.css +69 -0
  883. package/src/styles/components/checkbox.css +210 -0
  884. package/src/styles/components/chemical-formula.css +46 -0
  885. package/src/styles/components/collapsible-card.css +393 -0
  886. package/src/styles/components/color-slider.css +110 -0
  887. package/src/styles/components/concentration-input.css +17 -0
  888. package/src/styles/components/confirm-dialog.css +59 -0
  889. package/src/styles/components/dataframe.css +554 -0
  890. package/src/styles/components/date-picker.css +243 -0
  891. package/src/styles/components/datetime-picker.css +229 -0
  892. package/src/styles/components/divider.css +63 -0
  893. package/src/styles/components/dose-calculator.css +297 -0
  894. package/src/styles/components/dropdown-button.css +280 -0
  895. package/src/styles/components/empty-state.css +135 -0
  896. package/src/styles/components/experiment-code-badge.css +33 -0
  897. package/src/styles/components/experiment-data-viewer.css +138 -0
  898. package/src/styles/components/experiment-popover.css +563 -0
  899. package/src/styles/components/experiment-selector-modal.css +341 -0
  900. package/src/styles/components/experiment-timeline.css +529 -0
  901. package/src/styles/components/file-uploader.css +310 -0
  902. package/src/styles/components/fit-panel.css +67 -0
  903. package/src/styles/components/form-builder.css +69 -0
  904. package/src/styles/components/form-field.css +48 -0
  905. package/src/styles/components/formula-input.css +103 -0
  906. package/src/styles/components/group-assigner.css +200 -0
  907. package/src/styles/components/icon-button.css +196 -0
  908. package/src/styles/components/input.css +65 -0
  909. package/src/styles/components/instrument-monitor.css +478 -0
  910. package/src/styles/components/jobs-status-tray.css +420 -0
  911. package/src/styles/components/lcms-sequence-table.css +189 -0
  912. package/src/styles/components/loading-spinner.css +67 -0
  913. package/src/styles/components/mobile-support-gate.css +119 -0
  914. package/src/styles/components/modal.css +646 -0
  915. package/src/styles/components/molecule-input.css +186 -0
  916. package/src/styles/components/multi-select.css +131 -0
  917. package/src/styles/components/number-input.css +199 -0
  918. package/src/styles/components/pill.css +188 -0
  919. package/src/styles/components/plate-map-editor.css +464 -0
  920. package/src/styles/components/plugin-icon.css +46 -0
  921. package/src/styles/components/progress-bar.css +133 -0
  922. package/src/styles/components/protocol-step-editor.css +443 -0
  923. package/src/styles/components/rack-editor.css +265 -0
  924. package/src/styles/components/radio-group.css +240 -0
  925. package/src/styles/components/reagent-editor.css +505 -0
  926. package/src/styles/components/reagent-list.css +407 -0
  927. package/src/styles/components/resource-card.css +360 -0
  928. package/src/styles/components/sample-hierarchy-tree.css +310 -0
  929. package/src/styles/components/sample-legend.css +201 -0
  930. package/src/styles/components/sample-selector.css +682 -0
  931. package/src/styles/components/schedule-calendar.css +472 -0
  932. package/src/styles/components/scientific-number.css +63 -0
  933. package/src/styles/components/secret-input.css +60 -0
  934. package/src/styles/components/section-card.css +161 -0
  935. package/src/styles/components/segmented-control.css +194 -0
  936. package/src/styles/components/select.css +77 -0
  937. package/src/styles/components/sequence-input.css +184 -0
  938. package/src/styles/components/sequence-progress-bar.css +63 -0
  939. package/src/styles/components/settings-modal.css +76 -0
  940. package/src/styles/components/skeleton.css +49 -0
  941. package/src/styles/components/slider.css +74 -0
  942. package/src/styles/components/smart-group.css +734 -0
  943. package/src/styles/components/status-indicator.css +66 -0
  944. package/src/styles/components/step-wizard.css +192 -0
  945. package/src/styles/components/tabs.css +103 -0
  946. package/src/styles/components/tags-input.css +195 -0
  947. package/src/styles/components/textarea.css +81 -0
  948. package/src/styles/components/theme-toggle.css +6 -0
  949. package/src/styles/components/time-picker.css +171 -0
  950. package/src/styles/components/time-range-input.css +42 -0
  951. package/src/styles/components/toast.css +91 -0
  952. package/src/styles/components/toggle.css +226 -0
  953. package/src/styles/components/tooltip.css +91 -0
  954. package/src/styles/components/unit-input.css +123 -0
  955. package/src/styles/components/well-edit-popup.css +258 -0
  956. package/src/styles/components/well-plate.css +286 -0
  957. package/src/styles/index.css +94 -0
  958. package/src/styles/variables.css +1150 -0
  959. package/src/tailwind.preset.ts +66 -0
  960. package/src/templates/adapters.ts +137 -0
  961. package/src/templates/assayLookups.ts +33 -0
  962. package/src/templates/assayMatrixAdapters.ts +78 -0
  963. package/src/templates/assayMatrixBuilder.ts +59 -0
  964. package/src/templates/assayNormalizers.ts +34 -0
  965. package/src/templates/builderDefaults.ts +11 -0
  966. package/src/templates/builderIdUtils.ts +20 -0
  967. package/src/templates/builderPresetControls.ts +165 -0
  968. package/src/templates/builderReadUtils.ts +55 -0
  969. package/src/templates/builders.ts +122 -0
  970. package/src/templates/calibrationCurveAdapters.ts +59 -0
  971. package/src/templates/calibrationCurveBuilder.ts +99 -0
  972. package/src/templates/calibrationNormalizers.ts +60 -0
  973. package/src/templates/catalog.ts +245 -0
  974. package/src/templates/componentBindingCatalog.ts +90 -0
  975. package/src/templates/componentBindingHelpers.ts +93 -0
  976. package/src/templates/componentBindings.ts +253 -0
  977. package/src/templates/componentDoseResponseProps.ts +42 -0
  978. package/src/templates/componentGenericProps.ts +77 -0
  979. package/src/templates/componentPlateHelpers.ts +29 -0
  980. package/src/templates/componentPlateMapProps.ts +32 -0
  981. package/src/templates/componentPropsFactory.ts +21 -0
  982. package/src/templates/componentQpcrPlateProps.ts +28 -0
  983. package/src/templates/componentTargetResolvers.ts +67 -0
  984. package/src/templates/componentTemplateProps.ts +78 -0
  985. package/src/templates/controlSchemaClone.ts +32 -0
  986. package/src/templates/controlSchemaConstants.ts +11 -0
  987. package/src/templates/controlSchemaMerge.ts +40 -0
  988. package/src/templates/controlSchemaTargets.ts +85 -0
  989. package/src/templates/controlSchemaTypes.ts +20 -0
  990. package/src/templates/controlSchemas.ts +104 -0
  991. package/src/templates/defaultBioTemplateBuilder.ts +124 -0
  992. package/src/templates/doseResponseAdapters.ts +45 -0
  993. package/src/templates/doseResponseBuilder.ts +44 -0
  994. package/src/templates/elisaAssayCollectionBuilder.ts +62 -0
  995. package/src/templates/flowCytometryAssayCollectionBuilder.ts +41 -0
  996. package/src/templates/flowCytometryPanelBuilder.ts +53 -0
  997. package/src/templates/flowNormalizers.ts +58 -0
  998. package/src/templates/flowPanelAdapters.ts +58 -0
  999. package/src/templates/index.ts +326 -0
  1000. package/src/templates/instrumentRunAdapterHelpers.ts +94 -0
  1001. package/src/templates/instrumentRunAdapters.ts +163 -0
  1002. package/src/templates/instrumentRunBuilder.ts +97 -0
  1003. package/src/templates/lcmsBatchCollectionBuilder.ts +38 -0
  1004. package/src/templates/lookup.ts +18 -0
  1005. package/src/templates/packs.ts +162 -0
  1006. package/src/templates/plateGeometry.ts +62 -0
  1007. package/src/templates/plateMapAdapters.ts +36 -0
  1008. package/src/templates/plateMapBuilder.ts +43 -0
  1009. package/src/templates/presetControlSchemas.ts +258 -0
  1010. package/src/templates/presets.ts +179 -0
  1011. package/src/templates/protocolAdapters.ts +69 -0
  1012. package/src/templates/protocolNormalizers.ts +37 -0
  1013. package/src/templates/protocolStepsBuilder.ts +36 -0
  1014. package/src/templates/qpcrAdapters.ts +104 -0
  1015. package/src/templates/qpcrExpressionCollectionBuilder.ts +33 -0
  1016. package/src/templates/qpcrPlateBuilder.ts +96 -0
  1017. package/src/templates/reagentAdapters.ts +77 -0
  1018. package/src/templates/reagentListBuilder.ts +30 -0
  1019. package/src/templates/runNormalizers.ts +63 -0
  1020. package/src/templates/sampleNormalizers.ts +58 -0
  1021. package/src/templates/samplePrepAdapters.ts +63 -0
  1022. package/src/templates/samplePrepBuilder.ts +51 -0
  1023. package/src/templates/sampleSheetAdapters.ts +75 -0
  1024. package/src/templates/sampleSheetBuilder.ts +23 -0
  1025. package/src/templates/targetedMetabolomicsCollectionBuilder.ts +79 -0
  1026. package/src/templates/targetedMetabolomicsHelpers.ts +102 -0
  1027. package/src/templates/templateAdapterTypes.ts +58 -0
  1028. package/src/templates/templateControlSchemas.ts +320 -0
  1029. package/src/templates/templateCreateOptions.ts +208 -0
  1030. package/src/templates/templateEnvelopes.ts +137 -0
  1031. package/src/templates/templatePackCollectionBuilder.ts +23 -0
  1032. package/src/templates/templatePresetCollectionBuilder.ts +139 -0
  1033. package/src/templates/templateQpcrTypes.ts +48 -0
  1034. package/src/templates/templateValidators.ts +414 -0
  1035. package/src/templates/timeCourseAdapters.ts +73 -0
  1036. package/src/templates/timeCourseBuilder.ts +64 -0
  1037. package/src/templates/types.ts +493 -0
  1038. package/src/templates/wellPlateScreenCollectionBuilder.ts +36 -0
  1039. package/src/templates/westernBlotAssayCollectionBuilder.ts +68 -0
  1040. package/src/types/analysisArtifactTypes.ts +176 -0
  1041. package/src/types/auth.ts +59 -0
  1042. package/src/types/auto-group.ts +157 -0
  1043. package/src/types/componentLabTypes.ts +235 -0
  1044. package/src/types/componentWorkflowTypes.ts +190 -0
  1045. package/src/types/components.ts +527 -0
  1046. package/src/types/form-builder.ts +208 -0
  1047. package/src/types/generated-ui.ts +189 -0
  1048. package/src/types/index.ts +299 -0
  1049. package/src/types/instrument.ts +62 -0
  1050. package/src/types/jobs.ts +70 -0
  1051. package/src/types/platform.ts +132 -0
  1052. package/src/utils/color.ts +96 -0
  1053. package/src/utils/formModelSync.ts +50 -0
  1054. package/src/utils/items.ts +28 -0
  1055. package/src/utils/options.ts +23 -0
  1056. package/src/utils/pluginIcon.ts +188 -0
  1057. package/src/utils/pluginSecrets.ts +102 -0
  1058. package/src/utils/rack.ts +209 -0
  1059. package/src/utils/records.ts +9 -0
  1060. package/src/utils/sampleGroupPath.ts +19 -0
  1061. package/dist/ExperimentPopover-C1e0cd94.js +0 -3
  1062. package/dist/ExperimentSelectorModal-DCWTFyos.js +0 -4
  1063. package/dist/SettingsModal-Bpybht86.js +0 -5
@@ -0,0 +1,1006 @@
1
+ import {
2
+ computed,
3
+ onMounted,
4
+ ref,
5
+ shallowRef,
6
+ watch,
7
+ type ComputedRef,
8
+ type Ref,
9
+ } from 'vue'
10
+ import {
11
+ AuthenticationRequiredError,
12
+ authenticationRequiredError,
13
+ useApi,
14
+ } from './useApi'
15
+ import { usePlatformContext } from './usePlatformContext'
16
+ import { useRequestSyncState } from './useRequestSyncState'
17
+ import { useAuthStore } from '../stores/auth'
18
+ import { PLUGIN_SECRET_FORMAT_KEY } from '../utils/pluginSecrets'
19
+ import {
20
+ currentExperimentFromContext,
21
+ getInjectedPlatformContext,
22
+ resolveCurrentExperimentId,
23
+ } from './platformContextHelpers'
24
+ import {
25
+ buildPluginEndpointUrl,
26
+ hasKeys,
27
+ pluginEndpointRequestParts,
28
+ requestBodyFromPayload,
29
+ } from './pluginEndpointBuilder'
30
+ import {
31
+ useEventStream,
32
+ type EventStreamMessage,
33
+ type EventStreamTransport,
34
+ type UseEventStreamReturn,
35
+ } from './useEventStream'
36
+ import type {
37
+ ExperimentSummary,
38
+ GeneratedJobDefinition,
39
+ PageSelectorItem,
40
+ SettingsModalSchema,
41
+ TopBarSettingsConfig,
42
+ } from '../types'
43
+
44
+ export {
45
+ buildPluginEndpointUrl,
46
+ resolvePluginBaseUrl,
47
+ } from './pluginEndpointBuilder'
48
+
49
+ export type PluginHttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete'
50
+
51
+ export interface PluginEndpointContract {
52
+ name: string
53
+ operationId?: string
54
+ method: PluginHttpMethod
55
+ path: string
56
+ requiresAuth?: boolean
57
+ pathParams?: PluginEndpointParamContract[]
58
+ queryParams?: PluginEndpointParamContract[]
59
+ requestType?: string | null
60
+ requestContentType?: string | null
61
+ responseType?: string | null
62
+ responseContentType?: string | null
63
+ eventStream?: boolean
64
+ }
65
+
66
+ export interface PluginEndpointParamContract {
67
+ name: string
68
+ fieldName: string
69
+ type?: string
70
+ required?: boolean
71
+ }
72
+
73
+ export interface PluginNavItemContract {
74
+ path: string
75
+ label: string
76
+ id?: string
77
+ icon?: string
78
+ description?: string
79
+ requiresAuth?: boolean
80
+ requiresAdmin?: boolean
81
+ requiresFeature?: string
82
+ }
83
+
84
+ export interface PluginContractSettings {
85
+ modelName: string | null
86
+ /** Pydantic JSON Schema used to generate typed settings values. */
87
+ valueSchema: Record<string, unknown> | null
88
+ /** SDK SettingsModal schema used to render the settings form. */
89
+ formSchema: SettingsModalSchema | null
90
+ }
91
+
92
+ export interface PluginContract {
93
+ schemaVersion: 2
94
+ plugin: {
95
+ name?: string
96
+ packageName?: string
97
+ version?: string
98
+ description?: string
99
+ routesPrefix: string
100
+ apiPrefix: string
101
+ type: 'analysis' | 'experiment-design' | string
102
+ analysisType?: string
103
+ icon?: string
104
+ color?: string
105
+ navItems?: PluginNavItemContract[]
106
+ analysisResultReaders?: string[]
107
+ capabilities?: Record<string, unknown>
108
+ }
109
+ settings: PluginContractSettings
110
+ endpoints: PluginEndpointContract[]
111
+ schemas?: Record<string, Record<string, unknown>>
112
+ jobs?: GeneratedJobDefinition[]
113
+ hash: string
114
+ }
115
+
116
+ export interface PluginEndpointDefinition {
117
+ method: PluginHttpMethod
118
+ path: string
119
+ requiresAuth?: boolean
120
+ pathParams?: PluginEndpointParamDefinition[]
121
+ queryParams?: PluginEndpointParamDefinition[]
122
+ hasBody?: boolean
123
+ requestContentType?: string | null
124
+ eventStream?: boolean
125
+ responseType?: string | null
126
+ responseContentType?: string | null
127
+ }
128
+
129
+ export type PluginEndpointParamDefinition = string | {
130
+ name: string
131
+ fieldName?: string
132
+ type?: string
133
+ required?: boolean
134
+ }
135
+
136
+ export interface CreatePluginClientOptions {
137
+ endpoints: Record<string, PluginEndpointDefinition>
138
+ baseUrl?: string
139
+ }
140
+
141
+ export interface BuildPluginEndpointUrlOptions {
142
+ /** Override the generated or platform-injected API base URL. */
143
+ baseUrl?: string
144
+ /** Return only the endpoint path and query string instead of base URL + path. */
145
+ includeBaseUrl?: boolean
146
+ }
147
+
148
+ export interface PluginEndpointRequestOptions {
149
+ /** Override the generated or platform-injected API base URL. */
150
+ baseUrl?: string
151
+ /** Cancel the request without changing its endpoint or authentication behavior. */
152
+ signal?: AbortSignal
153
+ }
154
+
155
+ export interface PluginClientRequestOptions {
156
+ /** Cancel the generated endpoint request. */
157
+ signal?: AbortSignal
158
+ }
159
+
160
+ export interface DownloadPluginEndpointOptions extends PluginEndpointRequestOptions {
161
+ /** Browser download filename. When omitted, the blob is returned without triggering a download. */
162
+ filename?: string
163
+ /** Delay before revoking the object URL after a browser download is triggered. */
164
+ revokeObjectUrlDelayMs?: number
165
+ }
166
+
167
+ export interface DownloadBlobOptions {
168
+ /** Delay before revoking the object URL after a browser download is triggered. */
169
+ revokeObjectUrlDelayMs?: number
170
+ }
171
+
172
+ export type PluginSettingsValues<TSettings> = Partial<TSettings> & Record<string, unknown>
173
+
174
+ export interface UsePluginSettingsOptions {
175
+ /** Plugin name for platform persistence. Defaults to the integrated platform plugin name. */
176
+ pluginName?: string
177
+ /** Plugin API base URL for standalone/local settings routes. Generated clients pass pluginApiPrefix. */
178
+ apiBaseUrl?: string
179
+ /** Platform API base URL for /plugins/{name}/config. Defaults to the injected platform API URL. */
180
+ platformApiBaseUrl?: string
181
+ /** SettingsModal schema generated from the backend plugin config model. */
182
+ schema?: SettingsModalSchema | null
183
+ /** SettingsModal title when using settingsConfig. */
184
+ title?: string
185
+ /** Whether SettingsModal should include SDK appearance controls. */
186
+ showAppearance?: boolean
187
+ /** Load persisted values on component mount. */
188
+ loadOnMount?: boolean
189
+ }
190
+
191
+ export interface UsePluginSettingsReturn<TSettings = Record<string, unknown>> {
192
+ /** Current typed settings values. */
193
+ settings: ComputedRef<PluginSettingsValues<TSettings>>
194
+ /** Editable settings values for SettingsModal. */
195
+ values: Ref<PluginSettingsValues<TSettings>>
196
+ /** Alias for values, kept for callers that think in platform config terms. */
197
+ config: Ref<PluginSettingsValues<TSettings>>
198
+ /** Ready-to-pass AppTopBar/PluginWorkspaceView settingsConfig. */
199
+ settingsConfig: ComputedRef<TopBarSettingsConfig>
200
+ isLoading: Ref<boolean>
201
+ isSaving: Ref<boolean>
202
+ error: Ref<string | null>
203
+ lastLoadedAt: Ref<Date | null>
204
+ lastSavedAt: Ref<Date | null>
205
+ isDirty: ComputedRef<boolean>
206
+ setValues: (values: Record<string, unknown>) => void
207
+ load: () => Promise<void>
208
+ save: (values?: Record<string, unknown>) => Promise<boolean>
209
+ reset: () => void
210
+ }
211
+
212
+ export type PluginEventStreamMessage<TData = string> = EventStreamMessage<TData>
213
+
214
+ export interface PluginEventStreamOptions<TData = string> {
215
+ /** Override the generated or platform-injected API base URL. */
216
+ baseUrl?: string
217
+ /** Start the stream immediately. Defaults to true. */
218
+ immediate?: boolean
219
+ /** Reconnect after errors or server closes. Defaults to true. */
220
+ reconnect?: boolean
221
+ /** Delay before reconnecting after a stream failure or close. Defaults to 2000ms. */
222
+ reconnectDelayMs?: number
223
+ /** Parse `data:` as JSON. Defaults to true for typed endpoints and false otherwise. */
224
+ parseJson?: boolean
225
+ /** Fetch credentials mode. Defaults to same-origin. */
226
+ credentials?: RequestCredentials
227
+ /** Extra request headers. Authorization is injected unless already supplied. */
228
+ headers?: Record<string, string>
229
+ onOpen?: () => void
230
+ onMessage?: (message: PluginEventStreamMessage<TData>) => void
231
+ onError?: (error: unknown) => void
232
+ }
233
+
234
+ export type UsePluginEventStreamReturn<TData = string> = UseEventStreamReturn<TData>
235
+
236
+ export type PluginFormDataValue =
237
+ | string
238
+ | number
239
+ | boolean
240
+ | Blob
241
+ | null
242
+ | undefined
243
+ | Record<string, unknown>
244
+
245
+ export type PluginFormDataPayload = Record<string, PluginFormDataValue | PluginFormDataValue[]>
246
+
247
+ export interface UseCurrentExperimentOptions {
248
+ apiBaseUrl?: string
249
+ immediate?: boolean
250
+ }
251
+
252
+ export interface UseCurrentExperimentReturn<TExperiment = ExperimentSummary> {
253
+ /** Current experiment id resolved from platform injection or URL conventions. */
254
+ experimentId: ComputedRef<number | undefined>
255
+ /** Whether a current experiment id is available. */
256
+ hasExperiment: ComputedRef<boolean>
257
+ /** Current experiment payload, if injected or successfully fetched. */
258
+ experiment: Ref<TExperiment | undefined>
259
+ /** Whether the current experiment is currently loading. */
260
+ isLoading: Ref<boolean>
261
+ /** Error message from the last failed current-experiment fetch, or null. */
262
+ error: Ref<string | null>
263
+ /** Timestamp of the last successful current-experiment fetch, or null. */
264
+ lastLoadedAt: Ref<Date | null>
265
+ /** Return the current experiment id or throw a clear SDK error when absent. */
266
+ requireExperimentId: () => number
267
+ /** Fetch a specific experiment id, defaulting to the current experiment id. */
268
+ fetch: (experimentId?: number) => Promise<TExperiment | undefined>
269
+ /** Refetch the currently resolved experiment id. */
270
+ refresh: () => Promise<TExperiment | undefined>
271
+ }
272
+
273
+ export type PluginEndpointCaller = (
274
+ payloadOrOptions?: unknown,
275
+ options?: PluginClientRequestOptions,
276
+ ) => Promise<unknown>
277
+ export type GeneratedPluginClient = Record<string, (...args: any[]) => Promise<any>>
278
+
279
+ function queryConfig(query: Record<string, unknown>) {
280
+ return hasKeys(query) ? { params: query } : undefined
281
+ }
282
+
283
+ const OCTET_STREAM = 'application/octet-stream'
284
+ const MULTIPART_FORM_DATA = 'multipart/form-data'
285
+
286
+ function endpointRequestConfig(
287
+ endpoint: PluginEndpointDefinition,
288
+ query: Record<string, unknown>,
289
+ options?: PluginClientRequestOptions,
290
+ ) {
291
+ const config: Record<string, unknown> = {}
292
+ if (hasKeys(query)) config.params = query
293
+ if (endpoint.requestContentType === OCTET_STREAM) {
294
+ config.headers = { 'Content-Type': OCTET_STREAM }
295
+ }
296
+ if (endpoint.requestContentType === MULTIPART_FORM_DATA) {
297
+ config.headers = { 'Content-Type': undefined }
298
+ }
299
+ if (endpoint.responseContentType === OCTET_STREAM) {
300
+ config.responseType = 'blob'
301
+ }
302
+ if (options?.signal) config.signal = options.signal
303
+ return hasKeys(config) ? config : undefined
304
+ }
305
+
306
+ function isFormData(value: unknown): value is FormData {
307
+ return typeof FormData !== 'undefined' && value instanceof FormData
308
+ }
309
+
310
+ function endpointRequestBody(endpoint: PluginEndpointDefinition, body: unknown): unknown {
311
+ return endpoint.requestContentType === MULTIPART_FORM_DATA
312
+ ? pluginFormDataFromPayload(body)
313
+ : body
314
+ }
315
+
316
+ function endpointHasPayload(endpoint: PluginEndpointDefinition): boolean {
317
+ return Boolean(
318
+ endpoint.hasBody
319
+ || endpoint.pathParams?.length
320
+ || endpoint.queryParams?.length,
321
+ )
322
+ }
323
+
324
+ function isBlob(value: unknown): value is Blob {
325
+ return typeof Blob !== 'undefined' && value instanceof Blob
326
+ }
327
+
328
+ function appendFormDataValue(formData: FormData, key: string, value: PluginFormDataValue | PluginFormDataValue[]): void {
329
+ if (value === undefined || value === null) return
330
+
331
+ if (Array.isArray(value)) {
332
+ for (const item of value) {
333
+ appendFormDataValue(formData, key, item)
334
+ }
335
+ return
336
+ }
337
+
338
+ if (isBlob(value)) {
339
+ formData.append(key, value)
340
+ return
341
+ }
342
+
343
+ if (typeof value === 'object') {
344
+ formData.append(key, JSON.stringify(value))
345
+ return
346
+ }
347
+
348
+ formData.append(key, String(value))
349
+ }
350
+
351
+ /** Convert plain upload payloads into FormData using the same encoding across generated plugin clients. */
352
+ export function pluginFormDataFromPayload(payload: unknown): FormData {
353
+ if (isFormData(payload)) return payload
354
+ if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {
355
+ throw new Error('[MINT SDK] Plugin upload endpoints require a FormData or plain object payload.')
356
+ }
357
+
358
+ const formData = new FormData()
359
+ for (const [key, value] of Object.entries(payload as PluginFormDataPayload)) {
360
+ appendFormDataValue(formData, key, value)
361
+ }
362
+ return formData
363
+ }
364
+
365
+ /** Trigger a browser download for an already-created Blob. */
366
+ export function downloadBlob(blob: Blob, filename: string, options: DownloadBlobOptions = {}): void {
367
+ if (typeof document === 'undefined' || typeof URL === 'undefined') {
368
+ throw new Error('[MINT SDK] Cannot trigger a file download outside a browser.')
369
+ }
370
+
371
+ const blobUrl = URL.createObjectURL(blob)
372
+ const link = document.createElement('a')
373
+ link.href = blobUrl
374
+ link.download = filename
375
+ document.body.appendChild(link)
376
+ link.click()
377
+ document.body.removeChild(link)
378
+ setTimeout(() => URL.revokeObjectURL(blobUrl), options.revokeObjectUrlDelayMs ?? 100)
379
+ }
380
+
381
+ function normalizePluginNavPath(path: string): string {
382
+ const raw = path.trim() || '/'
383
+ const prefixed = raw.startsWith('/') ? raw : `/${raw}`
384
+ return prefixed.replace(/\/+$/, '') || '/'
385
+ }
386
+
387
+ function pluginPageIdFromPath(path: string, fallbackIndex: number): string {
388
+ const normalizedPath = normalizePluginNavPath(path)
389
+ if (normalizedPath === '/') return 'dashboard'
390
+ return normalizedPath.replace(/^\/+/, '').replace(/\/+/g, '-') || `page-${fallbackIndex + 1}`
391
+ }
392
+
393
+ /** Convert resolved @mint_plugin nav_items into page selectors for the topbar and homepage PluginCards. */
394
+ export function getPluginPageSelectorItems(contract: PluginContract): PageSelectorItem[] {
395
+ const pluginIcon = contract.plugin.icon ?? ''
396
+ const navItems = contract.plugin.navItems ?? []
397
+ return navItems.map((item, index) => ({
398
+ id: item.id || pluginPageIdFromPath(item.path, index),
399
+ label: item.label,
400
+ to: normalizePluginNavPath(item.path),
401
+ icon: item.icon || pluginIcon || undefined,
402
+ }))
403
+ }
404
+
405
+ /** Create a typed plugin API client from a generated MINT plugin contract. */
406
+ export function createPluginClient<TClient extends object = GeneratedPluginClient>(
407
+ contract: PluginContract,
408
+ options: CreatePluginClientOptions,
409
+ ): TClient {
410
+ const client: Record<string, PluginEndpointCaller> = {}
411
+
412
+ for (const [name, endpoint] of Object.entries(options.endpoints)) {
413
+ client[name] = async (
414
+ payloadOrOptions?: unknown,
415
+ explicitOptions?: PluginClientRequestOptions,
416
+ ) => {
417
+ const hasPayload = endpointHasPayload(endpoint)
418
+ const payload = hasPayload ? payloadOrOptions : undefined
419
+ const callOptions = hasPayload
420
+ ? explicitOptions
421
+ : (payloadOrOptions as PluginClientRequestOptions | undefined) ?? explicitOptions
422
+ const parts = pluginEndpointRequestParts(contract, endpoint, payload, options.baseUrl)
423
+ const api = useApi({
424
+ baseUrl: parts.baseUrl,
425
+ withAuth: endpoint.requiresAuth !== false,
426
+ })
427
+ const config = endpointRequestConfig(endpoint, parts.query, callOptions)
428
+
429
+ if (endpoint.method === 'get') {
430
+ return api.get(parts.path, config)
431
+ }
432
+
433
+ if (endpoint.method === 'delete') {
434
+ const rawBody = requestBodyFromPayload(payload, parts.requestPayload, endpoint)
435
+ const body = rawBody === undefined ? undefined : endpointRequestBody(endpoint, rawBody)
436
+ const config = body === undefined
437
+ ? endpointRequestConfig(endpoint, parts.query, callOptions)
438
+ : { ...endpointRequestConfig(endpoint, parts.query, callOptions), data: body }
439
+ return api.delete(parts.path, config)
440
+ }
441
+
442
+ const body = endpointRequestBody(
443
+ endpoint,
444
+ requestBodyFromPayload(payload, parts.requestPayload, endpoint),
445
+ )
446
+
447
+ if (endpoint.method === 'post') return api.post(parts.path, body, config)
448
+ if (endpoint.method === 'put') return api.put(parts.path, body, config)
449
+ if (endpoint.method === 'patch') return api.patch(parts.path, body, config)
450
+ throw new Error(`[MINT SDK] Unsupported plugin endpoint method: ${endpoint.method}`)
451
+ }
452
+ }
453
+
454
+ return client as TClient
455
+ }
456
+
457
+ /** Send multipart or raw binary data to a generated endpoint with contract URL, cancellation, and auth handling. */
458
+ export async function uploadPluginEndpoint<TResponse = unknown>(
459
+ contract: PluginContract,
460
+ endpoint: PluginEndpointDefinition,
461
+ payload?: unknown,
462
+ options: PluginEndpointRequestOptions = {},
463
+ ): Promise<TResponse> {
464
+ if (!['post', 'put', 'patch'].includes(endpoint.method)) {
465
+ throw new Error(`[MINT SDK] Plugin upload endpoints must use POST, PUT, or PATCH; got ${endpoint.method}`)
466
+ }
467
+
468
+ const parts = pluginEndpointRequestParts(contract, endpoint, payload, options.baseUrl)
469
+ const api = useApi({
470
+ baseUrl: parts.baseUrl,
471
+ withAuth: endpoint.requiresAuth !== false,
472
+ })
473
+ const body = endpoint.hasBody
474
+ ? requestBodyFromPayload(payload, parts.requestPayload, endpoint)
475
+ : payload
476
+ if (endpoint.requestContentType === OCTET_STREAM) {
477
+ const config = endpointRequestConfig(endpoint, parts.query, { signal: options.signal })
478
+ if (endpoint.method === 'post') return api.post<TResponse>(parts.path, body, config)
479
+ if (endpoint.method === 'put') return api.put<TResponse>(parts.path, body, config)
480
+ return api.patch<TResponse>(parts.path, body, config)
481
+ }
482
+ const formData = pluginFormDataFromPayload(body)
483
+ const config = {
484
+ ...(queryConfig(parts.query) ?? {}),
485
+ ...(options.signal ? { signal: options.signal } : {}),
486
+ // Let Axios/browser set multipart boundaries.
487
+ headers: { 'Content-Type': undefined },
488
+ }
489
+
490
+ if (endpoint.method === 'post') return api.post<TResponse>(parts.path, formData, config)
491
+ if (endpoint.method === 'put') return api.put<TResponse>(parts.path, formData, config)
492
+ return api.patch<TResponse>(parts.path, formData, config)
493
+ }
494
+
495
+ /** Fetch a generated plugin endpoint as a Blob and optionally trigger a browser download. */
496
+ export async function downloadPluginEndpoint(
497
+ contract: PluginContract,
498
+ endpoint: PluginEndpointDefinition,
499
+ payload?: unknown,
500
+ options: DownloadPluginEndpointOptions = {},
501
+ ): Promise<Blob> {
502
+ if (endpoint.requestContentType === MULTIPART_FORM_DATA) {
503
+ throw new Error('[MINT SDK] Plugin download endpoints do not support multipart request bodies')
504
+ }
505
+
506
+ const parts = pluginEndpointRequestParts(contract, endpoint, payload, options.baseUrl)
507
+ const api = useApi({
508
+ baseUrl: parts.baseUrl,
509
+ withAuth: endpoint.requiresAuth !== false,
510
+ })
511
+ const config = {
512
+ ...(endpointRequestConfig(endpoint, parts.query, { signal: options.signal }) ?? {}),
513
+ responseType: 'blob' as const,
514
+ }
515
+ const rawBody = requestBodyFromPayload(payload, parts.requestPayload, endpoint)
516
+ const body = rawBody === undefined ? undefined : endpointRequestBody(endpoint, rawBody)
517
+ let blob: Blob
518
+
519
+ if (endpoint.method === 'get') blob = await api.get<Blob>(parts.path, config)
520
+ else if (endpoint.method === 'post') blob = await api.post<Blob>(parts.path, body, config)
521
+ else if (endpoint.method === 'put') blob = await api.put<Blob>(parts.path, body, config)
522
+ else if (endpoint.method === 'patch') blob = await api.patch<Blob>(parts.path, body, config)
523
+ else if (endpoint.method === 'delete') {
524
+ blob = await api.delete<Blob>(parts.path, body === undefined ? config : { ...config, data: body })
525
+ } else {
526
+ throw new Error(`[MINT SDK] Unsupported plugin endpoint method: ${endpoint.method}`)
527
+ }
528
+
529
+ if (options.filename) {
530
+ downloadBlob(blob, options.filename, {
531
+ revokeObjectUrlDelayMs: options.revokeObjectUrlDelayMs,
532
+ })
533
+ }
534
+
535
+ return blob
536
+ }
537
+
538
+ function normalizePluginSettingsOptions(options: UsePluginSettingsOptions | string = {}): UsePluginSettingsOptions {
539
+ return typeof options === 'string' ? { pluginName: options } : options
540
+ }
541
+
542
+ /** @deprecated Use `useGeneratedPluginClient()` for generated clients. */
543
+ export function usePluginClient<TClient>(client: TClient): TClient {
544
+ return client
545
+ }
546
+
547
+ const PLATFORM_OWNED_SETTINGS_KEY = 'allowed_experiment_types'
548
+
549
+ /**
550
+ * Secret settings travel as `{ "$secret": "<id>" }` references, so an untouched
551
+ * secret round-trips without ever exposing its value. Declaring the format on
552
+ * every write keeps a `null` unambiguous: it clears the stored secret instead of
553
+ * meaning "unchanged", which is what the deprecated placeholder form meant.
554
+ */
555
+ function withSecretFormat(
556
+ payload: Record<string, unknown>,
557
+ secretFormat: string | null,
558
+ ): Record<string, unknown> {
559
+ if (!secretFormat) return payload
560
+ return { ...payload, [PLUGIN_SECRET_FORMAT_KEY]: secretFormat }
561
+ }
562
+
563
+ function responseSecretFormat(response: unknown): string | null {
564
+ if (!response || typeof response !== 'object') return null
565
+ const format = (response as Record<string, unknown>)[PLUGIN_SECRET_FORMAT_KEY]
566
+ return typeof format === 'string' && format ? format : null
567
+ }
568
+
569
+ function cloneRecord(value: Record<string, unknown>): Record<string, unknown> {
570
+ return JSON.parse(JSON.stringify(value)) as Record<string, unknown>
571
+ }
572
+
573
+ function hasOwnSetting(settings: Record<string, unknown>, key: string): boolean {
574
+ return Object.prototype.hasOwnProperty.call(settings, key)
575
+ }
576
+
577
+ function responseSettingsPayload(response: unknown): Record<string, unknown> {
578
+ if (!response || typeof response !== 'object') return {}
579
+ const data = response as {
580
+ config?: unknown
581
+ settings?: unknown
582
+ }
583
+ if (data.config && typeof data.config === 'object') {
584
+ return cloneRecord(data.config as Record<string, unknown>)
585
+ }
586
+ if (data.settings && typeof data.settings === 'object') {
587
+ return cloneRecord(data.settings as Record<string, unknown>)
588
+ }
589
+ return {}
590
+ }
591
+
592
+ function responseSettingsRevision(response: unknown): string | null {
593
+ if (!response || typeof response !== 'object') return null
594
+ const revision = (response as { revision?: unknown }).revision
595
+ return typeof revision === 'string' && revision ? revision : null
596
+ }
597
+
598
+ function topLevelSettingsPatch(
599
+ current: Record<string, unknown>,
600
+ keys: Iterable<string>,
601
+ ): Record<string, unknown> {
602
+ return Object.fromEntries(
603
+ [...keys].map(key => [
604
+ key,
605
+ hasOwnSetting(current, key) ? current[key] : null,
606
+ ]),
607
+ )
608
+ }
609
+
610
+ function changedTopLevelSettingKeys(
611
+ current: Record<string, unknown>,
612
+ saved: Record<string, unknown>,
613
+ ): Set<string> {
614
+ return new Set(
615
+ [...new Set([...Object.keys(current), ...Object.keys(saved)])].filter(
616
+ key => JSON.stringify(current[key]) !== JSON.stringify(saved[key]),
617
+ ),
618
+ )
619
+ }
620
+
621
+ function platformOwnedSettingsPatch(settings: Record<string, unknown>): Record<string, unknown> {
622
+ return {
623
+ [PLATFORM_OWNED_SETTINGS_KEY]: hasOwnSetting(settings, PLATFORM_OWNED_SETTINGS_KEY)
624
+ ? settings[PLATFORM_OWNED_SETTINGS_KEY]
625
+ : null,
626
+ }
627
+ }
628
+
629
+ /** Load, edit, and persist plugin settings from platform config or the plugin-local settings router. */
630
+ export function usePluginSettings<TSettings = Record<string, unknown>>(
631
+ options: UsePluginSettingsOptions | string = {},
632
+ ): UsePluginSettingsReturn<TSettings> {
633
+ const resolvedOptions = normalizePluginSettingsOptions(options)
634
+ const injectedContext = getInjectedPlatformContext()
635
+ const { plugin, isIntegrated } = usePlatformContext()
636
+ const platformApi = useApi({ baseUrl: resolvedOptions.platformApiBaseUrl ?? injectedContext?.platformApiUrl })
637
+ const pluginApi = useApi({ baseUrl: resolvedOptions.apiBaseUrl ?? injectedContext?.plugin?.api_prefix })
638
+
639
+ const values = ref({}) as Ref<PluginSettingsValues<TSettings>>
640
+ const savedValues = shallowRef<Record<string, unknown>>({})
641
+ const revision = ref<string | null>(null)
642
+ const secretFormat = ref<string | null>(null)
643
+ const request = useRequestSyncState('Plugin settings request failed.')
644
+ const isLoading = ref(false)
645
+ const isSaving = ref(false)
646
+
647
+ const resolvedPluginName = computed(() =>
648
+ resolvedOptions.pluginName ?? plugin.value?.name ?? injectedContext?.plugin?.name ?? '',
649
+ )
650
+ const usesPluginSettingsApi = computed(() => {
651
+ const currentPlugin = injectedContext?.plugin ?? plugin.value
652
+ return currentPlugin?.settings_api === 'plugin'
653
+ && resolvedPluginName.value === currentPlugin.name
654
+ })
655
+ const usesPlatformConfig = computed(() =>
656
+ Boolean(
657
+ (isIntegrated.value || injectedContext?.isIntegrated)
658
+ && resolvedPluginName.value
659
+ && !usesPluginSettingsApi.value,
660
+ ),
661
+ )
662
+ const settings = computed(() => values.value)
663
+ const isDirty = computed(() => JSON.stringify(values.value) !== JSON.stringify(savedValues.value))
664
+ const settingsConfig = computed<TopBarSettingsConfig>(() => ({
665
+ title: resolvedOptions.title,
666
+ schema: resolvedOptions.schema ?? undefined,
667
+ showAppearance: resolvedOptions.showAppearance,
668
+ values: values.value,
669
+ }))
670
+
671
+ function setValues(nextValues: Record<string, unknown>): void {
672
+ values.value = cloneRecord(nextValues) as PluginSettingsValues<TSettings>
673
+ }
674
+
675
+ function applyLoaded(
676
+ nextValues: Record<string, unknown>,
677
+ nextRevision: string | null,
678
+ nextSecretFormat: string | null = secretFormat.value,
679
+ ): void {
680
+ const cloned = cloneRecord(nextValues)
681
+ values.value = cloned as PluginSettingsValues<TSettings>
682
+ savedValues.value = cloneRecord(cloned)
683
+ revision.value = nextRevision
684
+ secretFormat.value = nextSecretFormat
685
+ }
686
+
687
+ async function load(): Promise<void> {
688
+ isLoading.value = true
689
+ try {
690
+ const response = usesPlatformConfig.value
691
+ ? await request.run(
692
+ () => platformApi.get<{ plugin_name: string; config: Record<string, unknown> }>(
693
+ `/plugins/${encodeURIComponent(resolvedPluginName.value)}/config`,
694
+ ),
695
+ { success: 'load', errorMessage: 'Failed to load plugin settings' },
696
+ )
697
+ : await request.run(
698
+ () => pluginApi.get<{ settings: Record<string, unknown>; mode?: string }>('/settings'),
699
+ { success: 'load', errorMessage: 'Failed to load plugin settings' },
700
+ )
701
+ applyLoaded(
702
+ responseSettingsPayload(response),
703
+ responseSettingsRevision(response),
704
+ responseSecretFormat(response),
705
+ )
706
+ } catch {
707
+ // Error state is handled by request.run().
708
+ } finally {
709
+ isLoading.value = false
710
+ }
711
+ }
712
+
713
+ async function save(nextValues?: Record<string, unknown>): Promise<boolean> {
714
+ if (nextValues) {
715
+ setValues(nextValues)
716
+ }
717
+
718
+ isSaving.value = true
719
+ try {
720
+ const payload = cloneRecord(values.value)
721
+ let response: unknown
722
+ if (usesPlatformConfig.value) {
723
+ const dirtyKeys = changedTopLevelSettingKeys(payload, savedValues.value)
724
+ const platformOwnedChanged = dirtyKeys.has(PLATFORM_OWNED_SETTINGS_KEY)
725
+ const typedKeys = [...dirtyKeys].filter(
726
+ key => key !== PLATFORM_OWNED_SETTINGS_KEY,
727
+ )
728
+ let nextRevision = revision.value
729
+
730
+ if (typedKeys.length) {
731
+ response = await request.run(
732
+ () => platformApi.patch<{
733
+ plugin_name: string
734
+ config: Record<string, unknown>
735
+ revision?: string
736
+ }>(
737
+ `/plugins/${encodeURIComponent(resolvedPluginName.value)}/config`,
738
+ {
739
+ config: withSecretFormat(
740
+ topLevelSettingsPatch(payload, typedKeys),
741
+ secretFormat.value,
742
+ ),
743
+ },
744
+ ),
745
+ { success: 'save', errorMessage: 'Failed to save plugin settings' },
746
+ )
747
+ nextRevision = responseSettingsRevision(response) ?? nextRevision
748
+ }
749
+
750
+ if (platformOwnedChanged) {
751
+ response = await request.run(
752
+ () => platformApi.patch<{
753
+ plugin_name: string
754
+ config: Record<string, unknown>
755
+ revision?: string
756
+ }>(
757
+ `/plugins/${encodeURIComponent(resolvedPluginName.value)}/config`,
758
+ { config: platformOwnedSettingsPatch(payload) },
759
+ ),
760
+ { success: 'save', errorMessage: 'Failed to save plugin settings' },
761
+ )
762
+ nextRevision = responseSettingsRevision(response) ?? nextRevision
763
+ }
764
+
765
+ if (!response) return true
766
+ applyLoaded(
767
+ responseSettingsPayload(response),
768
+ nextRevision,
769
+ responseSecretFormat(response) ?? secretFormat.value,
770
+ )
771
+ return true
772
+ } else {
773
+ const ifMatch = revision.value
774
+ ? { headers: { 'If-Match': `"${revision.value}"` } }
775
+ : undefined
776
+ response = await request.run(
777
+ () => pluginApi.put<{
778
+ settings: Record<string, unknown>
779
+ mode?: string
780
+ revision?: string
781
+ }>('/settings', withSecretFormat(payload, secretFormat.value), ifMatch),
782
+ { success: 'save', errorMessage: 'Failed to save plugin settings' },
783
+ )
784
+ }
785
+ applyLoaded(
786
+ responseSettingsPayload(response),
787
+ responseSettingsRevision(response) ?? revision.value,
788
+ responseSecretFormat(response) ?? secretFormat.value,
789
+ )
790
+ return true
791
+ } catch {
792
+ return false
793
+ } finally {
794
+ isSaving.value = false
795
+ }
796
+ }
797
+
798
+ function reset(): void {
799
+ values.value = cloneRecord(savedValues.value) as PluginSettingsValues<TSettings>
800
+ request.clearError()
801
+ }
802
+
803
+ onMounted(() => {
804
+ if (resolvedOptions.loadOnMount !== false) {
805
+ void load()
806
+ }
807
+ })
808
+
809
+ return {
810
+ settings,
811
+ values,
812
+ config: values,
813
+ settingsConfig,
814
+ isLoading,
815
+ isSaving,
816
+ error: request.error,
817
+ lastLoadedAt: request.lastLoadedAt,
818
+ lastSavedAt: request.lastSavedAt,
819
+ isDirty,
820
+ setValues,
821
+ load,
822
+ save,
823
+ reset,
824
+ }
825
+ }
826
+
827
+ function streamRequestAuth(
828
+ requestHeaders: HeadersInit | undefined,
829
+ policy: { requiresAuth: boolean },
830
+ ): {
831
+ headers: Headers
832
+ token?: string
833
+ } {
834
+ const headers = new Headers(requestHeaders)
835
+ const authStore = useAuthStore()
836
+ if (!authStore.isInitialized) {
837
+ authStore.initialize()
838
+ }
839
+ if (policy.requiresAuth && authStore.token && !headers.has('Authorization')) {
840
+ headers.set('Authorization', `Bearer ${authStore.token}`)
841
+ }
842
+ const token = policy.requiresAuth ? authStore.token : undefined
843
+ return {
844
+ headers,
845
+ token: token && headers.get('Authorization') === `Bearer ${token}` ? token : undefined,
846
+ }
847
+ }
848
+
849
+ function pluginEventStreamTransport(
850
+ endpoint: PluginEndpointDefinition,
851
+ ): EventStreamTransport {
852
+ return async (url, init = {}) => {
853
+ if (typeof fetch !== 'function') {
854
+ throw new Error('[MINT SDK] fetch is required for plugin event streams.')
855
+ }
856
+ const requestAuth = streamRequestAuth(
857
+ init.headers,
858
+ { requiresAuth: endpoint.requiresAuth !== false },
859
+ )
860
+ const response = await fetch(url, { ...init, headers: requestAuth.headers })
861
+ if (response.status === 401) {
862
+ throw authenticationRequiredError(response, requestAuth.token)
863
+ }
864
+ return response
865
+ }
866
+ }
867
+
868
+ function looksLikeEventStreamOptions(value: unknown): value is PluginEventStreamOptions {
869
+ if (!value || typeof value !== 'object') return false
870
+ const candidate = value as Record<string, unknown>
871
+ return [
872
+ 'baseUrl',
873
+ 'immediate',
874
+ 'reconnect',
875
+ 'reconnectDelayMs',
876
+ 'parseJson',
877
+ 'credentials',
878
+ 'headers',
879
+ 'onOpen',
880
+ 'onMessage',
881
+ 'onError',
882
+ ].some(key => key in candidate)
883
+ }
884
+
885
+ /** Consume a generated plugin SSE endpoint with auth headers, reconnect, and teardown. */
886
+ export function usePluginEventStream<TData = string>(
887
+ contract: PluginContract,
888
+ endpoint: PluginEndpointDefinition,
889
+ options?: PluginEventStreamOptions<TData>,
890
+ ): UsePluginEventStreamReturn<TData>
891
+ export function usePluginEventStream<TData = string>(
892
+ contract: PluginContract,
893
+ endpoint: PluginEndpointDefinition,
894
+ payload?: unknown,
895
+ options?: PluginEventStreamOptions<TData>,
896
+ ): UsePluginEventStreamReturn<TData>
897
+ export function usePluginEventStream<TData = string>(
898
+ contract: PluginContract,
899
+ endpoint: PluginEndpointDefinition,
900
+ payloadOrOptions?: unknown,
901
+ maybeOptions?: PluginEventStreamOptions<TData>,
902
+ ): UsePluginEventStreamReturn<TData> {
903
+ if (endpoint.method !== 'get') {
904
+ throw new Error(`[MINT SDK] Plugin event streams must use GET; got ${endpoint.method}`)
905
+ }
906
+ const payload = maybeOptions === undefined && looksLikeEventStreamOptions(payloadOrOptions)
907
+ ? undefined
908
+ : payloadOrOptions
909
+ const options = (
910
+ maybeOptions === undefined && looksLikeEventStreamOptions(payloadOrOptions)
911
+ ? payloadOrOptions
912
+ : maybeOptions ?? {}
913
+ ) as PluginEventStreamOptions<TData>
914
+ const responseType = endpoint.responseType?.trim()
915
+ const parseJson = options.parseJson ?? Boolean(responseType && responseType !== 'string')
916
+ return useEventStream<TData>(
917
+ () => buildPluginEndpointUrl(contract, endpoint, payload, { baseUrl: options.baseUrl }),
918
+ {
919
+ transport: pluginEventStreamTransport(endpoint),
920
+ immediate: options.immediate,
921
+ reconnect: options.reconnect,
922
+ reconnectDelayMs: options.reconnectDelayMs,
923
+ parseJson,
924
+ credentials: options.credentials,
925
+ headers: options.headers,
926
+ shouldReconnect: cause => !(cause instanceof AuthenticationRequiredError),
927
+ onOpen: options.onOpen,
928
+ onMessage: options.onMessage,
929
+ onError: options.onError,
930
+ errorLabel: 'Plugin event stream',
931
+ },
932
+ )
933
+ }
934
+
935
+ /** Read and optionally load the current platform experiment for integrated plugin views. */
936
+ export function useCurrentExperiment<TExperiment = ExperimentSummary>(
937
+ options: UseCurrentExperimentOptions = {},
938
+ ): UseCurrentExperimentReturn<TExperiment> {
939
+ const api = useApi({ baseUrl: options.apiBaseUrl ?? getInjectedPlatformContext()?.platformApiUrl })
940
+ const experiment = shallowRef<TExperiment | undefined>(currentExperimentFromContext<TExperiment>())
941
+ const request = useRequestSyncState('Failed to load current experiment')
942
+ const isLoading = request.loading
943
+ const error = request.error
944
+ const lastLoadedAt = request.lastLoadedAt
945
+
946
+ const experimentId = computed<number | undefined>(() => {
947
+ return resolveCurrentExperimentId()
948
+ })
949
+ const hasExperiment = computed(() => experimentId.value !== undefined)
950
+
951
+ function requireExperimentId(): number {
952
+ const id = experimentId.value
953
+ if (id === undefined) {
954
+ throw new Error('[MINT SDK] No current experiment is selected.')
955
+ }
956
+ return id
957
+ }
958
+
959
+ async function fetchExperiment(id = experimentId.value): Promise<TExperiment | undefined> {
960
+ if (id === undefined) {
961
+ experiment.value = currentExperimentFromContext<TExperiment>()
962
+ return experiment.value
963
+ }
964
+
965
+ try {
966
+ const result = await request.run(
967
+ () => api.get<TExperiment>(`/experiments/${id}`),
968
+ { success: 'load', errorMessage: 'Failed to load current experiment' },
969
+ )
970
+ experiment.value = result
971
+ return result
972
+ } catch (e) {
973
+ experiment.value = undefined
974
+ return undefined
975
+ }
976
+ }
977
+
978
+ async function refresh(): Promise<TExperiment | undefined> {
979
+ return fetchExperiment()
980
+ }
981
+
982
+ watch(
983
+ experimentId,
984
+ (id) => {
985
+ if (options.immediate === false) return
986
+ if (id === undefined) {
987
+ experiment.value = currentExperimentFromContext<TExperiment>()
988
+ return
989
+ }
990
+ void fetchExperiment(id)
991
+ },
992
+ { immediate: options.immediate !== false },
993
+ )
994
+
995
+ return {
996
+ experimentId,
997
+ hasExperiment,
998
+ experiment,
999
+ isLoading,
1000
+ error,
1001
+ lastLoadedAt,
1002
+ requireExperimentId,
1003
+ fetch: fetchExperiment,
1004
+ refresh,
1005
+ }
1006
+ }