arrayview 0.28.0__tar.gz → 0.29.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.
- {arrayview-0.28.0 → arrayview-0.29.0}/PKG-INFO +1 -1
- {arrayview-0.28.0 → arrayview-0.29.0}/pyproject.toml +1 -1
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_analysis.py +8 -2
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_launcher.py +7 -5
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_analysis.py +2 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_viewer.html +1790 -448
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_vscode_extension.py +1 -1
- arrayview-0.29.0/src/arrayview/arrayview-opener.vsix +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_api.py +21 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_browser.py +14 -13
- arrayview-0.29.0/tests/test_view_component_integration.py +1613 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/uv.lock +1 -1
- {arrayview-0.28.0 → arrayview-0.29.0}/vscode-extension/extension.js +120 -57
- {arrayview-0.28.0 → arrayview-0.29.0}/vscode-extension/package.json +1 -1
- arrayview-0.28.0/src/arrayview/arrayview-opener.vsix +0 -0
- arrayview-0.28.0/tests/test_view_component_integration.py +0 -730
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/frontend-designer/SKILL.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/invocation-consistency/SKILL.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/modes-consistency/SKILL.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/SKILL.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/element-attributes.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/playwright-tests.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/request-mocking.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/running-code.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/session-management.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/storage-state.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/test-generation.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/tracing.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/playwright-cli/references/video-recording.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/todo-workflow/SKILL.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/ui-consistency-audit/SKILL.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/viewer-ui-checklist/SKILL.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.agents/skills/visual-bug-fixing/SKILL.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.github/copilot-instructions.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.github/workflows/docs.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.github/workflows/python-publish.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.gitignore +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.ignore +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/AGENTS.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/ROUTER.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/SETUP.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/SYNC.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/architecture.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/conventions.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/decisions.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/frontend.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/lifecycle.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/project-state.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/render-pipeline.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/setup.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/context/stack.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/INDEX.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/README.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/add-file-format.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/add-server-endpoint.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/animation-verify.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/debug-render.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/debug-vscode-extension-python.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/extend-compare-mode.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/extract-server-route-module.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/patterns/frontend-change.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/setup.sh +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.mex/sync.sh +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.opencode/opencode.json +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T18-46-49-737Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T18-48-21-979Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T18-51-35-665Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-07-01-393Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-14-37-969Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-21-30-940Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-23-08-126Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-29-33-155Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-31-25-336Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-31-53-789Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-39-12-257Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T19-39-16-449Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T20-15-25-513Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T20-25-13-179Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T20-39-01-435Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-01-27-659Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-01-41-283Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-03-00-625Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-04-12-887Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-33-39-044Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-38-01-530Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-45-20-383Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-55-11-545Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-56-03-307Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-56-35-733Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-57-12-181Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-57-37-748Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T21-58-13-679Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-06T22-37-23-895Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T00-39-18-637Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T01-41-46-243Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T04-31-48-472Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-14-15-632Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-14-47-582Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-16-23-471Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-17-10-247Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-18-24-707Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-20-06-164Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-20-28-342Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-21-54-962Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-22-34-666Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-23-11-336Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-23-36-260Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-24-09-267Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-24-35-434Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-25-57-010Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-34-48-823Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-46-46-468Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-48-17-930Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-49-26-400Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-50-31-563Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/page-2026-05-07T12-56-45-568Z.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.playwright-cli/theme-dark.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.python-version +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/.vscode/settings.json +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/AGENTS.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/CONTRIBUTING.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/DESIGN.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/LICENSE +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/README.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/docs/comparing.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/docs/configuration.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/docs/display.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/docs/index.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/docs/launch-routing-refactor.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/docs/lifecycle.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/docs/loading.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/docs/logo.png +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/docs/measurement.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/docs/remote.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/docs/stylesheets/extra.css +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/docs/viewing.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/experiments/ws_tunnel_diag/ws_tunnel_diag.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/matlab/arrayview.m +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/mkdocs.yml +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/plans/2026-04-14-immersive-animation.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/plans/2026-05-07-unified-colormap-picker.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/plans/arrayview_tool_menu_fix_prompt.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/plans/arrayview_tool_menu_implementation_plan.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/plans/egg-placement-mockup.html +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/plans/refactoring_plan.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/plans/roi-analysis-requirements.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/plans/webview/LOG.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/scripts/demo.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/scripts/release.sh +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/ARCHITECTURE.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/__init__.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/__main__.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_app.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_codex_open.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_config.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_diff.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_icon.png +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_imaging.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_io.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_launch_plan.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_lifecycle.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_overlays.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_platform.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_render.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_export.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_loading.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_persistence.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_preload.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_query.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_rendering.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_segmentation.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_state.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_vectorfield.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_routes_websocket.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_segmentation.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_server.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_session.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_shell.html +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_synthetic_mri.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_torch.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_vectorfield.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_vscode.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_vscode_browser.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/_vscode_signal.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/src/arrayview/gsap.min.js +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/capture_v_animation.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/conftest.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/lifecycle_matrix.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/make_vectorfield_test_arrays.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_backend_shared.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_cli.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_colorbar_hover_highlight.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_command_reachability.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_config.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_cross_mode_parametrized.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_interactions.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_io.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_large_arrays.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_launch_plan.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_lifecycle_contract.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_loading_server.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_mode_consistency.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_mode_matrix.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_mode_roundtrip.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_nifti_meta.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_nifti_series.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_rgb_pixel_art.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_torch.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/test_view_component_unit.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/ui_audit.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/v_anim_frames/.gitkeep +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/tests/visual_smoke.py +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/vscode-extension/AGENTS.md +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/vscode-extension/LICENSE +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/vscode-extension/lifecycle_helpers.js +0 -0
- {arrayview-0.28.0 → arrayview-0.29.0}/vscode-extension/test_lifecycle_helpers.js +0 -0
|
@@ -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(
|
|
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
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
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}")
|