plexora 0.0.35__tar.gz → 0.0.36__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.
- {plexora-0.0.35/plexora.egg-info → plexora-0.0.36}/PKG-INFO +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/bridge_roles.py +5 -1
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/render_spec.py +3 -2
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/schemas.py +63 -6
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/sessions/tools.py +109 -26
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/bench.py +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/bench_qc.py +2 -1
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/capabilities.py +31 -17
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/chat_capabilities.py +2 -1
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/decision.py +4 -2
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/gate-image/SKILL.md +2 -4
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/gate-packets/SKILL.md +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/gate-review/SKILL.md +2 -1
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/gating/dataset.md +2 -1
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/gating/decisions.md +4 -3
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/qc-image/SKILL.md +10 -10
- {plexora-0.0.35 → plexora-0.0.36}/plexora/cli.py +5 -5
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/agentPanel.js +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/plexora/mcp/resources_gating.py +2 -2
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/capabilities_session.py +383 -253
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/hypotheses/__init__.py +5 -1
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/capabilities_session.py +74 -50
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/mcp.py +2 -2
- {plexora-0.0.35 → plexora-0.0.36/plexora.egg-info}/PKG-INFO +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/plexora_intelligence/__init__.py +14 -8
- {plexora-0.0.35 → plexora-0.0.36}/plexora_intelligence/guest.json +606 -2516
- {plexora-0.0.35 → plexora-0.0.36}/pyproject.toml +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_client_probes.py +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_viewer_api.py +8 -5
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_context.py +2 -1
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_harness.py +4 -2
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_harness_qc.py +2 -1
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_models_mcp.py +2 -2
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_parallel_markers.py +2 -2
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_routes.py +6 -1
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_contrast_observations.py +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_candidates.py +2 -1
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_channel_match.py +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_classifier_layer.py +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_delta.py +2 -2
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_hypotheses.py +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_limits.py +4 -4
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_session.py +164 -20
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_tiles.py +3 -2
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_intelligence_registration.py +104 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_bulk_timing.py +2 -1
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_mirror.py +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_payload_trim.py +69 -4
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_session.py +4 -2
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_visual_session.py +1 -1
- {plexora-0.0.35 → plexora-0.0.36}/LICENSE +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/MANIFEST.in +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/README.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/__main__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/_guard.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/_lifetime.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/_logging.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/_resources.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/_subprocess.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/_transient_locks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/_url.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/artifacts.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/attach.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/audit.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/bridge_provider.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/bridge_wire.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/cell_exclusions.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/cell_explain.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/cell_gallery.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/coordinates.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/bridge.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/cells.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/image.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/jobs.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/operations.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/project.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/scene.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/selection.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/surface.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/table.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/viewer.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/visual.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/volume.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/core/volume_analysis.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/errors.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/evidence/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/evidence/calibration.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/evidence/cell_window.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/evidence/collage.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/evidence/crops.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/evidence/density_plot.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/evidence/display_contrast.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/evidence/display_grid.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/evidence/image_cells.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/evidence/image_qc.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/evidence/sheet_layout.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/expression.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/gate_panel.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/gate_rule.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/gate_sampling.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/jobs.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/limits.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/plots.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/policy.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/presets.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/receipts.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/registry.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/render.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/report.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/revision.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/scene_models.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/sections.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/session.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/sessions/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/sessions/budget.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/sessions/control.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/sessions/engine.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/sessions/events.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/sessions/memo.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/sessions/mirror.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/sessions/store.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/tasks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/tokens.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/agent/viewer.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/audit.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/bench_data.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/bench_experience.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/context.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/delegation.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/backend.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/cache_plan.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/cli.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/conversations.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/expression.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/gateway.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/prefix.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/route_bench.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/schema.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/toolcache.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/harness/trace.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/knowledge/biology.yaml +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/knowledge/markers.yaml +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/models_config.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/qc_scenes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/setup.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skill_manifest.yaml +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/analysis-handoff/SKILL.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/dataset-triage/SKILL.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/gating/qc-cells.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/gating/setup.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/gating/visual-gating.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/marker-qc/SKILL.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/qc-checks/SKILL.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/qc-packets/SKILL.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/qc-visual-artifacts/SKILL.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/review-objects/SKILL.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/review-qc/SKILL.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/surface-rendering/SKILL.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/video-storyboard/SKILL.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/visual-inspection/SKILL.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills/volume-triage/SKILL.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/skills.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/tasks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/tasks.yaml +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/ai/vocabulary.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/api/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/api/dataset.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/api/features.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/api/http.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/api/plugin.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/api/representation.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/api/store.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/askpass.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/124_bundle.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/248_bundle.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/248_bundle.js.LICENSE.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/354_bundle.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/354_bundle.js.LICENSE.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/418_bundle.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/418_bundle.js.LICENSE.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/693b935cb1f907814be9c6199a68c217.svg +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/713c134ff47cd328a5b711526f151082.svg +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/770_bundle.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/908_bundle.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/908_bundle.js.LICENSE.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/ff743f408972e0e96ca9153ed5ae4c83.svg +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/vendor_bundle.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/vendor_bundle.js.LICENSE.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/vendors-node_modules_canvg_lib_index_es_js_bundle.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/vendors-node_modules_dompurify_dist_purify_es_mjs_bundle.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/dist/vendors-node_modules_html2canvas_dist_html2canvas_js_bundle.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/LICENSE.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/canvas-overlay-hd.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/changelog.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/.gitattributes +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/LICENSE.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/Toolbar.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/fullpage.psd +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/home.psd +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/next.psd +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/previous.psd +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/rotateleft.psd +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/rotateright.psd +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/Photoshop/zoom.psd +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/README.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_grouphover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_hover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_pressed.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/fullpage_rest.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_grouphover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_hover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_pressed.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/home_rest.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_grouphover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_hover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_pressed.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/next_rest.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_grouphover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_hover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_pressed.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/previous_rest.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_grouphover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_hover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_pressed.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateleft_rest.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_grouphover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_hover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_pressed.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/rotateright_rest.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_grouphover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_hover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_pressed.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomin_rest.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_grouphover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_hover.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_pressed.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-flat-toolbar-icons-master/images/zoomout_rest.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/openseadragon-bin-2.4.0/openseadragon-scalebar.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/thinking-orbs-0.3.2/LICENSE +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/thinking-orbs-0.3.2/README-plexora.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/external/thinking-orbs-0.3.2/orbs.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/css/agentPanel.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/css/chatPanel.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/css/explorer.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/css/import.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/css/main.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/css/openProject.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/css/quickView.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/css/settings.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/css/tokens.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/css/viewer.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/img/apple-touch-icon.png +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/img/favicon.ico +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/img/logo.ai +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/img/logo.svg +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/img/logo_with_text.ai +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/img/logo_with_text.svg +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/main.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/pluginRegistry.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/agentBridge.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/appRouter.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/appStatus.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/bookmarks.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/browsePicker.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/canvasHint.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/canvasLayout.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/carryOver.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/channelFade.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/connectionModal.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/dataLayer.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/dataLocation.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/datasetContext.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/desktopBridge.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/displayCurve.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/drawToolbar.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/dropRouter.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/errors.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/explorer/explorerCrumbs.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/explorer/explorerListing.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/explorer/explorerSidebar.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/explorer/explorerTypes.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/explorer/fileExplorer.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/explorer/floatingWindow.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/failureMessage.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/fileLocation.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/glRenderer.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/inspectGeometry.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/inspectState.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/keyboardShortcuts.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/launchContext.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/logTerminal.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/maskSurfaces.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/numericData.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/orbDriver.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/pageBoot.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/passVariablesToFrontend.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/perfProbe.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/performanceTelemetry.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/placePicker.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/pointerDrag.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/proFeature.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/remoteGlobe.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/remoteState.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/renderClipboard.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/resourceRouting.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/resourceStatus.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/segmentService.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/sessionExpiry.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/simpleEventHandler.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/surfaceLayers.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/telemetry.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/toast.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/tooltip.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/viewControls.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/viewHistory.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/viewRaster.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/viewSnapshot.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/viewState.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/viewTransform.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/viewerLoader.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/viewerPrefs.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/viewerScene.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/services/volumeWindows.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/vendor.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/areaTool.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/backButton.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/bookmarkTray.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/brightfieldAdjust.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/cardList.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/channelList.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/channelNamesUpload.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/chatPanel.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/colorSwatchPicker.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/columnClassifier.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/confirmDialog.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/coordinateField.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/dataSourceField.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/datasetBuilder.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/datasetNav.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/datasetPicker.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/datasetStrip.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/depthSettings.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/depthStrip.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/depthTools.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/fileSourceRow.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/geneGroupModal.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/geneList.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/glInit.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/gradientRange.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/helpMenu.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/imageViewer.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/importHelp.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/importSample.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/jobProgress.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/jobWait.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/labelGpu.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/labelTile.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/layerChannelPanel.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/layerManager.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/layerSections.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/layerStack.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/loadProgress.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/locators.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/machineChip.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/maskSurfaceWait.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/miniMap.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/navbarControls.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/openProjectPage.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/orientationGizmo.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/panCursor.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/paneStatus.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/planeMotion.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/pluginHelp.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/popoverMenu.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/popoverPortal.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/projectEdit.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/quickViewLanding.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/rainbow.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/requirementsModal.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/rgbImageViewer.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/scaleCalibration.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/searchableSelect.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/sectionCells.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/sectionPanes.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/segmentationWait.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/settingsPage.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/slider.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/surfaceCard.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/surfaceInspect.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/surfaceObjects.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/surfaceRenderer.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/surfaceStudio.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/tableProgress.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/tileColorize.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/tileDecode.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/tileFetch.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/toolLoader.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/updateDialog.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/viewTransformTools.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/viewerControls.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/viewerErrorState.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/viewerManager.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/viewerSidebar.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/volumeAtlas.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/volumeCamera.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/volumeDock.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/volumeHandles.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/views/volumeRenderer.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/js/workers/tileDecoder.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/shaders/frag.glsl +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/shaders/label.frag.glsl +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/src/shaders/vert.glsl +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/templates/_fragment.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/templates/_scale_calibration.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/templates/_scale_calibration_float.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/templates/base.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/templates/index.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/templates/open_project.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/templates/project_edit.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/templates/settings.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/templates/tools/depth_panel.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/client/templates/tools/rotate_panel.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/connect.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/datasets.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/datasource.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/gcloud.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/jupyter.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/licensing/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/licensing/cli.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/licensing/guards.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/licensing/manifest.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/licensing/tokens.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/links.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/mcp/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/mcp/auth.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/mcp/profiles.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/mcp/prompts.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/mcp/resources.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/mcp/resources_scene.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/mcp/resources_visual.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/mcp/serialize.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/mcp/server.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/mcp/smoke.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/mcp/tools.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/memory.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/nodes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/notebook_env.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/paths.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/server/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/server/routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/server/state.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/server/values.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/server/variables.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/static/cellExplorerAnalysisBridge.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/static/cellExplorerApi.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/static/cellExplorerColors.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/static/cellExplorerContinuous.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/static/cellExplorerFigureBridge.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/static/cellExplorerLegend.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/static/cellExplorerRoiBridge.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/static/cellExplorerSidebarController.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/static/cellExplorerState.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/static/cell_explorer.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/cell_explorer/templates/cell_explorer/panel.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/captures.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/compose.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/export.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/export_jobs.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/operations.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/pixels.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/provenance.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/render.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/repository.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/schema.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/shapegeom.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/sources.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/strokegeom.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/server/textmetrics.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureActions.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureBookmarkStore.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureBuilderApi.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureCanvas.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureCaptureBin.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureCaptureBinGrid.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureCaptureBoxes.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureCaptureDock.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureCaptureTool.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureChoiceField.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureColorField.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureConfirm.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureContextBar.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureContextMenu.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureDestinationPicker.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureDocumentState.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureExportUi.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureImagePanel.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureLibrary.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureLineDefs.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureLinePanel.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figurePanelCompositor.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figurePointEditor.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureQuickEdit.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureRichText.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureSceneSnapshot.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureSchema.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureShapeDefs.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureShapeDrawing.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureShapeGeometry.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureShapePanel.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureSidebarController.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureStrokeGeometry.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureTextEditor.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureTextPanel.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureThumbnail.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureViewOptions.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figureWorkspace.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/static/figure_builder.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/templates/figure_builder/captures.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/templates/figure_builder/library.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/templates/figure_builder/workspace.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/figure_builder/templates/figure_builder/workspace_body.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/capabilities.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/capabilities_autogate.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/capabilities_classifier.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/anndata_gates.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/absence.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/answers.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/biology.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/bivariate.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/bulk.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/candidates.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/cellcalls.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/cells.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/context.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/engine.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/events.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/hierarchy.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/hypotheses/calibration.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/hypotheses/candidates.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/hypotheses/classifier_check.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/hypotheses/controller.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/hypotheses/evidence.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/hypotheses/panel.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/kernels.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/lattice.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/memo.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/mirror_script.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/packets.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/partners.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/pixel_estimate.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/profile.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/provenance.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/qc_cells.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/reference.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/regression.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/replan.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/report.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/sampler.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/schemas.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/scoring.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/sheet.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/tableops.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/transfer.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/transitions.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/verdicts.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/autogate/views.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/autopick.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/calls.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/export.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/features.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/geometry.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/learner.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/panel.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/rules.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/runs.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/signal.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/source_write.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/classifier/store.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/database.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/experience.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/mixture.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/model.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/provenance.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/server/tableops.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/static/csvGatingList.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/static/gating.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/static/gatingAgentBridge.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/static/gatingAgentShow.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/static/gatingApi.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/static/gatingClassifier.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/static/gatingPlanes.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/static/gatingSidebarController.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/templates/gating/legacy.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/gating/templates/gating/panel.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/capabilities.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/capabilities_checks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/capabilities_objects.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/capabilities_segment.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/capabilities_stack.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/capabilities_visual.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/answers.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/artifacts.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/background.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/blur.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/bulk.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/candidates.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/cells/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/cells/areas.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/cells/calls.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/cells/channel_findings.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/cells/columns.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/cells/inputs.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/check_candidates.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/checks_bulk.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/checks_result.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/class_rules.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/consolidate.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/cycles.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/detectors/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/detectors/base.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/detectors/classical.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/digest.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/dna_retention.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/engine.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/events.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/exclusions.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/export.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/finalize.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/frames.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/mirror_script.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/nuclei_trace.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/overview.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/packets.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/plane.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/polygons.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/propagate.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/provenance.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/refine.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/refine_sam.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/region_write.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/registration.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/report.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/results.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/roi_link.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/scan.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/schemas.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/score_fields.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/score_review.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/segqc/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/segqc/analysis.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/segqc/kernels.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/segqc/run.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/sheets.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/source_write.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/spatialdata_write.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/strictness.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/tableops.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/tissue.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/transitions.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/server/viewer_data.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qc.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qcAgentBridge.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qcApi.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qcArtifacts.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qcBlur.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qcDraw.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qcHover.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qcLayers.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qcRegistration.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qcSegmentation.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qcSidebarController.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qcStack.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/static/qcTree.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/qc/templates/qc/panel.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/capabilities.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/server/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/server/adapters.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/server/geojson.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/server/geometry.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/server/mapping.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/server/operations.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/server/repository.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/server/routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/server/schema.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/server/service.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/server/tableops.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/static/roi.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/static/roiAgentBridge.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/static/roiApi.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/static/roiFigureBridge.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/static/roiGeometry.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/static/roiRenderer.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/static/roiSidebarController.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/static/roiState.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/static/roiTools.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/static/roiTree.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/roi/templates/roi/panel.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/segmentation/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/segmentation/capabilities.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/segmentation/server/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/segmentation/server/cellpose3d.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/segmentation/server/routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/segmentation/server/run.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/segmentation/static/segmentation3d.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/segmentation/static/segmentation3d.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/segmentation/templates/segmentation/panel.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/transcripts/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/transcripts/server/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/transcripts/server/routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/transcripts/server/xenium.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/transcripts/static/transcriptLayer.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/transcripts/static/transcriptPoints.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/transcripts/static/transcripts.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/transcripts/static/transcriptsApi.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/transcripts/static/transcriptsSidebarController.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/transcripts/templates/transcripts/panel.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/capabilities.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/server/encode_jobs.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/server/encoders.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/server/facts.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/server/manifest.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/server/operations.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/server/presets.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/server/repository.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/server/routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/server/schema.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/server/writers.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/vendor/LICENSE-mediabunny +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/vendor/README.md +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/vendor/mediabunny-1.60.0.mjs +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoAgentBridge.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoAnimation.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoArcLength.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoCamera2d.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoCamera3d.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoComposite.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoEasing.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoEncodeWorker.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoEncoders.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoExportLoop.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoExportUi.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoFigureBridge.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoHistory.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoInterp.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoOverlays.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoParamFields.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoPathEditor.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoPrefetch.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoPreview.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoProjectApi.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoReadiness.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoRecorder.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoRenderCoordinator.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoRenderCover.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoSceneState.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoSchema.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoStage.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoStudioBar.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoStudioSidebarController.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoTimeline.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoTracking.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/videoViewerState.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/video_studio/static/video_studio.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/visium_hd/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/visium_hd/server/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/visium_hd/server/routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/visium_hd/server/spots.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/visium_hd/server/tenx.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/visium_hd/static/binLayer.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/visium_hd/static/spotLayer.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/visium_hd/static/visiumHdApi.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/visium_hd/static/visiumHdSidebarController.js +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/visium_hd/static/visium_hd.css +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/plugins/visium_hd/templates/visium_hd/panel.html +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/proxy.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/core_tools.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/adapters/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/adapters/anndata_adapter.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/adapters/base.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/adapters/classify.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/adapters/csv_adapter.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/adapters/flat_table.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/adapters/inspection.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/adapters/memory_adapter.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/adapters/spatialdata_adapter.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/bin_tiles.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/centroid_tiles.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/consistency.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/data_migration.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/data_model.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/database_model.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/dataset_answers.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/dataset_build.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/dataset_events.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/dataset_plan.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/dataset_scan.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/datasets.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/drop_plan.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/import_proposal.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/import_sample.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/layer_jobs.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/layer_sources.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/manifest.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/nodes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/project.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/recipes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/remote_sessions.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/remote_sources.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/remotes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/secret_store.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/server_records.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/table_correction.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/transcript_tiles.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/viewer_sessions.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/models/views.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/node/api.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/node/app.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/node/resources.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/plugins.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/providers/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/providers/base.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/providers/http.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/providers/local.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/providers/memory.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/providers/node.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/providers/operations.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/providers/remote.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/providers/wire.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/agent_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/ai_chat_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/ai_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/browse_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/data_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/dataset_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/dataset_scan_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/desktop_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/drop_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/gcloud_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/import_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/license_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/page_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/project_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/segment_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/settings_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/surface_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/system_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/telemetry_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/tool_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/transfer_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/update_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/routes/volume_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/contacts.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/export.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/importers.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/isosurface.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/labels.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/levels.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/marching.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/mesh.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/nets.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/preview.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/refine.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/sections.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/store.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/surface/suggest.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/tile_batch.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/addHEColumns.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/boundary_mask.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/brightfield.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/cell_features.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/channel_file.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/colormaps.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/dataset_marks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/dicom_wsi.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/dir_listing.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/dir_search.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/display_curve.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/fast_png.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/file_transfer.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/fs_places.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/fullConversion.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/gene_groups.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/head_cache.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/host_policy.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/image_pyramid.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/jit.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/label_kernels.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/label_overlay.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/layer_composite.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/mask_polygon.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/memory_pyramid.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/native_dialog.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/ngff_transform.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/ome_zarr.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/pixel_scale.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/remote_image.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/remote_store.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/safe_pickle.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/segmentation_pyramid.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/sftp.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/smallestenclosingcircle.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/source_image.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/spatial_index.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/spatial_scene.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/tenx_matrix.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/tiff_region.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/tiff_series.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/tiffsurgeon.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/xenium_cells.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/utils/xenium_focus.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/axes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/brick_serve.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/bricks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/chunk_cache.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/labels.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/measure.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/model.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/objects.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/pin.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/plane_view.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/planes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/prefetch.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/provenance.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/qc3d.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/reduce.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/section_cells.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/serve.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/sources/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/sources/dicom.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/sources/ims.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/sources/ims_index.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/sources/memory.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/sources/ngff.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/sources/tiff.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/tracking.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/viewspec.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/windows.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/volume/zprofile.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server/warmup.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/server_cli.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/agent_hooks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/batch.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/cli.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/client.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/config.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/dataset.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/environment.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/flask_hooks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/identity.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/node_hooks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/performance.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/queue.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/redact.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/report.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/sample.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/schema.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/telemetry/uploader.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/test.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/updates.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/vision/__init__.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/vision/cli.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/vision/model_files.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/vision/propagate.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/vision/sam.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/vision/sam_backend.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/vision/sam_video.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/vision/sam_weights.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora/vision/segment.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora.egg-info/SOURCES.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora.egg-info/dependency_links.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora.egg-info/entry_points.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora.egg-info/requires.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/plexora.egg-info/top_level.txt +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/setup.cfg +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_architecture.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_artifacts.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_cell_gallery.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_explain_cell.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_future_modality.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_gate_panel.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_gate_sampling.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_gating.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_gating_dataset.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_http_capabilities.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_jobs.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_policy_scopes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_registry.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_render.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_render_formats.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_render_layers.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_render_node.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_report.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_roi.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_routes_guard.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_scene.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_scope.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_session.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_undo.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_vertical_slice.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_viewer_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_agent_volume.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_bench.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_chat.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_chat_panel.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_route_bench.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_setup.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_skills.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_tasks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ai_token.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_anndata_adapter.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_api_dataset.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_api_store.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_app_router.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_app_shell.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_auth_token.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_autogate_units.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_bench_remote.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_bench_run_arms.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_bin_tiles.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_blank_frame.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_bookmarks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_boundary_mask.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_bridge_approval.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_bridge_handoff.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_bridge_mcp.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_brightfield_detection.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_brightfield_pipeline.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_brightfield_reader.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_brightfield_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_browse_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_browser_guard.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_canvas_hint_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_carry_over.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_cell_color_layer.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_cell_features.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_cell_mode_control.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_centroid_tiles.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_channel_auto_revert.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_channel_fade_client.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_channel_names_modal.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_channel_names_sidecar.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_channel_names_upload.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_channel_overview.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_channel_rename_state.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_channel_row_position.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_classify_columns.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_cli.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_colormaps.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_column_classifier_css.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_config_store.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_connect.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_connection_modal.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_consistency.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_core_tools.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_csv_adapter.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_csv_xyz.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_data_location.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_database_model.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_datalayer_requests.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dataset_answers.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dataset_build.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dataset_builder_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dataset_changed.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dataset_nav.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dataset_plan.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dataset_remote.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dataset_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dataset_scan.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dataset_scan_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dataset_strip.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dataset_web.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_datasets_api.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_datasets_api_on_a_node.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_datasets_registry.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_derive_anndata_channel_names.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_desktop_bridge.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_desktop_cli.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_desktop_menu.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_desktop_process.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_desktop_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_detect_data_type.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dicom_assembly.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dicom_detection.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dicom_pyramid.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dicom_registration.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dicom_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dir_listing.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_dir_search.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_display_curve.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_docs_coverage.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_docs_docstrings.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_docs_envvars.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_docs_examples.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_docs_freshness.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_docs_links.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_docs_signatures.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_draw_toolbar_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_drop_plan.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_drop_router.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_file_explorer.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_file_location.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_file_transfer_node.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_files_server.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_fs_places.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gate_not_called_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_3d.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_experience.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_hierarchy.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_log_layer.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_panel_replay.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_planes_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_qc_exclusion.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_replan.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gating_split_views.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_gcloud.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_hd_default.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_hd_slider_domain.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_head_cache.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_home_landing.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_host_policy.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_icon_names.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_image_cells.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_image_pyramid.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_image_status.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_import_costs_nothing.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_import_dialog.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_import_entry_points.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_import_from_a_node.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_import_help.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_import_progressive.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_import_proposal.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_import_roles.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_import_routes_json_errors.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_import_sample_association.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_import_sample_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ims_index.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ims_masks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_jupyter_viewer.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_label_gpu.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_label_gpu_parity.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_label_outlines.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_label_overlay.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_label_region.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_label_tile_lifecycle.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_launch_context.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_launch_state.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_layer_channel_panel.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_layer_draw.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_layer_jobs.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_layer_manager.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_layer_sources.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_layer_spec.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_layer_state.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_layer_transform.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_layer_visibility.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_license_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_license_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_license_transcriptomics.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_license_visibility.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_license_volume.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_licensing_cli.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_licensing_enforcement.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_licensing_hardening.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_licensing_hpc.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_licensing_manifest.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_licensing_plugins.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_lifetime.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_load_progress.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_logging.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_machine_chip.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_magic_select_wording.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_manifest.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_marker_split.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_mask_formats.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_mask_without_table.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_mcp_gating.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_mcp_http.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_mcp_job_streaming.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_mcp_link.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_mcp_profiles.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_mcp_qc.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_mcp_server.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_mcp_stdio.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_memory_adapter.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_memory_datasource.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_memory_pyramid.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_metadata_columns.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_mini_map.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_nan_tables.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_nav_shortcuts.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_nearest_cell.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_nearest_cell_3d.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_cell_features.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_direct_routing.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_disconnect.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_dynamic.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_image.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_image_pyramid.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_image_type.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_label_volume.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_mask_status.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_new_formats.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_plane_index.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_reconnect.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_surfaces.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_table.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_node_warm_and_cache.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_notebook_env.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_notebook_mode.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_ome_zarr_reader.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_open_project.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_optional_segmentation.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_page_assets.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_page_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_parquet_tables.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_path_drop.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_paths.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_physical_coordinates.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_pixel_scale.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_pixel_size.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_plane_cells_route.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_plane_index.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_plugin_boundary.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_plugin_css_boundary.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_plugin_layers.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_plugin_panel_standard.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_plugins.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_popover_menu.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_popover_portal.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_presets_nuclear.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_prime_hot_code.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_project_bind.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_project_edit_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_project_layer_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_project_record.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_project_title.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_artifacts_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_bench.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_blur_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_candidate_noise.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_cell_rules.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_cells_derive.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_cells_exports.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_cells_frame.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_check_sampling.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_columns.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_consolidate.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_cycle_rule.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_delegated_run_fixes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_detectors.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_digest.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_geojson_member.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_hover_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_live_run_fixes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_magic_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_magic_select.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_picker_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_provenance.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_refine.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_refine_tool.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_registration.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_registration_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_registration_report.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_results.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_rework.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_scan.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_score_fields.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_segment_tool.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_session_checks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_session_refine.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_stack.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_tool_surface.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_units.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_qc_visual_tools.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_recipes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_reconnect.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_refresh_dataset.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_register_anndata_datasource.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_register_image_datasource.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_register_zarr_image_datasource.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_release_script.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_chunk_cache.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_connect.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_dicom.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_discovery.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_file.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_globe.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_health.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_image_provider.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_image_status.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_ims.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_jobs.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_labels.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_locator.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_picture.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_state.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_tables.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_remote_tiff.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_rename_channels.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_rename_channels_json.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_render_clipboard.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_requirements_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_resource_status_notice.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_roi_cell_regions.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_roi_magic_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_safe_pickle.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_scimappro_plugin.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_secret_store.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_section_cells.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_security_headers.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_segment_service_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_segmentation_3d.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_segmentation_mapping.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_segmentation_mode_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_segmentation_pyramid.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_segmentation_wait.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_selection.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_server_records.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_session_expiry.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_session_mirror.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_session_walltime.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_settings_page.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_settings_remotes_page.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_settings_telemetry_page.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_settings_webdata_page.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_sftp.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_shared_roots.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_sidebar_scoping.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_single_image_import.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_slider.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_slider_css.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_source_image_core.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_spatial_index.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_spatial_scene.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_spatialdata_adapter.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_spatialdata_image_import.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_stack_contrast_client.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_staged_progress.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_subprocess_flags.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_surface_agent.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_surface_engine.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_surface_layer.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_surface_perf.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_surface_phase2.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_table_correction.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_table_progress.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_agent.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_cli.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_client.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_config.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_dataset.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_hooks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_hooks_cost.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_node.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_privacy.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_queue.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_schema.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_tiles.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_telemetry_uploader.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_tenx_matrix.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_thumbnail_rgb.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_tiff_hyperstack.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_tiff_region.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_tile_batch.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_tile_colorize.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_tile_url.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_toast.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_tool_assets.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_tool_cards.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_tool_coexistence.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_tool_switching.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_tooltip.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_transcript_cost.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_transcript_tiles.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_transfer_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_unreachable_node.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_updates.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_url_helpers.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_view_menu.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_view_snapshot_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_view_state_client.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_view_transform.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_view_transform_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_viewer_3d_client.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_viewer_color_by.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_viewer_error_state.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_viewer_loader.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_viewer_sessions.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_vision_first.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_vision_sam.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_vision_sam_real.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_vision_segment.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_visium_hd_import.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_visium_import.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_vocabulary_learned.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_backend.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_bricks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_bricks_serve.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_chunk_cache.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_core.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_deep_stacks.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_depth_levels.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_dicom.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_fluid_planes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_labels.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_level_cache.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_magic.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_memory.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_objects_route.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_pin.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_plane_read_ahead.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_propagate.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_remote.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_routes.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_sections.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_time_series.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_volume_window_provisional.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_wide_features.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_xenium_cells.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_xenium_focus.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_xss_sinks_js.py +0 -0
- {plexora-0.0.35 → plexora-0.0.36}/tests/test_zarr_write_retry.py +0 -0
|
@@ -151,6 +151,8 @@ def describe(capability) -> dict:
|
|
|
151
151
|
The descriptor id is `plexora:<capability name>`; the tool name is what a
|
|
152
152
|
peer calls (`POST /agent/v1/capabilities/<tool_name>`, or the MCP tool).
|
|
153
153
|
"""
|
|
154
|
+
from plexora.agent.schemas import compact_schema
|
|
155
|
+
|
|
154
156
|
entitlement = capability.entitlement if capability.entitlement not in (None, "free") \
|
|
155
157
|
else None
|
|
156
158
|
return {
|
|
@@ -165,7 +167,9 @@ def describe(capability) -> dict:
|
|
|
165
167
|
"execution": capability.execution,
|
|
166
168
|
"viewer_required": bool(capability.viewer_required),
|
|
167
169
|
"entitlement": entitlement,
|
|
168
|
-
|
|
170
|
+
# What a peer shows a model: pydantic's schema less what says
|
|
171
|
+
# nothing to it (`schemas.compact_schema`); Plexora validates the call.
|
|
172
|
+
"input_schema": compact_schema(capability.input_model.model_json_schema())
|
|
169
173
|
if capability.input_model else None,
|
|
170
174
|
"version": capability.version,
|
|
171
175
|
"tags": [str(tag) for tag in capability.tags],
|
|
@@ -214,11 +214,12 @@ class RenderInput(ProjectInput):
|
|
|
214
214
|
description="Regions to outline over the picture "
|
|
215
215
|
"(GeoJSON or boxes, full-resolution "
|
|
216
216
|
"pixels).")
|
|
217
|
+
#: Ones that cannot be drawn are listed in the manifest's not_rendered,
|
|
218
|
+
#: with the reason.
|
|
217
219
|
layers: Literal["visible", "none"] | list[str] = Field(
|
|
218
220
|
"visible", description="The scene's other layers to draw over the image: "
|
|
219
221
|
"'visible' (as the viewer shows them), 'none', or a list "
|
|
220
|
-
"of layer ids.
|
|
221
|
-
"the manifest's not_rendered, with the reason.")
|
|
222
|
+
"of layer ids.")
|
|
222
223
|
view: str | None = Field(
|
|
223
224
|
None, max_length=48,
|
|
224
225
|
description="For a z-stack (inspect_volume): which plane or projection to draw -- "
|
|
@@ -23,6 +23,62 @@ class AgentModel(BaseModel):
|
|
|
23
23
|
model_config = ConfigDict(extra="forbid")
|
|
24
24
|
|
|
25
25
|
|
|
26
|
+
def compact_schema(schema: Any) -> Any:
|
|
27
|
+
"""An input model's JSON schema as a model is shown it, with what pydantic
|
|
28
|
+
adds that says nothing to the model taken out -- and nothing a call could
|
|
29
|
+
use: validation is the model's own, never this schema's.
|
|
30
|
+
|
|
31
|
+
- `title` on every property and model (the property's name already says it);
|
|
32
|
+
- an optional field's `anyOf: [X, {"type": "null"}]` with `default: null`
|
|
33
|
+
is X: leaving the field out is the null (a field whose default is not
|
|
34
|
+
null, or one that is required, keeps its null branch, which then means
|
|
35
|
+
something);
|
|
36
|
+
- a tagged union's `discriminator` mapping beside its `oneOf`: each branch
|
|
37
|
+
carries its tag as a `const`.
|
|
38
|
+
|
|
39
|
+
On render_region, whose options are nested models, about a fifth."""
|
|
40
|
+
if isinstance(schema, list):
|
|
41
|
+
return [compact_schema(item) for item in schema]
|
|
42
|
+
if not isinstance(schema, dict):
|
|
43
|
+
return schema
|
|
44
|
+
out = {}
|
|
45
|
+
for key, value in schema.items():
|
|
46
|
+
if key == "title" and isinstance(value, str):
|
|
47
|
+
continue
|
|
48
|
+
if key == "discriminator" and "oneOf" in schema:
|
|
49
|
+
continue
|
|
50
|
+
if key in _VALUES:
|
|
51
|
+
out[key] = value # data, not schema: kept byte for byte
|
|
52
|
+
elif key in ("properties", "$defs", "definitions") and isinstance(value, dict):
|
|
53
|
+
required = set(schema.get("required") or ()) if key == "properties" else None
|
|
54
|
+
out[key] = {name: (_without_null(compact_schema(node))
|
|
55
|
+
if required is not None and name not in required
|
|
56
|
+
else compact_schema(node))
|
|
57
|
+
for name, node in value.items()}
|
|
58
|
+
else:
|
|
59
|
+
out[key] = compact_schema(value)
|
|
60
|
+
return out
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
#: Schema keywords whose value is data (a default, an example), never walked.
|
|
64
|
+
_VALUES = ("default", "const", "enum", "examples", "required")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _without_null(node: Any) -> Any:
|
|
68
|
+
"""An optional property's schema without its null branch, when null is
|
|
69
|
+
only its default (`compact_schema`)."""
|
|
70
|
+
if not isinstance(node, dict) or node.get("default", None) is not None:
|
|
71
|
+
return node
|
|
72
|
+
branches = node.get("anyOf")
|
|
73
|
+
if not isinstance(branches, list) or len(branches) != 2 or {"type": "null"} not in branches:
|
|
74
|
+
return node
|
|
75
|
+
other = next(b for b in branches if b != {"type": "null"})
|
|
76
|
+
rest = {k: v for k, v in node.items() if k not in ("anyOf", "default")}
|
|
77
|
+
if not isinstance(other, dict) or set(other) & set(rest):
|
|
78
|
+
return node
|
|
79
|
+
return {**other, **rest}
|
|
80
|
+
|
|
81
|
+
|
|
26
82
|
def _trim(text: str, limit: int) -> str:
|
|
27
83
|
"""`text` cut to `limit` characters: at the last sentence end in the
|
|
28
84
|
second half of the limit, else the last word, then an ellipsis."""
|
|
@@ -56,13 +112,14 @@ class NoInput(AgentModel):
|
|
|
56
112
|
|
|
57
113
|
|
|
58
114
|
#: What a `qc` field says, wherever an estimate or a sample takes one
|
|
59
|
-
#: (plexora/agent/cell_exclusions.py).
|
|
115
|
+
#: (plexora/agent/cell_exclusions.py). Inside a gating session the session's
|
|
116
|
+
#: own setting applies; no effect where QC was never run; `off` also when QC
|
|
117
|
+
#: is suspected wrong.
|
|
60
118
|
QC_FIELD_DESCRIPTION = (
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"session the session's own setting applies. No effect where QC was never run.")
|
|
119
|
+
"QC failures left out of this estimate, sample or picture (the gate still applies to "
|
|
120
|
+
"every cell). strict (default): cells QC called exclude or warn, and the cells QC "
|
|
121
|
+
"flagged this marker unreliable in; exclude: warn calls kept; off: QC ignored (only "
|
|
122
|
+
"when the user asks).")
|
|
66
123
|
|
|
67
124
|
|
|
68
125
|
class QcInput(AgentModel):
|
|
@@ -118,15 +118,20 @@ def status_input(limit_decisions):
|
|
|
118
118
|
"mirror into (defaults to the one mirrored before).")
|
|
119
119
|
pause: bool | None = Field(None, description="Pause (true) or resume (false) the "
|
|
120
120
|
"session.")
|
|
121
|
+
detail: Literal["brief", "full"] = Field(
|
|
122
|
+
"brief", description="brief: state, progress, counts, and the units still open "
|
|
123
|
+
"or left for a person, by state and why; full: every "
|
|
124
|
+
"unit's fields, the checks and scan, the residual, the "
|
|
125
|
+
"budget spent, mirroring, the delegate block, the "
|
|
126
|
+
"vocabulary and the reading guide.")
|
|
127
|
+
guide: bool = Field(False, description="Send the reading guide packets point into "
|
|
128
|
+
"(`evidence.guide`, `answer_schema.see`): once, before you "
|
|
129
|
+
"answer packets yourself.")
|
|
121
130
|
known_guide: str | None = Field(None, description="The `guide_version` you hold: the "
|
|
122
131
|
"reading guide is then not sent again.")
|
|
123
132
|
units: Literal["open", "all"] = Field(
|
|
124
133
|
"open", description="open: list only the units still to settle and those left "
|
|
125
134
|
"for a person (the counts cover the rest); all: every unit.")
|
|
126
|
-
detail: Literal["brief", "full"] = Field(
|
|
127
|
-
"brief", description="brief: the units list capped (with a count of the rest), "
|
|
128
|
-
"the residual as its top rows plus totals, no strictness "
|
|
129
|
-
"table or vocabulary; full: all of it.")
|
|
130
135
|
limits: dict[str, Literal[limit_decisions]] | None = Field(
|
|
131
136
|
None, description="Answers to the session's limit questions (`requests` of a "
|
|
132
137
|
"`waiting_for_user` result), by unit: `continue` grants another "
|
|
@@ -249,6 +254,15 @@ class SessionTools:
|
|
|
249
254
|
return {}
|
|
250
255
|
|
|
251
256
|
def status_extra(self, engine, detail="brief") -> dict:
|
|
257
|
+
"""More fields for the full status (`detail: full`)."""
|
|
258
|
+
return {}
|
|
259
|
+
|
|
260
|
+
def brief_unit(self, unit):
|
|
261
|
+
"""What a brief status shows of one listed unit, under its id."""
|
|
262
|
+
return None
|
|
263
|
+
|
|
264
|
+
def brief_extra(self, engine) -> dict:
|
|
265
|
+
"""More fields for the brief status (a workflow's checks, say)."""
|
|
252
266
|
return {}
|
|
253
267
|
|
|
254
268
|
def status_input_model(self):
|
|
@@ -567,6 +581,10 @@ class SessionTools:
|
|
|
567
581
|
paused=bool(inp.pause), paused_by="agent" if inp.pause else None)
|
|
568
582
|
return {"session_id": inp.session_id, "paused": bool(inp.pause), "state": state,
|
|
569
583
|
"progress": progress}
|
|
584
|
+
# The reading guide (~20k characters) goes to a caller that asks for
|
|
585
|
+
# it -- one about to answer packets (`guide`), or the whole status --
|
|
586
|
+
# never to one asking how the session stands.
|
|
587
|
+
send_guide = inp.guide or inp.detail == "full"
|
|
570
588
|
with self.engine_for(call, inp.session_id, st=st) as engine:
|
|
571
589
|
record = engine.record
|
|
572
590
|
if inp.reattach_viewer:
|
|
@@ -575,28 +593,34 @@ class SessionTools:
|
|
|
575
593
|
view_id=inp.view_id or mirror_.get("view_id"))
|
|
576
594
|
replay = record.get("outstanding_packet") \
|
|
577
595
|
if inp.reattach_viewer and inp.replay_mirror else None
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
596
|
+
guide = self.guide(record["options"].get("reading"), inp.known_guide) \
|
|
597
|
+
if send_guide else {}
|
|
598
|
+
if inp.detail == "brief":
|
|
599
|
+
out = {**self.brief(engine, st, inp), **guide}
|
|
600
|
+
if guide:
|
|
601
|
+
out.pop("guide", None)
|
|
602
|
+
else:
|
|
603
|
+
units = [self.unit_row(u) for u in self.listed_units(record, inp.units)]
|
|
604
|
+
shown, omitted = _capped(units, inp.units)
|
|
605
|
+
out = {"session_id": inp.session_id, "state": record["state"],
|
|
606
|
+
"mode": record["options"]["mode"], "images": record["images"],
|
|
607
|
+
"progress": engine.progress(), "units": shown,
|
|
608
|
+
"units_omitted": omitted, "truncated": omitted > 0,
|
|
609
|
+
"used": record.get("used"),
|
|
610
|
+
"estimated_vision_tokens": budgets.vision_tokens(
|
|
611
|
+
(record.get("used") or {}).get("pixels", 0)),
|
|
612
|
+
"summary": self.summary_of(record), **guide,
|
|
613
|
+
"mirror": record.get("mirror"), "control": st.control(inp.session_id),
|
|
614
|
+
"outstanding_packet": record.get("outstanding_packet"),
|
|
615
|
+
"receipts": len(record.get("receipts") or []),
|
|
616
|
+
"replayed": len(record.get("replayed") or []),
|
|
617
|
+
"limit_requests": [self.limit_brief(u["limit_request"])
|
|
618
|
+
for u in engine.waiting_for_user()],
|
|
619
|
+
**self.status_extra(engine, inp.detail),
|
|
620
|
+
**self.delegate_block(record, inp.session_id)}
|
|
621
|
+
models = engine.models_used()
|
|
622
|
+
if models:
|
|
623
|
+
out["models"] = models
|
|
600
624
|
if replay and not st.control(inp.session_id).get("viewer_detached"):
|
|
601
625
|
try:
|
|
602
626
|
packet, _ = st.read_packet(inp.session_id, replay)
|
|
@@ -606,6 +630,65 @@ class SessionTools:
|
|
|
606
630
|
out["mirror"] = self.mirror(call, inp.session_id, packet, replay=True)
|
|
607
631
|
return out
|
|
608
632
|
|
|
633
|
+
def brief(self, engine, st, inp) -> dict:
|
|
634
|
+
"""The status by default: what a person asks of a session -- its state,
|
|
635
|
+
progress and counts, and the units still open or left for a person,
|
|
636
|
+
grouped by type and state and under `why` by the reason each closed
|
|
637
|
+
with (`brief_unit` says what is shown of one). Whatever waits on
|
|
638
|
+
someone (a limit question, a pause) is added when there is one;
|
|
639
|
+
`detail: full` has the rest."""
|
|
640
|
+
record = engine.record
|
|
641
|
+
progress = engine.progress()
|
|
642
|
+
summary = self.summary_of(record)
|
|
643
|
+
listed = self.listed_units(record, inp.units)
|
|
644
|
+
limit = MAX_LIST if inp.units == "all" else MAX_STATUS_UNITS
|
|
645
|
+
groups: dict = {}
|
|
646
|
+
for unit in listed[:limit]:
|
|
647
|
+
key = (unit.get("type"), unit.get("state"))
|
|
648
|
+
name = str(unit.get("id") or unit.get("channel") or unit.get("marker"))
|
|
649
|
+
groups.setdefault(key, {}).setdefault(unit.get("reason"), {})[name] = \
|
|
650
|
+
self.brief_unit(unit)
|
|
651
|
+
rows = []
|
|
652
|
+
for (kind, state), by_why in groups.items():
|
|
653
|
+
group = {**({"type": kind} if kind else {}), "state": state}
|
|
654
|
+
plain = by_why.pop(None, None)
|
|
655
|
+
if plain:
|
|
656
|
+
group["units"] = plain
|
|
657
|
+
if by_why:
|
|
658
|
+
group["why"] = dict(sorted(by_why.items(),
|
|
659
|
+
key=lambda item: (-len(item[1]), item[0])))
|
|
660
|
+
rows.append(group)
|
|
661
|
+
out = {"session_id": inp.session_id, "state": record["state"],
|
|
662
|
+
"mode": record["options"]["mode"], "images": record["images"],
|
|
663
|
+
"progress": {k: v for k, v in progress.items()
|
|
664
|
+
if k in ("units_done", "units_total") or (
|
|
665
|
+
v and k in ("by_type", "waiting_for_user", "not_profiled",
|
|
666
|
+
"not_scanned"))},
|
|
667
|
+
"summary": {k: v for k, v in summary.items()
|
|
668
|
+
if k not in ("by_state", "units_done", "units_total")
|
|
669
|
+
and v not in (None, [], {}, "")},
|
|
670
|
+
"units": rows,
|
|
671
|
+
**({"units_omitted": len(listed) - limit} if len(listed) > limit else {}),
|
|
672
|
+
**self.brief_extra(engine)}
|
|
673
|
+
requests = [self.limit_brief(u["limit_request"]) for u in engine.waiting_for_user()]
|
|
674
|
+
if requests:
|
|
675
|
+
out["limit_requests"] = requests
|
|
676
|
+
control = st.control(inp.session_id)
|
|
677
|
+
held = {k: control.get(k) for k in ("paused", "paused_by", "stopped", "stopped_by")
|
|
678
|
+
if control.get(k)}
|
|
679
|
+
if held:
|
|
680
|
+
out["control"] = held
|
|
681
|
+
if record.get("outstanding_packet"):
|
|
682
|
+
out["outstanding_packet"] = record["outstanding_packet"]
|
|
683
|
+
if inp.reattach_viewer:
|
|
684
|
+
out["mirror"] = record.get("mirror")
|
|
685
|
+
if record["state"] not in self.FINISHED_STATES \
|
|
686
|
+
and record["options"].get("reading") == "once":
|
|
687
|
+
out["guide"] = "not sent: guide=true sends the reading guide packets point into"
|
|
688
|
+
out["more"] = ("detail='full' adds every unit's fields, the checks and scan, the "
|
|
689
|
+
"residual, the budget spent and mirroring")
|
|
690
|
+
return out
|
|
691
|
+
|
|
609
692
|
def finish(self, call, inp):
|
|
610
693
|
from plexora.agent import jobs, registry
|
|
611
694
|
|
|
@@ -468,7 +468,7 @@ def run_session(session, project, markers, agent, *, mode="apply", limit=400, op
|
|
|
468
468
|
result = _ok(invoke(session, "gating_answer", {
|
|
469
469
|
"session_id": sid, "packet_id": packet["packet_id"],
|
|
470
470
|
"answer": agent.answer(packet)}))["next"]
|
|
471
|
-
status = _ok(invoke(session, "gating_session_status", {"session_id": sid,
|
|
471
|
+
status = _ok(invoke(session, "gating_session_status", {"session_id": sid, "detail": "full",
|
|
472
472
|
"known_guide": started.get(
|
|
473
473
|
"guide_version")}))
|
|
474
474
|
status["sent_to_agent"] = sent
|
|
@@ -652,7 +652,8 @@ def run_scene(session, made, arm, agent_style, *, seed=0, cell_um=25.0):
|
|
|
652
652
|
finish_answer = invoke(session, "qc_session_finish", {"session_id": sid})
|
|
653
653
|
agent_text.see(finish_answer["result"])
|
|
654
654
|
status_answer = invoke(session, "qc_session_status", {"session_id": sid,
|
|
655
|
-
"units": "all"
|
|
655
|
+
"units": "all",
|
|
656
|
+
"detail": "full"})
|
|
656
657
|
agent_text.see(status_answer["result"])
|
|
657
658
|
status = status_answer["result"]
|
|
658
659
|
document = results.load(project)
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
its calls billed through the gateway
|
|
6
6
|
ai.run_status one run (by run id or job id), or the recent ones
|
|
7
7
|
ai.run_control pause / resume / stop the run's session
|
|
8
|
-
ai.balance the
|
|
9
|
-
run of this project would be quoted
|
|
8
|
+
ai.balance the organisation's credit, the price list, and what
|
|
9
|
+
a run of this project would be quoted (its ceiling)
|
|
10
10
|
|
|
11
11
|
`/ai/v1` (server/routes/ai_routes.py) and MCP reach these through
|
|
12
12
|
`registry.invoke`, so receipts and audit lines are the same whoever asks.
|
|
@@ -42,6 +42,15 @@ AI_EVENTS = ("ai_run", "ai_context", "ai_usage", "ai_paused", "ai_finished")
|
|
|
42
42
|
#: Credits are 10,000 micro-dollars (the gateway's `credit_micro`).
|
|
43
43
|
CREDIT_MICRO = 10_000
|
|
44
44
|
|
|
45
|
+
#: How a run is charged, beside its estimate (`ai_balance`): the gateway's
|
|
46
|
+
#: ledger charges a declared run min(metered calls, quote) and holds the
|
|
47
|
+
#: quote from the one organisation wallet while it runs.
|
|
48
|
+
CHARGING = ("each estimate is the quote a run is declared with: up to that many credits. Every "
|
|
49
|
+
"model call is metered and the run is charged what its calls cost, never more than "
|
|
50
|
+
"the quote, which is held from the wallet while the run lasts. The wallet is the "
|
|
51
|
+
"organisation's one AI wallet, which every product's AI -- a Plexora run, a "
|
|
52
|
+
"conversation -- draws on.")
|
|
53
|
+
|
|
45
54
|
|
|
46
55
|
def run_id_for(job_id: str) -> str:
|
|
47
56
|
return "air_" + str(job_id).removeprefix("job_")
|
|
@@ -78,8 +87,8 @@ def _workflow(kind):
|
|
|
78
87
|
|
|
79
88
|
class RunInput(AgentModel):
|
|
80
89
|
kind: Literal["gating", "contrast", "qc"] = Field(
|
|
81
|
-
description="gating: Auto Gating of the
|
|
82
|
-
"
|
|
90
|
+
description="gating: Auto Gating of the markers; contrast: how bright each marker is "
|
|
91
|
+
"drawn, no gating; qc: AutoQC of the image.")
|
|
83
92
|
project: str
|
|
84
93
|
markers: list[str] | None = Field(None, max_length=200, description="gating, contrast: the "
|
|
85
94
|
"markers (default: every marker of the table).")
|
|
@@ -91,21 +100,22 @@ class RunInput(AgentModel):
|
|
|
91
100
|
resume_session: str | None = Field(None, description="Continue this paused session (after "
|
|
92
101
|
"a credit pause, say) instead of starting one.")
|
|
93
102
|
dev: bool = Field(False, description="The gateway's dev route (internal testing accounts "
|
|
94
|
-
"only
|
|
103
|
+
"only).")
|
|
95
104
|
model: str | None = Field(None, max_length=80, description="With dev only: the model to use.")
|
|
96
105
|
units_per_worker: int | None = Field(None, ge=1, le=16, description="Units one rolling "
|
|
97
106
|
"worker covers (default: 1 marker, 4 QC units).")
|
|
107
|
+
#: Default: the session's `lanes`, chosen from the panel; more lanes
|
|
108
|
+
#: finish sooner.
|
|
98
109
|
parallel_markers: int | None = Field(None, ge=1, le=8, description="gating: markers answered "
|
|
99
|
-
"side by side, each lane
|
|
100
|
-
"the
|
|
101
|
-
"gates are the serial run's; more lanes finish sooner.")
|
|
110
|
+
"side by side, each lane its own workers; the gates are "
|
|
111
|
+
"the serial run's.")
|
|
102
112
|
start_options: dict | None = Field(None, description="Extra options for the session's start "
|
|
103
113
|
"(the workflow's own, e.g. QC's map_cell_um).")
|
|
114
|
+
#: A cheap text model normalises it (plexora.ai.context); empty: no call.
|
|
104
115
|
context: str | None = Field(None, max_length=1000, description="gating: the user's note about "
|
|
105
116
|
"the sample, as typed (\"melanoma from skin\", \"only gate CD3 and "
|
|
106
|
-
"CD8\")
|
|
107
|
-
"
|
|
108
|
-
"explicitly. Empty: no call, every marker.")
|
|
117
|
+
"CD8\"): read into the session's biology, narrowing the markers only "
|
|
118
|
+
"when it says so.")
|
|
109
119
|
|
|
110
120
|
|
|
111
121
|
class _Relay:
|
|
@@ -535,6 +545,7 @@ def balance(call, inp):
|
|
|
535
545
|
"affordable": credits * credit <= out["available_micro"],
|
|
536
546
|
**({"unavailable": why} if why else {}), **words}
|
|
537
547
|
out["estimates"] = estimates
|
|
548
|
+
out["charging"] = CHARGING
|
|
538
549
|
out["project"] = inp.project
|
|
539
550
|
return out
|
|
540
551
|
|
|
@@ -551,10 +562,12 @@ def capabilities():
|
|
|
551
562
|
return [
|
|
552
563
|
cap(name="ai.run_session", tool_name="ai_run_session",
|
|
553
564
|
purpose="Gate the project's markers or quality-control its image with Plexora AI, inside "
|
|
554
|
-
"Plexora: the session runs on a job and every decision is a model call
|
|
555
|
-
"
|
|
556
|
-
"
|
|
557
|
-
"
|
|
565
|
+
"Plexora: the session runs on a job and every decision is a model call, paid from "
|
|
566
|
+
"the organisation's AI credit wallet. The run is quoted before anything is spent "
|
|
567
|
+
"(ai_balance's estimate: the price per marker or channel times their number) and "
|
|
568
|
+
"the quote is a ceiling -- up to that many credits: each call is metered and the "
|
|
569
|
+
"run is charged what its calls cost, never more. An open viewer's agent panel "
|
|
570
|
+
"shows it. Resume a session paused for credit with resume_session.",
|
|
558
571
|
permission="reversible_write", input_model=RunInput, handler=run_session, execution="job",
|
|
559
572
|
writes=("gates", "rois", "qc"), persistent=True, egress="rendered_pixels",
|
|
560
573
|
reads=("image", "table", "mask", "rois")),
|
|
@@ -567,7 +580,8 @@ def capabilities():
|
|
|
567
580
|
permission="reversible_write", input_model=ControlInput, handler=run_control,
|
|
568
581
|
persistent=True, egress="metadata"),
|
|
569
582
|
cap(name="ai.balance", tool_name="ai_balance",
|
|
570
|
-
purpose="The
|
|
571
|
-
"of a project would be quoted
|
|
583
|
+
purpose="The organisation's AI credit wallet (every product's AI draws on it), the price "
|
|
584
|
+
"per marker / channel, and what a Plexora AI run of a project would be quoted: up "
|
|
585
|
+
"to that many credits, charged as metered.",
|
|
572
586
|
permission="read", input_model=BalanceInput, handler=balance, egress="metadata"),
|
|
573
587
|
]
|
|
@@ -121,7 +121,8 @@ def capabilities():
|
|
|
121
121
|
return [
|
|
122
122
|
cap(name="ai.chat_start", tool_name="ai_chat_start",
|
|
123
123
|
purpose="Start a Plexora AI conversation: an assistant inside Plexora that answers questions "
|
|
124
|
-
"about the user's projects by calling Plexora's tools, billed
|
|
124
|
+
"about the user's projects by calling Plexora's tools, billed to the organisation's AI "
|
|
125
|
+
"credits.",
|
|
125
126
|
permission="reversible_write", input_model=StartInput, handler=chat_start,
|
|
126
127
|
writes=("conversation",)),
|
|
127
128
|
cap(name="ai.chat_send", tool_name="ai_chat_send",
|
|
@@ -670,7 +670,8 @@ class DecisionRun:
|
|
|
670
670
|
first = self._await_setup(self.lanes[0], started)
|
|
671
671
|
if first.get("state") in ("stopped", "paused", "cancelled", "failed"):
|
|
672
672
|
return first
|
|
673
|
-
planned = _ok(self._invoke(self.wf.STATUS, {"session_id": self.session_id
|
|
673
|
+
planned = _ok(self._invoke(self.wf.STATUS, {"session_id": self.session_id,
|
|
674
|
+
"detail": "full"}))
|
|
674
675
|
started = {**started, "n_units": planned.get("n_units"), "channels": planned.get("channels")}
|
|
675
676
|
else:
|
|
676
677
|
first = None
|
|
@@ -1262,7 +1263,8 @@ class DecisionRun:
|
|
|
1262
1263
|
finished = None
|
|
1263
1264
|
if self.session_id and self.parallel > 1:
|
|
1264
1265
|
try:
|
|
1265
|
-
state = _ok(self._invoke(self.wf.STATUS, {"session_id": self.session_id
|
|
1266
|
+
state = _ok(self._invoke(self.wf.STATUS, {"session_id": self.session_id,
|
|
1267
|
+
"detail": "full"}))
|
|
1266
1268
|
self.peak_outstanding = int(state.get("outstanding_peak") or 0)
|
|
1267
1269
|
except Exception: # noqa: BLE001 -- a count for the summary only
|
|
1268
1270
|
pass
|
|
@@ -36,10 +36,8 @@ A cell table with cell-id/x/y roles; image channels and a mask for the looks.
|
|
|
36
36
|
3. Hand packets out as the start's `delegate` says (`how`). Its `brief` is a
|
|
37
37
|
worker's whole prompt: add no skill or guide text; keep only the lines it
|
|
38
38
|
returns. `lanes`: launch them all in one message. `waiting_for_user`: ask the user, pass their word as
|
|
39
|
-
`gating_session_status` `limits`; never answer for them.
|
|
40
|
-
|
|
41
|
-
guide is sent again. Without workers, answer packets yourself
|
|
42
|
-
(gate-packets) and start a new conversation
|
|
39
|
+
`gating_session_status` `limits`; never answer for them. Without workers,
|
|
40
|
+
answer packets yourself (gate-packets) and start a new conversation
|
|
43
41
|
every {{ENGINE.markers_per_worker}} markers or so: each call re-reads all
|
|
44
42
|
earlier packets.
|
|
45
43
|
4. Ask the user (`ask_user`) only what neither numbers nor panel settle:
|
|
@@ -18,7 +18,7 @@ A session `gating_session_status` finds.
|
|
|
18
18
|
|
|
19
19
|
## Decision logic
|
|
20
20
|
|
|
21
|
-
1. `gating_session_status`
|
|
21
|
+
1. `gating_session_status` with `guide: true` sends the `reading_guide` once:
|
|
22
22
|
judge every packet by it. Stop once `progress.units_done` rose by your
|
|
23
23
|
brief's number (default {{ENGINE.markers_per_worker}}); a brief with
|
|
24
24
|
`reader` (plus `tasks` or `parallel`): pass them on every call, count
|
|
@@ -141,7 +141,8 @@ numbers and flags; each picture's artifact id and what it shows.
|
|
|
141
141
|
(gating/qc-cells says how to tell an artifact QC caught from the marker's
|
|
142
142
|
own problem).
|
|
143
143
|
- Confidence words (`high`, `moderate`, `low`, ...) come from the session's
|
|
144
|
-
rule table (`gating_session_status` `
|
|
144
|
+
rule table (`gating_session_status` `detail: "full"` lists them under
|
|
145
|
+
`vocabulary`); report them as
|
|
145
146
|
given.
|
|
146
147
|
|
|
147
148
|
## Mutation policy
|
|
@@ -56,7 +56,8 @@ looks.
|
|
|
56
56
|
look on this image.
|
|
57
57
|
4. Without workers, start a fresh conversation per image when the panel is
|
|
58
58
|
large; continue with `gating_next` and the `session_id`.
|
|
59
|
-
5. `gating_session_status` shows each marker's `strategy` under
|
|
59
|
+
5. `gating_session_status` shows each marker's `strategy` (per image under
|
|
60
|
+
`dataset` with `detail: "full"`)
|
|
60
61
|
(the classes `compare_gates_across_images` gives: one aligned gate
|
|
61
62
|
`global_aligned`, a gate `per_batch`, `globally_informed_per_image`, or each
|
|
62
63
|
image `per_image`). Report it per marker, with the image as the unit.
|
|
@@ -77,9 +77,10 @@ the packet.
|
|
|
77
77
|
(gate-review).
|
|
78
78
|
- `gating_report` lists per marker the final gate, the Auto proposal, the
|
|
79
79
|
tier, the confidence, the flags and the decisions; `get_all_gates` shows
|
|
80
|
-
each gate's method; `export_gates` writes CSV files. Status `models`
|
|
81
|
-
which model answered each task when the user's
|
|
80
|
+
each gate's method; `export_gates` writes CSV files. Status `models`
|
|
81
|
+
(`detail: "full"`) shows which model answered each task when the user's
|
|
82
|
+
models file splits the work.
|
|
82
83
|
- A bulk pass a restart stopped resumes at the next `gating_next`
|
|
83
|
-
(`gating_session_status` `bulk` says
|
|
84
|
+
(`gating_session_status` `bulk` says when it is not running).
|
|
84
85
|
- A packet's `mirror` says whether the open viewer shows the same thing;
|
|
85
86
|
`viewer_not_available` while mirroring: the session goes on headless.
|
|
@@ -56,10 +56,10 @@ user's data; every export keeps every input row.
|
|
|
56
56
|
|
|
57
57
|
The packet is the authority on its own question: what you may answer is its
|
|
58
58
|
`allowed` list and its `answer_schema`, and every number you need is in its
|
|
59
|
-
`evidence`. The start (and `qc_session_status`) returns a
|
|
60
|
-
once; each packet names the entries it relies on in
|
|
61
|
-
schema in `answer_schema.see`. Pass `guide_version`
|
|
62
|
-
time and the guide is not sent again.
|
|
59
|
+
`evidence`. The start (and `qc_session_status` with `guide: true`) returns a
|
|
60
|
+
`reading_guide` once; each packet names the entries it relies on in
|
|
61
|
+
`evidence.guide` and its schema in `answer_schema.see`. Pass `guide_version`
|
|
62
|
+
back as `known_guide` next time and the guide is not sent again.
|
|
63
63
|
|
|
64
64
|
## When to use
|
|
65
65
|
|
|
@@ -106,12 +106,12 @@ suffixes; when the names do not say, `set_qc_cycles` states them.
|
|
|
106
106
|
reply carries the pass's `job_id`: wait on it with `job_wait` (it streams
|
|
107
107
|
the progress) rather than calling `qc_next` again and again, then call
|
|
108
108
|
`qc_next` once it is done.
|
|
109
|
-
A start (or `qc_session_status`) with `delegate` means the
|
|
110
|
-
file assigns QC tasks to models: do not answer packets
|
|
111
|
-
entry of `delegate.workers` whose `launch` is `now`,
|
|
112
|
-
its `brief` as the whole prompt and only
|
|
113
|
-
foreground, and wait for its lines (no wake-ups,
|
|
114
|
-
while it runs). One that returns `other_tasks <task>`: launch the worker
|
|
109
|
+
A start (or `qc_session_status` `detail: "full"`) with `delegate` means the
|
|
110
|
+
user's models file assigns QC tasks to models: do not answer packets
|
|
111
|
+
yourself. Launch the entry of `delegate.workers` whose `launch` is `now`,
|
|
112
|
+
on its `model`, with its `brief` as the whole prompt and only
|
|
113
|
+
`delegate.tools`, in the foreground, and wait for its lines (no wake-ups,
|
|
114
|
+
messages or status polls while it runs). One that returns `other_tasks <task>`: launch the worker
|
|
115
115
|
whose `tasks` hold that task (an `on_demand` one only then); one that
|
|
116
116
|
stops at its quota: launch its group again. One that returns
|
|
117
117
|
`other_tasks` naming the visual pass hands you a packet no worker takes:
|
|
@@ -1686,10 +1686,10 @@ def _build_ai_parser():
|
|
|
1686
1686
|
help="With experience: print the summary as JSON.")
|
|
1687
1687
|
_gating_limit_arguments(bench, "--on-limit", "--max-extensions")
|
|
1688
1688
|
|
|
1689
|
-
# Plexora's own harness: AI features with no external agent, billed
|
|
1690
|
-
#
|
|
1689
|
+
# Plexora's own harness: AI features with no external agent, billed to the
|
|
1690
|
+
# organisation's AI credits through the gateway (plexora/ai/harness).
|
|
1691
1691
|
run = subs.add_parser("run", help="Run an AI feature inside Plexora (no external agent), "
|
|
1692
|
-
"billed
|
|
1692
|
+
"billed to your organisation's AI credits.")
|
|
1693
1693
|
run.add_argument("run_target", choices=("gating", "contrast", "qc"),
|
|
1694
1694
|
help="gating: Auto Gating of the markers; contrast: auto contrast -- how "
|
|
1695
1695
|
"bright each marker is drawn, no gating; qc: AutoQC of the image.")
|
|
@@ -1744,12 +1744,12 @@ def _build_ai_parser():
|
|
|
1744
1744
|
trace.add_argument("--cache", action="store_true", help="The run's prompt-cache report.")
|
|
1745
1745
|
trace.add_argument("--json", dest="trace_json", action="store_true")
|
|
1746
1746
|
chat = subs.add_parser("chat", help="Talk to Plexora AI in the terminal: it answers by calling "
|
|
1747
|
-
"Plexora's tools, billed
|
|
1747
|
+
"Plexora's tools, billed to your organisation's AI credits.")
|
|
1748
1748
|
chat.add_argument("--resume", default=None, metavar="ID", help="Continue a conversation.")
|
|
1749
1749
|
chat.add_argument("--dev", action="store_true", help="Use the gateway's dev route (internal testing).")
|
|
1750
1750
|
chat.add_argument("--model", default=None, help="With --dev: the model to use.")
|
|
1751
1751
|
chat.add_argument("--gateway", default=None, help="Gateway URL (default: the BioCognia AI gateway).")
|
|
1752
|
-
credits = subs.add_parser("credits", help="
|
|
1752
|
+
credits = subs.add_parser("credits", help="Your organisation's AI credit balance and Plexora's recent usage.")
|
|
1753
1753
|
credits.add_argument("--days", type=int, default=30)
|
|
1754
1754
|
credits.add_argument("--dev", action="store_true")
|
|
1755
1755
|
credits.add_argument("--gateway", default=None)
|
|
@@ -865,7 +865,7 @@ window.PlexoraAgentPanel = (function () {
|
|
|
865
865
|
// with no marker matching an image channel): said, not hidden.
|
|
866
866
|
if (estimate.blocked) return { disabled: true, detail: String(estimate.blocked) };
|
|
867
867
|
if (estimate.unavailable || units <= 0) return { omit: true };
|
|
868
|
-
const cost =
|
|
868
|
+
const cost = `up to ${creditCount(estimate.credits)} credits`;
|
|
869
869
|
const skipped = (estimate.channels?.unmatched || []).length;
|
|
870
870
|
const detail = ` · ${plural(units, estimate.unit || kind.noun)}`
|
|
871
871
|
+ (estimate.confirm && skipped ? ` · ${skipped} without an image channel` : "");
|
|
@@ -23,8 +23,8 @@ def register(server, runtime):
|
|
|
23
23
|
return _answer(runtime, "gating.session_status", {})
|
|
24
24
|
|
|
25
25
|
@resource("plexora://gating/session/{session_id}", "gating-session",
|
|
26
|
-
"One gating session:
|
|
27
|
-
"its open questions.")
|
|
26
|
+
"One gating session: each marker's gate, state, confidence and why it needs "
|
|
27
|
+
"review; its progress and open questions.")
|
|
28
28
|
def session(session_id: str) -> str:
|
|
29
29
|
return _answer(runtime, "gating.session_status", {"session_id": session_id})
|
|
30
30
|
|