arrayview 0.29.2__tar.gz → 0.30.0__tar.gz

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 (235) hide show
  1. arrayview-0.30.0/.github/workflows/launch-contracts.yml +62 -0
  2. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/project-state.md +1 -1
  3. {arrayview-0.29.2 → arrayview-0.30.0}/PKG-INFO +1 -1
  4. {arrayview-0.29.2 → arrayview-0.30.0}/docs/comparing.md +7 -0
  5. {arrayview-0.29.2 → arrayview-0.30.0}/docs/configuration.md +3 -0
  6. arrayview-0.30.0/docs/foreign-hosts.md +104 -0
  7. {arrayview-0.29.2 → arrayview-0.30.0}/docs/index.md +4 -0
  8. arrayview-0.30.0/docs/launch-routing-refactor.md +523 -0
  9. {arrayview-0.29.2 → arrayview-0.30.0}/docs/loading.md +52 -2
  10. {arrayview-0.29.2 → arrayview-0.30.0}/docs/remote.md +8 -3
  11. {arrayview-0.29.2 → arrayview-0.30.0}/pyproject.toml +1 -1
  12. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/__init__.py +2 -1
  13. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_analysis.py +12 -0
  14. arrayview-0.30.0/src/arrayview/_instance_registry.py +253 -0
  15. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_io.py +469 -98
  16. arrayview-0.30.0/src/arrayview/_launch_plan.py +524 -0
  17. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_launcher.py +859 -301
  18. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_render.py +2 -0
  19. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_loading.py +95 -10
  20. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_websocket.py +19 -0
  21. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_server.py +85 -0
  22. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_session.py +15 -2
  23. arrayview-0.30.0/src/arrayview/_session_spec.py +199 -0
  24. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_viewer.html +295 -31
  25. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_vscode_browser.py +124 -11
  26. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_vscode_extension.py +1 -1
  27. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_vscode_signal.py +239 -10
  28. arrayview-0.30.0/src/arrayview/arrayview-opener.vsix +0 -0
  29. {arrayview-0.29.2 → arrayview-0.30.0}/tests/lifecycle_matrix.py +13 -2
  30. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_api.py +127 -0
  31. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_cli.py +55 -2
  32. arrayview-0.30.0/tests/test_display_opener_results.py +126 -0
  33. arrayview-0.30.0/tests/test_doctor_commands.py +87 -0
  34. arrayview-0.30.0/tests/test_instance_registry.py +181 -0
  35. arrayview-0.30.0/tests/test_invocation_contract_matrix.py +224 -0
  36. arrayview-0.30.0/tests/test_launch_diagnostics.py +44 -0
  37. arrayview-0.30.0/tests/test_launch_plan.py +534 -0
  38. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_lifecycle_contract.py +54 -21
  39. arrayview-0.30.0/tests/test_nifti_series.py +559 -0
  40. arrayview-0.30.0/tests/test_safe_server_stop.py +175 -0
  41. arrayview-0.30.0/tests/test_server_identity_status.py +81 -0
  42. arrayview-0.30.0/tests/test_session_spec.py +95 -0
  43. arrayview-0.30.0/tests/test_view_handle_lifecycle.py +87 -0
  44. arrayview-0.30.0/tests/test_view_launch_execution.py +212 -0
  45. arrayview-0.30.0/tests/test_vscode_ack_protocol.py +258 -0
  46. {arrayview-0.29.2 → arrayview-0.30.0}/uv.lock +1 -1
  47. {arrayview-0.29.2 → arrayview-0.30.0}/vscode-extension/extension.js +128 -15
  48. {arrayview-0.29.2 → arrayview-0.30.0}/vscode-extension/lifecycle_helpers.js +35 -0
  49. {arrayview-0.29.2 → arrayview-0.30.0}/vscode-extension/package.json +1 -1
  50. {arrayview-0.29.2 → arrayview-0.30.0}/vscode-extension/test_lifecycle_helpers.js +45 -0
  51. arrayview-0.29.2/docs/launch-routing-refactor.md +0 -153
  52. arrayview-0.29.2/src/arrayview/_launch_plan.py +0 -281
  53. arrayview-0.29.2/src/arrayview/arrayview-opener.vsix +0 -0
  54. arrayview-0.29.2/tests/test_launch_plan.py +0 -235
  55. arrayview-0.29.2/tests/test_nifti_series.py +0 -263
  56. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/frontend-designer/SKILL.md +0 -0
  57. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/invocation-consistency/SKILL.md +0 -0
  58. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/modes-consistency/SKILL.md +0 -0
  59. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/SKILL.md +0 -0
  60. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/element-attributes.md +0 -0
  61. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/playwright-tests.md +0 -0
  62. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/request-mocking.md +0 -0
  63. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/running-code.md +0 -0
  64. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/session-management.md +0 -0
  65. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/storage-state.md +0 -0
  66. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/test-generation.md +0 -0
  67. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/tracing.md +0 -0
  68. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/video-recording.md +0 -0
  69. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/todo-workflow/SKILL.md +0 -0
  70. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/ui-consistency-audit/SKILL.md +0 -0
  71. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/viewer-ui-checklist/SKILL.md +0 -0
  72. {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/visual-bug-fixing/SKILL.md +0 -0
  73. {arrayview-0.29.2 → arrayview-0.30.0}/.github/copilot-instructions.md +0 -0
  74. {arrayview-0.29.2 → arrayview-0.30.0}/.github/workflows/docs.yml +0 -0
  75. {arrayview-0.29.2 → arrayview-0.30.0}/.github/workflows/python-publish.yml +0 -0
  76. {arrayview-0.29.2 → arrayview-0.30.0}/.gitignore +0 -0
  77. {arrayview-0.29.2 → arrayview-0.30.0}/.ignore +0 -0
  78. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/AGENTS.md +0 -0
  79. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/ROUTER.md +0 -0
  80. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/SETUP.md +0 -0
  81. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/SYNC.md +0 -0
  82. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/architecture.md +0 -0
  83. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/conventions.md +0 -0
  84. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/decisions.md +0 -0
  85. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/frontend.md +0 -0
  86. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/lifecycle.md +0 -0
  87. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/render-pipeline.md +0 -0
  88. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/setup.md +0 -0
  89. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/stack.md +0 -0
  90. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/INDEX.md +0 -0
  91. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/README.md +0 -0
  92. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/add-file-format.md +0 -0
  93. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/add-server-endpoint.md +0 -0
  94. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/animation-verify.md +0 -0
  95. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/debug-render.md +0 -0
  96. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/debug-vscode-extension-python.md +0 -0
  97. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/extend-compare-mode.md +0 -0
  98. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/extract-server-route-module.md +0 -0
  99. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/frontend-change.md +0 -0
  100. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/setup.sh +0 -0
  101. {arrayview-0.29.2 → arrayview-0.30.0}/.mex/sync.sh +0 -0
  102. {arrayview-0.29.2 → arrayview-0.30.0}/.opencode/opencode.json +0 -0
  103. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T18-46-49-737Z.yml +0 -0
  104. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T18-48-21-979Z.yml +0 -0
  105. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T18-51-35-665Z.yml +0 -0
  106. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-07-01-393Z.yml +0 -0
  107. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-14-37-969Z.yml +0 -0
  108. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-21-30-940Z.yml +0 -0
  109. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-23-08-126Z.yml +0 -0
  110. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-29-33-155Z.yml +0 -0
  111. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-31-25-336Z.yml +0 -0
  112. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-31-53-789Z.yml +0 -0
  113. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-39-12-257Z.yml +0 -0
  114. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-39-16-449Z.yml +0 -0
  115. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T20-15-25-513Z.yml +0 -0
  116. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T20-25-13-179Z.yml +0 -0
  117. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T20-39-01-435Z.yml +0 -0
  118. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-01-27-659Z.yml +0 -0
  119. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-01-41-283Z.yml +0 -0
  120. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-03-00-625Z.yml +0 -0
  121. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-04-12-887Z.yml +0 -0
  122. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-33-39-044Z.yml +0 -0
  123. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-38-01-530Z.yml +0 -0
  124. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-45-20-383Z.yml +0 -0
  125. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-55-11-545Z.yml +0 -0
  126. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-56-03-307Z.yml +0 -0
  127. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-56-35-733Z.yml +0 -0
  128. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-57-12-181Z.yml +0 -0
  129. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-57-37-748Z.yml +0 -0
  130. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-58-13-679Z.yml +0 -0
  131. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T22-37-23-895Z.yml +0 -0
  132. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T00-39-18-637Z.yml +0 -0
  133. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T01-41-46-243Z.yml +0 -0
  134. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T04-31-48-472Z.yml +0 -0
  135. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-14-15-632Z.yml +0 -0
  136. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-14-47-582Z.yml +0 -0
  137. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-16-23-471Z.yml +0 -0
  138. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-17-10-247Z.yml +0 -0
  139. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-18-24-707Z.yml +0 -0
  140. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-20-06-164Z.yml +0 -0
  141. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-20-28-342Z.yml +0 -0
  142. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-21-54-962Z.yml +0 -0
  143. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-22-34-666Z.yml +0 -0
  144. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-23-11-336Z.yml +0 -0
  145. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-23-36-260Z.yml +0 -0
  146. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-24-09-267Z.yml +0 -0
  147. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-24-35-434Z.yml +0 -0
  148. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-25-57-010Z.yml +0 -0
  149. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-34-48-823Z.yml +0 -0
  150. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-46-46-468Z.yml +0 -0
  151. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-48-17-930Z.yml +0 -0
  152. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-49-26-400Z.yml +0 -0
  153. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-50-31-563Z.yml +0 -0
  154. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-56-45-568Z.yml +0 -0
  155. {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/theme-dark.yml +0 -0
  156. {arrayview-0.29.2 → arrayview-0.30.0}/.python-version +0 -0
  157. {arrayview-0.29.2 → arrayview-0.30.0}/.vscode/settings.json +0 -0
  158. {arrayview-0.29.2 → arrayview-0.30.0}/AGENTS.md +0 -0
  159. {arrayview-0.29.2 → arrayview-0.30.0}/CONTRIBUTING.md +0 -0
  160. {arrayview-0.29.2 → arrayview-0.30.0}/DESIGN.md +0 -0
  161. {arrayview-0.29.2 → arrayview-0.30.0}/LICENSE +0 -0
  162. {arrayview-0.29.2 → arrayview-0.30.0}/README.md +0 -0
  163. {arrayview-0.29.2 → arrayview-0.30.0}/docs/display.md +0 -0
  164. {arrayview-0.29.2 → arrayview-0.30.0}/docs/lifecycle.md +0 -0
  165. {arrayview-0.29.2 → arrayview-0.30.0}/docs/logo.png +0 -0
  166. {arrayview-0.29.2 → arrayview-0.30.0}/docs/measurement.md +0 -0
  167. {arrayview-0.29.2 → arrayview-0.30.0}/docs/stylesheets/extra.css +0 -0
  168. {arrayview-0.29.2 → arrayview-0.30.0}/docs/viewing.md +0 -0
  169. {arrayview-0.29.2 → arrayview-0.30.0}/docs/vscode-window-routing-plan.md +0 -0
  170. {arrayview-0.29.2 → arrayview-0.30.0}/experiments/ws_tunnel_diag/ws_tunnel_diag.py +0 -0
  171. {arrayview-0.29.2 → arrayview-0.30.0}/matlab/arrayview.m +0 -0
  172. {arrayview-0.29.2 → arrayview-0.30.0}/mkdocs.yml +0 -0
  173. {arrayview-0.29.2 → arrayview-0.30.0}/plans/2026-04-14-immersive-animation.md +0 -0
  174. {arrayview-0.29.2 → arrayview-0.30.0}/plans/2026-05-07-unified-colormap-picker.md +0 -0
  175. {arrayview-0.29.2 → arrayview-0.30.0}/plans/arrayview_tool_menu_fix_prompt.md +0 -0
  176. {arrayview-0.29.2 → arrayview-0.30.0}/plans/arrayview_tool_menu_implementation_plan.md +0 -0
  177. {arrayview-0.29.2 → arrayview-0.30.0}/plans/egg-placement-mockup.html +0 -0
  178. {arrayview-0.29.2 → arrayview-0.30.0}/plans/refactoring_plan.md +0 -0
  179. {arrayview-0.29.2 → arrayview-0.30.0}/plans/roi-analysis-requirements.md +0 -0
  180. {arrayview-0.29.2 → arrayview-0.30.0}/plans/webview/LOG.md +0 -0
  181. {arrayview-0.29.2 → arrayview-0.30.0}/scripts/demo.py +0 -0
  182. {arrayview-0.29.2 → arrayview-0.30.0}/scripts/release.sh +0 -0
  183. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/ARCHITECTURE.md +0 -0
  184. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/__main__.py +0 -0
  185. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_app.py +0 -0
  186. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_codex_open.py +0 -0
  187. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_config.py +0 -0
  188. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_diff.py +0 -0
  189. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_icon.png +0 -0
  190. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_imaging.py +0 -0
  191. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_lifecycle.py +0 -0
  192. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_overlays.py +0 -0
  193. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_platform.py +0 -0
  194. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_analysis.py +0 -0
  195. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_export.py +0 -0
  196. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_persistence.py +0 -0
  197. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_preload.py +0 -0
  198. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_query.py +0 -0
  199. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_rendering.py +0 -0
  200. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_segmentation.py +0 -0
  201. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_state.py +0 -0
  202. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_vectorfield.py +0 -0
  203. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_segmentation.py +0 -0
  204. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_shell.html +0 -0
  205. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_synthetic_mri.py +0 -0
  206. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_torch.py +0 -0
  207. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_vectorfield.py +0 -0
  208. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_vscode.py +0 -0
  209. {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/gsap.min.js +0 -0
  210. {arrayview-0.29.2 → arrayview-0.30.0}/tests/capture_v_animation.py +0 -0
  211. {arrayview-0.29.2 → arrayview-0.30.0}/tests/conftest.py +0 -0
  212. {arrayview-0.29.2 → arrayview-0.30.0}/tests/make_vectorfield_test_arrays.py +0 -0
  213. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_backend_shared.py +0 -0
  214. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_browser.py +0 -0
  215. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_colorbar_hover_highlight.py +0 -0
  216. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_command_reachability.py +0 -0
  217. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_config.py +0 -0
  218. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_cross_mode_parametrized.py +0 -0
  219. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_interactions.py +0 -0
  220. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_io.py +0 -0
  221. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_large_arrays.py +0 -0
  222. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_loading_server.py +0 -0
  223. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_mode_consistency.py +0 -0
  224. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_mode_matrix.py +0 -0
  225. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_mode_roundtrip.py +0 -0
  226. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_nifti_meta.py +0 -0
  227. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_rgb_pixel_art.py +0 -0
  228. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_torch.py +0 -0
  229. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_view_component_integration.py +0 -0
  230. {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_view_component_unit.py +0 -0
  231. {arrayview-0.29.2 → arrayview-0.30.0}/tests/ui_audit.py +0 -0
  232. {arrayview-0.29.2 → arrayview-0.30.0}/tests/v_anim_frames/.gitkeep +0 -0
  233. {arrayview-0.29.2 → arrayview-0.30.0}/tests/visual_smoke.py +0 -0
  234. {arrayview-0.29.2 → arrayview-0.30.0}/vscode-extension/AGENTS.md +0 -0
  235. {arrayview-0.29.2 → arrayview-0.30.0}/vscode-extension/LICENSE +0 -0
@@ -0,0 +1,62 @@
1
+ name: Launch contracts
2
+
3
+ on:
4
+ pull_request:
5
+ paths:
6
+ - src/arrayview/**
7
+ - tests/**
8
+ - vscode-extension/**
9
+ - pyproject.toml
10
+ - uv.lock
11
+ - .github/workflows/launch-contracts.yml
12
+ push:
13
+ branches: [main]
14
+ paths:
15
+ - src/arrayview/**
16
+ - tests/**
17
+ - vscode-extension/**
18
+ - pyproject.toml
19
+ - uv.lock
20
+ - .github/workflows/launch-contracts.yml
21
+
22
+ permissions:
23
+ contents: read
24
+
25
+ jobs:
26
+ planner-and-lifecycle:
27
+ strategy:
28
+ fail-fast: false
29
+ matrix:
30
+ os: [ubuntu-latest, macos-latest, windows-latest]
31
+ runs-on: ${{ matrix.os }}
32
+ steps:
33
+ - uses: actions/checkout@v4
34
+ - uses: actions/setup-python@v5
35
+ with:
36
+ python-version: "3.12"
37
+ - uses: astral-sh/setup-uv@v6
38
+ - uses: actions/setup-node@v4
39
+ with:
40
+ node-version: "22"
41
+ - run: uv sync --frozen --group dev --group test
42
+ - name: Python launch contracts
43
+ run: >-
44
+ uv run pytest
45
+ tests/test_launch_plan.py
46
+ tests/test_launch_diagnostics.py
47
+ tests/test_invocation_contract_matrix.py
48
+ tests/test_instance_registry.py
49
+ tests/test_server_identity_status.py
50
+ tests/test_safe_server_stop.py
51
+ tests/test_view_handle_lifecycle.py
52
+ tests/test_view_launch_execution.py
53
+ tests/test_vscode_ack_protocol.py
54
+ tests/test_display_opener_results.py
55
+ tests/test_doctor_commands.py
56
+ tests/test_cli.py
57
+ tests/test_lifecycle_contract.py
58
+ -q
59
+ - name: VS Code extension contracts
60
+ run: node vscode-extension/test_lifecycle_helpers.js
61
+ - name: VS Code extension syntax
62
+ run: node --check vscode-extension/extension.js
@@ -20,7 +20,7 @@ last_updated: 2026-06-30
20
20
  - Rendering pipeline: colormaps, complex modes, mosaic, RGB/RGBA, projections, overlays
21
21
  - Backend transport: FastAPI HTTP/WebSocket is the single viewer transport; shared helpers keep route modules small for metadata/analysis, compare/diff, overlay compositing, and vector field layout/arrow sampling.
22
22
  - NIfTI spatial metadata, RAS resampling
23
- - NIfTI series: `--stack-nifti DIR` + `--select PATTERN` stacks a directory of same-shape NIfTI files into a lazy 4D/5D array; `view_dir()` Python helper; recursive patient-folder grouping, LRU volume cache, spatial meta from first file
23
+ - Directory collections are header-scanned and lazy by default: compatible files form a dense virtual stack, mixed shapes use a ragged collection, and `--load lazy|eager` plus `--stack-policy auto|dense|ragged` make both choices explicit. Compressed NIfTI volumes use a byte-bounded LRU cache; `view_dir()` exposes the same controls.
24
24
  - VS Code extension v0.14.27 — stable window ID via `EnvironmentVariableCollection`; `arrayview.openInFloatingWindow` setting moves new tabs to a floating window; `view(arr, floating=True)` and `arrayview file.npy --floating` open in a floating window per-call regardless of global setting; remote/tunnel display uses the same forwarded HTTP/WebSocket path as local VS Code; floating mode uses a single persistent shell hub panel (`_shell.html`) so all arrays share one floating window as tabs instead of opening separate windows; second CLI calls inject tabs via `new_tab` postMessage relay (extension -> hub wrapper -> shell iframe)
25
25
  - Colorbar refactor: `ColorBar` JS class partially migrated (in progress)
26
26
  - Colormap picker: `c` opens an expanded colorbar-island grid without changing the colormap; subsequent `c` taps cycle, hover/hjkl/arrows live-preview, Enter/click commits, Esc cancels, and auto-dismiss pauses while hovered
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arrayview
3
- Version: 0.29.2
3
+ Version: 0.30.0
4
4
  Summary: Fast multi-dimensional array viewer
5
5
  Project-URL: Home, https://github.com/oscarvanderheide/arrayview
6
6
  Project-URL: Source, https://github.com/oscarvanderheide/arrayview
@@ -39,6 +39,13 @@ uvx arrayview volume.nii.gz --overlay mask.nii.gz
39
39
 
40
40
  Binary mask (0/1), same spatial shape. `[`/`]` adjusts blend opacity. Multiple overlays get automatic palette colors.
41
41
 
42
+ For cohort review, use `--stack` so image and overlay patterns are paired into
43
+ aligned stacks:
44
+
45
+ ```bash
46
+ uvx arrayview --stack "data/**/*_0000.nii.gz" --overlay "gt=data/**/labels/*.nii.gz"
47
+ ```
48
+
42
49
  ## Vector field
43
50
 
44
51
  ```bash
@@ -46,3 +46,6 @@ Explicit `--window` flag > `ARRAYVIEW_WINDOW` env var > config file > built-in d
46
46
  | `jupyter` | Jupyter / IPython notebook kernel |
47
47
  | `ssh` | SSH session without VS Code |
48
48
  | `julia` | Julia via PythonCall / PyCall |
49
+
50
+ MATLAB uses the detected terminal, VS Code, SSH, or remote route. Local MATLAB
51
+ prefers a native window when available. See [MATLAB and Julia](foreign-hosts.md).
@@ -0,0 +1,104 @@
1
+ # MATLAB and Julia
2
+
3
+ ArrayView uses the Python environment selected by the host application.
4
+
5
+ ## MATLAB
6
+
7
+ Select a Python environment with ArrayView installed, then import and call it:
8
+
9
+ ```matlab
10
+ pyenv(Version="/path/to/python")
11
+ py.importlib.import_module("arrayview");
12
+
13
+ h = py.arrayview.view(A);
14
+ ```
15
+
16
+ Local MATLAB follows the normal display selection and prefers a native window
17
+ when available. MATLAB started through SSH or VS Code follows that environment's
18
+ browser or VS Code route.
19
+
20
+ The array is converted to NumPy before registration. Keep `h` when explicit
21
+ cleanup is needed:
22
+
23
+ ```matlab
24
+ h.close()
25
+ ```
26
+
27
+ ## Julia
28
+
29
+ PythonCall:
30
+
31
+ ```julia
32
+ using PythonCall
33
+
34
+ arrayview = pyimport("arrayview")
35
+ h = arrayview.view(A)
36
+ ```
37
+
38
+ PyCall:
39
+
40
+ ```julia
41
+ using PyCall
42
+
43
+ arrayview = pyimport("arrayview")
44
+ h = arrayview.view(A)
45
+ ```
46
+
47
+ Julia currently supports one array per `view()` call. Call `view()` again for
48
+ another array.
49
+
50
+ ArrayView copies the array to a temporary NumPy file and starts or reuses a
51
+ separate Python server process. This avoids blocking on Julia's Python lock and
52
+ lets the viewer survive after the call returns. The returned value is a Python
53
+ `ViewHandle` wrapper with `url`, `sid`, `port`, `update()`, and `close()`.
54
+
55
+ ```julia
56
+ h.close()
57
+ ```
58
+
59
+ ## IJulia
60
+
61
+ Use the same PythonCall or PyCall code in an IJulia notebook. ArrayView displays
62
+ an inline iframe by default. Inline display is a side effect; the call may return
63
+ `nothing` instead of a handle.
64
+
65
+ ## Display routing
66
+
67
+ | Host | Default display |
68
+ |------|-----------------|
69
+ | Local desktop | Native window when available, otherwise browser |
70
+ | VS Code terminal | VS Code tab |
71
+ | VS Code remote or tunnel | VS Code tab through a forwarded port |
72
+ | Jupyter or IJulia | Inline iframe |
73
+ | Plain SSH | Browser URL through SSH port forwarding |
74
+
75
+ For plain SSH, follow [Remote](remote.md#ssh). VS Code tunnel forwarding is
76
+ handled by the extension.
77
+
78
+ ## Cleanup
79
+
80
+ In Python, close a handle directly or use a context manager:
81
+
82
+ ```python
83
+ handle = arrayview.view(a)
84
+ handle.close()
85
+
86
+ with arrayview.view(a) as handle:
87
+ print(handle.url)
88
+ ```
89
+
90
+ `close()` releases that viewer session. Calling it again is a no-op. If cleanup
91
+ fails, it raises an error and can be retried.
92
+
93
+ ## Advanced server setup
94
+
95
+ Start with `view(A)`. Use a persistent server only for shared or multi-hop
96
+ setups:
97
+
98
+ ```bash
99
+ arrayview --serve
100
+ arrayview data.npy
101
+ ```
102
+
103
+ Use `--relay PORT` only when a reverse SSH tunnel exposes ArrayView on a
104
+ different remote port. See [Remote](remote.md#multi-hop).
@@ -26,6 +26,10 @@ view(np.random.rand(256, 256, 32))
26
26
 
27
27
  Works in scripts, Jupyter notebooks, and VS Code interactive windows.
28
28
 
29
+ MATLAB and Julia setup: [MATLAB and Julia](foreign-hosts.md).
30
+
31
+ Remote and tunnel setup: [Remote](remote.md).
32
+
29
33
  ## Formats
30
34
 
31
35
  `.npy` `.npz` `.nii` `.nii.gz` `.zarr` `.pt` `.h5` `.tif` `.mat`