arrayview 0.29.2__tar.gz → 0.31.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- arrayview-0.31.0/.github/workflows/launch-contracts.yml +62 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/project-state.md +19 -2
- {arrayview-0.29.2 → arrayview-0.31.0}/PKG-INFO +1 -1
- {arrayview-0.29.2 → arrayview-0.31.0}/docs/comparing.md +8 -1
- {arrayview-0.29.2 → arrayview-0.31.0}/docs/configuration.md +3 -0
- arrayview-0.31.0/docs/foreign-hosts.md +104 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/docs/index.md +4 -0
- arrayview-0.31.0/docs/launch-routing-refactor.md +523 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/docs/loading.md +74 -2
- {arrayview-0.29.2 → arrayview-0.31.0}/docs/remote.md +8 -3
- {arrayview-0.29.2 → arrayview-0.31.0}/pyproject.toml +1 -1
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/__init__.py +2 -1
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_analysis.py +12 -0
- arrayview-0.31.0/src/arrayview/_instance_registry.py +253 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_io.py +638 -98
- arrayview-0.31.0/src/arrayview/_launch_plan.py +524 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_launcher.py +1093 -305
- arrayview-0.31.0/src/arrayview/_lifecycle.py +64 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_overlays.py +14 -1
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_render.py +23 -1
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_loading.py +103 -11
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_query.py +13 -1
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_rendering.py +4 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_websocket.py +23 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_server.py +86 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_session.py +15 -2
- arrayview-0.31.0/src/arrayview/_session_spec.py +199 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_viewer.html +766 -89
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_vscode_browser.py +124 -11
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_vscode_extension.py +1 -1
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_vscode_signal.py +239 -10
- arrayview-0.31.0/src/arrayview/arrayview-opener.vsix +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/lifecycle_matrix.py +13 -2
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_api.py +292 -1
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_backend_shared.py +57 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_browser.py +152 -4
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_cli.py +216 -2
- arrayview-0.31.0/tests/test_display_opener_results.py +126 -0
- arrayview-0.31.0/tests/test_doctor_commands.py +87 -0
- arrayview-0.31.0/tests/test_instance_registry.py +181 -0
- arrayview-0.31.0/tests/test_invocation_contract_matrix.py +224 -0
- arrayview-0.31.0/tests/test_launch_diagnostics.py +44 -0
- arrayview-0.31.0/tests/test_launch_plan.py +534 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_lifecycle_contract.py +62 -21
- arrayview-0.31.0/tests/test_nifti_series.py +679 -0
- arrayview-0.31.0/tests/test_safe_server_stop.py +175 -0
- arrayview-0.31.0/tests/test_server_identity_status.py +81 -0
- arrayview-0.31.0/tests/test_session_spec.py +95 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_view_component_integration.py +11 -0
- arrayview-0.31.0/tests/test_view_handle_lifecycle.py +87 -0
- arrayview-0.31.0/tests/test_view_launch_execution.py +212 -0
- arrayview-0.31.0/tests/test_vscode_ack_protocol.py +258 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/visual_smoke.py +10 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/uv.lock +1 -1
- {arrayview-0.29.2 → arrayview-0.31.0}/vscode-extension/extension.js +133 -15
- {arrayview-0.29.2 → arrayview-0.31.0}/vscode-extension/lifecycle_helpers.js +47 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/vscode-extension/package.json +1 -1
- arrayview-0.31.0/vscode-extension/test_lifecycle_helpers.js +99 -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/_lifecycle.py +0 -39
- 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/vscode-extension/test_lifecycle_helpers.js +0 -47
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/frontend-designer/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/invocation-consistency/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/modes-consistency/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/element-attributes.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/playwright-tests.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/request-mocking.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/running-code.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/session-management.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/storage-state.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/test-generation.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/tracing.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/playwright-cli/references/video-recording.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/todo-workflow/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/ui-consistency-audit/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/viewer-ui-checklist/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.agents/skills/visual-bug-fixing/SKILL.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.github/copilot-instructions.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.github/workflows/docs.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.github/workflows/python-publish.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.gitignore +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.ignore +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/AGENTS.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/ROUTER.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/SETUP.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/SYNC.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/architecture.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/conventions.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/decisions.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/frontend.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/lifecycle.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/render-pipeline.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/setup.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/context/stack.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/INDEX.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/README.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/add-file-format.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/add-server-endpoint.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/animation-verify.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/debug-render.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/debug-vscode-extension-python.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/extend-compare-mode.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/extract-server-route-module.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/patterns/frontend-change.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/setup.sh +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.mex/sync.sh +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.opencode/opencode.json +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T18-46-49-737Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T18-48-21-979Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T18-51-35-665Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-07-01-393Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-14-37-969Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-21-30-940Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-23-08-126Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-29-33-155Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-31-25-336Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-31-53-789Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-39-12-257Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T19-39-16-449Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T20-15-25-513Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T20-25-13-179Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T20-39-01-435Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-01-27-659Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-01-41-283Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-03-00-625Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-04-12-887Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-33-39-044Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-38-01-530Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-45-20-383Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-55-11-545Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-56-03-307Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-56-35-733Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-57-12-181Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-57-37-748Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T21-58-13-679Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-06T22-37-23-895Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T00-39-18-637Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T01-41-46-243Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T04-31-48-472Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-14-15-632Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-14-47-582Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-16-23-471Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-17-10-247Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-18-24-707Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-20-06-164Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-20-28-342Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-21-54-962Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-22-34-666Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-23-11-336Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-23-36-260Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-24-09-267Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-24-35-434Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-25-57-010Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-34-48-823Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-46-46-468Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-48-17-930Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-49-26-400Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-50-31-563Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/page-2026-05-07T12-56-45-568Z.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.playwright-cli/theme-dark.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.python-version +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/.vscode/settings.json +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/AGENTS.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/CONTRIBUTING.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/DESIGN.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/LICENSE +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/README.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/docs/display.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/docs/lifecycle.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/docs/logo.png +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/docs/measurement.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/docs/stylesheets/extra.css +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/docs/viewing.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/docs/vscode-window-routing-plan.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/experiments/ws_tunnel_diag/ws_tunnel_diag.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/matlab/arrayview.m +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/mkdocs.yml +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/plans/2026-04-14-immersive-animation.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/plans/2026-05-07-unified-colormap-picker.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/plans/arrayview_tool_menu_fix_prompt.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/plans/arrayview_tool_menu_implementation_plan.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/plans/egg-placement-mockup.html +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/plans/refactoring_plan.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/plans/roi-analysis-requirements.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/plans/webview/LOG.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/scripts/demo.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/scripts/release.sh +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/ARCHITECTURE.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/__main__.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_app.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_codex_open.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_config.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_diff.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_icon.png +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_imaging.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_platform.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_analysis.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_export.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_persistence.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_preload.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_segmentation.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_state.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_routes_vectorfield.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_segmentation.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_shell.html +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_synthetic_mri.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_torch.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_vectorfield.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/_vscode.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/src/arrayview/gsap.min.js +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/capture_v_animation.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/conftest.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/make_vectorfield_test_arrays.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_colorbar_hover_highlight.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_command_reachability.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_config.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_cross_mode_parametrized.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_interactions.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_io.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_large_arrays.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_loading_server.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_mode_consistency.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_mode_matrix.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_mode_roundtrip.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_nifti_meta.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_rgb_pixel_art.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_torch.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/test_view_component_unit.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/ui_audit.py +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/tests/v_anim_frames/.gitkeep +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/vscode-extension/AGENTS.md +0 -0
- {arrayview-0.29.2 → arrayview-0.31.0}/vscode-extension/LICENSE +0 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
name: Launch contracts
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
paths:
|
|
6
|
+
- src/arrayview/**
|
|
7
|
+
- tests/**
|
|
8
|
+
- vscode-extension/**
|
|
9
|
+
- pyproject.toml
|
|
10
|
+
- uv.lock
|
|
11
|
+
- .github/workflows/launch-contracts.yml
|
|
12
|
+
push:
|
|
13
|
+
branches: [main]
|
|
14
|
+
paths:
|
|
15
|
+
- src/arrayview/**
|
|
16
|
+
- tests/**
|
|
17
|
+
- vscode-extension/**
|
|
18
|
+
- pyproject.toml
|
|
19
|
+
- uv.lock
|
|
20
|
+
- .github/workflows/launch-contracts.yml
|
|
21
|
+
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
planner-and-lifecycle:
|
|
27
|
+
strategy:
|
|
28
|
+
fail-fast: false
|
|
29
|
+
matrix:
|
|
30
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
31
|
+
runs-on: ${{ matrix.os }}
|
|
32
|
+
steps:
|
|
33
|
+
- uses: actions/checkout@v4
|
|
34
|
+
- uses: actions/setup-python@v5
|
|
35
|
+
with:
|
|
36
|
+
python-version: "3.12"
|
|
37
|
+
- uses: astral-sh/setup-uv@v6
|
|
38
|
+
- uses: actions/setup-node@v4
|
|
39
|
+
with:
|
|
40
|
+
node-version: "22"
|
|
41
|
+
- run: uv sync --frozen --group dev --group test
|
|
42
|
+
- name: Python launch contracts
|
|
43
|
+
run: >-
|
|
44
|
+
uv run pytest
|
|
45
|
+
tests/test_launch_plan.py
|
|
46
|
+
tests/test_launch_diagnostics.py
|
|
47
|
+
tests/test_invocation_contract_matrix.py
|
|
48
|
+
tests/test_instance_registry.py
|
|
49
|
+
tests/test_server_identity_status.py
|
|
50
|
+
tests/test_safe_server_stop.py
|
|
51
|
+
tests/test_view_handle_lifecycle.py
|
|
52
|
+
tests/test_view_launch_execution.py
|
|
53
|
+
tests/test_vscode_ack_protocol.py
|
|
54
|
+
tests/test_display_opener_results.py
|
|
55
|
+
tests/test_doctor_commands.py
|
|
56
|
+
tests/test_cli.py
|
|
57
|
+
tests/test_lifecycle_contract.py
|
|
58
|
+
-q
|
|
59
|
+
- name: VS Code extension contracts
|
|
60
|
+
run: node vscode-extension/test_lifecycle_helpers.js
|
|
61
|
+
- name: VS Code extension syntax
|
|
62
|
+
run: node --check vscode-extension/extension.js
|
|
@@ -20,7 +20,7 @@ last_updated: 2026-06-30
|
|
|
20
20
|
- Rendering pipeline: colormaps, complex modes, mosaic, RGB/RGBA, projections, overlays
|
|
21
21
|
- Backend transport: FastAPI HTTP/WebSocket is the single viewer transport; shared helpers keep route modules small for metadata/analysis, compare/diff, overlay compositing, and vector field layout/arrow sampling.
|
|
22
22
|
- NIfTI spatial metadata, RAS resampling
|
|
23
|
-
-
|
|
23
|
+
- Directory collections are header-scanned and lazy by default: compatible files form a dense virtual stack, mixed shapes use a ragged collection, and `--load lazy|eager` plus `--stack-policy auto|dense|ragged` make both choices explicit. Compressed NIfTI volumes use a byte-bounded LRU cache; `view_dir()` exposes the same controls.
|
|
24
24
|
- VS Code extension v0.14.27 — stable window ID via `EnvironmentVariableCollection`; `arrayview.openInFloatingWindow` setting moves new tabs to a floating window; `view(arr, floating=True)` and `arrayview file.npy --floating` open in a floating window per-call regardless of global setting; remote/tunnel display uses the same forwarded HTTP/WebSocket path as local VS Code; floating mode uses a single persistent shell hub panel (`_shell.html`) so all arrays share one floating window as tabs instead of opening separate windows; second CLI calls inject tabs via `new_tab` postMessage relay (extension -> hub wrapper -> shell iframe)
|
|
25
25
|
- Colorbar refactor: `ColorBar` JS class partially migrated (in progress)
|
|
26
26
|
- Colormap picker: `c` opens an expanded colorbar-island grid without changing the colormap; subsequent `c` taps cycle, hover/hjkl/arrows live-preview, Enter/click commits, Esc cancels, and auto-dismiss pauses while hovered
|
|
@@ -32,8 +32,25 @@ last_updated: 2026-06-30
|
|
|
32
32
|
- qMRI map toggle (`_islandToggleQmriMap`) fade animation now covers dimbar and array-name in addition to panes and colorbars
|
|
33
33
|
- Segmentation menu shares the ROI layout (yellow accent, magnifier action icon, common `#export-overlay` modal). Pre-activation shows a pulsing "nnInteractive · connecting" row that morphs into the normal shape toolbar once `/seg/activate` resolves
|
|
34
34
|
- Overlays are a plugin tile (`OV`): per-overlay row with colour swatch, editable label, eye toggle, × delete; shared opacity slider; `+ add overlay` opens a filesystem picker rooted at the launched file's directory
|
|
35
|
+
- The floating overlay HUD is reconciled as soon as startup loading ends, so it
|
|
36
|
+
is visible on first load and `/ o` toggles it correctly from the first press.
|
|
37
|
+
Its drag grip allows viewport-clamped repositioning that survives mode and
|
|
38
|
+
layout reconciliation for the current viewer session. Hovering a visible row
|
|
39
|
+
focuses that mask and dims the other visible overlays across normal, compare,
|
|
40
|
+
multiview, and qMRI render paths. The HUD and overlay drawer can switch masks
|
|
41
|
+
between filled regions and outline-only contours.
|
|
35
42
|
- Vector field is a plugin tile (`VF`): row with visibility toggle + density/length sliders bi-directionally wired to the `[ ] { }` keyboard commands
|
|
36
|
-
- CLI `--overlay FILE` can be repeated to load multiple overlays at launch
|
|
43
|
+
- CLI `--overlay FILE` can be repeated to load multiple overlays at launch;
|
|
44
|
+
unnamed overlays use the filename stem and `NAME=FILE` supplies an explicit
|
|
45
|
+
HUD label.
|
|
46
|
+
- Stack collections support `--overlay-dir PATTERN` to discover per-case mask
|
|
47
|
+
filenames as sparse overlay roles; missing masks render as empty and common
|
|
48
|
+
patient/modality directory layouts pair automatically. `--case-regex` remains
|
|
49
|
+
an override for unusual layouts. CLI header scans show an in-place file counter
|
|
50
|
+
and elapsed time on interactive terminals.
|
|
51
|
+
- Reused collection sessions are protected by per-tab leases, including their
|
|
52
|
+
overlay sessions, and VS Code opener readiness now verifies the requested
|
|
53
|
+
session metadata before acknowledging `backend_ready`.
|
|
37
54
|
- Filesystem picker endpoint (`GET /fs/list`) clamped to `$HOME`. Accepts `base_sid` + `mode` (`overlay` | `vectorfield`) to filter entries by a cheap header-shape peek (`.npy`, `.nii`/`.nii.gz`, `.h5`, `.zarr`); overlay mode requires identical shape, vectorfield mode requires base shape plus one axis of size 3
|
|
38
55
|
- Island collapse affordance: inline `~` at the island's top-right animates the panel into the bottom-left `~` hint circle; external `~` hint only visible while the island is actually collapsed. New `/` hint circle at bottom-right opens the tool menu
|
|
39
56
|
- Compare center tool menu: `/` now re-opens the last-used compare center mode from the tool menu, while compare pane header buttons select diff / overlay / wipe directly. Eligible two-array compare layouts can switch into a big-left arrangement with a wider center pane, and the diff colorbar now matches that center-pane width.
|
|
@@ -37,7 +37,14 @@ Or use the file picker (`Cmd/Ctrl+O`) or drag-and-drop.
|
|
|
37
37
|
uvx arrayview volume.nii.gz --overlay mask.nii.gz
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
Binary mask (0/1), same spatial shape. `[`/`]` adjusts blend opacity. Multiple overlays get automatic palette colors.
|
|
40
|
+
Binary mask (0/1), same spatial shape. `[`/`]` adjusts blend opacity. Multiple overlays get automatic palette colors. Hover an overlay HUD row to focus that mask while dimming the others. Use the overlay HUD or `/ o` to switch between filled masks and outline-only contours.
|
|
41
|
+
|
|
42
|
+
For cohort review, use `--stack` so image and overlay patterns are paired into
|
|
43
|
+
aligned stacks:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
uvx arrayview --stack "data/**/*_0000.nii.gz" --overlay "gt=data/**/labels/*.nii.gz"
|
|
47
|
+
```
|
|
41
48
|
|
|
42
49
|
## Vector field
|
|
43
50
|
|
|
@@ -46,3 +46,6 @@ Explicit `--window` flag > `ARRAYVIEW_WINDOW` env var > config file > built-in d
|
|
|
46
46
|
| `jupyter` | Jupyter / IPython notebook kernel |
|
|
47
47
|
| `ssh` | SSH session without VS Code |
|
|
48
48
|
| `julia` | Julia via PythonCall / PyCall |
|
|
49
|
+
|
|
50
|
+
MATLAB uses the detected terminal, VS Code, SSH, or remote route. Local MATLAB
|
|
51
|
+
prefers a native window when available. See [MATLAB and Julia](foreign-hosts.md).
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# MATLAB and Julia
|
|
2
|
+
|
|
3
|
+
ArrayView uses the Python environment selected by the host application.
|
|
4
|
+
|
|
5
|
+
## MATLAB
|
|
6
|
+
|
|
7
|
+
Select a Python environment with ArrayView installed, then import and call it:
|
|
8
|
+
|
|
9
|
+
```matlab
|
|
10
|
+
pyenv(Version="/path/to/python")
|
|
11
|
+
py.importlib.import_module("arrayview");
|
|
12
|
+
|
|
13
|
+
h = py.arrayview.view(A);
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Local MATLAB follows the normal display selection and prefers a native window
|
|
17
|
+
when available. MATLAB started through SSH or VS Code follows that environment's
|
|
18
|
+
browser or VS Code route.
|
|
19
|
+
|
|
20
|
+
The array is converted to NumPy before registration. Keep `h` when explicit
|
|
21
|
+
cleanup is needed:
|
|
22
|
+
|
|
23
|
+
```matlab
|
|
24
|
+
h.close()
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Julia
|
|
28
|
+
|
|
29
|
+
PythonCall:
|
|
30
|
+
|
|
31
|
+
```julia
|
|
32
|
+
using PythonCall
|
|
33
|
+
|
|
34
|
+
arrayview = pyimport("arrayview")
|
|
35
|
+
h = arrayview.view(A)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
PyCall:
|
|
39
|
+
|
|
40
|
+
```julia
|
|
41
|
+
using PyCall
|
|
42
|
+
|
|
43
|
+
arrayview = pyimport("arrayview")
|
|
44
|
+
h = arrayview.view(A)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Julia currently supports one array per `view()` call. Call `view()` again for
|
|
48
|
+
another array.
|
|
49
|
+
|
|
50
|
+
ArrayView copies the array to a temporary NumPy file and starts or reuses a
|
|
51
|
+
separate Python server process. This avoids blocking on Julia's Python lock and
|
|
52
|
+
lets the viewer survive after the call returns. The returned value is a Python
|
|
53
|
+
`ViewHandle` wrapper with `url`, `sid`, `port`, `update()`, and `close()`.
|
|
54
|
+
|
|
55
|
+
```julia
|
|
56
|
+
h.close()
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## IJulia
|
|
60
|
+
|
|
61
|
+
Use the same PythonCall or PyCall code in an IJulia notebook. ArrayView displays
|
|
62
|
+
an inline iframe by default. Inline display is a side effect; the call may return
|
|
63
|
+
`nothing` instead of a handle.
|
|
64
|
+
|
|
65
|
+
## Display routing
|
|
66
|
+
|
|
67
|
+
| Host | Default display |
|
|
68
|
+
|------|-----------------|
|
|
69
|
+
| Local desktop | Native window when available, otherwise browser |
|
|
70
|
+
| VS Code terminal | VS Code tab |
|
|
71
|
+
| VS Code remote or tunnel | VS Code tab through a forwarded port |
|
|
72
|
+
| Jupyter or IJulia | Inline iframe |
|
|
73
|
+
| Plain SSH | Browser URL through SSH port forwarding |
|
|
74
|
+
|
|
75
|
+
For plain SSH, follow [Remote](remote.md#ssh). VS Code tunnel forwarding is
|
|
76
|
+
handled by the extension.
|
|
77
|
+
|
|
78
|
+
## Cleanup
|
|
79
|
+
|
|
80
|
+
In Python, close a handle directly or use a context manager:
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
handle = arrayview.view(a)
|
|
84
|
+
handle.close()
|
|
85
|
+
|
|
86
|
+
with arrayview.view(a) as handle:
|
|
87
|
+
print(handle.url)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
`close()` releases that viewer session. Calling it again is a no-op. If cleanup
|
|
91
|
+
fails, it raises an error and can be retried.
|
|
92
|
+
|
|
93
|
+
## Advanced server setup
|
|
94
|
+
|
|
95
|
+
Start with `view(A)`. Use a persistent server only for shared or multi-hop
|
|
96
|
+
setups:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
arrayview --serve
|
|
100
|
+
arrayview data.npy
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Use `--relay PORT` only when a reverse SSH tunnel exposes ArrayView on a
|
|
104
|
+
different remote port. See [Remote](remote.md#multi-hop).
|
|
@@ -26,6 +26,10 @@ view(np.random.rand(256, 256, 32))
|
|
|
26
26
|
|
|
27
27
|
Works in scripts, Jupyter notebooks, and VS Code interactive windows.
|
|
28
28
|
|
|
29
|
+
MATLAB and Julia setup: [MATLAB and Julia](foreign-hosts.md).
|
|
30
|
+
|
|
31
|
+
Remote and tunnel setup: [Remote](remote.md).
|
|
32
|
+
|
|
29
33
|
## Formats
|
|
30
34
|
|
|
31
35
|
`.npy` `.npz` `.nii` `.nii.gz` `.zarr` `.pt` `.h5` `.tif` `.mat`
|