@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.0

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 (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34430
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -878
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -1,6 +1,5 @@
1
- import { WandService } from '../wand/wand.service';
2
- import { WandToolHost } from '../wand/wand-tool.service';
3
- import * as i0 from "@angular/core";
1
+ import { UndoGestureTarget } from '../tool-kit/undo-gesture';
2
+ import { CanvasToolHost, ICanvasTool } from '../tool-kit/canvas-tool';
4
3
  /** Brush parameters. `size` is the brush *diameter* in matrix (image) pixels. */
5
4
  export interface BrushOptions {
6
5
  size?: number;
@@ -14,14 +13,9 @@ export interface BrushOptions {
14
13
  label?: string;
15
14
  color?: string;
16
15
  }
17
- /**
18
- * The brush host is identical to the wand's — both need the cached-image
19
- * coordinate frame, the overlay container, the coordinate transform, and
20
- * read/write access to the shared region list. The brush ignores the wand's
21
- * pixel values (it paints a geometric disc rather than flood-filling by colour),
22
- * so reusing {@link WandToolHost} lets each backend bind the same host object.
23
- */
24
- export type BrushToolHost = WandToolHost;
16
+ /** @deprecated One host serves every canvas tool: use {@link CanvasToolHost}. The
17
+ * brush reads only the readback's coordinate frame, not its pixel values. */
18
+ export type BrushToolHost = CanvasToolHost;
25
19
  /**
26
20
  * QuPath-style brush tool. Painting a stroke unions a disc of the configured
27
21
  * size into the active region as the cursor drags; holding <kbd>Shift</kbd>
@@ -33,37 +27,26 @@ export type BrushToolHost = WandToolHost;
33
27
  * No pixel sampling and no cursor indicator: the painted stroke itself shows the
34
28
  * brush size. The overlay canvas only captures the pointer.
35
29
  *
36
- * Lifecycle mirrors the wand: a backend binds its host once, then toggles the
37
- * tool with `setMode(true | false, options)`.
30
+ * Lifecycle mirrors the wand: a plain class, one instance per backend's
31
+ * `CanvasToolManager`, armed with `activate(host, options)` / `deactivate()`.
38
32
  *
39
33
  * Holes / donuts (jit-ui#85): brushing a ring that encloses an unpainted area
40
- * keeps the enclosed hole — {@link WandService.maskToPolygons} traces interior
34
+ * keeps the enclosed hole — the contour tracer (`geometry/contour`) traces interior
41
35
  * rings into {@link Polygon.holes}, which adopt/merge preserve (the re-rasterize
42
36
  * punches the holes back out). The OpenSeadragon overlay renders them with
43
37
  * even-odd fill and GeoJSON round-trips them as extra Polygon rings. The Plotly
44
38
  * (Heatmap) backend currently renders the filled exterior only.
45
39
  */
46
- export declare class BrushToolService {
47
- private wandService;
40
+ export declare class BrushTool implements ICanvasTool<BrushOptions> {
41
+ readonly id = "brush";
48
42
  private host;
49
- private overlay;
50
- private active;
43
+ private readonly overlay;
51
44
  /**
52
- * Accumulated brush region (bbox-relative mask). Persists across mouseup so a
53
- * subsequent stroke extends the *same* region until the user switches tool —
54
- * matching QuPath, and the wand.
45
+ * Accumulated brush region (bbox-relative mask), shared logic with the wand.
46
+ * Persists across mouseup so a subsequent stroke extends the *same* region
47
+ * until the user switches tool — matching QuPath, and the wand.
55
48
  */
56
- private stroke;
57
- /** Id of the region this stroke is editing (null = a fresh region). For an
58
- * erase that splits the region, this tracks the largest resulting piece. */
59
- private strokeRegionId;
60
- /** Readback ratio/origin signature the active stroke is tied to; a change (zoom/pan) invalidates
61
- * it so it isn't re-committed at a different scale (jit-ui#102). */
62
- private strokeRatioSig;
63
- /** Ids of the extra regions produced when an erase stroke splits a region
64
- * into disconnected pieces — reused across drag ticks so the split pieces
65
- * keep stable identities instead of being recreated each tick. */
66
- private strokeExtraIds;
49
+ private readonly editor;
67
50
  /** Previous cursor position (matrix coords) within the current drag, so fast
68
51
  * drags paint a continuous stroke rather than disconnected dabs. */
69
52
  private lastMatrix;
@@ -71,14 +54,17 @@ export declare class BrushToolService {
71
54
  private size;
72
55
  /** The class being painted ({@link BrushOptions.label} / `color`); null = plain brush. */
73
56
  private paintClass;
74
- private readonly boundMouseDown;
75
- private readonly boundMouseMove;
76
- private readonly boundMouseUp;
77
- constructor(wandService: WandService);
78
- /** Wire the tool to its host. Must be called once before `setMode(true)`. */
79
- bindHost(host: BrushToolHost): void;
80
- /** Toggle the brush on/off. */
81
- setMode(active: boolean, options?: BrushOptions): void;
57
+ /** Makes each drag one undo step, however long the user pauses (RT-12). */
58
+ private readonly gesture;
59
+ /** @param gestureTarget the region store, so each drag is one undo step. */
60
+ constructor(gestureTarget?: UndoGestureTarget | null);
61
+ /** Arm the brush on `host`. Arming sets the class in full: no label/color
62
+ * means the plain brush; a missing size keeps the previous one. */
63
+ activate(host: CanvasToolHost, options?: BrushOptions): void;
64
+ /** Disarm: remove the overlay, drop the active region and the class. */
65
+ deactivate(): void;
66
+ /** Drop the active brush region so the next stroke starts a new one. */
67
+ reset(): void;
82
68
  /**
83
69
  * Update size and/or class while armed. The class changes only when `label`
84
70
  * or `color` is passed (as a key, even `undefined`), so a size-only update
@@ -88,13 +74,10 @@ export declare class BrushToolService {
88
74
  setOptions(options?: BrushOptions): void;
89
75
  /** Live-update the brush size (matrix-pixel diameter). */
90
76
  setSize(size: number): void;
91
- /** Drop the active brush region so the next stroke starts a new one. */
92
- clearActiveRegion(): void;
93
77
  private createOverlay;
94
- private destroyOverlay;
95
- private onMouseDown;
96
- private onMouseMove;
97
- private onMouseUp;
78
+ private onPointerDown;
79
+ private onPointerMove;
80
+ private onPointerUp;
98
81
  private resetStroke;
99
82
  /**
100
83
  * Paint (or erase) a disc — or a swept line of discs since the previous
@@ -104,61 +87,11 @@ export declare class BrushToolService {
104
87
  private applyAtClient;
105
88
  /**
106
89
  * OR (add) or AND-NOT (erase) a filled disc of `radius` matrix-pixels centred
107
- * at (cx, cy) into the accumulator, growing its bbox to fit when adding.
90
+ * at (cx, cy) into the accumulator, growing its bbox (clipped to the
91
+ * readback) to fit when adding.
108
92
  */
109
93
  private stampDisc;
110
- /**
111
- * Ensure the accumulator's bbox covers [px0,py0,px1,py1) (clamped to the
112
- * image), allocating/copying a larger mask when it must grow. Returns false if
113
- * the requested box is empty after clamping.
114
- */
115
- private ensureStrokeCovers;
116
- /** True if (matrixX, matrixY) lies inside the current stroke accumulator. */
117
- private pointInStroke;
118
- /**
119
- * Remove the region(s) referenced by the stroke and reset it — used when an
120
- * erase stroke deletes every pixel.
121
- */
122
- private dropActiveShape;
123
94
  /** Whether the stroke may adopt or merge `region`: always for the plain brush,
124
95
  * otherwise only a region of the class being painted. */
125
96
  private paintsInto;
126
- /** A region's closed-polygon vertices (image/data coords), or null when it
127
- * isn't a fillable closed polygon (rectangles, open polylines). */
128
- private regionVerts;
129
- /** Whether a region can be faithfully rasterized at this zoom (rx/ry = data units per matrix px).
130
- * Editing rasterizes + re-traces the region, so one whose matrix-space bbox exceeds the
131
- * rasterizer cap would come back rescaled/corrupted (e.g. a whole-slide annotation while zoomed
132
- * out) — skip adopt/merge for those and only edit them near native zoom (jit-ui#102). */
133
- private fitsForEdit;
134
- /** Convert a region's hole rings from image/data coords into matrix coords so
135
- * they line up with the stroke accumulator (jit-ui#85). */
136
- private holesToMatrix;
137
- /**
138
- * If (matrixX, matrixY) falls inside an existing region, rasterize it into the
139
- * stroke accumulator so subsequent brush input extends it rather than starting
140
- * a new region.
141
- */
142
- private tryAdoptShapeAt;
143
- /**
144
- * Fold every region whose rasterized mask overlaps the stroke mask into the
145
- * stroke and remove it from the list, so brushing across regions merges them.
146
- */
147
- private mergeOverlappingShapes;
148
- /**
149
- * Commit the stroke's connected pieces as regions — the largest keeps the
150
- * stroke's region identity, additional pieces (from an erase that split the
151
- * region) become their own regions tracked in `strokeExtraIds` so they keep
152
- * stable identities across drag ticks. The store mints ids on commit, which
153
- * we read back so subsequent ticks replace the same regions.
154
- */
155
- private commitComponents;
156
- /**
157
- * Build a Region for one component and insert it into `regions`: replace the
158
- * region with `id` in place if it exists, otherwise append a new one. Returns
159
- * the Region instance (its id is minted later by the store when new).
160
- */
161
- private upsertComponent;
162
- static ɵfac: i0.ɵɵFactoryDeclaration<BrushToolService, never>;
163
- static ɵprov: i0.ɵɵInjectableDeclaration<BrushToolService>;
164
97
  }
@@ -0,0 +1,20 @@
1
+ import { WandService } from './wand/wand.service';
2
+ import { SamPointToolService } from './segmentation/sam-point-tool.service';
3
+ import { CanvasToolHost } from './tool-kit/canvas-tool';
4
+ import { CanvasToolManager } from './tool-kit/canvas-tool-manager';
5
+ import { UndoGestureTarget } from './tool-kit/undo-gesture';
6
+ /** What a backend supplies to build its canvas tools — all from its own injector. */
7
+ export interface CanvasToolDeps {
8
+ /** The (stateless) wand patch sampler. */
9
+ wandService: WandService;
10
+ /** The chain's region store: makes each wand/brush/eraser drag one undo step. */
11
+ regionStore: UndoGestureTarget | null;
12
+ /** The chain's SAM point feeds; the point tool reports through them. */
13
+ samPoint: SamPointToolService;
14
+ }
15
+ /**
16
+ * A backend's canvas-tool manager: fresh wand, brush, vertex eraser,
17
+ * zoom-to-box and SAM point tools over `host`. Each backend calls this once, so
18
+ * no tool instance — and no tool state — is shared between backends (RT-21).
19
+ */
20
+ export declare function createCanvasToolManager(host: CanvasToolHost, deps: CanvasToolDeps): CanvasToolManager;
@@ -1,4 +1,4 @@
1
- import { CachedImageData } from '../wand/wand-tool.service';
1
+ import type { CachedImageData } from '../wand/wand-tool.service';
2
2
  /** A client-side crop of the loaded image — the browser equivalent of the JIT
3
3
  * server slide-crop, taken from the pixels already in the viewer. */
4
4
  export interface CroppedImage {
@@ -19,12 +19,18 @@ export interface DataBox {
19
19
  }
20
20
  /**
21
21
  * Browser "slide crop": extract the box region (data coords) from a cached image
22
- * frame as an RGBA image, clamped to the image bounds. Grayscale frames are
23
- * replicated across R/G/B; RGB tuples are copied through. Returns null when the
24
- * box is empty/outside the image.
22
+ * frame as an RGBA image, clamped to the image bounds. Returns null when the box
23
+ * is empty/outside the image.
25
24
  *
26
25
  * The output feeds an automatic segmenter (e.g. cellpose-SAM): run it on the
27
26
  * crop, then offset the resulting masks by (matrixX0, matrixY0) to place them
28
27
  * back on the full frame.
29
28
  */
30
29
  export declare function cropImageRegion(cached: CachedImageData, frameIndex: number, box: DataBox): CroppedImage | null;
30
+ /**
31
+ * RGBA pixels of the `w`×`h` matrix window at (x0, y0) of a cached frame,
32
+ * nested or packed (see `tool-kit/frame-pixels`). Grayscale frames are
33
+ * replicated across R/G/B; RGB tuples are copied through. Missing pixels become
34
+ * opaque black.
35
+ */
36
+ export declare function frameRegionToRgba(cached: CachedImageData, frameIndex: number, x0: number, y0: number, w: number, h: number): Uint8ClampedArray;
@@ -0,0 +1,38 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { PlotTypeId } from '../../contracts/plot-type';
3
+ import { PlotTypeOption } from '../../contracts/plot-type-contribution.contract';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * The toolbar's plot-type group: the plot-type dropdown, the isosurface band
7
+ * slider for the isosurface modes, and the add-intensity-line button for the
8
+ * views that draw profile lines. Presentational: the host owns the values.
9
+ */
10
+ export declare class PlotTypeSelectorComponent {
11
+ /** Plot types the active backend advertises, then any contributed modes. */
12
+ options: PlotTypeOption[];
13
+ /** The selected built-in type or contributed mode id. */
14
+ selected: PlotTypeId;
15
+ /** An isosurface mode: show the iso band slider. */
16
+ isosurface: boolean;
17
+ /** Isosurface band as a 0–255 slider position. */
18
+ isoRange: number[];
19
+ /** The view draws intensity profile lines: show the add-line button. */
20
+ intensityLines: boolean;
21
+ /** A plot type or contributed mode was picked from the dropdown. */
22
+ selectPlotType: EventEmitter<string>;
23
+ /** The iso band slider moved: the new `[low, high]` pair (or nothing). */
24
+ isoRangeChange: EventEmitter<number[] | undefined>;
25
+ /** Add another coloured intensity line ROI + inset trace. */
26
+ addProfileLine: EventEmitter<void>;
27
+ /** Iso slider bounds — UI constants (the band is host-owned). */
28
+ protected readonly isoValueMin = 0;
29
+ protected readonly isoValueMax = 255;
30
+ protected readonly isoValueStep = 1;
31
+ /** A plot-type icon is a PrimeNG font glyph (e.g. `pi pi-image`) rather than an
32
+ * SVG asset path — drives which element the item template renders. */
33
+ protected isPiIcon(icon: string | undefined): boolean;
34
+ /** The iso band slider reports its `[low, high]` pair (or nothing). */
35
+ protected onIsoRange(value: number | number[] | undefined): void;
36
+ static ɵfac: i0.ɵɵFactoryDeclaration<PlotTypeSelectorComponent, never>;
37
+ static ɵcmp: i0.ɵɵComponentDeclaration<PlotTypeSelectorComponent, "toolbar-plot-type-selector", never, { "options": { "alias": "options"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "isosurface": { "alias": "isosurface"; "required": false; }; "isoRange": { "alias": "isoRange"; "required": false; }; "intensityLines": { "alias": "intensityLines"; "required": false; }; }, { "selectPlotType": "selectPlotType"; "isoRangeChange": "isoRangeChange"; "addProfileLine": "addProfileLine"; }, never, never, true, never>;
38
+ }
@@ -0,0 +1,21 @@
1
+ /** A drawing tool's toggle button in the toolbar's region group. */
2
+ export interface RegionToolButton {
3
+ /** The drag mode the button toggles. */
4
+ mode: string;
5
+ /** Accessible name. */
6
+ label: string;
7
+ /** Tooltip (HTML). */
8
+ tooltip: string;
9
+ /** A PrimeNG glyph (`pi pi-…`), or else {@link img}. */
10
+ icon?: string;
11
+ /** An SVG under `assets/plotting/`, recoloured for its on/off state. */
12
+ img?: string;
13
+ /** `not3d`: absent from the 3D cloud's screen-space lasso (no raster to
14
+ * sample / an open polyline is no region); `vertex`: needs a backend with a
15
+ * vertex-editing overlay (OSD + napari-js image). */
16
+ gate?: 'not3d' | 'vertex';
17
+ /** The tool's parameter slider, shown while it is active. */
18
+ slider?: 'brush' | 'wand' | 'eraser';
19
+ }
20
+ /** The region drawing tools, in toolbar order. */
21
+ export declare const REGION_TOOL_BUTTONS: readonly RegionToolButton[];
@@ -0,0 +1,60 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { RegionToolButton } from './region-tool-buttons';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * The toolbar's region group: open the Region Editor, the drawing tools (one
6
+ * table-driven toggle per {@link REGION_TOOL_BUTTONS} entry, with the active
7
+ * tool's parameter slider), undo / redo and delete. Presentational: the host
8
+ * owns the active mode and every value.
9
+ */
10
+ export declare class RegionToolsComponent {
11
+ /** The armed drawing tool's mode, or null. */
12
+ activeDragMode: string | null;
13
+ /** The 3D cloud's screen-space lasso: no brush or polyline. */
14
+ is3dRegions: boolean;
15
+ /** The backend has a vertex-editing overlay (OSD + napari-js image). */
16
+ vertexTools: boolean;
17
+ /** Magic-wand sensitivity (the wand's slider value). */
18
+ wandSensitivity: number;
19
+ /** Brush diameter in image pixels. */
20
+ brushSize: number;
21
+ /** Vertex-eraser radius in image pixels. */
22
+ vertexEraserRadius: number;
23
+ /** A region action can be undone (enables Undo). */
24
+ canUndo: boolean;
25
+ /** An undone region action can be redone (enables Redo). */
26
+ canRedo: boolean;
27
+ /** Open the Region Editor dialog. */
28
+ openRegionEditor: EventEmitter<void>;
29
+ /** A drawing tool's button was clicked (its mode). */
30
+ toggleDragMode: EventEmitter<string>;
31
+ /** Undo the last region action. */
32
+ undoRegion: EventEmitter<void>;
33
+ /** Redo the last undone region action. */
34
+ redoRegion: EventEmitter<void>;
35
+ /** Delete the selected region. */
36
+ deleteRegion: EventEmitter<void>;
37
+ /** The wand sensitivity slider moved. */
38
+ wandSensitivityChange: EventEmitter<number | undefined>;
39
+ /** The brush size slider moved. */
40
+ brushSizeChange: EventEmitter<number | undefined>;
41
+ /** The vertex-eraser radius slider moved. */
42
+ vertexEraserRadiusChange: EventEmitter<number | undefined>;
43
+ protected readonly buttons: readonly RegionToolButton[];
44
+ /** Slider bounds — toolbar UI constants (the values are host-owned). */
45
+ protected readonly wandSensitivityMin = 0.5;
46
+ protected readonly wandSensitivityMax = 10;
47
+ protected readonly wandSensitivityStep = 0.1;
48
+ protected readonly brushSizeMin = 5;
49
+ protected readonly brushSizeMax = 300;
50
+ protected readonly brushSizeStep = 5;
51
+ protected readonly vertexEraserRadiusMin = 5;
52
+ protected readonly vertexEraserRadiusMax = 300;
53
+ protected readonly vertexEraserRadiusStep = 5;
54
+ protected readonly trackByMode: (_: number, b: RegionToolButton) => string;
55
+ protected shown(b: RegionToolButton): boolean;
56
+ /** A single slider's value (a range slider never feeds these). */
57
+ protected asNumber(v: number | number[] | undefined): number | undefined;
58
+ static ɵfac: i0.ɵɵFactoryDeclaration<RegionToolsComponent, never>;
59
+ static ɵcmp: i0.ɵɵComponentDeclaration<RegionToolsComponent, "toolbar-region-tools", never, { "activeDragMode": { "alias": "activeDragMode"; "required": false; }; "is3dRegions": { "alias": "is3dRegions"; "required": false; }; "vertexTools": { "alias": "vertexTools"; "required": false; }; "wandSensitivity": { "alias": "wandSensitivity"; "required": false; }; "brushSize": { "alias": "brushSize"; "required": false; }; "vertexEraserRadius": { "alias": "vertexEraserRadius"; "required": false; }; "canUndo": { "alias": "canUndo"; "required": false; }; "canRedo": { "alias": "canRedo"; "required": false; }; }, { "openRegionEditor": "openRegionEditor"; "toggleDragMode": "toggleDragMode"; "undoRegion": "undoRegion"; "redoRegion": "redoRegion"; "deleteRegion": "deleteRegion"; "wandSensitivityChange": "wandSensitivityChange"; "brushSizeChange": "brushSizeChange"; "vertexEraserRadiusChange": "vertexEraserRadiusChange"; }, never, never, true, never>;
60
+ }
@@ -1,6 +1,4 @@
1
- import { BehaviorSubject } from 'rxjs';
2
- import { WandService } from '../wand/wand.service';
3
- import { WandToolHost } from '../wand/wand-tool.service';
1
+ import { CanvasToolHost } from '../tool-kit/canvas-tool';
4
2
  import { ICellSegmenter } from '../../contracts/cell-segmenter.contract';
5
3
  import * as i0 from "@angular/core";
6
4
  /**
@@ -14,19 +12,17 @@ import * as i0 from "@angular/core";
14
12
  * box prompt, so the box just bounds the crop it segments automatically.
15
13
  */
16
14
  export declare class CellSegmentToolService {
17
- private wandService;
18
- private host;
19
- readonly status$: BehaviorSubject<string>;
20
- readonly busy$: BehaviorSubject<boolean>;
21
- readonly progress$: BehaviorSubject<number>;
22
- constructor(wandService: WandService);
23
- bindHost(host: WandToolHost): void;
15
+ private readonly state;
16
+ readonly status$: import("rxjs").BehaviorSubject<string>;
17
+ readonly busy$: import("rxjs").BehaviorSubject<boolean>;
18
+ readonly progress$: import("rxjs").BehaviorSubject<number>;
24
19
  /**
25
- * Crop + cellpose-segment every rectangle; append the cell regions and drop
26
- * the prompt rectangles that produced cells. Returns the number of regions added.
20
+ * Crop + cellpose-segment every rectangle of the backend behind `host`; append
21
+ * the cell regions and drop the prompt rectangles that produced cells. Returns
22
+ * the number of regions added; 0 (ignored) while a previous run is still going.
23
+ * The host is passed per run, so no backend's host outlives its call.
27
24
  */
28
- segmentBoxes(segmenter: ICellSegmenter): Promise<number>;
29
- private makeRegion;
25
+ segmentBoxes(host: CanvasToolHost, segmenter: ICellSegmenter): Promise<number>;
30
26
  static ɵfac: i0.ɵɵFactoryDeclaration<CellSegmentToolService, never>;
31
27
  static ɵprov: i0.ɵɵInjectableDeclaration<CellSegmentToolService>;
32
28
  }
@@ -17,8 +17,17 @@ import * as i0 from "@angular/core";
17
17
  export declare class CellposeSegmenterService implements ICellSegmenter {
18
18
  private instance;
19
19
  private loading;
20
+ /** Bumped by {@link setModelUrl}, so a load of the previous URL is discarded. */
21
+ private generation;
20
22
  private modelUrl;
21
- /** Point the segmenter at a different hosted CPSAM ONNX (before first use). */
23
+ /** Every in-flight caller's callbacks: one shared load reports to all of them. */
24
+ private readonly progressListeners;
25
+ private readonly statusListeners;
26
+ /**
27
+ * Point the segmenter at a different hosted CPSAM ONNX. Changing the URL after
28
+ * the model loaded (or while it loads) disposes it, so the next run loads the
29
+ * new model instead of silently keeping the old one.
30
+ */
22
31
  setModelUrl(url: string): void;
23
32
  segmentCells(image: {
24
33
  data: Uint8ClampedArray;
@@ -27,7 +36,8 @@ export declare class CellposeSegmenterService implements ICellSegmenter {
27
36
  }, progress?: CellSegmentProgress): Promise<CellSegmentation>;
28
37
  /**
29
38
  * The shared Cellpose instance, lazily created on first use and reused
30
- * thereafter (deduped across concurrent callers). Exposed so a host pipeline
39
+ * thereafter (deduped across concurrent callers, each of which receives the
40
+ * load's progress). A failed load is retried on the next call. Exposed so a host pipeline
31
41
  * engine can run richer `segment()` options on the same instance. `onProgress`
32
42
  * reports raw downloaded/total bytes (`total` is null when unknown); `onStatus`
33
43
  * reports worker-init phase strings.
@@ -1,15 +1,30 @@
1
1
  import { ISamSession, SamEmbedding, SamMaskResult, SamModelDef, SamPrompt } from '../../contracts/sam.contract';
2
+ /**
3
+ * onnxruntime-web implementation of {@link ISamSession} (jit-ui#90), with two
4
+ * execution modes chosen per model:
5
+ *
6
+ * - **in-process** (main thread) — for small WASM models flagged `inProcess`
7
+ * (e.g. micro-sam ViT-T). Fast load + inference with no Web Worker spawn /
8
+ * second ORT runtime / message round-trips; the brief encode runs on the main
9
+ * thread (fine for a tiny model).
10
+ * - **worker** — for WebGPU models (e.g. ViT-B, patho-sam fp16) whose heavy
11
+ * encode would otherwise freeze the tab. Runs in {@link ./onnx-sam.worker} so
12
+ * the UI stays responsive (the spinner animates).
13
+ *
14
+ * Both modes share their inference math via {@link ./sam-onnx-core}. Lazy-imported
15
+ * by the SAM tools so onnxruntime-web / the worker never load in unit tests or
16
+ * the initial bundle.
17
+ */
2
18
  export declare class OnnxSamSession implements ISamSession {
3
19
  private mode;
4
20
  private loaded;
5
- private model;
6
21
  private inputSize;
7
22
  private worker;
8
- private seq;
9
- private readonly pending;
23
+ private readonly calls;
10
24
  private encoder;
11
25
  private decoder;
12
26
  private nextToken;
27
+ /** The few most recently used embeddings, by token (one per recently viewed image). */
13
28
  private readonly embeddings;
14
29
  loadModel(model: SamModelDef, onProgress?: (fraction: number) => void): Promise<void>;
15
30
  isLoaded(): boolean;
@@ -19,7 +34,11 @@ export declare class OnnxSamSession implements ISamSession {
19
34
  height: number;
20
35
  }): Promise<SamEmbedding>;
21
36
  decode(embedding: SamEmbedding, prompt: SamPrompt): Promise<SamMaskResult>;
37
+ /** Release the worker / ORT sessions. Calls still in flight reject (RT-8), so
38
+ * their callers' `finally` blocks run (e.g. a tool's busy flag clears). */
22
39
  dispose(): void;
23
40
  private ensureWorker;
41
+ /** Terminate the worker (if any) and reject every call still waiting on it. */
42
+ private dropWorker;
24
43
  private call;
25
44
  }
@@ -0,0 +1,31 @@
1
+ /** A reply from the SAM worker: progress for, or the result of, call `id`. */
2
+ export interface WorkerReply {
3
+ id: number;
4
+ type: string;
5
+ /** Present on `type: 'progress'` replies. */
6
+ fraction?: number;
7
+ /** Present on `type: 'error'` replies. */
8
+ error?: string;
9
+ [key: string]: unknown;
10
+ }
11
+ /**
12
+ * Request/response bookkeeping for a worker RPC: each call gets an id and a
13
+ * promise that its reply settles. Every exit path (dispose, a worker crash)
14
+ * must {@link rejectAll}, or awaiting callers never reach their `finally` and a
15
+ * tool's busy flag sticks forever (RT-8).
16
+ */
17
+ export declare class PendingCalls {
18
+ private seq;
19
+ private readonly pending;
20
+ /** Calls still awaiting a reply. */
21
+ get size(): number;
22
+ /** Register a new call; post the message with the returned id. */
23
+ open(onProgress?: (fraction: number) => void): {
24
+ id: number;
25
+ promise: Promise<WorkerReply>;
26
+ };
27
+ /** Route a worker reply to its call: progress, error or result. */
28
+ handle(reply: WorkerReply): void;
29
+ /** Reject every pending call with `err` and forget them. */
30
+ rejectAll(err: Error): void;
31
+ }
@@ -13,7 +13,12 @@ import { SamModelDef } from '../../contracts/sam.contract';
13
13
  * cellpose default). A host can repoint them at its own hosting (e.g. a GCS
14
14
  * bucket) at runtime via {@link setSamModelUrls}; an empty URL disables a model
15
15
  * (the session throws a clear "not configured" error). Export/quantization
16
- * tooling: the sibling `browser-onnx-tools` project; see docs/sam-segmentation-design.md.
16
+ * tooling: the sibling `browser-onnx-tools` project; see
17
+ * docs/design/sam-segmentation-design.md.
18
+ *
19
+ * Downloads are cached in the browser by URL and `revision`: when a model's files are
20
+ * re-exported under the same URLs, set (or bump) its `revision` so browsers fetch the
21
+ * new files instead of serving the old ones from cache.
17
22
  */
18
23
  export declare const SAM_MODELS: SamModelDef[];
19
24
  /** Initial default model id (overridden at runtime once the host configures a
@@ -31,6 +36,7 @@ export declare function isSamModelReady(model: SamModelDef): boolean;
31
36
  /**
32
37
  * Point a registered model at its hosted ONNX pair (HF / GCS). Called by the
33
38
  * host's composition root once hosting is decided, keeping deployment URLs out
34
- * of the library.
39
+ * of the library. Pass `revision` when the files at those URLs can be replaced in
40
+ * place, and change it whenever they are (see {@link SamModelDef.revision}).
35
41
  */
36
- export declare function setSamModelUrls(id: string, encoderUrl: string, decoderUrl: string): void;
42
+ export declare function setSamModelUrls(id: string, encoderUrl: string, decoderUrl: string, revision?: string): void;
@@ -4,11 +4,18 @@ import type { SamPrompt } from '../../contracts/sam.contract';
4
4
  * Shared, DOM-free SAM inference primitives used by BOTH inference backends:
5
5
  * the in-process session (`OnnxSamSession`, main thread) and the dedicated
6
6
  * Web Worker (`onnx-sam.worker`). Keeping these here avoids duplicating the
7
- * preprocessing / decoder-prompt math and keeps the worker DOM-free (it can't
8
- * import sam-prompt.ts, which pulls in DOM types).
7
+ * preprocessing / decoder-prompt math; nothing here may import Angular or the
8
+ * DOM, since the worker bundles it.
9
9
  */
10
+ /** SAM's per-channel (RGB) pixel mean, subtracted before the encoder. */
10
11
  export declare const PIXEL_MEAN: number[];
12
+ /** SAM's per-channel (RGB) pixel standard deviation, divided out before the encoder. */
11
13
  export declare const PIXEL_STD: number[];
14
+ /**
15
+ * Delete every downloaded SAM model (several hundred MB per origin). Resolves
16
+ * to true when something was removed; false where the Cache API is unavailable.
17
+ */
18
+ export declare function clearSamModelCache(): Promise<boolean>;
12
19
  /** Encoder output for one image, reused across prompts. */
13
20
  export interface CoreEmbedding {
14
21
  data: Float32Array;
@@ -24,10 +31,16 @@ export interface CoreMask {
24
31
  height: number;
25
32
  iou: number;
26
33
  }
34
+ /**
35
+ * The Cache API key a model file is stored under: its URL, plus the model's
36
+ * `SamModelDef.revision` as a query parameter when it has one, so a bumped revision
37
+ * misses the cache and downloads the re-exported file.
38
+ */
39
+ export declare function modelCacheKey(url: string, revision?: string): string;
27
40
  /** Fetch a model as an ArrayBuffer, streaming progress and caching in the Cache
28
- * API (so it isn't re-downloaded). Cache hit → progress jumps to 1. Works on
29
- * the main thread and in a worker (both have `fetch` + `caches`). */
30
- export declare function fetchModel(url: string, onProgress?: (f: number) => void): Promise<ArrayBuffer>;
41
+ * API (so it isn't re-downloaded) under {@link modelCacheKey}. Cache hit → progress
42
+ * jumps to 1. Works on the main thread and in a worker (both have `fetch` + `caches`). */
43
+ export declare function fetchModel(url: string, onProgress?: (f: number) => void, revision?: string): Promise<ArrayBuffer>;
31
44
  /** Resize (long side → size, bilinear), pad to size×size, SAM-normalize → CHW float32. */
32
45
  export declare function preprocess(data: Uint8ClampedArray, width: number, height: number, size: number, scale: number): Float32Array;
33
46
  /** Assemble decoder `point_coords`/`point_labels` from a prompt, in encoder