arrayview 0.29.2__tar.gz → 0.30.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- arrayview-0.30.0/.github/workflows/launch-contracts.yml +62 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/project-state.md +1 -1
- {arrayview-0.29.2 → arrayview-0.30.0}/PKG-INFO +1 -1
- {arrayview-0.29.2 → arrayview-0.30.0}/docs/comparing.md +7 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/docs/configuration.md +3 -0
- arrayview-0.30.0/docs/foreign-hosts.md +104 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/docs/index.md +4 -0
- arrayview-0.30.0/docs/launch-routing-refactor.md +523 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/docs/loading.md +52 -2
- {arrayview-0.29.2 → arrayview-0.30.0}/docs/remote.md +8 -3
- {arrayview-0.29.2 → arrayview-0.30.0}/pyproject.toml +1 -1
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/__init__.py +2 -1
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_analysis.py +12 -0
- arrayview-0.30.0/src/arrayview/_instance_registry.py +253 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_io.py +469 -98
- arrayview-0.30.0/src/arrayview/_launch_plan.py +524 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_launcher.py +859 -301
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_render.py +2 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_loading.py +95 -10
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_websocket.py +19 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_server.py +85 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_session.py +15 -2
- arrayview-0.30.0/src/arrayview/_session_spec.py +199 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_viewer.html +295 -31
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_vscode_browser.py +124 -11
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_vscode_extension.py +1 -1
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_vscode_signal.py +239 -10
- arrayview-0.30.0/src/arrayview/arrayview-opener.vsix +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/lifecycle_matrix.py +13 -2
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_api.py +127 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_cli.py +55 -2
- arrayview-0.30.0/tests/test_display_opener_results.py +126 -0
- arrayview-0.30.0/tests/test_doctor_commands.py +87 -0
- arrayview-0.30.0/tests/test_instance_registry.py +181 -0
- arrayview-0.30.0/tests/test_invocation_contract_matrix.py +224 -0
- arrayview-0.30.0/tests/test_launch_diagnostics.py +44 -0
- arrayview-0.30.0/tests/test_launch_plan.py +534 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_lifecycle_contract.py +54 -21
- arrayview-0.30.0/tests/test_nifti_series.py +559 -0
- arrayview-0.30.0/tests/test_safe_server_stop.py +175 -0
- arrayview-0.30.0/tests/test_server_identity_status.py +81 -0
- arrayview-0.30.0/tests/test_session_spec.py +95 -0
- arrayview-0.30.0/tests/test_view_handle_lifecycle.py +87 -0
- arrayview-0.30.0/tests/test_view_launch_execution.py +212 -0
- arrayview-0.30.0/tests/test_vscode_ack_protocol.py +258 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/uv.lock +1 -1
- {arrayview-0.29.2 → arrayview-0.30.0}/vscode-extension/extension.js +128 -15
- {arrayview-0.29.2 → arrayview-0.30.0}/vscode-extension/lifecycle_helpers.js +35 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/vscode-extension/package.json +1 -1
- {arrayview-0.29.2 → arrayview-0.30.0}/vscode-extension/test_lifecycle_helpers.js +45 -0
- arrayview-0.29.2/docs/launch-routing-refactor.md +0 -153
- arrayview-0.29.2/src/arrayview/_launch_plan.py +0 -281
- arrayview-0.29.2/src/arrayview/arrayview-opener.vsix +0 -0
- arrayview-0.29.2/tests/test_launch_plan.py +0 -235
- arrayview-0.29.2/tests/test_nifti_series.py +0 -263
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/frontend-designer/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/invocation-consistency/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/modes-consistency/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/element-attributes.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/playwright-tests.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/request-mocking.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/running-code.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/session-management.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/storage-state.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/test-generation.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/tracing.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/playwright-cli/references/video-recording.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/todo-workflow/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/ui-consistency-audit/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/viewer-ui-checklist/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.agents/skills/visual-bug-fixing/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.github/copilot-instructions.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.github/workflows/docs.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.github/workflows/python-publish.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.gitignore +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.ignore +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/AGENTS.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/ROUTER.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/SETUP.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/SYNC.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/architecture.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/conventions.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/decisions.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/frontend.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/lifecycle.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/render-pipeline.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/setup.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/context/stack.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/INDEX.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/README.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/add-file-format.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/add-server-endpoint.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/animation-verify.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/debug-render.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/debug-vscode-extension-python.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/extend-compare-mode.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/extract-server-route-module.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/patterns/frontend-change.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/setup.sh +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.mex/sync.sh +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.opencode/opencode.json +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T18-46-49-737Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T18-48-21-979Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T18-51-35-665Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-07-01-393Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-14-37-969Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-21-30-940Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-23-08-126Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-29-33-155Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-31-25-336Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-31-53-789Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-39-12-257Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T19-39-16-449Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T20-15-25-513Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T20-25-13-179Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T20-39-01-435Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-01-27-659Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-01-41-283Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-03-00-625Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-04-12-887Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-33-39-044Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-38-01-530Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-45-20-383Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-55-11-545Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-56-03-307Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-56-35-733Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-57-12-181Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-57-37-748Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T21-58-13-679Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-06T22-37-23-895Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T00-39-18-637Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T01-41-46-243Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T04-31-48-472Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-14-15-632Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-14-47-582Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-16-23-471Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-17-10-247Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-18-24-707Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-20-06-164Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-20-28-342Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-21-54-962Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-22-34-666Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-23-11-336Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-23-36-260Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-24-09-267Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-24-35-434Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-25-57-010Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-34-48-823Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-46-46-468Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-48-17-930Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-49-26-400Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-50-31-563Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/page-2026-05-07T12-56-45-568Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.playwright-cli/theme-dark.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.python-version +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/.vscode/settings.json +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/AGENTS.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/CONTRIBUTING.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/DESIGN.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/LICENSE +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/README.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/docs/display.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/docs/lifecycle.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/docs/logo.png +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/docs/measurement.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/docs/stylesheets/extra.css +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/docs/viewing.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/docs/vscode-window-routing-plan.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/experiments/ws_tunnel_diag/ws_tunnel_diag.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/matlab/arrayview.m +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/mkdocs.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/plans/2026-04-14-immersive-animation.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/plans/2026-05-07-unified-colormap-picker.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/plans/arrayview_tool_menu_fix_prompt.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/plans/arrayview_tool_menu_implementation_plan.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/plans/egg-placement-mockup.html +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/plans/refactoring_plan.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/plans/roi-analysis-requirements.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/plans/webview/LOG.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/scripts/demo.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/scripts/release.sh +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/ARCHITECTURE.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/__main__.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_app.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_codex_open.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_config.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_diff.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_icon.png +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_imaging.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_lifecycle.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_overlays.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_platform.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_analysis.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_export.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_persistence.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_preload.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_query.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_rendering.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_segmentation.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_state.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_routes_vectorfield.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_segmentation.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_shell.html +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_synthetic_mri.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_torch.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_vectorfield.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/_vscode.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/src/arrayview/gsap.min.js +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/capture_v_animation.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/conftest.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/make_vectorfield_test_arrays.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_backend_shared.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_browser.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_colorbar_hover_highlight.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_command_reachability.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_config.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_cross_mode_parametrized.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_interactions.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_io.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_large_arrays.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_loading_server.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_mode_consistency.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_mode_matrix.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_mode_roundtrip.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_nifti_meta.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_rgb_pixel_art.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_torch.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_view_component_integration.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/test_view_component_unit.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/ui_audit.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/v_anim_frames/.gitkeep +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/tests/visual_smoke.py +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/vscode-extension/AGENTS.md +0 -0
- {arrayview-0.29.2 → arrayview-0.30.0}/vscode-extension/LICENSE +0 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
name: Launch contracts
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
paths:
|
|
6
|
+
- src/arrayview/**
|
|
7
|
+
- tests/**
|
|
8
|
+
- vscode-extension/**
|
|
9
|
+
- pyproject.toml
|
|
10
|
+
- uv.lock
|
|
11
|
+
- .github/workflows/launch-contracts.yml
|
|
12
|
+
push:
|
|
13
|
+
branches: [main]
|
|
14
|
+
paths:
|
|
15
|
+
- src/arrayview/**
|
|
16
|
+
- tests/**
|
|
17
|
+
- vscode-extension/**
|
|
18
|
+
- pyproject.toml
|
|
19
|
+
- uv.lock
|
|
20
|
+
- .github/workflows/launch-contracts.yml
|
|
21
|
+
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
planner-and-lifecycle:
|
|
27
|
+
strategy:
|
|
28
|
+
fail-fast: false
|
|
29
|
+
matrix:
|
|
30
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
31
|
+
runs-on: ${{ matrix.os }}
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v4
|
|
34
|
+
- uses: actions/setup-python@v5
|
|
35
|
+
with:
|
|
36
|
+
python-version: "3.12"
|
|
37
|
+
- uses: astral-sh/setup-uv@v6
|
|
38
|
+
- uses: actions/setup-node@v4
|
|
39
|
+
with:
|
|
40
|
+
node-version: "22"
|
|
41
|
+
- run: uv sync --frozen --group dev --group test
|
|
42
|
+
- name: Python launch contracts
|
|
43
|
+
run: >-
|
|
44
|
+
uv run pytest
|
|
45
|
+
tests/test_launch_plan.py
|
|
46
|
+
tests/test_launch_diagnostics.py
|
|
47
|
+
tests/test_invocation_contract_matrix.py
|
|
48
|
+
tests/test_instance_registry.py
|
|
49
|
+
tests/test_server_identity_status.py
|
|
50
|
+
tests/test_safe_server_stop.py
|
|
51
|
+
tests/test_view_handle_lifecycle.py
|
|
52
|
+
tests/test_view_launch_execution.py
|
|
53
|
+
tests/test_vscode_ack_protocol.py
|
|
54
|
+
tests/test_display_opener_results.py
|
|
55
|
+
tests/test_doctor_commands.py
|
|
56
|
+
tests/test_cli.py
|
|
57
|
+
tests/test_lifecycle_contract.py
|
|
58
|
+
-q
|
|
59
|
+
- name: VS Code extension contracts
|
|
60
|
+
run: node vscode-extension/test_lifecycle_helpers.js
|
|
61
|
+
- name: VS Code extension syntax
|
|
62
|
+
run: node --check vscode-extension/extension.js
|
|
@@ -20,7 +20,7 @@ last_updated: 2026-06-30
|
|
|
20
20
|
- Rendering pipeline: colormaps, complex modes, mosaic, RGB/RGBA, projections, overlays
|
|
21
21
|
- Backend transport: FastAPI HTTP/WebSocket is the single viewer transport; shared helpers keep route modules small for metadata/analysis, compare/diff, overlay compositing, and vector field layout/arrow sampling.
|
|
22
22
|
- NIfTI spatial metadata, RAS resampling
|
|
23
|
-
-
|
|
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
|
|
@@ -39,6 +39,13 @@ uvx arrayview volume.nii.gz --overlay mask.nii.gz
|
|
|
39
39
|
|
|
40
40
|
Binary mask (0/1), same spatial shape. `[`/`]` adjusts blend opacity. Multiple overlays get automatic palette colors.
|
|
41
41
|
|
|
42
|
+
For cohort review, use `--stack` so image and overlay patterns are paired into
|
|
43
|
+
aligned stacks:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
uvx arrayview --stack "data/**/*_0000.nii.gz" --overlay "gt=data/**/labels/*.nii.gz"
|
|
47
|
+
```
|
|
48
|
+
|
|
42
49
|
## Vector field
|
|
43
50
|
|
|
44
51
|
```bash
|
|
@@ -46,3 +46,6 @@ Explicit `--window` flag > `ARRAYVIEW_WINDOW` env var > config file > built-in d
|
|
|
46
46
|
| `jupyter` | Jupyter / IPython notebook kernel |
|
|
47
47
|
| `ssh` | SSH session without VS Code |
|
|
48
48
|
| `julia` | Julia via PythonCall / PyCall |
|
|
49
|
+
|
|
50
|
+
MATLAB uses the detected terminal, VS Code, SSH, or remote route. Local MATLAB
|
|
51
|
+
prefers a native window when available. See [MATLAB and Julia](foreign-hosts.md).
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# MATLAB and Julia
|
|
2
|
+
|
|
3
|
+
ArrayView uses the Python environment selected by the host application.
|
|
4
|
+
|
|
5
|
+
## MATLAB
|
|
6
|
+
|
|
7
|
+
Select a Python environment with ArrayView installed, then import and call it:
|
|
8
|
+
|
|
9
|
+
```matlab
|
|
10
|
+
pyenv(Version="/path/to/python")
|
|
11
|
+
py.importlib.import_module("arrayview");
|
|
12
|
+
|
|
13
|
+
h = py.arrayview.view(A);
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Local MATLAB follows the normal display selection and prefers a native window
|
|
17
|
+
when available. MATLAB started through SSH or VS Code follows that environment's
|
|
18
|
+
browser or VS Code route.
|
|
19
|
+
|
|
20
|
+
The array is converted to NumPy before registration. Keep `h` when explicit
|
|
21
|
+
cleanup is needed:
|
|
22
|
+
|
|
23
|
+
```matlab
|
|
24
|
+
h.close()
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Julia
|
|
28
|
+
|
|
29
|
+
PythonCall:
|
|
30
|
+
|
|
31
|
+
```julia
|
|
32
|
+
using PythonCall
|
|
33
|
+
|
|
34
|
+
arrayview = pyimport("arrayview")
|
|
35
|
+
h = arrayview.view(A)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
PyCall:
|
|
39
|
+
|
|
40
|
+
```julia
|
|
41
|
+
using PyCall
|
|
42
|
+
|
|
43
|
+
arrayview = pyimport("arrayview")
|
|
44
|
+
h = arrayview.view(A)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Julia currently supports one array per `view()` call. Call `view()` again for
|
|
48
|
+
another array.
|
|
49
|
+
|
|
50
|
+
ArrayView copies the array to a temporary NumPy file and starts or reuses a
|
|
51
|
+
separate Python server process. This avoids blocking on Julia's Python lock and
|
|
52
|
+
lets the viewer survive after the call returns. The returned value is a Python
|
|
53
|
+
`ViewHandle` wrapper with `url`, `sid`, `port`, `update()`, and `close()`.
|
|
54
|
+
|
|
55
|
+
```julia
|
|
56
|
+
h.close()
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## IJulia
|
|
60
|
+
|
|
61
|
+
Use the same PythonCall or PyCall code in an IJulia notebook. ArrayView displays
|
|
62
|
+
an inline iframe by default. Inline display is a side effect; the call may return
|
|
63
|
+
`nothing` instead of a handle.
|
|
64
|
+
|
|
65
|
+
## Display routing
|
|
66
|
+
|
|
67
|
+
| Host | Default display |
|
|
68
|
+
|------|-----------------|
|
|
69
|
+
| Local desktop | Native window when available, otherwise browser |
|
|
70
|
+
| VS Code terminal | VS Code tab |
|
|
71
|
+
| VS Code remote or tunnel | VS Code tab through a forwarded port |
|
|
72
|
+
| Jupyter or IJulia | Inline iframe |
|
|
73
|
+
| Plain SSH | Browser URL through SSH port forwarding |
|
|
74
|
+
|
|
75
|
+
For plain SSH, follow [Remote](remote.md#ssh). VS Code tunnel forwarding is
|
|
76
|
+
handled by the extension.
|
|
77
|
+
|
|
78
|
+
## Cleanup
|
|
79
|
+
|
|
80
|
+
In Python, close a handle directly or use a context manager:
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
handle = arrayview.view(a)
|
|
84
|
+
handle.close()
|
|
85
|
+
|
|
86
|
+
with arrayview.view(a) as handle:
|
|
87
|
+
print(handle.url)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
`close()` releases that viewer session. Calling it again is a no-op. If cleanup
|
|
91
|
+
fails, it raises an error and can be retried.
|
|
92
|
+
|
|
93
|
+
## Advanced server setup
|
|
94
|
+
|
|
95
|
+
Start with `view(A)`. Use a persistent server only for shared or multi-hop
|
|
96
|
+
setups:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
arrayview --serve
|
|
100
|
+
arrayview data.npy
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Use `--relay PORT` only when a reverse SSH tunnel exposes ArrayView on a
|
|
104
|
+
different remote port. See [Remote](remote.md#multi-hop).
|
|
@@ -26,6 +26,10 @@ view(np.random.rand(256, 256, 32))
|
|
|
26
26
|
|
|
27
27
|
Works in scripts, Jupyter notebooks, and VS Code interactive windows.
|
|
28
28
|
|
|
29
|
+
MATLAB and Julia setup: [MATLAB and Julia](foreign-hosts.md).
|
|
30
|
+
|
|
31
|
+
Remote and tunnel setup: [Remote](remote.md).
|
|
32
|
+
|
|
29
33
|
## Formats
|
|
30
34
|
|
|
31
35
|
`.npy` `.npz` `.nii` `.nii.gz` `.zarr` `.pt` `.h5` `.tif` `.mat`
|