arrayview 0.28.1__tar.gz → 0.29.1__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 (217) hide show
  1. {arrayview-0.28.1 → arrayview-0.29.1}/PKG-INFO +1 -1
  2. arrayview-0.29.1/docs/vscode-window-routing-plan.md +37 -0
  3. {arrayview-0.28.1 → arrayview-0.29.1}/pyproject.toml +1 -1
  4. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_analysis.py +8 -2
  5. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_launcher.py +7 -5
  6. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_routes_analysis.py +2 -0
  7. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_viewer.html +1748 -430
  8. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_vscode_extension.py +1 -1
  9. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_vscode_signal.py +49 -86
  10. arrayview-0.29.1/src/arrayview/arrayview-opener.vsix +0 -0
  11. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_api.py +21 -0
  12. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_browser.py +14 -13
  13. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_lifecycle_contract.py +117 -0
  14. arrayview-0.29.1/tests/test_view_component_integration.py +1613 -0
  15. {arrayview-0.28.1 → arrayview-0.29.1}/uv.lock +1 -1
  16. {arrayview-0.28.1 → arrayview-0.29.1}/vscode-extension/extension.js +42 -17
  17. {arrayview-0.28.1 → arrayview-0.29.1}/vscode-extension/package.json +1 -1
  18. arrayview-0.28.1/src/arrayview/arrayview-opener.vsix +0 -0
  19. arrayview-0.28.1/tests/test_view_component_integration.py +0 -730
  20. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/frontend-designer/SKILL.md +0 -0
  21. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/invocation-consistency/SKILL.md +0 -0
  22. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/modes-consistency/SKILL.md +0 -0
  23. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/playwright-cli/SKILL.md +0 -0
  24. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/playwright-cli/references/element-attributes.md +0 -0
  25. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/playwright-cli/references/playwright-tests.md +0 -0
  26. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/playwright-cli/references/request-mocking.md +0 -0
  27. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/playwright-cli/references/running-code.md +0 -0
  28. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/playwright-cli/references/session-management.md +0 -0
  29. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/playwright-cli/references/storage-state.md +0 -0
  30. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/playwright-cli/references/test-generation.md +0 -0
  31. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/playwright-cli/references/tracing.md +0 -0
  32. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/playwright-cli/references/video-recording.md +0 -0
  33. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/todo-workflow/SKILL.md +0 -0
  34. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/ui-consistency-audit/SKILL.md +0 -0
  35. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/viewer-ui-checklist/SKILL.md +0 -0
  36. {arrayview-0.28.1 → arrayview-0.29.1}/.agents/skills/visual-bug-fixing/SKILL.md +0 -0
  37. {arrayview-0.28.1 → arrayview-0.29.1}/.github/copilot-instructions.md +0 -0
  38. {arrayview-0.28.1 → arrayview-0.29.1}/.github/workflows/docs.yml +0 -0
  39. {arrayview-0.28.1 → arrayview-0.29.1}/.github/workflows/python-publish.yml +0 -0
  40. {arrayview-0.28.1 → arrayview-0.29.1}/.gitignore +0 -0
  41. {arrayview-0.28.1 → arrayview-0.29.1}/.ignore +0 -0
  42. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/AGENTS.md +0 -0
  43. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/ROUTER.md +0 -0
  44. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/SETUP.md +0 -0
  45. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/SYNC.md +0 -0
  46. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/context/architecture.md +0 -0
  47. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/context/conventions.md +0 -0
  48. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/context/decisions.md +0 -0
  49. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/context/frontend.md +0 -0
  50. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/context/lifecycle.md +0 -0
  51. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/context/project-state.md +0 -0
  52. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/context/render-pipeline.md +0 -0
  53. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/context/setup.md +0 -0
  54. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/context/stack.md +0 -0
  55. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/patterns/INDEX.md +0 -0
  56. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/patterns/README.md +0 -0
  57. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/patterns/add-file-format.md +0 -0
  58. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/patterns/add-server-endpoint.md +0 -0
  59. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/patterns/animation-verify.md +0 -0
  60. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/patterns/debug-render.md +0 -0
  61. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/patterns/debug-vscode-extension-python.md +0 -0
  62. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/patterns/extend-compare-mode.md +0 -0
  63. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/patterns/extract-server-route-module.md +0 -0
  64. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/patterns/frontend-change.md +0 -0
  65. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/setup.sh +0 -0
  66. {arrayview-0.28.1 → arrayview-0.29.1}/.mex/sync.sh +0 -0
  67. {arrayview-0.28.1 → arrayview-0.29.1}/.opencode/opencode.json +0 -0
  68. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T18-46-49-737Z.yml +0 -0
  69. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T18-48-21-979Z.yml +0 -0
  70. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T18-51-35-665Z.yml +0 -0
  71. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T19-07-01-393Z.yml +0 -0
  72. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T19-14-37-969Z.yml +0 -0
  73. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T19-21-30-940Z.yml +0 -0
  74. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T19-23-08-126Z.yml +0 -0
  75. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T19-29-33-155Z.yml +0 -0
  76. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T19-31-25-336Z.yml +0 -0
  77. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T19-31-53-789Z.yml +0 -0
  78. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T19-39-12-257Z.yml +0 -0
  79. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T19-39-16-449Z.yml +0 -0
  80. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T20-15-25-513Z.yml +0 -0
  81. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T20-25-13-179Z.yml +0 -0
  82. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T20-39-01-435Z.yml +0 -0
  83. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-01-27-659Z.yml +0 -0
  84. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-01-41-283Z.yml +0 -0
  85. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-03-00-625Z.yml +0 -0
  86. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-04-12-887Z.yml +0 -0
  87. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-33-39-044Z.yml +0 -0
  88. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-38-01-530Z.yml +0 -0
  89. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-45-20-383Z.yml +0 -0
  90. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-55-11-545Z.yml +0 -0
  91. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-56-03-307Z.yml +0 -0
  92. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-56-35-733Z.yml +0 -0
  93. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-57-12-181Z.yml +0 -0
  94. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-57-37-748Z.yml +0 -0
  95. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T21-58-13-679Z.yml +0 -0
  96. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-06T22-37-23-895Z.yml +0 -0
  97. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T00-39-18-637Z.yml +0 -0
  98. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T01-41-46-243Z.yml +0 -0
  99. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T04-31-48-472Z.yml +0 -0
  100. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-14-15-632Z.yml +0 -0
  101. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-14-47-582Z.yml +0 -0
  102. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-16-23-471Z.yml +0 -0
  103. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-17-10-247Z.yml +0 -0
  104. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-18-24-707Z.yml +0 -0
  105. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-20-06-164Z.yml +0 -0
  106. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-20-28-342Z.yml +0 -0
  107. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-21-54-962Z.yml +0 -0
  108. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-22-34-666Z.yml +0 -0
  109. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-23-11-336Z.yml +0 -0
  110. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-23-36-260Z.yml +0 -0
  111. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-24-09-267Z.yml +0 -0
  112. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-24-35-434Z.yml +0 -0
  113. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-25-57-010Z.yml +0 -0
  114. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-34-48-823Z.yml +0 -0
  115. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-46-46-468Z.yml +0 -0
  116. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-48-17-930Z.yml +0 -0
  117. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-49-26-400Z.yml +0 -0
  118. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-50-31-563Z.yml +0 -0
  119. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/page-2026-05-07T12-56-45-568Z.yml +0 -0
  120. {arrayview-0.28.1 → arrayview-0.29.1}/.playwright-cli/theme-dark.yml +0 -0
  121. {arrayview-0.28.1 → arrayview-0.29.1}/.python-version +0 -0
  122. {arrayview-0.28.1 → arrayview-0.29.1}/.vscode/settings.json +0 -0
  123. {arrayview-0.28.1 → arrayview-0.29.1}/AGENTS.md +0 -0
  124. {arrayview-0.28.1 → arrayview-0.29.1}/CONTRIBUTING.md +0 -0
  125. {arrayview-0.28.1 → arrayview-0.29.1}/DESIGN.md +0 -0
  126. {arrayview-0.28.1 → arrayview-0.29.1}/LICENSE +0 -0
  127. {arrayview-0.28.1 → arrayview-0.29.1}/README.md +0 -0
  128. {arrayview-0.28.1 → arrayview-0.29.1}/docs/comparing.md +0 -0
  129. {arrayview-0.28.1 → arrayview-0.29.1}/docs/configuration.md +0 -0
  130. {arrayview-0.28.1 → arrayview-0.29.1}/docs/display.md +0 -0
  131. {arrayview-0.28.1 → arrayview-0.29.1}/docs/index.md +0 -0
  132. {arrayview-0.28.1 → arrayview-0.29.1}/docs/launch-routing-refactor.md +0 -0
  133. {arrayview-0.28.1 → arrayview-0.29.1}/docs/lifecycle.md +0 -0
  134. {arrayview-0.28.1 → arrayview-0.29.1}/docs/loading.md +0 -0
  135. {arrayview-0.28.1 → arrayview-0.29.1}/docs/logo.png +0 -0
  136. {arrayview-0.28.1 → arrayview-0.29.1}/docs/measurement.md +0 -0
  137. {arrayview-0.28.1 → arrayview-0.29.1}/docs/remote.md +0 -0
  138. {arrayview-0.28.1 → arrayview-0.29.1}/docs/stylesheets/extra.css +0 -0
  139. {arrayview-0.28.1 → arrayview-0.29.1}/docs/viewing.md +0 -0
  140. {arrayview-0.28.1 → arrayview-0.29.1}/experiments/ws_tunnel_diag/ws_tunnel_diag.py +0 -0
  141. {arrayview-0.28.1 → arrayview-0.29.1}/matlab/arrayview.m +0 -0
  142. {arrayview-0.28.1 → arrayview-0.29.1}/mkdocs.yml +0 -0
  143. {arrayview-0.28.1 → arrayview-0.29.1}/plans/2026-04-14-immersive-animation.md +0 -0
  144. {arrayview-0.28.1 → arrayview-0.29.1}/plans/2026-05-07-unified-colormap-picker.md +0 -0
  145. {arrayview-0.28.1 → arrayview-0.29.1}/plans/arrayview_tool_menu_fix_prompt.md +0 -0
  146. {arrayview-0.28.1 → arrayview-0.29.1}/plans/arrayview_tool_menu_implementation_plan.md +0 -0
  147. {arrayview-0.28.1 → arrayview-0.29.1}/plans/egg-placement-mockup.html +0 -0
  148. {arrayview-0.28.1 → arrayview-0.29.1}/plans/refactoring_plan.md +0 -0
  149. {arrayview-0.28.1 → arrayview-0.29.1}/plans/roi-analysis-requirements.md +0 -0
  150. {arrayview-0.28.1 → arrayview-0.29.1}/plans/webview/LOG.md +0 -0
  151. {arrayview-0.28.1 → arrayview-0.29.1}/scripts/demo.py +0 -0
  152. {arrayview-0.28.1 → arrayview-0.29.1}/scripts/release.sh +0 -0
  153. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/ARCHITECTURE.md +0 -0
  154. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/__init__.py +0 -0
  155. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/__main__.py +0 -0
  156. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_app.py +0 -0
  157. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_codex_open.py +0 -0
  158. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_config.py +0 -0
  159. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_diff.py +0 -0
  160. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_icon.png +0 -0
  161. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_imaging.py +0 -0
  162. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_io.py +0 -0
  163. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_launch_plan.py +0 -0
  164. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_lifecycle.py +0 -0
  165. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_overlays.py +0 -0
  166. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_platform.py +0 -0
  167. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_render.py +0 -0
  168. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_routes_export.py +0 -0
  169. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_routes_loading.py +0 -0
  170. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_routes_persistence.py +0 -0
  171. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_routes_preload.py +0 -0
  172. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_routes_query.py +0 -0
  173. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_routes_rendering.py +0 -0
  174. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_routes_segmentation.py +0 -0
  175. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_routes_state.py +0 -0
  176. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_routes_vectorfield.py +0 -0
  177. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_routes_websocket.py +0 -0
  178. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_segmentation.py +0 -0
  179. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_server.py +0 -0
  180. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_session.py +0 -0
  181. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_shell.html +0 -0
  182. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_synthetic_mri.py +0 -0
  183. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_torch.py +0 -0
  184. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_vectorfield.py +0 -0
  185. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_vscode.py +0 -0
  186. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/_vscode_browser.py +0 -0
  187. {arrayview-0.28.1 → arrayview-0.29.1}/src/arrayview/gsap.min.js +0 -0
  188. {arrayview-0.28.1 → arrayview-0.29.1}/tests/capture_v_animation.py +0 -0
  189. {arrayview-0.28.1 → arrayview-0.29.1}/tests/conftest.py +0 -0
  190. {arrayview-0.28.1 → arrayview-0.29.1}/tests/lifecycle_matrix.py +0 -0
  191. {arrayview-0.28.1 → arrayview-0.29.1}/tests/make_vectorfield_test_arrays.py +0 -0
  192. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_backend_shared.py +0 -0
  193. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_cli.py +0 -0
  194. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_colorbar_hover_highlight.py +0 -0
  195. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_command_reachability.py +0 -0
  196. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_config.py +0 -0
  197. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_cross_mode_parametrized.py +0 -0
  198. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_interactions.py +0 -0
  199. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_io.py +0 -0
  200. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_large_arrays.py +0 -0
  201. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_launch_plan.py +0 -0
  202. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_loading_server.py +0 -0
  203. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_mode_consistency.py +0 -0
  204. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_mode_matrix.py +0 -0
  205. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_mode_roundtrip.py +0 -0
  206. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_nifti_meta.py +0 -0
  207. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_nifti_series.py +0 -0
  208. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_rgb_pixel_art.py +0 -0
  209. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_torch.py +0 -0
  210. {arrayview-0.28.1 → arrayview-0.29.1}/tests/test_view_component_unit.py +0 -0
  211. {arrayview-0.28.1 → arrayview-0.29.1}/tests/ui_audit.py +0 -0
  212. {arrayview-0.28.1 → arrayview-0.29.1}/tests/v_anim_frames/.gitkeep +0 -0
  213. {arrayview-0.28.1 → arrayview-0.29.1}/tests/visual_smoke.py +0 -0
  214. {arrayview-0.28.1 → arrayview-0.29.1}/vscode-extension/AGENTS.md +0 -0
  215. {arrayview-0.28.1 → arrayview-0.29.1}/vscode-extension/LICENSE +0 -0
  216. {arrayview-0.28.1 → arrayview-0.29.1}/vscode-extension/lifecycle_helpers.js +0 -0
  217. {arrayview-0.28.1 → arrayview-0.29.1}/vscode-extension/test_lifecycle_helpers.js +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arrayview
3
- Version: 0.28.1
3
+ Version: 0.29.1
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
@@ -0,0 +1,37 @@
1
+ # VS Code Window Routing Plan
2
+
3
+ ## Problem
4
+
5
+ ArrayView can open the viewer tab in the wrong VS Code window when multiple
6
+ local windows and multiple remote/tunnel windows are active. The unsafe cases
7
+ are the ones where Python cannot prove the originating window and falls back to
8
+ writing multiple signal files or a shared signal file.
9
+
10
+ ## Contract
11
+
12
+ - An exact `ARRAYVIEW_WINDOW_ID` wins when its registration exists.
13
+ - A missing or stale `ARRAYVIEW_WINDOW_ID` with multiple active registrations
14
+ fails closed with a diagnostic.
15
+ - PID ancestry and IPC hook matching are allowed only when they identify a
16
+ single window.
17
+ - tmux client fallback is allowed only when all attached clients for the current
18
+ tmux session report the same `ARRAYVIEW_WINDOW_ID`.
19
+ - File-explorer opens launched by the extension keep using the extension's own
20
+ `ARRAYVIEW_WINDOW_ID`.
21
+
22
+ ## Implementation Slice
23
+
24
+ - Tighten `src/arrayview/_vscode_signal.py` window selection.
25
+ - Add focused lifecycle tests for local ambiguity, stale exact IDs, exact-ID
26
+ ownership, and tmux multi-client ambiguity.
27
+ - Avoid changing `_app.py` or the viewer frontend.
28
+
29
+ ## Manual Verification Targets
30
+
31
+ - Local VS Code terminal, one window: opens in that window.
32
+ - Local VS Code terminal, several windows: stale/missing exact ID prints a
33
+ diagnostic instead of opening elsewhere.
34
+ - Remote/tunnel terminal, several windows: exact ID opens the matching window;
35
+ stale/missing ID fails closed.
36
+ - File explorer custom editor: spawned Python receives the extension window ID
37
+ and opens back into the same window.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "arrayview"
7
- version = "0.28.1"
7
+ version = "0.29.1"
8
8
  description = "Fast multi-dimensional array viewer"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.12"
@@ -67,8 +67,10 @@ def _safe_float(v) -> float | None:
67
67
  return f if np.isfinite(f) else None
68
68
 
69
69
 
70
- def _histogram_payload(finite: np.ndarray, bins: int, log_bins: bool = False) -> dict:
70
+ def _histogram_payload(finite: np.ndarray, bins: int, log_bins: bool = False, exclude_zeros: bool = False) -> dict:
71
71
  """Build a histogram response from finite values."""
72
+ if exclude_zeros:
73
+ finite = finite[finite != 0]
72
74
  if finite.size == 0:
73
75
  return {"counts": [], "edges": [], "vmin": 0.0, "vmax": 1.0}
74
76
  vmin = float(finite.min())
@@ -172,6 +174,7 @@ def _volume_histogram(
172
174
  complex_mode: int = 0,
173
175
  bins: int = 64,
174
176
  qmri_role: str = "",
177
+ exclude_zeros: bool = False,
175
178
  ) -> dict:
176
179
  """Return a sampled volume histogram."""
177
180
  fixed = _parse_fixed_indices(fixed_indices)
@@ -189,6 +192,7 @@ def _volume_histogram(
189
192
  qmri_role,
190
193
  bins,
191
194
  log_bins,
195
+ exclude_zeros,
192
196
  )
193
197
  if not hasattr(session, "_volume_hist_cache"):
194
198
  session._volume_hist_cache = {}
@@ -234,7 +238,9 @@ def _volume_histogram(
234
238
  pixels.append(finite)
235
239
 
236
240
  if pixels:
237
- result = _histogram_payload(np.concatenate(pixels), bins, log_bins=log_bins)
241
+ result = _histogram_payload(
242
+ np.concatenate(pixels), bins, log_bins=log_bins, exclude_zeros=exclude_zeros
243
+ )
238
244
  else:
239
245
  result = {"counts": [], "edges": [], "vmin": 0.0, "vmax": 1.0}
240
246
  session._volume_hist_cache[cache_key] = {
@@ -1616,6 +1616,9 @@ _CLI_DAEMON_CONNECT_TIMEOUT_SECONDS = 20.0
1616
1616
  # closes. Keeping a warm idle daemon around caused native-window sessions to
1617
1617
  # appear orphaned after close.
1618
1618
  _CLI_DAEMON_IDLE_SECONDS = 0.0
1619
+ _PERSIST_DAEMON_IDLE_SECONDS = float(
1620
+ os.environ.get("ARRAYVIEW_PERSIST_IDLE_SECONDS", "1800")
1621
+ )
1619
1622
 
1620
1623
 
1621
1624
  def _join_query_values(values: _CSVValues) -> str:
@@ -2842,11 +2845,10 @@ def _serve_daemon(
2842
2845
  threading.Thread(target=_load, daemon=True).start()
2843
2846
 
2844
2847
  if persist:
2845
- try:
2846
- while True:
2847
- time.sleep(1)
2848
- except KeyboardInterrupt:
2849
- pass
2848
+ _wait_for_viewer_close(
2849
+ idle_seconds=_PERSIST_DAEMON_IDLE_SECONDS,
2850
+ connect_timeout=None,
2851
+ )
2850
2852
  else:
2851
2853
  # Transient CLI launches should stop as soon as the last viewer is
2852
2854
  # really gone, aside from the short grace period inside
@@ -465,6 +465,7 @@ def register_analysis_routes(app, get_session_or_404) -> None:
465
465
  complex_mode: int = 0,
466
466
  bins: int = 64,
467
467
  qmri_role: str = "",
468
+ exclude_zeros: int = 0,
468
469
  session=Depends(get_session_or_404),
469
470
  ):
470
471
  return _volume_histogram(
@@ -477,6 +478,7 @@ def register_analysis_routes(app, get_session_or_404) -> None:
477
478
  complex_mode,
478
479
  bins,
479
480
  qmri_role,
481
+ exclude_zeros=bool(exclude_zeros),
480
482
  )
481
483
 
482
484
  @app.get("/volume_data/{sid}")