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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/README.md +35 -5
  2. package/dist/{ExperimentPopover-tLwJ7XF4.js → ExperimentPopover-oL0fg_A0.js} +6 -4
  3. package/dist/ExperimentPopover-oL0fg_A0.js.map +1 -0
  4. package/dist/{ExperimentSelectorModal-DyPAUCLw.js → ExperimentSelectorModal-BeEOomw_.js} +5 -5
  5. package/dist/ExperimentSelectorModal-BeEOomw_.js.map +1 -0
  6. package/dist/{SettingsModal-BgKY93zh.js → SettingsModal-Dphh3RrI.js} +5 -8
  7. package/dist/SettingsModal-Dphh3RrI.js.map +1 -0
  8. package/dist/{EmptyState-p90quq8Z.js → Skeleton-DxtwJ5gt.js} +111 -93
  9. package/dist/Skeleton-DxtwJ5gt.js.map +1 -0
  10. package/dist/__tests__/components/ExperimentTimeline.test.d.ts +1 -0
  11. package/dist/__tests__/components/PluginWorkspaceView.internal.test.d.ts +1 -0
  12. package/dist/__tests__/components/SecretInput.test.d.ts +1 -0
  13. package/dist/__tests__/components/WellEditPopupInternal.test.d.ts +1 -0
  14. package/dist/__tests__/composables/useListReorder.test.d.ts +1 -0
  15. package/dist/__tests__/composables/usePluginConfig.test.d.ts +15 -0
  16. package/dist/__tests__/styles/cssTokens.test.d.ts +1 -0
  17. package/dist/components/ActionMenu.vue.d.ts +1 -1
  18. package/dist/components/AppAvatarMenu.vue.d.ts +4 -0
  19. package/dist/components/AppPluginSwitcher.vue.d.ts +2 -0
  20. package/dist/components/AppSidebar.vue.d.ts +1 -1
  21. package/dist/components/AuditTrail.vue.d.ts +13 -0
  22. package/dist/components/AutoGroupModal.vue.d.ts +1 -1
  23. package/dist/components/BatchProgressList.vue.d.ts +17 -0
  24. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  25. package/dist/components/DataFrame.vue.d.ts +14 -2
  26. package/dist/components/DatePicker.vue.d.ts +1 -1
  27. package/dist/components/DateTimePicker.vue.d.ts +2 -0
  28. package/dist/components/DropdownButton.vue.d.ts +2 -0
  29. package/dist/components/ExperimentDataViewer.vue.d.ts +26 -1
  30. package/dist/components/ExperimentPopover.vue.d.ts +1 -0
  31. package/dist/components/ExperimentTimeline.vue.d.ts +29 -1
  32. package/dist/components/FitPanel.vue.d.ts +1 -1
  33. package/dist/components/JobsStatusTray.vue.d.ts +9 -2
  34. package/dist/components/LcmsSequenceTable.vue.d.ts +29 -1
  35. package/dist/components/PluginWorkspaceView.props.d.ts +29 -1
  36. package/dist/components/PluginWorkspaceView.vue.d.ts +5 -5
  37. package/dist/components/ProgressBar.vue.d.ts +1 -1
  38. package/dist/components/ProtocolStepEditor.vue.d.ts +1 -0
  39. package/dist/components/ReagentList.vue.d.ts +29 -1
  40. package/dist/components/SampleHierarchyTree.vue.d.ts +29 -1
  41. package/dist/components/SampleLegend.vue.d.ts +1 -1
  42. package/dist/components/SampleSelector.drag.d.ts +13 -0
  43. package/dist/components/SampleSelector.tree.d.ts +2 -0
  44. package/dist/components/SampleSelector.vue.d.ts +35 -2
  45. package/dist/components/ScheduleCalendar.vue.d.ts +20 -0
  46. package/dist/components/SecretInput.vue.d.ts +28 -0
  47. package/dist/components/SettingsModal.vue.d.ts +1 -1
  48. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +2 -1
  49. package/dist/components/TimePicker.vue.d.ts +1 -0
  50. package/dist/components/WellPlate.geometry.d.ts +15 -0
  51. package/dist/components/WellPlate.interaction.d.ts +13 -0
  52. package/dist/components/WellPlate.vue.d.ts +29 -0
  53. package/dist/components/index.d.ts +9 -0
  54. package/dist/components/index.js +8 -8
  55. package/dist/components/internal/AppTopBarPageSelectorInternal.vue.d.ts +2 -0
  56. package/dist/components/internal/DataStateInternal.vue.d.ts +43 -0
  57. package/dist/components/internal/WellEditPopupInternal.vue.d.ts +3 -1
  58. package/dist/components/internal/WorkspaceControlsInternal.vue.d.ts +23 -0
  59. package/dist/components/internal/WorkspaceShellInternal.vue.d.ts +70 -0
  60. package/dist/components/internal/WorkspaceSidebarInternal.vue.d.ts +43 -0
  61. package/dist/{components-DkHddRMl.js → components-CgAUzF8F.js} +2497 -2235
  62. package/dist/components-CgAUzF8F.js.map +1 -0
  63. package/dist/composables/controlSchemaTypes.d.ts +34 -0
  64. package/dist/composables/flattenWorkspaceBindings.d.ts +61 -0
  65. package/dist/composables/index.d.ts +9 -2
  66. package/dist/composables/index.js +10 -10
  67. package/dist/composables/pluginWorkspaceModel.d.ts +164 -0
  68. package/dist/composables/useAsync.d.ts +5 -1
  69. package/dist/composables/useBioTemplateWorkspace.d.ts +4 -20
  70. package/dist/composables/useCommandHistory.d.ts +5 -1
  71. package/dist/composables/useDropdownState.d.ts +18 -2
  72. package/dist/composables/useEventStream.d.ts +9 -0
  73. package/dist/composables/useFocusTrap.d.ts +21 -0
  74. package/dist/composables/useGeneratedAnalysis.d.ts +3 -1
  75. package/dist/composables/useJobsStatusTray.d.ts +25 -1
  76. package/dist/composables/useListReorder.d.ts +90 -0
  77. package/dist/composables/useMenuKeyboard.d.ts +29 -0
  78. package/dist/composables/useOptimisticMutation.d.ts +5 -1
  79. package/dist/composables/usePluginClient.d.ts +2 -0
  80. package/dist/composables/usePluginConfig.d.ts +27 -0
  81. package/dist/composables/usePluginWorkspace.d.ts +51 -0
  82. package/dist/composables/useRequestSyncState.d.ts +42 -2
  83. package/dist/composables/useResourceCrud.d.ts +5 -1
  84. package/dist/composables/useRovingFocus.d.ts +24 -0
  85. package/dist/composables/useScheduleDrag.d.ts +1 -0
  86. package/dist/composables/useWellPainting.d.ts +5 -1
  87. package/dist/composables/useWellPlateAdapter.d.ts +5 -1
  88. package/dist/composables/useWellPlateValidation.d.ts +5 -1
  89. package/dist/composables/workspaceRecipes.d.ts +188 -0
  90. package/dist/{composables-C_i90sGS.js → composables-B_pia3hO.js} +209 -82
  91. package/dist/composables-B_pia3hO.js.map +1 -0
  92. package/dist/{useApi-J6zFkHmn.js → errors-_W0-LbA6.js} +103 -3
  93. package/dist/errors-_W0-LbA6.js.map +1 -0
  94. package/dist/{experiment-Cq145oEW.js → experiment-Cwl9AYxw.js} +3 -8
  95. package/dist/experiment-Cwl9AYxw.js.map +1 -0
  96. package/dist/{experiment-utils-CLnzPPq5.js → experiment-utils-DV3DrvE_.js} +70 -51
  97. package/dist/experiment-utils-DV3DrvE_.js.map +1 -0
  98. package/dist/index.d.ts +1 -0
  99. package/dist/index.js +15 -15
  100. package/dist/install.js +2 -7
  101. package/dist/install.js.map +1 -1
  102. package/dist/permissions.d.ts +42 -1
  103. package/dist/permissions.js +20 -10
  104. package/dist/permissions.js.map +1 -1
  105. package/dist/stores/auth.d.ts +6 -0
  106. package/dist/stores/index.d.ts +1 -1
  107. package/dist/stores/index.js +3 -3
  108. package/dist/stores/settings.d.ts +31 -1
  109. package/dist/styles.css +11247 -29501
  110. package/dist/templates/builderReadUtils.d.ts +1 -1
  111. package/dist/templates/index.js +2 -4
  112. package/dist/{templates-DsP51i-S.js → templates-Qq113pyZ.js} +303 -106
  113. package/dist/templates-Qq113pyZ.js.map +1 -0
  114. package/dist/types/auth.d.ts +1 -0
  115. package/dist/types/form-builder.d.ts +1 -1
  116. package/dist/{useControlSchema-BDx2Olha.js → useControlSchema-aMZlb4Sc.js} +462 -1130
  117. package/dist/useControlSchema-aMZlb4Sc.js.map +1 -0
  118. package/dist/{useDropdownState-DSb3BC3N.js → useDropdownState-DitCtrTT.js} +22 -6
  119. package/dist/useDropdownState-DitCtrTT.js.map +1 -0
  120. package/dist/{useExperimentSelector-CV4iNfMS.js → useExperimentSelector-I8HC8hUu.js} +4 -4
  121. package/dist/{useExperimentSelector-CV4iNfMS.js.map → useExperimentSelector-I8HC8hUu.js.map} +1 -1
  122. package/dist/{useFormBuilder-BLxG3BOX.js → useFormBuilder-TCxNnqeb.js} +2 -2
  123. package/dist/{useFormBuilder-BLxG3BOX.js.map → useFormBuilder-TCxNnqeb.js.map} +1 -1
  124. package/dist/{useProtocolTemplates-CS_SQl6U.js → useProtocolTemplates-BmX_iVBR.js} +766 -212
  125. package/dist/useProtocolTemplates-BmX_iVBR.js.map +1 -0
  126. package/dist/utils/color.d.ts +13 -0
  127. package/dist/utils/errors.d.ts +9 -0
  128. package/dist/utils/pluginSecrets.d.ts +53 -0
  129. package/dist/utils/records.d.ts +4 -0
  130. package/package.json +1 -1
  131. package/src/__tests__/components/ActionMenu.test.ts +94 -0
  132. package/src/__tests__/components/AppAvatarMenu.test.ts +123 -0
  133. package/src/__tests__/components/BaseTabs.test.ts +67 -0
  134. package/src/__tests__/components/DataFrame.test.ts +183 -11
  135. package/src/__tests__/components/DataStates.test.ts +176 -0
  136. package/src/__tests__/components/DatePicker.test.ts +76 -0
  137. package/src/__tests__/components/DateTimePicker.test.ts +36 -0
  138. package/src/__tests__/components/DropdownButton.test.ts +134 -0
  139. package/src/__tests__/components/ExperimentTimeline.test.ts +63 -0
  140. package/src/__tests__/components/GroupAssigner.test.ts +53 -0
  141. package/src/__tests__/components/LcmsSequenceTable.test.ts +22 -0
  142. package/src/__tests__/components/PluginWorkspaceView.internal.test.ts +230 -0
  143. package/src/__tests__/components/RackEditor.test.ts +35 -0
  144. package/src/__tests__/components/ReagentList.test.ts +64 -2
  145. package/src/__tests__/components/RetiredStyles.test.ts +31 -0
  146. package/src/__tests__/components/SampleSelector.drag.test.ts +51 -1
  147. package/src/__tests__/components/ScheduleCalendar.test.ts +63 -0
  148. package/src/__tests__/components/SecretInput.test.ts +87 -0
  149. package/src/__tests__/components/SegmentedControl.test.ts +88 -0
  150. package/src/__tests__/components/TimePicker.test.ts +61 -0
  151. package/src/__tests__/components/WellEditPopupInternal.test.ts +108 -0
  152. package/src/__tests__/components/WellPlate.interaction.test.ts +59 -0
  153. package/src/__tests__/composables/useAuth.test.ts +2 -0
  154. package/src/__tests__/composables/useDropdownState.test.ts +58 -1
  155. package/src/__tests__/composables/useListReorder.test.ts +145 -0
  156. package/src/__tests__/composables/usePluginClient.test.ts +140 -0
  157. package/src/__tests__/composables/usePluginConfig.test.ts +497 -0
  158. package/src/__tests__/composables/useRequestSyncState.test.ts +140 -0
  159. package/src/__tests__/docs/frontendDocsCatalog.test.ts +39 -7
  160. package/src/__tests__/stores/settings.test.ts +71 -1
  161. package/src/__tests__/styles/cssTokens.test.ts +131 -0
  162. package/src/__tests__/utils/permissions.test.ts +68 -0
  163. package/src/components/ActionMenu.vue +45 -88
  164. package/src/components/AlertBox.vue +0 -4
  165. package/src/components/AppAvatarMenu.vue +26 -7
  166. package/src/components/AppLayout.vue +0 -4
  167. package/src/components/AppPluginSwitcher.story.vue +87 -0
  168. package/src/components/AppPluginSwitcher.vue +2 -5
  169. package/src/components/AppSidebar.vue +0 -4
  170. package/src/components/AppToastContainer.vue +6 -8
  171. package/src/components/AppTopBar.vue +0 -4
  172. package/src/components/ArtifactSaveDialog.vue +0 -4
  173. package/src/components/ArtifactSelectorModal.vue +0 -4
  174. package/src/components/AuditTrail.story.vue +18 -0
  175. package/src/components/AuditTrail.vue +27 -7
  176. package/src/components/AutoGroupModal.vue +0 -4
  177. package/src/components/Avatar.vue +0 -4
  178. package/src/components/BaseButton.vue +0 -4
  179. package/src/components/BaseCheckbox.vue +0 -4
  180. package/src/components/BaseInput.vue +0 -4
  181. package/src/components/BaseModal.vue +8 -60
  182. package/src/components/BasePill.vue +0 -4
  183. package/src/components/BaseRadioGroup.vue +0 -4
  184. package/src/components/BaseSelect.vue +0 -4
  185. package/src/components/BaseSlider.vue +0 -4
  186. package/src/components/BaseTabs.vue +26 -5
  187. package/src/components/BaseTextarea.vue +0 -4
  188. package/src/components/BaseToggle.vue +0 -4
  189. package/src/components/BatchProgressList.story.vue +18 -0
  190. package/src/components/BatchProgressList.vue +32 -4
  191. package/src/components/BioTemplateExperimentWorkspaceView.vue +10 -21
  192. package/src/components/BioTemplatePackWorkspaceView.vue +11 -15
  193. package/src/components/BioTemplatePresetWorkspaceView.vue +8 -13
  194. package/src/components/Breadcrumb.vue +0 -4
  195. package/src/components/Calendar.vue +0 -4
  196. package/src/components/ChartContainer.story.vue +1 -1
  197. package/src/components/ChartContainer.vue +0 -4
  198. package/src/components/ChemicalFormula.vue +0 -4
  199. package/src/components/CollapsibleCard.vue +0 -4
  200. package/src/components/ColorSlider.vue +0 -4
  201. package/src/components/ComponentBindingRenderer.vue +1 -3
  202. package/src/components/ConcentrationInput.vue +0 -4
  203. package/src/components/ConfirmDialog.vue +0 -4
  204. package/src/components/ControlWorkspaceView.vue +11 -22
  205. package/src/components/DataFrame.story.vue +14 -0
  206. package/src/components/DataFrame.vue +97 -23
  207. package/src/components/DatePicker.vue +73 -27
  208. package/src/components/DateTimePicker.vue +45 -17
  209. package/src/components/Divider.vue +0 -4
  210. package/src/components/DoseCalculator.vue +0 -4
  211. package/src/components/DoseDesignWorkspaceView.vue +6 -25
  212. package/src/components/DropdownButton.vue +24 -6
  213. package/src/components/EmptyState.vue +0 -4
  214. package/src/components/ExperimentCodeBadge.vue +0 -4
  215. package/src/components/ExperimentDataViewer.story.vue +3 -0
  216. package/src/components/ExperimentDataViewer.vue +33 -13
  217. package/src/components/ExperimentPopover.vue +2 -5
  218. package/src/components/ExperimentSelectorModal.vue +0 -4
  219. package/src/components/ExperimentTimeline.story.vue +18 -0
  220. package/src/components/ExperimentTimeline.vue +81 -75
  221. package/src/components/FileUploader.vue +0 -4
  222. package/src/components/FitPanel.vue +0 -4
  223. package/src/components/FormActions.story.vue +96 -0
  224. package/src/components/FormActions.vue +0 -4
  225. package/src/components/FormBuilder.vue +0 -4
  226. package/src/components/FormField.vue +0 -4
  227. package/src/components/FormulaInput.vue +0 -4
  228. package/src/components/GeneratedPathInput.story.vue +68 -0
  229. package/src/components/GeneratedPlotlyResult.story.vue +96 -0
  230. package/src/components/GeneratedPlotlyResult.vue +3 -3
  231. package/src/components/GeneratedPluginView.story.vue +145 -0
  232. package/src/components/GeneratedPluginView.vue +10 -10
  233. package/src/components/GeneratedResultRenderer.story.vue +117 -0
  234. package/src/components/GeneratedResultRenderer.vue +4 -4
  235. package/src/components/GroupAssigner.vue +67 -5
  236. package/src/components/IconButton.vue +0 -4
  237. package/src/components/InstrumentAlertLog.vue +0 -4
  238. package/src/components/InstrumentStateBadge.vue +0 -4
  239. package/src/components/InstrumentStatusCard.vue +0 -4
  240. package/src/components/JobsStatusTray.vue +16 -5
  241. package/src/components/LcmsSequenceTable.vue +81 -50
  242. package/src/components/LoadingSpinner.vue +0 -4
  243. package/src/components/MobileSupportGate.vue +0 -4
  244. package/src/components/MoleculeInput.vue +0 -4
  245. package/src/components/MultiSelect.vue +0 -4
  246. package/src/components/NumberInput.vue +0 -4
  247. package/src/components/PlateMapEditor.vue +3 -14
  248. package/src/components/PluginIcon.vue +0 -4
  249. package/src/components/PluginWorkspaceView.props.ts +38 -0
  250. package/src/components/PluginWorkspaceView.vue +53 -224
  251. package/src/components/ProgressBar.vue +0 -4
  252. package/src/components/ProtocolStepEditor.vue +2 -4
  253. package/src/components/RackEditor.vue +51 -70
  254. package/src/components/ReagentEditor.vue +0 -4
  255. package/src/components/ReagentList.story.vue +18 -0
  256. package/src/components/ReagentList.vue +127 -82
  257. package/src/components/ResourceCard.vue +0 -4
  258. package/src/components/RuntimeUpdateNotice.story.vue +49 -0
  259. package/src/components/RuntimeUpdateNotice.vue +4 -4
  260. package/src/components/SampleHierarchyTree.story.vue +18 -0
  261. package/src/components/SampleHierarchyTree.vue +32 -9
  262. package/src/components/SampleLegend.vue +2 -8
  263. package/src/components/SampleSelector.drag.ts +51 -0
  264. package/src/components/SampleSelector.story.vue +6 -0
  265. package/src/components/SampleSelector.tree.ts +2 -0
  266. package/src/components/SampleSelector.vue +49 -10
  267. package/src/components/SampleSelectorGroupNode.vue +19 -0
  268. package/src/components/ScheduleCalendar.story.vue +6 -0
  269. package/src/components/ScheduleCalendar.vue +82 -7
  270. package/src/components/ScientificNumber.vue +0 -4
  271. package/src/components/SecretInput.story.vue +79 -0
  272. package/src/components/SecretInput.vue +150 -0
  273. package/src/components/SectionCard.vue +0 -4
  274. package/src/components/SegmentedControl.vue +48 -5
  275. package/src/components/SequenceInput.vue +0 -4
  276. package/src/components/SequenceProgressBar.story.vue +110 -0
  277. package/src/components/SequenceProgressBar.vue +0 -4
  278. package/src/components/SettingsModal.vue +0 -4
  279. package/src/components/Skeleton.vue +0 -4
  280. package/src/components/SmartGroupFieldRecipe.vue +8 -6
  281. package/src/components/SmartGroupManual.vue +0 -4
  282. package/src/components/StatusIndicator.vue +0 -4
  283. package/src/components/StepWizard.vue +0 -4
  284. package/src/components/TagsInput.vue +4 -6
  285. package/src/components/ThemeToggle.vue +0 -4
  286. package/src/components/TimePicker.vue +36 -7
  287. package/src/components/TimeRangeInput.vue +0 -4
  288. package/src/components/Tooltip.story.vue +3 -3
  289. package/src/components/Tooltip.vue +0 -4
  290. package/src/components/UnitInput.vue +0 -4
  291. package/src/components/WellPlate.geometry.ts +60 -1
  292. package/src/components/WellPlate.interaction.ts +44 -0
  293. package/src/components/WellPlate.story.vue +8 -0
  294. package/src/components/WellPlate.vue +53 -7
  295. package/src/components/index.ts +9 -0
  296. package/src/components/internal/AppTopBarPageSelectorInternal.vue +2 -5
  297. package/src/components/internal/AppTopBarPillNavInternal.vue +0 -4
  298. package/src/components/internal/DataStateInternal.vue +74 -0
  299. package/src/components/internal/FormSectionRenderer.vue +0 -4
  300. package/src/components/internal/WellEditPopupInternal.vue +20 -5
  301. package/src/components/internal/WorkspaceControlsInternal.vue +20 -0
  302. package/src/components/internal/WorkspaceShellInternal.vue +125 -0
  303. package/src/components/internal/WorkspaceSidebarInternal.vue +82 -0
  304. package/src/composables/controlSchemaTypes.ts +34 -0
  305. package/src/composables/experimentDesignData.ts +1 -3
  306. package/src/composables/flattenWorkspaceBindings.ts +104 -0
  307. package/src/composables/formBuilderRegistry.ts +5 -0
  308. package/src/composables/index.ts +43 -0
  309. package/src/composables/pluginWorkspaceModel.ts +182 -0
  310. package/src/composables/useAsync.ts +5 -1
  311. package/src/composables/useAuth.ts +3 -0
  312. package/src/composables/useBioTemplatePackWorkspace.ts +15 -9
  313. package/src/composables/useBioTemplatePresetWorkspace.ts +14 -15
  314. package/src/composables/useBioTemplateWorkspace.ts +18 -43
  315. package/src/composables/useCommandHistory.ts +5 -1
  316. package/src/composables/useDropdownState.ts +35 -5
  317. package/src/composables/useEventStream.ts +14 -2
  318. package/src/composables/useFileImport.ts +2 -7
  319. package/src/composables/useFocusTrap.ts +91 -0
  320. package/src/composables/useGeneratedAnalysis.ts +22 -10
  321. package/src/composables/useJobsStatusTray.ts +184 -17
  322. package/src/composables/useListReorder.story.vue +143 -0
  323. package/src/composables/useListReorder.ts +242 -0
  324. package/src/composables/useMenuKeyboard.ts +90 -0
  325. package/src/composables/useOptimisticMutation.ts +6 -16
  326. package/src/composables/usePluginClient.ts +47 -4
  327. package/src/composables/usePluginConfig.ts +252 -0
  328. package/src/composables/usePluginWorkspace.ts +208 -0
  329. package/src/composables/useRackEditor.ts +2 -11
  330. package/src/composables/useRequestSyncState.ts +98 -28
  331. package/src/composables/useResourceCrud.ts +6 -16
  332. package/src/composables/useRovingFocus.ts +66 -0
  333. package/src/composables/useScheduleDrag.ts +37 -0
  334. package/src/composables/useWellPainting.ts +10 -30
  335. package/src/composables/useWellPlateAdapter.ts +5 -1
  336. package/src/composables/useWellPlateEditor.ts +1 -11
  337. package/src/composables/useWellPlateValidation.ts +5 -1
  338. package/src/composables/workspaceRecipes.ts +267 -0
  339. package/src/index.ts +16 -0
  340. package/src/permissions.ts +48 -9
  341. package/src/stores/auth.ts +1 -0
  342. package/src/stores/experiment.ts +2 -7
  343. package/src/stores/index.ts +9 -1
  344. package/src/stores/settings.ts +93 -1
  345. package/src/styles/components/audit-trail.css +5 -5
  346. package/src/styles/components/batch-progress-list.css +7 -0
  347. package/src/styles/components/color-slider.css +2 -2
  348. package/src/styles/components/data-state.css +30 -0
  349. package/src/styles/components/dataframe.css +29 -35
  350. package/src/styles/components/experiment-data-viewer.css +4 -4
  351. package/src/styles/components/experiment-timeline.css +3 -30
  352. package/src/styles/components/form-builder.css +5 -5
  353. package/src/styles/components/lcms-sequence-table.css +16 -1
  354. package/src/styles/components/multi-select.css +1 -1
  355. package/src/styles/components/reagent-list.css +38 -31
  356. package/src/styles/components/sample-hierarchy-tree.css +5 -19
  357. package/src/styles/components/sample-selector.css +9 -2
  358. package/src/styles/components/schedule-calendar.css +8 -0
  359. package/src/styles/components/scientific-number.css +1 -1
  360. package/src/styles/components/secret-input.css +60 -0
  361. package/src/styles/components/well-plate.css +8 -0
  362. package/src/styles/index.css +9 -0
  363. package/src/styles/variables.css +29 -0
  364. package/src/templates/builderPresetControls.ts +1 -1
  365. package/src/templates/builderReadUtils.ts +1 -3
  366. package/src/templates/componentPlateHelpers.ts +3 -1
  367. package/src/templates/componentTargetResolvers.ts +1 -3
  368. package/src/templates/controlSchemaTargets.ts +1 -3
  369. package/src/templates/doseResponseAdapters.ts +2 -13
  370. package/src/templates/elisaAssayCollectionBuilder.ts +2 -2
  371. package/src/templates/plateMapBuilder.ts +2 -2
  372. package/src/templates/qpcrPlateBuilder.ts +1 -1
  373. package/src/templates/templateValidators.ts +1 -1
  374. package/src/templates/timeCourseBuilder.ts +2 -2
  375. package/src/templates/wellPlateScreenCollectionBuilder.ts +2 -2
  376. package/src/types/auth.ts +1 -0
  377. package/src/types/form-builder.ts +1 -0
  378. package/src/utils/color.ts +51 -0
  379. package/src/utils/errors.ts +29 -0
  380. package/src/utils/formModelSync.ts +1 -3
  381. package/src/utils/pluginIcon.ts +1 -3
  382. package/src/utils/pluginSecrets.ts +102 -0
  383. package/src/utils/records.ts +9 -0
  384. package/dist/EmptyState-p90quq8Z.js.map +0 -1
  385. package/dist/ExperimentPopover-tLwJ7XF4.js.map +0 -1
  386. package/dist/ExperimentSelectorModal-DyPAUCLw.js.map +0 -1
  387. package/dist/SettingsModal-BgKY93zh.js.map +0 -1
  388. package/dist/components-DkHddRMl.js.map +0 -1
  389. package/dist/composables/autoGroupConstants.d.ts +0 -1
  390. package/dist/composables/autoGroupGrouping.d.ts +0 -3
  391. package/dist/composables/useAutoGroupInputSources.d.ts +0 -32
  392. package/dist/composables-C_i90sGS.js.map +0 -1
  393. package/dist/experiment-Cq145oEW.js.map +0 -1
  394. package/dist/experiment-utils-CLnzPPq5.js.map +0 -1
  395. package/dist/templates/builderDefaults.d.ts +0 -1
  396. package/dist/templates/plateGeometry.d.ts +0 -4
  397. package/dist/templates-DsP51i-S.js.map +0 -1
  398. package/dist/useApi-J6zFkHmn.js.map +0 -1
  399. package/dist/useControlSchema-BDx2Olha.js.map +0 -1
  400. package/dist/useDropdownState-DSb3BC3N.js.map +0 -1
  401. package/dist/useProtocolTemplates-CS_SQl6U.js.map +0 -1
  402. package/src/__tests__/composables/useAutoGroupInputSources.test.ts +0 -127
  403. package/src/composables/autoGroupConstants.ts +0 -4
  404. package/src/composables/autoGroupGrouping.ts +0 -148
  405. package/src/composables/useAutoGroupInputSources.ts +0 -147
  406. package/src/templates/builderDefaults.ts +0 -11
  407. package/src/templates/plateGeometry.ts +0 -62
  408. /package/dist/__tests__/{composables/useAutoGroupInputSources.test.d.ts → components/DataStates.test.d.ts} +0 -0
@@ -21,16 +21,12 @@ import {
21
21
  } from './useBioTemplateControls'
22
22
  import {
23
23
  useBioTemplateComponents,
24
- type BioTemplateComponentBinding,
25
- type BioTemplateComponentBindingsById,
26
- type BioTemplateComponentImport,
27
- type BioTemplateComponentPropsByComponent,
28
- type BioTemplateComponentPropsBinding,
29
- type BioTemplateComponentPropsById,
30
- type BioTemplateComponentSnippet,
31
- type BioTemplateComponentUsage,
32
24
  type UseBioTemplateComponentsReturn,
33
25
  } from './useBioTemplateComponents'
26
+ import {
27
+ flattenWorkspaceComponentBindings,
28
+ type BioTemplateWorkspaceComponentBindings,
29
+ } from './flattenWorkspaceBindings'
34
30
 
35
31
  export type BioTemplateWorkspaceTarget = BioTemplateControlTarget
36
32
 
@@ -38,24 +34,16 @@ export interface BioTemplateRendererBinding {
38
34
  target: BioTemplateEnvelope<unknown> | TemplateCollectionEnvelope
39
35
  }
40
36
 
41
- export interface BioTemplateWorkspaceBindings {
37
+ export interface BioTemplateWorkspaceBindings extends BioTemplateWorkspaceComponentBindings {
42
38
  renderer: BioTemplateRendererBinding | null
43
39
  form: ControlWorkspaceFormBinding
44
40
  sidebar: ControlWorkspaceSidebarBinding
45
41
  topBar: UseControlWorkspaceReturn<BioTemplateControlSchema>['bindings']['topBar']
46
42
  topBarSettings: ControlWorkspaceTopBarSettingsBinding
47
43
  pillNav: ControlWorkspacePillNavBinding
48
- componentBindings: BioTemplateComponentBinding[]
49
- componentBindingsById: BioTemplateComponentBindingsById
50
- componentProps: BioTemplateComponentPropsBinding[]
51
- componentPropsById: BioTemplateComponentPropsById
52
- componentPropsByComponent: BioTemplateComponentPropsByComponent
53
- componentSnippets: BioTemplateComponentSnippet[]
54
- componentUsage: BioTemplateComponentUsage | null
55
- getComponentProps: UseBioTemplateComponentsReturn['getComponentProps']
56
44
  }
57
45
 
58
- export interface UseBioTemplateWorkspaceReturn {
46
+ export interface UseBioTemplateWorkspaceReturn extends BioTemplateWorkspaceComponentBindings {
59
47
  target: BioTemplateWorkspaceTarget
60
48
  controls: UseControlSchemaReturn<BioTemplateControlSchema>
61
49
  workspace: UseControlWorkspaceReturn<BioTemplateControlSchema>
@@ -70,15 +58,6 @@ export interface UseBioTemplateWorkspaceReturn {
70
58
  topBarSettings: ControlWorkspaceTopBarSettingsBinding
71
59
  bindings: BioTemplateWorkspaceBindings
72
60
  renderer: BioTemplateRendererBinding | null
73
- componentBindings: BioTemplateComponentBinding[]
74
- componentBindingsById: BioTemplateComponentBindingsById
75
- componentImports: BioTemplateComponentImport[]
76
- componentProps: BioTemplateComponentPropsBinding[]
77
- componentPropsById: BioTemplateComponentPropsById
78
- componentPropsByComponent: BioTemplateComponentPropsByComponent
79
- componentSnippets: BioTemplateComponentSnippet[]
80
- componentUsage: BioTemplateComponentUsage | null
81
- getComponentProps: UseBioTemplateComponentsReturn['getComponentProps']
82
61
  }
83
62
 
84
63
  /** One-stop wiring for BioTemplateRenderer, FormBuilder, AppSidebar, and template-aware SDK components. */
@@ -90,21 +69,25 @@ export function useBioTemplateWorkspace(
90
69
  const workspace = useControlWorkspace(controls.controls, options)
91
70
  const components = useBioTemplateComponents(target)
92
71
  const renderer = isTemplateObjectTarget(target) ? { target } : null
93
- const bindings: BioTemplateWorkspaceBindings = {
94
- renderer,
95
- form: workspace.bindings.form,
96
- sidebar: workspace.bindings.sidebar,
97
- topBar: workspace.bindings.topBar,
98
- topBarSettings: workspace.bindings.topBarSettings,
99
- pillNav: workspace.bindings.pillNav,
72
+ const componentBindings = flattenWorkspaceComponentBindings({
100
73
  componentBindings: components.bindings,
101
74
  componentBindingsById: components.componentBindingsById,
75
+ componentImports: components.imports,
102
76
  componentProps: components.componentProps,
103
77
  componentPropsById: components.componentPropsById,
104
78
  componentPropsByComponent: components.componentPropsByComponent,
105
79
  componentSnippets: components.snippets,
106
80
  componentUsage: components.usage,
107
81
  getComponentProps: components.getComponentProps,
82
+ })
83
+ const bindings: BioTemplateWorkspaceBindings = {
84
+ renderer,
85
+ form: workspace.bindings.form,
86
+ sidebar: workspace.bindings.sidebar,
87
+ topBar: workspace.bindings.topBar,
88
+ topBarSettings: workspace.bindings.topBarSettings,
89
+ pillNav: workspace.bindings.pillNav,
90
+ ...componentBindings,
108
91
  }
109
92
 
110
93
  return {
@@ -122,15 +105,7 @@ export function useBioTemplateWorkspace(
122
105
  topBarSettings: workspace.topBarSettings,
123
106
  bindings,
124
107
  renderer,
125
- componentBindings: components.bindings,
126
- componentBindingsById: components.componentBindingsById,
127
- componentImports: components.imports,
128
- componentProps: components.componentProps,
129
- componentPropsById: components.componentPropsById,
130
- componentPropsByComponent: components.componentPropsByComponent,
131
- componentSnippets: components.snippets,
132
- componentUsage: components.usage,
133
- getComponentProps: components.getComponentProps,
108
+ ...componentBindings,
134
109
  }
135
110
  }
136
111
 
@@ -31,7 +31,11 @@ export interface UseCommandHistoryReturn<TCommand extends CommandHistoryCommand
31
31
  clear: () => void
32
32
  }
33
33
 
34
- /** Generic command-stack state for plugin editors with undo/redo controls. */
34
+ /**
35
+ * Generic command-stack state for plugin editors with undo/redo controls.
36
+ *
37
+ * @deprecated Unused by the MINT platform and scheduled for removal in MINT 1.3; keep command stacks plugin-local.
38
+ */
35
39
  export function useCommandHistory<TCommand extends CommandHistoryCommand = CommandHistoryCommand>(
36
40
  options: UseCommandHistoryOptions = {},
37
41
  ): UseCommandHistoryReturn<TCommand> {
@@ -1,10 +1,18 @@
1
- import { ref, type Ref } from 'vue'
1
+ import { nextTick, ref, type Ref } from 'vue'
2
2
  import { useEventListener } from './useEventListener'
3
3
 
4
4
  export interface UseDropdownStateOptions {
5
5
  closeOnOutsideClick?: boolean
6
6
  closeOnEscape?: boolean
7
+ /** Close the panel when the page scrolls or the viewport resizes. Default `false`. */
8
+ closeOnScroll?: boolean
7
9
  insideRefs?: Array<Ref<HTMLElement | null>>
10
+ /**
11
+ * Element focus returns to when the panel closes with `close(true)` (Escape).
12
+ * Pass one when the trigger lives outside `rootRef`; otherwise bind the
13
+ * returned `triggerRef` to the trigger element.
14
+ */
15
+ triggerRef?: Ref<HTMLElement | null>
8
16
  onOpen?: () => void
9
17
  onClose?: () => void
10
18
  }
@@ -12,19 +20,29 @@ export interface UseDropdownStateOptions {
12
20
  export interface UseDropdownStateReturn {
13
21
  isOpen: Ref<boolean>
14
22
  rootRef: Ref<HTMLElement | null>
23
+ /** Bind to the trigger element so Escape can return focus to it. */
24
+ triggerRef: Ref<HTMLElement | null>
15
25
  open: () => void
16
- close: () => void
26
+ /** Closes the panel; `returnFocus` moves focus back to `triggerRef`. */
27
+ close: (returnFocus?: boolean) => void
17
28
  toggle: () => void
18
29
  handleClickOutside: (event: MouseEvent) => void
19
30
  handleKeydown: (event: KeyboardEvent) => void
20
31
  }
21
32
 
22
- /** Shared disclosure state for dropdown-style SDK components. */
33
+ /**
34
+ * Shared disclosure state for dropdown-style SDK components: open/close state,
35
+ * outside-click and Escape closing, optional scroll/resize closing, and focus
36
+ * return to the trigger. `close(returnFocus)` mirrors `useMenuKeyboard`'s
37
+ * contract, so the two compose directly.
38
+ */
23
39
  export function useDropdownState(options: UseDropdownStateOptions = {}): UseDropdownStateReturn {
24
40
  const isOpen = ref(false)
25
41
  const rootRef = ref<HTMLElement | null>(null)
42
+ const triggerRef = options.triggerRef ?? ref<HTMLElement | null>(null)
26
43
  const closeOnOutsideClick = options.closeOnOutsideClick ?? true
27
44
  const closeOnEscape = options.closeOnEscape ?? true
45
+ const closeOnScroll = options.closeOnScroll ?? false
28
46
 
29
47
  function open(): void {
30
48
  if (isOpen.value) return
@@ -32,10 +50,13 @@ export function useDropdownState(options: UseDropdownStateOptions = {}): UseDrop
32
50
  options.onOpen?.()
33
51
  }
34
52
 
35
- function close(): void {
53
+ function close(returnFocus = false): void {
36
54
  if (!isOpen.value) return
37
55
  isOpen.value = false
38
56
  options.onClose?.()
57
+ if (returnFocus) {
58
+ void nextTick(() => triggerRef.value?.focus())
59
+ }
39
60
  }
40
61
 
41
62
  function toggle(): void {
@@ -60,20 +81,29 @@ export function useDropdownState(options: UseDropdownStateOptions = {}): UseDrop
60
81
 
61
82
  function handleKeydown(event: KeyboardEvent): void {
62
83
  if (closeOnEscape && event.key === 'Escape') {
63
- close()
84
+ close(true)
64
85
  }
65
86
  }
66
87
 
88
+ function handleViewportChange(): void {
89
+ if (isOpen.value) close()
90
+ }
91
+
67
92
  if (closeOnOutsideClick) {
68
93
  useEventListener(() => document, 'click', handleClickOutside)
69
94
  }
70
95
  if (closeOnEscape) {
71
96
  useEventListener(() => document, 'keydown', handleKeydown)
72
97
  }
98
+ if (closeOnScroll) {
99
+ useEventListener(() => window, 'scroll', handleViewportChange, true)
100
+ useEventListener(() => window, 'resize', handleViewportChange)
101
+ }
73
102
 
74
103
  return {
75
104
  isOpen,
76
105
  rootRef,
106
+ triggerRef,
77
107
  open,
78
108
  close,
79
109
  toggle,
@@ -7,6 +7,7 @@ import {
7
7
  shallowRef,
8
8
  type Ref,
9
9
  } from 'vue'
10
+ import { tryUseSettingsStore } from '../stores/settings'
10
11
 
11
12
  export type EventStreamTransport = (
12
13
  input: RequestInfo | URL,
@@ -26,7 +27,16 @@ export interface EventStreamOptions<TData = string> {
26
27
  headers?: HeadersInit
27
28
  credentials?: RequestCredentials
28
29
  immediate?: boolean
30
+ /**
31
+ * Reconnect after a dropped stream. Left unset, it follows the platform's
32
+ * `wsAutoReconnect` setting, defaulting to `true` without a settings store.
33
+ */
29
34
  reconnect?: boolean
35
+ /**
36
+ * Delay before the first reconnect attempt. Left unset, it follows the
37
+ * platform's `wsReconnectInterval` setting, defaulting to 2000 ms without a
38
+ * settings store. A server-sent `retry:` field still overrides it.
39
+ */
30
40
  reconnectDelayMs?: number
31
41
  parseJson?: boolean
32
42
  shouldReconnect?: (cause?: unknown) => boolean
@@ -114,7 +124,9 @@ export function useEventStream<TData = string>(
114
124
  let controller: AbortController | null = null
115
125
  let reader: ReadableStreamDefaultReader<Uint8Array> | null = null
116
126
  let reconnectTimer: ReturnType<typeof setTimeout> | null = null
117
- let reconnectDelayMs = options.reconnectDelayMs ?? 2_000
127
+ const settings = tryUseSettingsStore()
128
+ const reconnectEnabled = options.reconnect ?? settings?.wsAutoReconnect ?? true
129
+ let reconnectDelayMs = options.reconnectDelayMs ?? settings?.wsReconnectInterval ?? 2_000
118
130
  let stopped = true
119
131
  let generation = 0
120
132
 
@@ -135,7 +147,7 @@ export function useEventStream<TData = string>(
135
147
 
136
148
  function scheduleReconnect(connectionGeneration: number, cause?: unknown): void {
137
149
  if (stopped || generation !== connectionGeneration) return
138
- if (options.reconnect === false || options.shouldReconnect?.(cause) === false) {
150
+ if (!reconnectEnabled || options.shouldReconnect?.(cause) === false) {
139
151
  stopped = true
140
152
  return
141
153
  }
@@ -1,4 +1,5 @@
1
1
  import { ref, shallowRef, type Ref, type ShallowRef } from 'vue'
2
+ import { readErrorMessage } from '../utils/errors'
2
3
 
3
4
  export interface DelimitedTable {
4
5
  columns: string[]
@@ -63,7 +64,7 @@ export function useFileImport<TResult = string>(
63
64
  result.value = parsed
64
65
  return parsed
65
66
  } catch (err) {
66
- const message = readErrorMessage(err)
67
+ const message = readErrorMessage(err, 'Failed to import file.')
67
68
  error.value = message
68
69
  throw err
69
70
  } finally {
@@ -223,9 +224,3 @@ function formatBytes(bytes: number): string {
223
224
  if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)} KB`
224
225
  return `${Math.round(bytes / (1024 * 1024))} MB`
225
226
  }
226
-
227
- function readErrorMessage(value: unknown): string {
228
- if (value instanceof Error && value.message) return value.message
229
- if (typeof value === 'string' && value.trim()) return value
230
- return 'Failed to import file.'
231
- }
@@ -0,0 +1,91 @@
1
+ import { nextTick, watch, type Ref } from 'vue'
2
+ import { useEventListener } from './useEventListener'
3
+
4
+ export interface UseFocusTrapOptions {
5
+ /** Ref to the trap's container element. Focusable elements are queried within it. */
6
+ containerRef: Ref<HTMLElement | null>
7
+ /** Reactive flag — the trap activates when this becomes `true` and releases when it becomes `false`. */
8
+ active: Ref<boolean>
9
+ /** Restore focus to the element that was focused before activation, when the trap releases. Default `true`. */
10
+ restoreFocus?: boolean
11
+ }
12
+
13
+ export interface UseFocusTrapReturn {
14
+ /** Focusable descendants of the container, in DOM order, excluding roving-tabindex (`tabindex="-1"`) elements. */
15
+ getFocusableElements: () => HTMLElement[]
16
+ }
17
+
18
+ const FOCUSABLE_SELECTOR = [
19
+ 'a[href]',
20
+ 'button:not([disabled])',
21
+ 'input:not([disabled])',
22
+ 'select:not([disabled])',
23
+ 'textarea:not([disabled])',
24
+ '[tabindex]:not([tabindex="-1"])',
25
+ ].join(', ')
26
+
27
+ /**
28
+ * Traps Tab focus within a container while `active` is true: Tab wraps from the last
29
+ * focusable element back to the first (and Shift+Tab from the first to the last), the
30
+ * first focusable element (or the container itself, if none) receives focus when the
31
+ * trap activates, and focus returns to whatever was focused beforehand when it releases.
32
+ * Used by BaseModal and WellEditPopupInternal.
33
+ */
34
+ export function useFocusTrap(options: UseFocusTrapOptions): UseFocusTrapReturn {
35
+ const { containerRef, active } = options
36
+ const restoreFocus = options.restoreFocus ?? true
37
+ let previouslyFocused: HTMLElement | null = null
38
+
39
+ function getFocusableElements(): HTMLElement[] {
40
+ if (!containerRef.value) return []
41
+ // Roving tabindex (inactive tabs/rail items) stays out of the Tab cycle. Checking
42
+ // the attribute directly (rather than the `.tabIndex` IDL property) avoids relying
43
+ // on a browser/engine's default-tabindex computation for freshly-patched elements.
44
+ return Array.from(containerRef.value.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR))
45
+ .filter((el) => el.getAttribute('tabindex') !== '-1')
46
+ }
47
+
48
+ function handleKeydown(event: KeyboardEvent) {
49
+ if (event.key !== 'Tab' || !active.value || !containerRef.value) return
50
+
51
+ const focusable = getFocusableElements()
52
+ if (focusable.length === 0) {
53
+ event.preventDefault()
54
+ return
55
+ }
56
+
57
+ const first = focusable[0]
58
+ const last = focusable[focusable.length - 1]
59
+
60
+ if (event.shiftKey && document.activeElement === first) {
61
+ event.preventDefault()
62
+ last.focus()
63
+ } else if (!event.shiftKey && document.activeElement === last) {
64
+ event.preventDefault()
65
+ first.focus()
66
+ }
67
+ }
68
+
69
+ // `flush: 'sync'` so releasing the trap from `onBeforeUnmount` restores focus
70
+ // before the component's reactive scope is torn down — a batched (default
71
+ // 'pre') watcher would be scheduled but never flushed once that scope stops.
72
+ watch(active, async (isActive) => {
73
+ if (isActive) {
74
+ previouslyFocused = document.activeElement as HTMLElement | null
75
+ await nextTick()
76
+ const focusable = getFocusableElements()
77
+ if (focusable.length > 0) {
78
+ focusable[0].focus()
79
+ } else {
80
+ containerRef.value?.focus()
81
+ }
82
+ } else {
83
+ if (restoreFocus) previouslyFocused?.focus()
84
+ previouslyFocused = null
85
+ }
86
+ }, { flush: 'sync' })
87
+
88
+ useEventListener(() => document, 'keydown', handleKeydown)
89
+
90
+ return { getFocusableElements }
91
+ }
@@ -8,9 +8,12 @@ import {
8
8
  type ShallowRef,
9
9
  } from 'vue'
10
10
 
11
- import type { PluginJobCenterSource } from './useJobsStatusTray'
11
+ import type {
12
+ JobsStatusTrayAdapter,
13
+ PluginJobCenterSource,
14
+ } from './useJobsStatusTray'
12
15
  import { useEventStream, type EventStreamMessage } from './useEventStream'
13
- import { normalizeJobState } from '../jobs'
16
+ import { isActiveJobStatus, normalizeJobState } from '../jobs'
14
17
  import type {
15
18
  GeneratedAnalysisJob,
16
19
  GeneratedAnalysisJobInput,
@@ -102,11 +105,12 @@ export interface UsePluginJobsReturn extends PluginJobCenterSource {
102
105
  pause: () => void
103
106
  resume: () => void
104
107
  dispose: () => void
108
+ /** @deprecated Pass the runtime itself to SDK job UI as its source. */
109
+ jobsAdapter: JobsStatusTrayAdapter
105
110
  }
106
111
 
107
112
  export type UseGeneratedAnalysisReturn = UsePluginJobsReturn
108
113
 
109
- const ACTIVE_STATUSES = new Set(['awaiting_input', 'queued', 'running'])
110
114
  const AUTH_TOKEN_KEY = 'mint-auth-token'
111
115
  const SESSION_NOT_FOUND_DETAIL = 'Session not found'
112
116
  const MAX_RESULT_CACHE_ENTRIES = 32
@@ -468,12 +472,12 @@ function createPluginJobs(
468
472
  .then((payload) => {
469
473
  if (disposed) return jobs.value
470
474
  if (revision !== jobsRevision) {
471
- if (jobs.value.some(job => ACTIVE_STATUSES.has(job.status))) schedulePoll()
475
+ if (jobs.value.some(job => isActiveJobStatus(job.status))) schedulePoll()
472
476
  return jobs.value
473
477
  }
474
478
  replaceJobs(payload.jobs)
475
479
  error.value = null
476
- if (!paused && !jobStream.isConnected.value && jobs.value.some(job => ACTIVE_STATUSES.has(job.status))) {
480
+ if (!paused && !jobStream.isConnected.value && jobs.value.some(job => isActiveJobStatus(job.status))) {
477
481
  schedulePoll()
478
482
  }
479
483
  return jobs.value
@@ -525,7 +529,7 @@ function createPluginJobs(
525
529
  const current = typeof job === 'string'
526
530
  ? jobs.value.find(candidate => candidate.job_id === jobId)
527
531
  : jobs.value.find(candidate => candidate.job_id === jobId) ?? job
528
- if (current && !ACTIVE_STATUSES.has(current.status)) {
532
+ if (current && !isActiveJobStatus(current.status)) {
529
533
  return terminalWaitResult(current, options.rejectOnFailure === true)
530
534
  }
531
535
  if (paused) return Promise.reject(new Error('Plugin jobs runtime is paused'))
@@ -562,7 +566,7 @@ function createPluginJobs(
562
566
  }
563
567
 
564
568
  function settleJobWaiters(job: GeneratedAnalysisJob): void {
565
- if (ACTIVE_STATUSES.has(job.status)) return
569
+ if (isActiveJobStatus(job.status)) return
566
570
  const waiting = jobWaiters.get(job.job_id)
567
571
  if (!waiting) return
568
572
  jobWaiters.delete(job.job_id)
@@ -910,7 +914,7 @@ function createPluginJobs(
910
914
  await refreshJobs()
911
915
  } catch (cause) {
912
916
  error.value = errorMessage(cause, 'Failed to refresh analysis jobs')
913
- if (jobs.value.some(job => ACTIVE_STATUSES.has(job.status))) schedulePoll()
917
+ if (jobs.value.some(job => isActiveJobStatus(job.status))) schedulePoll()
914
918
  }
915
919
  }, pollInterval)
916
920
  }
@@ -922,7 +926,7 @@ function createPluginJobs(
922
926
  }
923
927
 
924
928
  function schedulePollForActiveJobs(): void {
925
- if (jobs.value.some(job => ACTIVE_STATUSES.has(job.status))) schedulePoll()
929
+ if (jobs.value.some(job => isActiveJobStatus(job.status))) schedulePoll()
926
930
  }
927
931
 
928
932
  function applyJobStreamMessage(message: EventStreamMessage<PluginJobStreamData>): void {
@@ -972,6 +976,13 @@ function createPluginJobs(
972
976
  return payload.deleted
973
977
  }
974
978
 
979
+ const jobsAdapter: JobsStatusTrayAdapter = {
980
+ listJobs: async () => ({ jobs: await refreshJobs() }),
981
+ cancelJob: async job => cancelJob(job as GeneratedAnalysisJob),
982
+ deleteJob: async job => deleteJob(job as GeneratedAnalysisJob),
983
+ clearFinishedJobs: async () => clearFinishedJobs(),
984
+ }
985
+
975
986
  function pause(): void {
976
987
  if (disposed || paused) return
977
988
  paused = true
@@ -993,7 +1004,7 @@ function createPluginJobs(
993
1004
  scheduleManagedDownloadRefresh(jobId, managedDownloadRefreshDelay(result))
994
1005
  }
995
1006
  if (streamEnabled) jobStream.start()
996
- else if (jobs.value.some(job => ACTIVE_STATUSES.has(job.status))) schedulePoll()
1007
+ else if (jobs.value.some(job => isActiveJobStatus(job.status))) schedulePoll()
997
1008
  }
998
1009
 
999
1010
  function dispose(): void {
@@ -1065,6 +1076,7 @@ function createPluginJobs(
1065
1076
  pause,
1066
1077
  resume,
1067
1078
  dispose,
1079
+ jobsAdapter,
1068
1080
  }
1069
1081
  }
1070
1082