@morscherlab/mint-sdk 1.0.63 → 1.1.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 (181) hide show
  1. package/README.md +119 -6
  2. package/dist/EmptyState-DgBRoYAy.js +647 -0
  3. package/dist/EmptyState-DgBRoYAy.js.map +1 -0
  4. package/dist/{ExperimentPopover-BbPkIFsI.js → ExperimentPopover-BFw3QX8L.js} +10 -9
  5. package/dist/{ExperimentPopover-BbPkIFsI.js.map → ExperimentPopover-BFw3QX8L.js.map} +1 -1
  6. package/dist/{ExperimentSelectorModal-DZeSd-yr.js → ExperimentSelectorModal-BBWXC7KW.js} +12 -216
  7. package/dist/ExperimentSelectorModal-BBWXC7KW.js.map +1 -0
  8. package/dist/{SettingsModal-CJgLadsN.js → SettingsModal-Dpg-X1OM.js} +12 -9
  9. package/dist/{SettingsModal-CJgLadsN.js.map → SettingsModal-Dpg-X1OM.js.map} +1 -1
  10. package/dist/__tests__/components/BaseToggle.test.d.ts +1 -0
  11. package/dist/__tests__/components/GeneratedPathInput.test.d.ts +1 -0
  12. package/dist/__tests__/components/GeneratedPlotlyResult.test.d.ts +1 -0
  13. package/dist/__tests__/components/GeneratedPluginView.test.d.ts +1 -0
  14. package/dist/__tests__/components/GeneratedResultRenderer.test.d.ts +1 -0
  15. package/dist/__tests__/components/InstrumentAlertLog.test.d.ts +1 -0
  16. package/dist/__tests__/components/SectionCard.test.d.ts +1 -0
  17. package/dist/__tests__/composables/useGeneratedAnalysis.test.d.ts +1 -0
  18. package/dist/__tests__/generatedUi.test.d.ts +1 -0
  19. package/dist/__tests__/types/GeneratedJsonSchema.test.d.ts +1 -0
  20. package/dist/{analysisArtifactTypes-Cu40dzSG.js → analysisArtifactTypes-ejqR8MX3.js} +1 -1
  21. package/dist/{analysisArtifactTypes-Cu40dzSG.js.map → analysisArtifactTypes-ejqR8MX3.js.map} +1 -1
  22. package/dist/{auth-DZAwEeis.js → auth-B87xM--s.js} +1 -1
  23. package/dist/{auth-DZAwEeis.js.map → auth-B87xM--s.js.map} +1 -1
  24. package/dist/chunk-BoAXSpZd.js +33 -0
  25. package/dist/components/AppSidebar.vue.d.ts +1 -1
  26. package/dist/components/AutoGroupModal.vue.d.ts +2 -2
  27. package/dist/components/BaseSelect.vue.d.ts +1 -1
  28. package/dist/components/BaseToggle.vue.d.ts +2 -0
  29. package/dist/components/BioTemplateExperimentWorkspaceView.vue.d.ts +2 -2
  30. package/dist/components/CollapsibleCard.vue.d.ts +1 -1
  31. package/dist/components/ComponentBindingRenderer.vue.d.ts +1 -1
  32. package/dist/components/ConfirmDialog.vue.d.ts +1 -1
  33. package/dist/components/ExperimentDataViewer.vue.d.ts +1 -1
  34. package/dist/components/ExperimentTimeline.vue.d.ts +1 -1
  35. package/dist/components/FileUploader.vue.d.ts +4 -2
  36. package/dist/components/FitPanel.vue.d.ts +2 -2
  37. package/dist/components/FormActions.vue.d.ts +1 -1
  38. package/dist/components/FormBuilder.vue.d.ts +1 -1
  39. package/dist/components/GeneratedPathInput.vue.d.ts +12 -0
  40. package/dist/components/GeneratedPlotlyResult.vue.d.ts +11 -0
  41. package/dist/components/GeneratedPluginView.vue.d.ts +10 -0
  42. package/dist/components/GeneratedResultRenderer.vue.d.ts +6 -0
  43. package/dist/components/JobsStatusTray.vue.d.ts +5 -1
  44. package/dist/components/LcmsSequenceTable.vue.d.ts +1 -1
  45. package/dist/components/PluginWorkspaceView.props.d.ts +1 -1
  46. package/dist/components/SampleLegend.vue.d.ts +1 -1
  47. package/dist/components/SampleSelector.vue.d.ts +2 -2
  48. package/dist/components/SectionCard.vue.d.ts +47 -0
  49. package/dist/components/SettingsModal.vue.d.ts +1 -1
  50. package/dist/components/SmartGroupFieldRecipe.vue.d.ts +2 -2
  51. package/dist/components/index.d.ts +5 -0
  52. package/dist/components/index.js +8 -9
  53. package/dist/components/internal/PlateMapEditorToolbarInternal.vue.d.ts +2 -2
  54. package/dist/{components-DdzHh3a_.js → components-Ci_BTx00.js} +2322 -2292
  55. package/dist/components-Ci_BTx00.js.map +1 -0
  56. package/dist/composables/index.d.ts +3 -2
  57. package/dist/composables/index.js +10 -11
  58. package/dist/composables/useGeneratedAnalysis.d.ts +62 -0
  59. package/dist/composables/useJobsStatusTray.d.ts +48 -4
  60. package/dist/composables/usePlatformContext.d.ts +3 -0
  61. package/dist/composables/usePluginClient.d.ts +17 -8
  62. package/dist/{composables-BUUphBqg.js → composables-C0VEJ73O.js} +154 -38
  63. package/dist/composables-C0VEJ73O.js.map +1 -0
  64. package/dist/experiment-utils-CxkruZ3G.js +392 -0
  65. package/dist/experiment-utils-CxkruZ3G.js.map +1 -0
  66. package/dist/generated/schema.d.ts +7 -0
  67. package/dist/generated-ui/main.d.ts +0 -0
  68. package/dist/index.d.ts +1 -0
  69. package/dist/index.js +15 -18
  70. package/dist/index.js.map +1 -1
  71. package/dist/install.js +7 -8
  72. package/dist/install.js.map +1 -1
  73. package/dist/plotly.min-BR53hja4.js +180634 -0
  74. package/dist/plotly.min-BR53hja4.js.map +1 -0
  75. package/dist/stores/auth.d.ts +2 -2
  76. package/dist/stores/index.js +1 -1
  77. package/dist/styles.css +8657 -8217
  78. package/dist/tailwind.preset.d.ts +5 -0
  79. package/dist/tailwind.preset.js +7 -2
  80. package/dist/tailwind.preset.js.map +1 -1
  81. package/dist/templates/index.js +4 -3
  82. package/dist/templates/packs.d.ts +0 -1
  83. package/dist/{templates-CNbPQNID.js → templates-Cdj93S9C.js} +2 -4
  84. package/dist/templates-Cdj93S9C.js.map +1 -0
  85. package/dist/types/components.d.ts +2 -0
  86. package/dist/types/form-builder.d.ts +1 -1
  87. package/dist/types/generated-ui.d.ts +183 -0
  88. package/dist/types/index.d.ts +2 -1
  89. package/dist/types/index.js +1 -1
  90. package/dist/types/instrument.d.ts +1 -0
  91. package/dist/types/jobs.d.ts +7 -1
  92. package/dist/types/platform.d.ts +2 -0
  93. package/dist/{useControlSchema-BZNdalmL.js → useControlSchema-B_qgU4rW.js} +1882 -172
  94. package/dist/useControlSchema-B_qgU4rW.js.map +1 -0
  95. package/dist/{useDropdownState-Bb-c_PeE.js → useDropdownState-gVaMXtwW.js} +2 -2
  96. package/dist/{useDropdownState-Bb-c_PeE.js.map → useDropdownState-gVaMXtwW.js.map} +1 -1
  97. package/dist/{useExperimentSelector-DRbj6vse.js → useExperimentSelector-BuQZRgMt.js} +4 -255
  98. package/dist/useExperimentSelector-BuQZRgMt.js.map +1 -0
  99. package/dist/{useFormBuilder-DKekvXRs.js → useFormBuilder-D1G5J5Z5.js} +2 -2
  100. package/dist/{useFormBuilder-DKekvXRs.js.map → useFormBuilder-D1G5J5Z5.js.map} +1 -1
  101. package/dist/{useAnalysisArtifacts-C3l0a0vu.js → useProtocolTemplates-DeaOmMaw.js} +307 -475
  102. package/dist/useProtocolTemplates-DeaOmMaw.js.map +1 -0
  103. package/package.json +7 -3
  104. package/src/__tests__/components/BaseSelect.test.ts +52 -0
  105. package/src/__tests__/components/BaseToggle.test.ts +40 -0
  106. package/src/__tests__/components/GeneratedPathInput.test.ts +132 -0
  107. package/src/__tests__/components/GeneratedPlotlyResult.test.ts +117 -0
  108. package/src/__tests__/components/GeneratedPluginView.test.ts +240 -0
  109. package/src/__tests__/components/GeneratedResultRenderer.test.ts +93 -0
  110. package/src/__tests__/components/InstrumentAlertLog.test.ts +59 -0
  111. package/src/__tests__/components/PluginWorkspaceView.test.ts +68 -14
  112. package/src/__tests__/components/SectionCard.test.ts +181 -0
  113. package/src/__tests__/composables/formBuilderRegistry.test.ts +5 -1
  114. package/src/__tests__/composables/useApi.test.ts +8 -0
  115. package/src/__tests__/composables/useGeneratedAnalysis.test.ts +1742 -0
  116. package/src/__tests__/composables/useJobsStatusTray.test.ts +179 -1
  117. package/src/__tests__/composables/usePlatformContext.test.ts +28 -0
  118. package/src/__tests__/composables/usePluginClient.test.ts +402 -21
  119. package/src/__tests__/composables/usePluginConfig.test.ts +323 -7
  120. package/src/__tests__/docs/extractDocsTemplates.test.ts +0 -1
  121. package/src/__tests__/generatedUi.test.ts +119 -0
  122. package/src/__tests__/templates/templates.test.ts +1 -1
  123. package/src/__tests__/types/GeneratedJsonSchema.test.ts +62 -0
  124. package/src/components/BaseSelect.vue +16 -2
  125. package/src/components/BaseToggle.vue +3 -1
  126. package/src/components/FileUploader.vue +49 -11
  127. package/src/components/GeneratedPathInput.vue +218 -0
  128. package/src/components/GeneratedPlotlyResult.vue +87 -0
  129. package/src/components/GeneratedPluginView.vue +279 -0
  130. package/src/components/GeneratedResultRenderer.vue +137 -0
  131. package/src/components/InstrumentAlertLog.vue +2 -2
  132. package/src/components/JobsStatusTray.vue +14 -8
  133. package/src/components/PluginWorkspaceView.props.ts +1 -1
  134. package/src/components/PluginWorkspaceView.vue +1 -5
  135. package/src/components/SectionCard.story.vue +163 -0
  136. package/src/components/SectionCard.vue +98 -0
  137. package/src/components/index.ts +5 -0
  138. package/src/composables/formBuilderRegistry.ts +2 -0
  139. package/src/composables/index.ts +19 -0
  140. package/src/composables/useApi.ts +1 -0
  141. package/src/composables/useGeneratedAnalysis.ts +1270 -0
  142. package/src/composables/useJobsStatusTray.ts +234 -45
  143. package/src/composables/usePluginClient.ts +164 -30
  144. package/src/composables/usePluginConfig.ts +156 -20
  145. package/src/generated/schema.ts +130 -0
  146. package/src/generated-ui/main.ts +21 -0
  147. package/src/index.ts +3 -0
  148. package/src/jobs.ts +5 -0
  149. package/src/plotly-dist.d.ts +3 -0
  150. package/src/styles/components/section-card.css +161 -0
  151. package/src/styles/index.css +1 -0
  152. package/src/styles/variables.css +25 -0
  153. package/src/tailwind.preset.ts +5 -0
  154. package/src/templates/packs.ts +0 -3
  155. package/src/types/components.ts +12 -0
  156. package/src/types/form-builder.ts +1 -0
  157. package/src/types/generated-ui.ts +189 -0
  158. package/src/types/index.ts +4 -0
  159. package/src/types/instrument.ts +1 -0
  160. package/src/types/jobs.ts +10 -1
  161. package/src/types/platform.ts +2 -0
  162. package/dist/BaseButton-Dgqrze41.js +0 -74
  163. package/dist/BaseButton-Dgqrze41.js.map +0 -1
  164. package/dist/BaseModal-B9UA8Y_I.js +0 -165
  165. package/dist/BaseModal-B9UA8Y_I.js.map +0 -1
  166. package/dist/BaseSelect-ekgr9fDo.js +0 -179
  167. package/dist/BaseSelect-ekgr9fDo.js.map +0 -1
  168. package/dist/ExperimentPopover-Ryusjrhv.js +0 -4
  169. package/dist/ExperimentSelectorModal-Cg4-LXBD.js +0 -5
  170. package/dist/ExperimentSelectorModal-DZeSd-yr.js.map +0 -1
  171. package/dist/SettingsModal-Bl_9w2Y3.js +0 -5
  172. package/dist/components-DdzHh3a_.js.map +0 -1
  173. package/dist/composables-BUUphBqg.js.map +0 -1
  174. package/dist/experiment-utils-Bfa7CwPU.js +0 -108
  175. package/dist/experiment-utils-Bfa7CwPU.js.map +0 -1
  176. package/dist/templates-CNbPQNID.js.map +0 -1
  177. package/dist/useAnalysisArtifacts-C3l0a0vu.js.map +0 -1
  178. package/dist/useControlSchema-BZNdalmL.js.map +0 -1
  179. package/dist/useEventListener-CfVkP9Xz.js +0 -57
  180. package/dist/useEventListener-CfVkP9Xz.js.map +0 -1
  181. package/dist/useExperimentSelector-DRbj6vse.js.map +0 -1
package/README.md CHANGED
@@ -105,16 +105,31 @@ const result = await pluginClient.analyze(
105
105
  )
106
106
  ```
107
107
 
108
- Generated files also expose typed plugin settings when the backend declares a
109
- `settings_model`:
108
+ Generated files also expose typed plugin settings when the backend declares
109
+ `@mint_plugin(config=PluginConfig)`:
110
110
 
111
111
  ```typescript
112
- import { useGeneratedPluginSettings } from './generated/mint-plugin'
113
-
114
- const { settings } = useGeneratedPluginSettings()
115
- const threshold = settings.value?.threshold
112
+ import {
113
+ pluginSettingsFormSchema,
114
+ pluginSettingsValueSchema,
115
+ useGeneratedPluginSettings,
116
+ } from './generated/mint-plugin'
117
+
118
+ const pluginSettings = useGeneratedPluginSettings()
119
+ const threshold = pluginSettings.settings.value?.threshold
120
+ const settingsConfig = pluginSettings.settingsConfig
116
121
  ```
117
122
 
123
+ Pass `settingsConfig` to `PluginWorkspaceView` or `AppTopBar`.
124
+ `pluginSettingsValueSchema` is the Pydantic JSON Schema used for generated
125
+ TypeScript values. `pluginSettingsFormSchema` is the SDK
126
+ `SettingsModalSchema` used to render controls; they are deliberately separate.
127
+
128
+ When `.env`, process-environment, or startup values override a field, saving
129
+ still updates its backing value. The effective override remains active, while
130
+ the saved value is returned in `stored_settings` and marked `inactive` until
131
+ that higher-priority override is removed.
132
+
118
133
  The generated client is built from backend plugin metadata, FastAPI routes, and Pydantic schemas, and uses the frontend SDK to resolve the API prefix automatically.
119
134
  FastAPI request or response content declared as standard
120
135
  `application/octet-stream` is generated as a raw binary transport: request
@@ -345,6 +360,104 @@ replacement path.
345
360
 
346
361
  ## Composables
347
362
 
363
+ ### `usePluginJobs(options)`
364
+
365
+ Generated plugin contracts wrap this composable with definition-specific
366
+ input, job, and output types. For a component dedicated to one generated job,
367
+ bind the definition once with `forDefinition()`:
368
+
369
+ ```typescript
370
+ import { usePluginJobs } from './generated/mint-plugin'
371
+
372
+ const jobs = usePluginJobs()
373
+ await jobs.ready()
374
+
375
+ const analyzeJobs = jobs.forDefinition('analyze')
376
+ const job = await analyzeJobs.submit({
377
+ source: new File(['peak\n1'], 'peaks.csv'),
378
+ threshold: 0.1,
379
+ })
380
+ const result = await analyzeJobs.loadResult(job)
381
+ const canonicalJob = await analyzeJobs.getJob(job.job_id)
382
+ const completedJob = await analyzeJobs.waitForJob(canonicalJob, {
383
+ signal: abortController.signal,
384
+ rejectOnFailure: true,
385
+ })
386
+
387
+ await analyzeJobs.cancelJob(canonicalJob)
388
+
389
+ // Releases only finished `analyze` jobs and their retained results.
390
+ await analyzeJobs.clearFinishedJobs()
391
+ ```
392
+
393
+ The returned scope exposes a typed `jobs` getter, `isJob()` type guard,
394
+ `submit()`, `getJob()`, `waitForJob()`, `loadResult()`, `cancelJob()`, `deleteJob()`, and
395
+ definition-scoped `clearFinishedJobs()`. It also exposes the generated
396
+ `lifecycle` and `profile` literals for that definition without adding runtime
397
+ requests. Passing a job from another definition
398
+ fails instead of crossing the scope. Capability fields are presentation hints;
399
+ the server remains authoritative when scoped cancel/delete methods are called.
400
+ The root wrapper still supports dynamic definition IDs through `submit()` and
401
+ `jobsFor()`. Its no-argument `clearFinishedJobs()` intentionally clears
402
+ terminal jobs across every definition.
403
+
404
+ The underlying frontend composable accepts an optional definition ID in
405
+ `clearFinishedJobs(definitionId)`; generated clients expose the scoped method
406
+ so static definition IDs retain their generated input, job, and output types.
407
+ `getJob()` fetches one fresh canonical job without refreshing the list.
408
+ `waitForJob()` settles from the same SSE/poll-backed canonical source and
409
+ cleans up on abort, deletion, or disposal, so callers do not need a second
410
+ event stream or Promise registry. A call made while the runtime is paused
411
+ rejects immediately. Waiting on a known active job tolerates a transient direct
412
+ lookup failure and continues through SSE/poll updates; pausing an existing wait
413
+ suspends those updates until `resume()`.
414
+ `cancelJob()` updates active work, while `deleteJob()` releases one terminal
415
+ job and its retained result. Background work can be `pause()`d and `resume()`d,
416
+ while `dispose()` is idempotent and also runs automatically with the owning Vue
417
+ effect scope.
418
+
419
+ Both ordinary `uploadPath({ ..., signal })` and a staged scope's
420
+ `uploadPart(job, { ..., signal })` forward the supplied `AbortSignal` to the
421
+ authenticated multipart request. Abort stops the client-side transfer, but the
422
+ caller should refresh job/staging state before retrying because the server may
423
+ already have committed the upload.
424
+ Automatic submission binds ordinary Path uploads to its job definition. When
425
+ uploading manually for an administrator-protected definition, call
426
+ `uploadPath(input, definitionId)` so the server can authorize and bind the
427
+ upload before reading its body.
428
+
429
+ `cancelJob()` and `deleteJob()` accept either a canonical job object or its ID.
430
+
431
+ Pass the runtime's canonical source directly to standard job UI. The job center
432
+ derives its groups from the same jobs ref and does not mirror it with a watcher:
433
+
434
+ ```vue
435
+ <script setup lang="ts">
436
+ import { JobsStatusTray } from '@morscherlab/mint-sdk'
437
+ import { usePluginJobs } from './generated/mint-plugin'
438
+
439
+ const jobs = usePluginJobs()
440
+ </script>
441
+
442
+ <template>
443
+ <JobsStatusTray :source="jobs" />
444
+ </template>
445
+ ```
446
+
447
+ The older `jobs` plus `adapter` tray inputs remain available for compatibility.
448
+ New integrations should pass the runtime itself so polling, SSE updates, and
449
+ job actions continue to have exactly one state owner.
450
+
451
+ When an incremental migration temporarily has more than one owner, use
452
+ `combinePluginJobSources([sdkJobs, legacyJobs])`. It preserves each source's
453
+ live jobs getter, fans out refresh/clear operations, routes per-job actions to
454
+ the owning source, and rejects duplicate IDs instead of guessing.
455
+
456
+ Job state exposes `definition_id`, `result_status`, and `result_expires_at`.
457
+ Managed file results carry a short-lived, result-scoped `download_url` instead
458
+ of embedded base64 data or the user's bearer token, so regular browser
459
+ downloads work through an integrated plugin proxy.
460
+
348
461
  ### `useApi(options?)`
349
462
  Generic API client with auth interceptor.
350
463