arrayview 0.29.2__tar.gz → 0.31.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 (237) hide show
  1. arrayview-0.31.0/.github/workflows/launch-contracts.yml +62 -0
  2. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/project-state.md +19 -2
  3. {arrayview-0.29.2 → arrayview-0.31.0}/PKG-INFO +1 -1
  4. {arrayview-0.29.2 → arrayview-0.31.0}/docs/comparing.md +8 -1
  5. {arrayview-0.29.2 → arrayview-0.31.0}/docs/configuration.md +3 -0
  6. arrayview-0.31.0/docs/foreign-hosts.md +104 -0
  7. {arrayview-0.29.2 → arrayview-0.31.0}/docs/index.md +4 -0
  8. arrayview-0.31.0/docs/launch-routing-refactor.md +523 -0
  9. {arrayview-0.29.2 → arrayview-0.31.0}/docs/loading.md +74 -2
  10. {arrayview-0.29.2 → arrayview-0.31.0}/docs/remote.md +8 -3
  11. {arrayview-0.29.2 → arrayview-0.31.0}/pyproject.toml +1 -1
  12. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/__init__.py +2 -1
  13. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_analysis.py +12 -0
  14. arrayview-0.31.0/src/arrayview/_instance_registry.py +253 -0
  15. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_io.py +638 -98
  16. arrayview-0.31.0/src/arrayview/_launch_plan.py +524 -0
  17. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_launcher.py +1093 -305
  18. arrayview-0.31.0/src/arrayview/_lifecycle.py +64 -0
  19. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_overlays.py +14 -1
  20. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_render.py +23 -1
  21. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_loading.py +103 -11
  22. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_query.py +13 -1
  23. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_rendering.py +4 -0
  24. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_websocket.py +23 -0
  25. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_server.py +86 -0
  26. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_session.py +15 -2
  27. arrayview-0.31.0/src/arrayview/_session_spec.py +199 -0
  28. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_viewer.html +766 -89
  29. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_vscode_browser.py +124 -11
  30. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_vscode_extension.py +1 -1
  31. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_vscode_signal.py +239 -10
  32. arrayview-0.31.0/src/arrayview/arrayview-opener.vsix +0 -0
  33. {arrayview-0.29.2 → arrayview-0.31.0}/tests/lifecycle_matrix.py +13 -2
  34. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_api.py +292 -1
  35. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_backend_shared.py +57 -0
  36. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_browser.py +152 -4
  37. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_cli.py +216 -2
  38. arrayview-0.31.0/tests/test_display_opener_results.py +126 -0
  39. arrayview-0.31.0/tests/test_doctor_commands.py +87 -0
  40. arrayview-0.31.0/tests/test_instance_registry.py +181 -0
  41. arrayview-0.31.0/tests/test_invocation_contract_matrix.py +224 -0
  42. arrayview-0.31.0/tests/test_launch_diagnostics.py +44 -0
  43. arrayview-0.31.0/tests/test_launch_plan.py +534 -0
  44. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_lifecycle_contract.py +62 -21
  45. arrayview-0.31.0/tests/test_nifti_series.py +679 -0
  46. arrayview-0.31.0/tests/test_safe_server_stop.py +175 -0
  47. arrayview-0.31.0/tests/test_server_identity_status.py +81 -0
  48. arrayview-0.31.0/tests/test_session_spec.py +95 -0
  49. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_view_component_integration.py +11 -0
  50. arrayview-0.31.0/tests/test_view_handle_lifecycle.py +87 -0
  51. arrayview-0.31.0/tests/test_view_launch_execution.py +212 -0
  52. arrayview-0.31.0/tests/test_vscode_ack_protocol.py +258 -0
  53. {arrayview-0.29.2 → arrayview-0.31.0}/tests/visual_smoke.py +10 -0
  54. {arrayview-0.29.2 → arrayview-0.31.0}/uv.lock +1 -1
  55. {arrayview-0.29.2 → arrayview-0.31.0}/vscode-extension/extension.js +133 -15
  56. {arrayview-0.29.2 → arrayview-0.31.0}/vscode-extension/lifecycle_helpers.js +47 -0
  57. {arrayview-0.29.2 → arrayview-0.31.0}/vscode-extension/package.json +1 -1
  58. arrayview-0.31.0/vscode-extension/test_lifecycle_helpers.js +99 -0
  59. arrayview-0.29.2/docs/launch-routing-refactor.md +0 -153
  60. arrayview-0.29.2/src/arrayview/_launch_plan.py +0 -281
  61. arrayview-0.29.2/src/arrayview/_lifecycle.py +0 -39
  62. arrayview-0.29.2/src/arrayview/arrayview-opener.vsix +0 -0
  63. arrayview-0.29.2/tests/test_launch_plan.py +0 -235
  64. arrayview-0.29.2/tests/test_nifti_series.py +0 -263
  65. arrayview-0.29.2/vscode-extension/test_lifecycle_helpers.js +0 -47
  66. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/frontend-designer/SKILL.md +0 -0
  67. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/invocation-consistency/SKILL.md +0 -0
  68. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/modes-consistency/SKILL.md +0 -0
  69. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/SKILL.md +0 -0
  70. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/element-attributes.md +0 -0
  71. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/playwright-tests.md +0 -0
  72. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/request-mocking.md +0 -0
  73. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/running-code.md +0 -0
  74. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/session-management.md +0 -0
  75. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/storage-state.md +0 -0
  76. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/test-generation.md +0 -0
  77. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/tracing.md +0 -0
  78. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/video-recording.md +0 -0
  79. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/todo-workflow/SKILL.md +0 -0
  80. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/ui-consistency-audit/SKILL.md +0 -0
  81. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/viewer-ui-checklist/SKILL.md +0 -0
  82. {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/visual-bug-fixing/SKILL.md +0 -0
  83. {arrayview-0.29.2 → arrayview-0.31.0}/.github/copilot-instructions.md +0 -0
  84. {arrayview-0.29.2 → arrayview-0.31.0}/.github/workflows/docs.yml +0 -0
  85. {arrayview-0.29.2 → arrayview-0.31.0}/.github/workflows/python-publish.yml +0 -0
  86. {arrayview-0.29.2 → arrayview-0.31.0}/.gitignore +0 -0
  87. {arrayview-0.29.2 → arrayview-0.31.0}/.ignore +0 -0
  88. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/AGENTS.md +0 -0
  89. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/ROUTER.md +0 -0
  90. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/SETUP.md +0 -0
  91. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/SYNC.md +0 -0
  92. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/architecture.md +0 -0
  93. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/conventions.md +0 -0
  94. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/decisions.md +0 -0
  95. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/frontend.md +0 -0
  96. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/lifecycle.md +0 -0
  97. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/render-pipeline.md +0 -0
  98. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/setup.md +0 -0
  99. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/stack.md +0 -0
  100. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/INDEX.md +0 -0
  101. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/README.md +0 -0
  102. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/add-file-format.md +0 -0
  103. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/add-server-endpoint.md +0 -0
  104. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/animation-verify.md +0 -0
  105. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/debug-render.md +0 -0
  106. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/debug-vscode-extension-python.md +0 -0
  107. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/extend-compare-mode.md +0 -0
  108. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/extract-server-route-module.md +0 -0
  109. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/frontend-change.md +0 -0
  110. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/setup.sh +0 -0
  111. {arrayview-0.29.2 → arrayview-0.31.0}/.mex/sync.sh +0 -0
  112. {arrayview-0.29.2 → arrayview-0.31.0}/.opencode/opencode.json +0 -0
  113. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T18-46-49-737Z.yml +0 -0
  114. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T18-48-21-979Z.yml +0 -0
  115. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T18-51-35-665Z.yml +0 -0
  116. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-07-01-393Z.yml +0 -0
  117. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-14-37-969Z.yml +0 -0
  118. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-21-30-940Z.yml +0 -0
  119. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-23-08-126Z.yml +0 -0
  120. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-29-33-155Z.yml +0 -0
  121. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-31-25-336Z.yml +0 -0
  122. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-31-53-789Z.yml +0 -0
  123. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-39-12-257Z.yml +0 -0
  124. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-39-16-449Z.yml +0 -0
  125. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T20-15-25-513Z.yml +0 -0
  126. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T20-25-13-179Z.yml +0 -0
  127. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T20-39-01-435Z.yml +0 -0
  128. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-01-27-659Z.yml +0 -0
  129. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-01-41-283Z.yml +0 -0
  130. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-03-00-625Z.yml +0 -0
  131. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-04-12-887Z.yml +0 -0
  132. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-33-39-044Z.yml +0 -0
  133. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-38-01-530Z.yml +0 -0
  134. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-45-20-383Z.yml +0 -0
  135. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-55-11-545Z.yml +0 -0
  136. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-56-03-307Z.yml +0 -0
  137. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-56-35-733Z.yml +0 -0
  138. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-57-12-181Z.yml +0 -0
  139. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-57-37-748Z.yml +0 -0
  140. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-58-13-679Z.yml +0 -0
  141. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T22-37-23-895Z.yml +0 -0
  142. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T00-39-18-637Z.yml +0 -0
  143. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T01-41-46-243Z.yml +0 -0
  144. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T04-31-48-472Z.yml +0 -0
  145. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-14-15-632Z.yml +0 -0
  146. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-14-47-582Z.yml +0 -0
  147. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-16-23-471Z.yml +0 -0
  148. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-17-10-247Z.yml +0 -0
  149. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-18-24-707Z.yml +0 -0
  150. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-20-06-164Z.yml +0 -0
  151. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-20-28-342Z.yml +0 -0
  152. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-21-54-962Z.yml +0 -0
  153. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-22-34-666Z.yml +0 -0
  154. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-23-11-336Z.yml +0 -0
  155. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-23-36-260Z.yml +0 -0
  156. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-24-09-267Z.yml +0 -0
  157. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-24-35-434Z.yml +0 -0
  158. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-25-57-010Z.yml +0 -0
  159. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-34-48-823Z.yml +0 -0
  160. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-46-46-468Z.yml +0 -0
  161. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-48-17-930Z.yml +0 -0
  162. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-49-26-400Z.yml +0 -0
  163. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-50-31-563Z.yml +0 -0
  164. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-56-45-568Z.yml +0 -0
  165. {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/theme-dark.yml +0 -0
  166. {arrayview-0.29.2 → arrayview-0.31.0}/.python-version +0 -0
  167. {arrayview-0.29.2 → arrayview-0.31.0}/.vscode/settings.json +0 -0
  168. {arrayview-0.29.2 → arrayview-0.31.0}/AGENTS.md +0 -0
  169. {arrayview-0.29.2 → arrayview-0.31.0}/CONTRIBUTING.md +0 -0
  170. {arrayview-0.29.2 → arrayview-0.31.0}/DESIGN.md +0 -0
  171. {arrayview-0.29.2 → arrayview-0.31.0}/LICENSE +0 -0
  172. {arrayview-0.29.2 → arrayview-0.31.0}/README.md +0 -0
  173. {arrayview-0.29.2 → arrayview-0.31.0}/docs/display.md +0 -0
  174. {arrayview-0.29.2 → arrayview-0.31.0}/docs/lifecycle.md +0 -0
  175. {arrayview-0.29.2 → arrayview-0.31.0}/docs/logo.png +0 -0
  176. {arrayview-0.29.2 → arrayview-0.31.0}/docs/measurement.md +0 -0
  177. {arrayview-0.29.2 → arrayview-0.31.0}/docs/stylesheets/extra.css +0 -0
  178. {arrayview-0.29.2 → arrayview-0.31.0}/docs/viewing.md +0 -0
  179. {arrayview-0.29.2 → arrayview-0.31.0}/docs/vscode-window-routing-plan.md +0 -0
  180. {arrayview-0.29.2 → arrayview-0.31.0}/experiments/ws_tunnel_diag/ws_tunnel_diag.py +0 -0
  181. {arrayview-0.29.2 → arrayview-0.31.0}/matlab/arrayview.m +0 -0
  182. {arrayview-0.29.2 → arrayview-0.31.0}/mkdocs.yml +0 -0
  183. {arrayview-0.29.2 → arrayview-0.31.0}/plans/2026-04-14-immersive-animation.md +0 -0
  184. {arrayview-0.29.2 → arrayview-0.31.0}/plans/2026-05-07-unified-colormap-picker.md +0 -0
  185. {arrayview-0.29.2 → arrayview-0.31.0}/plans/arrayview_tool_menu_fix_prompt.md +0 -0
  186. {arrayview-0.29.2 → arrayview-0.31.0}/plans/arrayview_tool_menu_implementation_plan.md +0 -0
  187. {arrayview-0.29.2 → arrayview-0.31.0}/plans/egg-placement-mockup.html +0 -0
  188. {arrayview-0.29.2 → arrayview-0.31.0}/plans/refactoring_plan.md +0 -0
  189. {arrayview-0.29.2 → arrayview-0.31.0}/plans/roi-analysis-requirements.md +0 -0
  190. {arrayview-0.29.2 → arrayview-0.31.0}/plans/webview/LOG.md +0 -0
  191. {arrayview-0.29.2 → arrayview-0.31.0}/scripts/demo.py +0 -0
  192. {arrayview-0.29.2 → arrayview-0.31.0}/scripts/release.sh +0 -0
  193. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/ARCHITECTURE.md +0 -0
  194. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/__main__.py +0 -0
  195. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_app.py +0 -0
  196. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_codex_open.py +0 -0
  197. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_config.py +0 -0
  198. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_diff.py +0 -0
  199. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_icon.png +0 -0
  200. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_imaging.py +0 -0
  201. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_platform.py +0 -0
  202. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_analysis.py +0 -0
  203. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_export.py +0 -0
  204. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_persistence.py +0 -0
  205. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_preload.py +0 -0
  206. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_segmentation.py +0 -0
  207. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_state.py +0 -0
  208. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_vectorfield.py +0 -0
  209. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_segmentation.py +0 -0
  210. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_shell.html +0 -0
  211. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_synthetic_mri.py +0 -0
  212. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_torch.py +0 -0
  213. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_vectorfield.py +0 -0
  214. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_vscode.py +0 -0
  215. {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/gsap.min.js +0 -0
  216. {arrayview-0.29.2 → arrayview-0.31.0}/tests/capture_v_animation.py +0 -0
  217. {arrayview-0.29.2 → arrayview-0.31.0}/tests/conftest.py +0 -0
  218. {arrayview-0.29.2 → arrayview-0.31.0}/tests/make_vectorfield_test_arrays.py +0 -0
  219. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_colorbar_hover_highlight.py +0 -0
  220. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_command_reachability.py +0 -0
  221. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_config.py +0 -0
  222. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_cross_mode_parametrized.py +0 -0
  223. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_interactions.py +0 -0
  224. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_io.py +0 -0
  225. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_large_arrays.py +0 -0
  226. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_loading_server.py +0 -0
  227. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_mode_consistency.py +0 -0
  228. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_mode_matrix.py +0 -0
  229. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_mode_roundtrip.py +0 -0
  230. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_nifti_meta.py +0 -0
  231. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_rgb_pixel_art.py +0 -0
  232. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_torch.py +0 -0
  233. {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_view_component_unit.py +0 -0
  234. {arrayview-0.29.2 → arrayview-0.31.0}/tests/ui_audit.py +0 -0
  235. {arrayview-0.29.2 → arrayview-0.31.0}/tests/v_anim_frames/.gitkeep +0 -0
  236. {arrayview-0.29.2 → arrayview-0.31.0}/vscode-extension/AGENTS.md +0 -0
  237. {arrayview-0.29.2 → arrayview-0.31.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
@@ -32,8 +32,25 @@ last_updated: 2026-06-30
32
32
  - qMRI map toggle (`_islandToggleQmriMap`) fade animation now covers dimbar and array-name in addition to panes and colorbars
33
33
  - Segmentation menu shares the ROI layout (yellow accent, magnifier action icon, common `#export-overlay` modal). Pre-activation shows a pulsing "nnInteractive · connecting" row that morphs into the normal shape toolbar once `/seg/activate` resolves
34
34
  - Overlays are a plugin tile (`OV`): per-overlay row with colour swatch, editable label, eye toggle, × delete; shared opacity slider; `+ add overlay` opens a filesystem picker rooted at the launched file's directory
35
+ - The floating overlay HUD is reconciled as soon as startup loading ends, so it
36
+ is visible on first load and `/ o` toggles it correctly from the first press.
37
+ Its drag grip allows viewport-clamped repositioning that survives mode and
38
+ layout reconciliation for the current viewer session. Hovering a visible row
39
+ focuses that mask and dims the other visible overlays across normal, compare,
40
+ multiview, and qMRI render paths. The HUD and overlay drawer can switch masks
41
+ between filled regions and outline-only contours.
35
42
  - Vector field is a plugin tile (`VF`): row with visibility toggle + density/length sliders bi-directionally wired to the `[ ] { }` keyboard commands
36
- - CLI `--overlay FILE` can be repeated to load multiple overlays at launch
43
+ - CLI `--overlay FILE` can be repeated to load multiple overlays at launch;
44
+ unnamed overlays use the filename stem and `NAME=FILE` supplies an explicit
45
+ HUD label.
46
+ - Stack collections support `--overlay-dir PATTERN` to discover per-case mask
47
+ filenames as sparse overlay roles; missing masks render as empty and common
48
+ patient/modality directory layouts pair automatically. `--case-regex` remains
49
+ an override for unusual layouts. CLI header scans show an in-place file counter
50
+ and elapsed time on interactive terminals.
51
+ - Reused collection sessions are protected by per-tab leases, including their
52
+ overlay sessions, and VS Code opener readiness now verifies the requested
53
+ session metadata before acknowledging `backend_ready`.
37
54
  - Filesystem picker endpoint (`GET /fs/list`) clamped to `$HOME`. Accepts `base_sid` + `mode` (`overlay` | `vectorfield`) to filter entries by a cheap header-shape peek (`.npy`, `.nii`/`.nii.gz`, `.h5`, `.zarr`); overlay mode requires identical shape, vectorfield mode requires base shape plus one axis of size 3
38
55
  - Island collapse affordance: inline `~` at the island's top-right animates the panel into the bottom-left `~` hint circle; external `~` hint only visible while the island is actually collapsed. New `/` hint circle at bottom-right opens the tool menu
39
56
  - Compare center tool menu: `/` now re-opens the last-used compare center mode from the tool menu, while compare pane header buttons select diff / overlay / wipe directly. Eligible two-array compare layouts can switch into a big-left arrangement with a wider center pane, and the diff colorbar now matches that center-pane width.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arrayview
3
- Version: 0.29.2
3
+ Version: 0.31.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
@@ -37,7 +37,14 @@ Or use the file picker (`Cmd/Ctrl+O`) or drag-and-drop.
37
37
  uvx arrayview volume.nii.gz --overlay mask.nii.gz
38
38
  ```
39
39
 
40
- Binary mask (0/1), same spatial shape. `[`/`]` adjusts blend opacity. Multiple overlays get automatic palette colors.
40
+ Binary mask (0/1), same spatial shape. `[`/`]` adjusts blend opacity. Multiple overlays get automatic palette colors. Hover an overlay HUD row to focus that mask while dimming the others. Use the overlay HUD or `/ o` to switch between filled masks and outline-only contours.
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
+ ```
41
48
 
42
49
  ## Vector field
43
50
 
@@ -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`