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