rigplane 2.1.2__tar.gz → 2.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rigplane-2.2.0/.github/pull_request_template.md +22 -0
- rigplane-2.2.0/.github/workflows/agent-review-gate.yml +85 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/AGENTS.md +49 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/CLAUDE.md +46 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/PKG-INFO +1 -1
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/CHANGELOG.md +17 -1
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/web.md +51 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/cli.md +8 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/pyproject.toml +1 -1
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/api_contract.py +22 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/discovery.py +41 -1
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/server.py +90 -18
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/web_routing.py +2 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/web_startup.py +13 -3
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_discovery_responder.py +16 -2
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_web_api_contract.py +2 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_web_server_coverage.py +41 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/uv.lock +1 -1
- {rigplane-2.1.2 → rigplane-2.2.0}/.claude/commands/analyze-failure.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.claude/commands/audit-ui.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.claude/commands/decompose-issue.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.claude/commands/generate-tests.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.claude/commands/next.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.claude/commands/refactor.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.claude/commands/regression-check.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.claude/commands/scan-issues.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.claude/commands/solve-issue.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.claude/skills/release/SKILL.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.github/ISSUE_TEMPLATE/epic.yml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.github/ISSUE_TEMPLATE/radio_report.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.github/ISSUE_TEMPLATE/ui-component.yml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.github/scripts/check-rebrand-allowlist.sh +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.github/workflows/docs.yml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.github/workflows/full.yml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.github/workflows/publish.yml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.github/workflows/quick.yml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.github/workflows/rebrand-gate.yml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.gitignore +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/.importlinter +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/ARCHITECTURE.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/CHANGELOG.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/CONTRIBUTING.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/LICENSE +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/README.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/ROADMAP.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/band-plans/_config.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/band-plans/arrl-hf.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/band-plans/broadcast.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/band-plans/iaru-r1.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/band-plans/utility.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/AUDIO_STREAMING_PROFILE.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/CNAME +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/EXTENDED_PROTOCOL_RESEARCH.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/PERFORMANCE.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/PROJECT.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/SECURITY.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/audio.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/auth.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/backends-icom7610-drivers.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/backends-icom7610.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/backends.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/commander.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/commands.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/exceptions.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/public-api-surface.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/radio.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/radios.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/rig-loader.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/rigctld.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/scope.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/sync.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/transport.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/api/types.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/architecture/open-core-policy.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/assets/scope-example.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/capabilities-matrix.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/contracts/diagnostic-bundle-v1.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/contracts/diagnostic-bundle-v2.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/audio-recipes.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/commands.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/configuration.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/connection.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/diagnostic-reports.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/ic705-usb-setup.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/ic7300-usb-setup.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/ic7610-usb-setup.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/ic9700-usb-setup.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/installation.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/profiles.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/quickstart.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/radios.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/rig-profiles.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/troubleshooting.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/web-ui.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/guide/wsjtx-setup.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/index.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/internals/architecture.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/internals/cli-design.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/internals/contributing.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/internals/github-project-workflow.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/internals/protocol.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/internals/reliability-semantics.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/internals/rfc-audio-v1-mini.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/operations/managed-runtime-packaging.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/opuslib-macos-fix.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/overrides/main.html +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/parity/README.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/parity/ic7610_command_matrix.json +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/parity/test_mapping.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-03-07-ui-architecture.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-05-desktop-companion-architecture.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-09-audio-backend-design.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-11-frontend-migration-plan.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-11-parity-matrix.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-11-presentation-architecture.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-11-rx-audio-trace.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-11-shared-frontend-runtime-contract.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-11-v2-lcd-runtime-audit.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-12-architecture-presentation.html +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-12-target-frontend-architecture.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-18-desktop-meters-panel.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-18-lcd-display-enhancements.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-18-mobile-ia.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-18-receiver-activation.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-18-spectrum-controls.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-18-ui-refinements-execution.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-19-lcd-layout-redesign-v2.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-19-lcd-layout-redesign.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-29-modularization-discovery.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-29-modularization-plan.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-29-panel-adapter-migration.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-04-29-ui-v1-deprecation-audit.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-05-03-diagnostic-data-collection-design.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-05-07-audio-route-resolver-design.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-05-08-audio-capability-probing.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-05-08-audio-codec-policy.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-05-08-audio-profile-policy-audit.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/2026-05-08-usb-audio-negotiation.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/archive/2026-03-04-dx-cluster.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/archive/2026-03-m5-m6-roadmap.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/archive/2026-04-19-lcd-twin-skins.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/build_orphan_report.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/classify_cycle_edges.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/cycles-classified.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/cycles.txt +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/discovery_graph.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/external-usage.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/file-inventory.json +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/file-inventory.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/import-graph.dot +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/importlinter-config-draft.ini +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/init-snapshot.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/orphan-candidates.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/tach-config-draft.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/test-inventory.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/discovery-artifacts/tooling-assessment.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/00-epic-final.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/00-epic.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/01-skeleton.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/02-core-foundationals.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/03-core-contracts.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/04-commands.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/05-profiles.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/06-scope.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/07-audio.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/08-runtime-radio.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/09-runtime-mixins.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/10-runtime-pollers.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/11-discovery-to-backends.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/12-cli.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/13-import-linter.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/14-followup-tests.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/15-followup-web-startup.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/2026-05-07-core-audio-pipeline-test-harness.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/plans/issue-drafts/2026-05-07-core-audio-route-resolver.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/radio-protocol.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/robots.txt +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/screenshots/amber-lcd.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/screenshots/hero.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/docs/screenshots/lcd-scope.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/.gitignore +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/README.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/eslint.config.js +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/index.html +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/package-lock.json +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/package.json +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/playwright.config.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/pnpm-lock.yaml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/apple-touch-icon.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/brand/lockup-dark.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/brand/lockup-light.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/brand/lockup-mono.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/brand/mark-dark.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/brand/mark-light.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/brand/mark-mono.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/brand/marketing/github-social-preview.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/brand/marketing/readme-banner.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/brand/wordmark-dark.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/brand/wordmark-light.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/brand/wordmark-mono.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicon-16.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicon-32.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicon-48.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicon.ico +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/ink/favicon-128.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/ink/favicon-16.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/ink/favicon-180.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/ink/favicon-192.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/ink/favicon-256.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/ink/favicon-32.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/ink/favicon-48.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/ink/favicon-512.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/ink/favicon-64.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/ink/favicon.ico +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/paper/favicon-128.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/paper/favicon-16.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/paper/favicon-180.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/paper/favicon-192.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/paper/favicon-256.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/paper/favicon-32.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/paper/favicon-48.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/paper/favicon-512.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/paper/favicon-64.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/paper/favicon.ico +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/transparent/favicon-128.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/transparent/favicon-16.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/transparent/favicon-180.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/transparent/favicon-192.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/transparent/favicon-256.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/transparent/favicon-32.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/transparent/favicon-48.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/transparent/favicon-512.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/favicons/transparent/favicon-64.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/manifest.json +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/og-image.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/pwa-192x192.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/pwa-512x512.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/public/twitter-card.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/App.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/app.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/assets/svelte.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/shared/Toast.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/BandPlanOverlay.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/DxOverlay.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/EiBiBrowser.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/ScopeSettingsPopover.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/SpectrumCanvas.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/SpectrumPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/SpectrumToolbar.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/WaterfallCanvas.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/__tests__/BandPlanOverlay.component.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/__tests__/DxOverlay.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/__tests__/EiBiBrowser.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/__tests__/SpectrumPanel.component.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/__tests__/SpectrumToolbar.component.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/__tests__/band-plan-overlay.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/__tests__/click-to-tune.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/__tests__/passband-geometry.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/__tests__/spectrum-panel-logic.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/__tests__/spectrum-toolbar.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/__tests__/tuning-indicator.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/band-plan-logic.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/passband-geometry.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/spectrum-logic.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components/spectrum/spectrum-toolbar-logic.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/AttenuatorControl.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/BandSelector.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/BottomSheet.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/CollapsiblePanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/ControlButtonDemo.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/InstallPrompt.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/PttFab.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/PullToRefresh.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/SegmentedButton.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/StatusBadge.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/ThemePicker.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/ValueControlLab.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/__tests__/AttenuatorControl.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/__tests__/BandSelector.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/__tests__/BottomSheet.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/__tests__/CollapsiblePanel.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/__tests__/InstallPrompt.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/__tests__/PullToRefresh.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/__tests__/SegmentedButton.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/__tests__/StatusBadge.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/__tests__/broadcast-presets.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/band-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/broadcast-presets.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/button-tokens.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/control-button.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/install-prompt-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/status-badge-style.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/BipolarRenderer.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/DiscreteRenderer.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/DualParamRenderer.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/HBarRenderer.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/KnobRenderer.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/ValueControl.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/__tests__/ValueControl.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/__tests__/value-control-core.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/index.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/skin.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/skins/ProfessionalKnob.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/skins/index.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/value-control-core.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/controls/value-control/value-control.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/dialogs/SendReportDialog.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/dialogs/__tests__/SendReportDialog.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/display/FrequencyDisplay.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/display/FrequencyDisplayInteractive.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/display/__tests__/FrequencyDisplay.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/display/__tests__/frequency-tuning.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/display/frequency-format.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/display/frequency-tuning.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/KeyboardHandler.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/LcdLayout.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/LeftSidebar.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/MobileNav.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/MobileRadioLayout.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/RadioLayout.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/RightSidebar.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/StatusBar.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/VfoHeader.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/__tests__/KeyboardHandler.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/__tests__/LeftSidebar.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/__tests__/MobileRadioLayout.component.svelte.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/__tests__/RadioLayout.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/__tests__/SpectrumPanelStub.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/__tests__/keyboard-map.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/__tests__/mobile-layout-logic.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/__tests__/mobile-nav.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/__tests__/top-row-visual-regression.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/__tests__/vfo-header.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/__tests__/vfo-layout-tokens.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/keyboard-map.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/layout-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/mobile-chip-bar.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/mobile-layout-logic.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/mobile-nav-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/responsive.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/shortcut-hints.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/layout/vfo-layout-tokens.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/meters/BarGauge.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/meters/LinearSMeter.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/meters/NeedleGauge.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/meters/SMeterDemo.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/meters/__tests__/BarGauge.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/meters/__tests__/LinearSMeter.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/meters/__tests__/NeedleGauge.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/meters/bar-gauge-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/meters/needle-gauge-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/meters/smeter-scale.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/AgcPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/AntennaPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/AudioRoutingControl.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/CwPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/DockMeterPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/DspPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/EssentialsPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/FilterPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/MemoryPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/MeterPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/MetersDockPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/ModePanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/RfFrontEnd.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/RitXitPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/RxAudioPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/ScanPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/TxPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/VoxPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/AgcPanel.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/AudioRoutingControl.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/CwPanel.component.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/DspPanel.component.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/DspPanel.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/FilterPanel.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/MeterPanel.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/MetersDockPanel.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/ModePanel.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/RfFrontEnd.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/RitXitPanel.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/RxAudioPanel.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/TxPanel.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/cw-panel-logic.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/dsp-panel-logic.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/__tests__/filter-controls.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/agc-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/audio-scope/AudioSpectrumCanvas.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/audio-scope/AudioSpectrumPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/audio-scope/__tests__/audio-spectrum-renderer.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/audio-scope/audio-spectrum-renderer.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/audio-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/cw-panel-logic.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/dsp-panel-logic.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/dsp-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/filter-controls.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/filter-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/AmberAfScope.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/AmberCockpit.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/AmberFilterGhost.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/AmberFrequency.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/AmberIndStrip.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/AmberLcdDisplay.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/AmberMemoryStrip.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/AmberScope.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/AmberSmeter.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/AmberSparkline.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/AmberTelemetryStrip.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/LcdContrastControl.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/LcdDisplayModeControl.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/VfoControlPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/__tests__/lcd-components.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/__tests__/scope-frame.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/lcd/lcd-vintage.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/meter-utils.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/meter-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/rf-frontend-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/rit-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/tx-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/vfo/DualVfoDisplay.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/panels/vfo/__tests__/DualVfoDisplay.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/fonts-digital.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/fonts.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/index.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/theme-switcher.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/amoled-black.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/ayu-dark.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/catppuccin-latte.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/catppuccin-mocha.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/crt-green.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/custom-ic7610.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/dracula.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/github-light.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/gruvbox-dark.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/gruvbox-light.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/high-contrast.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/index.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/lcd-blue.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/lcd-warm.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/nixie-tube.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/nord-light.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/nord.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/one-dark.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/solarized-dark.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/solarized-light.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/themes/tokyo-night.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/tokens.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/vfo-themes/crt-green.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/vfo-themes/index.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/vfo-themes/lcd-blue.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/theme/vfo-themes/nixie-tube.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/vfo/ActiveReceiverToggle.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/vfo/VfoOps.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/vfo/VfoPanel.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/vfo/__tests__/ActiveReceiverToggle.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/vfo/__tests__/VfoOps.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/vfo/__tests__/VfoPanel.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/vfo/vfo-ops-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/vfo/vfo-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/wiring/__tests__/double-click.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/wiring/__tests__/focus-mode-race.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/wiring/__tests__/keyboard-wiring.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/wiring/__tests__/state-adapter.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/wiring/__tests__/vfo-wiring.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/wiring/command-bus.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/wiring/double-click.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/components-v2/wiring/state-adapter.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/Button/ControlButton.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/Button/DotButton.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/Button/FillButton.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/Button/HardwareButton.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/Button/HardwarePlainButton.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/Button/StatusIndicator.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/Button/__tests__/ControlButton.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/Button/__tests__/ControlledHarness.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/Button/index.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/Button/roleMapping.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/Button/types.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/SegmentedControl/index.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/__tests__/drag-reorder.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/__tests__/migrate-legacy-storage.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/actions/keyboard.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/api/__tests__/diagnostics.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/api/diagnostics.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/audio/__tests__/audio-manager.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/audio/__tests__/constants.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/audio/__tests__/rx-player.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/audio/__tests__/tx-mic.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/audio/audio-manager.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/audio/constants.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/audio/rx-player.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/audio/tx-mic.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/data/__tests__/arrl-band-plan.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/data/arrl-band-plan.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/drag-reorder.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/gestures/gesture-recognizer.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/gestures/use-gesture.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/local-extensions/LocalExtensionsHost.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/local-extensions/__tests__/dock-layout.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/local-extensions/__tests__/host-api.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/local-extensions/__tests__/manifest.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/local-extensions/dock-layout.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/local-extensions/host-api.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/local-extensions/keyboard-scope.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/local-extensions/manifest.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/media/__tests__/media-session.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/media/media-session.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/migrate-legacy-storage.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/radio/filter-controls.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/radio/pending-focus.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/radio/pending-focus.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/renderers/__tests__/spectrum-renderer.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/renderers/__tests__/waterfall-renderer.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/renderers/spectrum-renderer.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/renderers/waterfall-renderer.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/__tests__/frontend-runtime.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/__tests__/scope-controller.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/adapters/audio-adapter.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/adapters/capabilities-adapter.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/adapters/lcd-chrome-adapter.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/adapters/panel-adapters.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/adapters/qsy-history-adapter.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/adapters/scope-adapter.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/adapters/tx-adapter.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/adapters/vfo-adapter.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/commands/panel-commands.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/frontend-runtime.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/index.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/props/panel-props.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/scope-controller.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/runtime/system-controller.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/__tests__/audio.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/__tests__/capabilities.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/__tests__/commands.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/__tests__/connection.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/__tests__/radio.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/__tests__/ui.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/audio.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/capabilities.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/commands.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/connection.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/connection.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/layout.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/lcd-contrast.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/lcd-display-mode.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/qsy-history.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/radio.svelte.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/radio.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/tuning.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/stores/ui.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/transport/__tests__/http-client.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/transport/__tests__/ws-client.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/transport/http-client.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/transport/ws-client.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/types/capabilities.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/types/protocol.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/types/state.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/utils/__tests__/battery.test.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/utils/battery.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/utils/filter-width.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/utils/haptics.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/utils/meter-utils.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/utils/smoothing.svelte.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/utils/tx-permit.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/lib/utils/uuid.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/main.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/skins/amber-lcd/LcdSkin.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/skins/desktop-v2/DesktopSkin.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/skins/lcd-cockpit/LcdCockpitSkin.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/skins/lcd-scope/LcdScopeSkin.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/skins/mobile/MobileSkin.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/skins/registry.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/skins/sdr-test/SdrTestSkin.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/skins/sdr-test/SdrVfoScreen.svelte +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/styles/animations.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/styles/tokens.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/types/pwa.d.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/src/types/webcodecs.d.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/static/fonts/DSEG7Classic-Bold.woff2 +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/svelte.config.js +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/tests/e2e/v2-ui-interactive.impl.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/tsconfig.app.json +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/tsconfig.json +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/tsconfig.node.json +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/frontend/vite.config.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/mkdocs.yml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/_keyboard-default.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/_schema.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/_schema_v2.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/examples/ftx1.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/examples/lab599_tx500.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/examples/sdrplay_rspdx.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/examples/xiegu_x6200.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/ftx1.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/ic705.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/ic7300.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/ic7610.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/ic9700.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/tx500.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/rigs/x6100.toml +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/icom_lan/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/icom_lan/_cli_shim.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/__main__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_audio_codecs.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_audio_recovery.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_audio_runtime_mixin.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_audio_transcoder.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_bounded_queue.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_bridge_metrics.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_bridge_state.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_civ_rx.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_connection_state.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_control_phase.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_dual_rx_runtime.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_optional_deps.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_platformdirs_migration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_poller_types.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_queue_pressure.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_runtime_protocols.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_scope_runtime.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_shared_state_runtime.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_state_cache.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/_state_queries.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/LAYER.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/_bridge_metrics.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/_bridge_state.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/_codecs.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/_macos_uid.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/_transcoder.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/_usb_resolve.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/analyzer.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/backend.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/bridge.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/bus.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/config.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/dsp.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/fft_scope.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/lan_stream.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/probe.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/probe_profile.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/probe_runner.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/resample.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/route.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio/usb_driver.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio_analyzer.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio_bridge.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio_bus.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/audio_fft_scope.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/auth.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/LAYER.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/_icom_serial_base.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/config.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/discovery.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/factory.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/ic705/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/ic705/core.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/ic705/serial.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/ic7300/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/ic7300/core.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/ic7300/serial.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/ic9700/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/ic9700/core.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/ic9700/serial.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/icom7610/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/icom7610/drivers/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/icom7610/drivers/contracts.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/icom7610/drivers/serial_civ_link.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/icom7610/drivers/serial_session.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/icom7610/drivers/serial_stub.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/icom7610/drivers/usb_audio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/icom7610/lan.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/icom7610/serial.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/yaesu_cat/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/yaesu_cat/parser.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/yaesu_cat/poller.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/yaesu_cat/radio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/backends/yaesu_cat/transport.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/capabilities.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/civ.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/cli/LAYER.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/cli/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/cli/_diagnose.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/command_map.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/command_spec.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commander.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/LAYER.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/_builders.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/_codec.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/_frame.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/antenna.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/command_map.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/command_spec.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/commander.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/config.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/cw.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/dsp.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/freq.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/levels.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/memory.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/meters.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/mode.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/power.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/ptt.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/scope.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/speech.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/system.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/tone.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/tx_band.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/commands/vfo.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/LAYER.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/_bounded_queue.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/_optional_deps.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/_queue_pressure.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/_state_cache.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/auth.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/capabilities.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/civ.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/env_config.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/exceptions.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/protocol.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/radio_protocol.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/radio_state.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/transport.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/core/types.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/cw_auto_tuner.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/_discovery.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/_error_ring.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/_errors.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/_logging.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/_manifest.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/bundle.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/contributor.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/contributors/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/contributors/audio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/contributors/config.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/contributors/dependencies.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/contributors/errors.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/contributors/invocation.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/contributors/logs.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/contributors/radio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/contributors/state.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/contributors/system.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/redaction.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/diagnostics/upload.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/discovery.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/dsp/LAYER.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/dsp/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/dsp/exceptions.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/dsp/nodes/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/dsp/nodes/base.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/dsp/nodes/nr_scipy.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/dsp/pipeline.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/dsp/resample.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/dsp/tap_registry.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/env_config.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/exceptions.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/ic705.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/meter_cal.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/profiles/LAYER.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/profiles/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/profiles/rig_loader.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/profiles_runtime.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/protocol.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/proxy.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/py.typed +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/radio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/radio_initial_state.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/radio_protocol.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/radio_reconnect.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/radio_state.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/radio_state_snapshot.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/radios.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rig_loader.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rigctld/LAYER.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rigctld/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rigctld/audit.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rigctld/circuit_breaker.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rigctld/contract.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rigctld/handler.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rigctld/poller.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rigctld/protocol.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rigctld/routing.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rigctld/server.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rigctld/state_cache.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/rigctld/utils.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/LAYER.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/_audio_recovery.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/_audio_runtime_mixin.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/_civ_rx.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/_connection_state.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/_control_phase.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/_dual_rx_runtime.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/_poller_types.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/_runtime_protocols.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/_scope_runtime.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/_shared_state_runtime.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/_state_queries.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/cw_auto_tuner.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/ic705.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/meter_cal.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/profiles_runtime.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/proxy.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/radio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/radio_initial_state.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/radio_reconnect.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/radio_state_snapshot.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/radios.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/startup_checks.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/runtime/sync.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/scope/LAYER.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/scope/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/scope/render.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/scope_render.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/startup_checks.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/sync.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/transport.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/types.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/usb_audio_resolve.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/LAYER.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/_delta_encoder.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/band_plan.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/dx_cluster.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/eibi.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/handlers/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/handlers/audio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/handlers/control.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/handlers/diagnostics.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/handlers/scope.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/protocol.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/radio_poller.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/rtc.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/runtime_helpers.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/apple-touch-icon.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/assets/ControlButtonDemo-Cdx5v8jW.js +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/assets/ControlButtonDemo-Ddi7py1_.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/assets/index-DV-TVNde.css +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/assets/index-DcFOgVs1.js +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/brand/lockup-dark.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/brand/lockup-light.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/brand/lockup-mono.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/brand/mark-dark.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/brand/mark-light.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/brand/mark-mono.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/brand/marketing/github-social-preview.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/brand/marketing/readme-banner.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/brand/wordmark-dark.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/brand/wordmark-light.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/brand/wordmark-mono.svg +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicon-16.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicon-32.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicon-48.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicon.ico +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/ink/favicon-128.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/ink/favicon-16.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/ink/favicon-180.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/ink/favicon-192.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/ink/favicon-256.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/ink/favicon-32.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/ink/favicon-48.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/ink/favicon-512.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/ink/favicon-64.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/ink/favicon.ico +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/paper/favicon-128.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/paper/favicon-16.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/paper/favicon-180.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/paper/favicon-192.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/paper/favicon-256.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/paper/favicon-32.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/paper/favicon-48.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/paper/favicon-512.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/paper/favicon-64.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/paper/favicon.ico +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/transparent/favicon-128.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/transparent/favicon-16.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/transparent/favicon-180.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/transparent/favicon-192.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/transparent/favicon-256.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/transparent/favicon-32.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/transparent/favicon-48.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/transparent/favicon-512.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/favicons/transparent/favicon-64.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/index.html +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/manifest.json +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/og-image.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/pwa-192x192.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/pwa-512x512.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static/twitter-card.png +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/static.old/index.html +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/tls.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/src/rigplane/web/websocket.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/_audio_pipeline_helpers.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/_audio_stream_fake.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/_caps.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/_command_test_helpers.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/_diagnostics_mock_server.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/_helpers.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/_perf_helpers.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/conftest.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/contracts/__init__.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/contracts/test_lazy_imports.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/e2e/package.json +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/e2e/v2-ui-interactive.spec.ts +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/fixtures/civ_rx_frames.json +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/golden/dump_state_ic7610.txt +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/golden/dump_state_yaesu.txt +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/golden/fldigi_dual_rx_session.txt +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/golden/js8call_dual_rx_session.txt +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/golden/protocol_golden.json +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/golden/wsjtx_dual_rx_session.txt +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/hardware/test_ic7610_audio_pipeline.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/README.md +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/conftest.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/full_handshake.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/logging_utils.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/probe_handshake.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/probe_login.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_audio_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_audio_routing.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_connect.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_controls_extended_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_dsp_levels_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_get_freq.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_media_scope_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_memory_set_only.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_negative_auth_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_operator_toggles_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_radio_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_reliability_matrix_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_rigctld_audio_pipeline.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_rigctld_golden_replay.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_rigctld_wsjtx.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_rit_tuner_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_scope_advanced_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_tone_tsql_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/integration/test_vfo_dual_watch_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/mock_server.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_analyzer.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_backend.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_bridge.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_bridge_stereo.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_bus.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_codec.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_codecs.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_config.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_dsp.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_fft_scope.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_fullduplex.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_pipeline_harness.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_pipeline_os_smoke.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_probe.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_probe_profile.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_probe_runner.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_recovery.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_resample.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_route.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_rx_tx_transition.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_stress.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_transcoder.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_transcoder_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audio_watchdog.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_audit.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_auth.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_backend_contract_matrix.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_backend_factory.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_bounded_queue.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_bsr_band_switching.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_circuit_breaker.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_civ.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_civ_command_profiling.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_civ_rx_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_civ_rx_dispatch_golden.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_civ_rx_mixin_host.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_cli.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_cli_async.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_cli_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_cli_diagnose.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_cli_diagnose_lazy_import.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_cli_e2e.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_cli_model.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_cmd29_parsing.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_command_map_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_command_spec.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_commander.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_commands.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_commands_extended.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_cw_auto_tune_wiring.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_cw_auto_tuner.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_data_mode.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_delta_encoder.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_diagnostics_bundle.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_diagnostics_contributor.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_diagnostics_contributors_batch1.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_diagnostics_contributors_batch2.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_diagnostics_contributors_batch3.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_diagnostics_e2e.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_diagnostics_logging.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_diagnostics_privacy_invariants.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_diagnostics_redaction.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_diagnostics_upload.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_discovery.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_docs_runtime_sync.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_dsp_filter_family.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_dsp_levels_part1.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_dsp_levels_part2.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_dsp_nodes.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_dsp_nr_scipy.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_dsp_pipeline.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_dx_cluster.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_env_config.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_exports.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_frontend_e2e_config.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_ftx1_audio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_ftx1_radio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_golden_protocol.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_handlers_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_handlers_dsp_407_408.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_handlers_protocol_gap_399.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_handlers_sys_band.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_ic705.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_ic705_backend.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_ic7300_backend.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_ic7610_parity_matrix.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_ic9700_backend.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_icom7610_serial_radio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_icom_lan_shim.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_icom_receiver_tier.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_issue_141_core_refactor.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_jitter_buffer.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_lifecycle_diagnostics.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_macos_audio_uid.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_main_sub_tracking.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_managed_runtime_packaging_doc.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_memory_commands.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_mock_integration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_naming_parity.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_operator_toggles.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_pcm_e2e.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_per_receiver_vfo_roundtrip.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_performance_regressions.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_platformdirs_migration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_poller.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_poller_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_power_unit_extension.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_profiles_routing.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_profiles_runtime.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_protocol.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_proxy.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_proxy_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_public_api_surface.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_radio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_radio_connect.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_radio_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_radio_extended.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_radio_poller_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_radio_protocol.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_radio_state.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_radios.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rate_limiter.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_reconnect.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rf_gain_af_level.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rig_ic7300.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rig_ic7610.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rig_loader.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rig_multi_vendor.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rig_schema.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rigctld_consistency.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rigctld_dump_state_snapshot.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rigctld_handler.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rigctld_init_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rigctld_protocol.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rigctld_routable_extension.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rigctld_server.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rigctld_server_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_rigctld_utils.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_scope.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_scope_render.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_scope_render_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_scope_stress.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_security_headers.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_selected_freq_mode.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_serial_backend_smoke.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_serial_civ_link.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_serial_stub_framing.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_server_wire.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_shared_state_runtime.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_state_cache.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_state_cache_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_state_pollable_extension.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_state_queries.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_supports_command.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_swr_calibration.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_sync.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_sync_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_tap_registry.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_tls.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_token_renewal.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_tone_tsql.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_transport.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_tx_band_edge.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_usb_audio_capable_extension.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_usb_audio_resolve.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_usb_audio_stub.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_vfo_dual_watch.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_vox_tone_state.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_web_audio_streaming_profile.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_web_auth_compare_digest.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_web_capability_guards.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_web_cw_http_control.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_web_diagnostics.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_web_post_body_cap.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_web_ptt_readonly.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_web_runtime_helpers.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_web_server.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_web_server_token_redaction.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_webrtc_signaling.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_websocket_coverage.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_yaesu_audio.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_yaesu_cat_parser.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_yaesu_cat_poller.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_yaesu_cat_transport.py +0 -0
- {rigplane-2.1.2 → rigplane-2.2.0}/tests/test_yaesu_cli_factory.py +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
## Scope
|
|
2
|
+
|
|
3
|
+
- Linked issue / task:
|
|
4
|
+
- Compatibility impact: API / CLI / config / wire behavior / docs / none
|
|
5
|
+
|
|
6
|
+
## Verification
|
|
7
|
+
|
|
8
|
+
- [ ] Relevant local tests or checks run
|
|
9
|
+
- [ ] Public/open-core boundary checked
|
|
10
|
+
- [ ] Release or migration impact documented if applicable
|
|
11
|
+
|
|
12
|
+
## Agent Review
|
|
13
|
+
|
|
14
|
+
- [ ] Independent agent review comment posted before merge
|
|
15
|
+
- Reviewer:
|
|
16
|
+
- Result: `Agent Review: PASS` / `Agent Review: BLOCKED`
|
|
17
|
+
- If BLOCKED: include concrete problems, file/line references, risks, required
|
|
18
|
+
fixes, and checks to rerun.
|
|
19
|
+
|
|
20
|
+
## Notes
|
|
21
|
+
|
|
22
|
+
- Out of scope / follow-ups:
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
name: Agent Review Gate
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [opened, reopened, synchronize, ready_for_review]
|
|
6
|
+
issue_comment:
|
|
7
|
+
types: [created, edited, deleted]
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
issues: read
|
|
12
|
+
pull-requests: read
|
|
13
|
+
statuses: write
|
|
14
|
+
|
|
15
|
+
concurrency:
|
|
16
|
+
group: agent-review-gate-${{ github.event.issue.pull_request && github.event.issue.number || github.event.pull_request.number }}
|
|
17
|
+
cancel-in-progress: true
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
agent-review:
|
|
21
|
+
name: Update Agent Review Gate status
|
|
22
|
+
if: github.event_name == 'pull_request' || github.event.issue.pull_request
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
timeout-minutes: 2
|
|
25
|
+
|
|
26
|
+
steps:
|
|
27
|
+
- name: Resolve pull request number
|
|
28
|
+
id: pr
|
|
29
|
+
uses: actions/github-script@v7
|
|
30
|
+
with:
|
|
31
|
+
script: |
|
|
32
|
+
const number = context.payload.pull_request?.number ?? context.payload.issue?.number;
|
|
33
|
+
const {owner, repo} = context.repo;
|
|
34
|
+
const {data: pull} = await github.rest.pulls.get({
|
|
35
|
+
owner,
|
|
36
|
+
repo,
|
|
37
|
+
pull_number: number,
|
|
38
|
+
});
|
|
39
|
+
const {data: commit} = await github.rest.repos.getCommit({
|
|
40
|
+
owner,
|
|
41
|
+
repo,
|
|
42
|
+
ref: pull.head.sha,
|
|
43
|
+
});
|
|
44
|
+
const committedAt =
|
|
45
|
+
commit.commit.committer?.date ??
|
|
46
|
+
commit.commit.author?.date ??
|
|
47
|
+
pull.updated_at;
|
|
48
|
+
core.setOutput('number', String(number));
|
|
49
|
+
core.setOutput('head_sha', pull.head.sha);
|
|
50
|
+
core.setOutput('committed_at', committedAt);
|
|
51
|
+
|
|
52
|
+
- name: Update required Agent Review Gate status
|
|
53
|
+
uses: actions/github-script@v7
|
|
54
|
+
with:
|
|
55
|
+
script: |
|
|
56
|
+
const pull_number = Number('${{ steps.pr.outputs.number }}');
|
|
57
|
+
const head_sha = '${{ steps.pr.outputs.head_sha }}';
|
|
58
|
+
const committed_at = new Date('${{ steps.pr.outputs.committed_at }}');
|
|
59
|
+
const {owner, repo} = context.repo;
|
|
60
|
+
const comments = await github.paginate(github.rest.issues.listComments, {
|
|
61
|
+
owner,
|
|
62
|
+
repo,
|
|
63
|
+
issue_number: pull_number,
|
|
64
|
+
per_page: 100,
|
|
65
|
+
});
|
|
66
|
+
const pass = comments.some((comment) =>
|
|
67
|
+
!comment.minimized &&
|
|
68
|
+
typeof comment.body === 'string' &&
|
|
69
|
+
comment.body.includes('Agent Review: PASS') &&
|
|
70
|
+
new Date(comment.updated_at ?? comment.created_at) >= committed_at
|
|
71
|
+
);
|
|
72
|
+
await github.rest.repos.createCommitStatus({
|
|
73
|
+
owner,
|
|
74
|
+
repo,
|
|
75
|
+
sha: head_sha,
|
|
76
|
+
state: pass ? 'success' : 'failure',
|
|
77
|
+
context: 'Agent Review Gate',
|
|
78
|
+
description: pass
|
|
79
|
+
? 'Agent Review PASS comment found for the current PR head.'
|
|
80
|
+
: 'Missing Agent Review PASS comment for the current PR head.',
|
|
81
|
+
target_url: `${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`,
|
|
82
|
+
});
|
|
83
|
+
if (!pass) {
|
|
84
|
+
core.notice('Missing required PR comment containing "Agent Review: PASS" posted or edited after the current PR head commit.');
|
|
85
|
+
}
|
|
@@ -61,6 +61,55 @@ Default rule for agents:
|
|
|
61
61
|
See `docs/internals/github-project-workflow.md` for the exact CLI and UI
|
|
62
62
|
workflow.
|
|
63
63
|
|
|
64
|
+
## Multi-agent Git hygiene
|
|
65
|
+
|
|
66
|
+
This repo is developed from multiple machines and by multiple agents. Before
|
|
67
|
+
editing:
|
|
68
|
+
|
|
69
|
+
- run `git fetch --all --tags --prune`;
|
|
70
|
+
- inspect `git status --short --branch`;
|
|
71
|
+
- do not work directly on `main`;
|
|
72
|
+
- use `codex/<issue-or-task>` branches for agent work;
|
|
73
|
+
- use `git pull --ff-only --tags` only on clean branches with a normal upstream;
|
|
74
|
+
- do not reset, clean, delete, or rebase uncertain work without explicit user
|
|
75
|
+
approval.
|
|
76
|
+
|
|
77
|
+
Use the global `repo-hygiene` skill for cross-repo inventory and cleanup.
|
|
78
|
+
|
|
79
|
+
## Protected main and review gate
|
|
80
|
+
|
|
81
|
+
`main` is protected. Changes should land through PRs.
|
|
82
|
+
|
|
83
|
+
RigPlane's standard automation gate is `.github/workflows/agent-review-gate.yml`.
|
|
84
|
+
It updates the required commit status `Agent Review Gate` on the current PR
|
|
85
|
+
head SHA and passes only after a normal PR comment contains `Agent Review:
|
|
86
|
+
PASS` for that head. Use this status instead of GitHub required approving
|
|
87
|
+
reviews; same-user approval restrictions break automated agent flow.
|
|
88
|
+
|
|
89
|
+
Every non-trivial PR requires independent agent review before merge. The
|
|
90
|
+
implementation agent may not be the review agent.
|
|
91
|
+
|
|
92
|
+
- `Agent Review: PASS` means the PR may merge once required checks are green,
|
|
93
|
+
the PASS comment is fresh for the current head, and the PR is not draft.
|
|
94
|
+
- `Agent Review: BLOCKED` must include concrete problems, file/line references
|
|
95
|
+
where applicable, risk, required fixes, and checks to run.
|
|
96
|
+
- The implementation agent must address BLOCKED feedback, push updates, and
|
|
97
|
+
rerun or wait for checks before merge.
|
|
98
|
+
- A failed `Agent Review Gate` without BLOCKED feedback usually means no fresh
|
|
99
|
+
PASS comment exists for the current head; perform or refresh the review
|
|
100
|
+
instead of skipping the PR.
|
|
101
|
+
- Cancelled checks must be rerun with `gh run rerun <run-id>` or a new push,
|
|
102
|
+
then watched to completion.
|
|
103
|
+
- Draft PRs must not merge. Determine why the PR is draft, finish the missing
|
|
104
|
+
work, run `gh pr ready`, then complete checks and review.
|
|
105
|
+
|
|
106
|
+
## Release branches
|
|
107
|
+
|
|
108
|
+
Use release branches only when a public/core release needs stabilization while
|
|
109
|
+
`main` continues moving. Tags remain the source of truth for published
|
|
110
|
+
artifacts. Hotfixes made on a release branch must be merged or cherry-picked
|
|
111
|
+
back to `main`.
|
|
112
|
+
|
|
64
113
|
## Engineering rules
|
|
65
114
|
|
|
66
115
|
- Follow `CLAUDE.md` for commands, architecture, testing, and workflow gates.
|
|
@@ -100,6 +100,52 @@ User-facing → **Russian**. Code/commits/docs/PR → **English**.
|
|
|
100
100
|
Commits: `feat(#N):` / `fix(#N):` / `refactor:` / `test:` / `docs:` / `chore:`
|
|
101
101
|
One change per commit. Full test suite before push.
|
|
102
102
|
|
|
103
|
+
### Multi-machine Git hygiene
|
|
104
|
+
|
|
105
|
+
Development runs across a local laptop and a dev Mac mini, often with several
|
|
106
|
+
agents. Before editing:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
git fetch --all --tags --prune
|
|
110
|
+
git status --short --branch
|
|
111
|
+
python3 ~/.codex/skills/repo-hygiene/scripts/repo_inventory.py --roots /Users/moroz/Projects --summary
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Rules:
|
|
115
|
+
|
|
116
|
+
- never work directly on `main`;
|
|
117
|
+
- use `codex/<issue-or-task>` for agent work;
|
|
118
|
+
- use `git pull --ff-only --tags` only on a clean branch with a normal upstream;
|
|
119
|
+
- do not reset, clean, delete, or rebase uncertain work without explicit user
|
|
120
|
+
approval;
|
|
121
|
+
- report or snapshot dirty trees before sync.
|
|
122
|
+
|
|
123
|
+
`main` is protected. RigPlane uses `.github/workflows/agent-review-gate.yml`
|
|
124
|
+
as the standard PR automation gate. The workflow passes only after a normal PR
|
|
125
|
+
comment contains `Agent Review: PASS` for the current PR head; use the required
|
|
126
|
+
commit status `Agent Review Gate` instead of GitHub required approving reviews,
|
|
127
|
+
because same-user approval restrictions break automated agent flow.
|
|
128
|
+
|
|
129
|
+
Non-trivial PRs require independent agent review before merge. The
|
|
130
|
+
implementation agent cannot self-review. `Agent Review: PASS` means the PR may
|
|
131
|
+
merge once required checks are green, the PASS comment is fresh for the current
|
|
132
|
+
head, and the PR is not draft. `Agent Review: BLOCKED` must include concrete
|
|
133
|
+
problems, file/line references where applicable, risk, required fixes, and
|
|
134
|
+
checks to run. The implementation agent must fix
|
|
135
|
+
BLOCKED feedback, push updates, and rerun or wait for checks before merge.
|
|
136
|
+
|
|
137
|
+
A failed `Agent Review Gate` without BLOCKED feedback usually means no fresh
|
|
138
|
+
PASS comment exists for the current head; perform or refresh the review instead
|
|
139
|
+
of skipping the PR. Cancelled checks must be rerun with `gh run rerun <run-id>`
|
|
140
|
+
or a new push, then watched to completion. Draft PRs must not merge: determine
|
|
141
|
+
why the PR is draft, finish the missing work, run `gh pr ready`, then complete
|
|
142
|
+
checks and review.
|
|
143
|
+
|
|
144
|
+
Release branches are exceptional: use `release/<major.minor>` only when a
|
|
145
|
+
public release needs stabilization while `main` moves ahead. Tags remain the
|
|
146
|
+
published artifact source of truth, and release-branch hotfixes must return to
|
|
147
|
+
`main`.
|
|
148
|
+
|
|
103
149
|
---
|
|
104
150
|
|
|
105
151
|
## Completion criteria
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rigplane
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Summary: Python library for controlling Icom transceivers over LAN (UDP) — no wfview/hamlib required
|
|
5
5
|
Project-URL: Homepage, https://rigplane.dev/
|
|
6
6
|
Project-URL: Documentation, https://rigplane.dev/
|
|
@@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.2.0] — 2026-05-11
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Added a friendly station-server discovery and status contract for desktop
|
|
14
|
+
supervisors: UDP discovery now advertises the station-server schema, endpoint
|
|
15
|
+
URLs, readiness, auth-required, backend, display name, and radio metadata
|
|
16
|
+
while preserving legacy discovery fields (#1498).
|
|
17
|
+
- Added `GET /api/v1/station` and exposed station readiness in
|
|
18
|
+
`GET /api/v1/runtime`, giving setup tools a stable machine-readable and
|
|
19
|
+
human-readable status payload for LAN station-server discovery (#1498).
|
|
20
|
+
|
|
21
|
+
### Docs
|
|
22
|
+
- Documented the new station-server discovery/status payloads and readiness
|
|
23
|
+
states for supervisors and setup tools (#1498).
|
|
24
|
+
|
|
10
25
|
## [2.1.2] — 2026-05-09
|
|
11
26
|
|
|
12
27
|
### Added
|
|
@@ -1279,7 +1294,8 @@ These deprecation closures were announced in v0.19 and dropped on schedule.
|
|
|
1279
1294
|
- Transport layer, authentication, CI-V commands, meters, PTT, keep-alive.
|
|
1280
1295
|
- Clean-room Icom LAN UDP protocol implementation.
|
|
1281
1296
|
|
|
1282
|
-
[Unreleased]: https://github.com/rigplane/rigplane-core/compare/v2.
|
|
1297
|
+
[Unreleased]: https://github.com/rigplane/rigplane-core/compare/v2.2.0...HEAD
|
|
1298
|
+
[2.2.0]: https://github.com/rigplane/rigplane-core/compare/v2.1.2...v2.2.0
|
|
1283
1299
|
[2.1.2]: https://github.com/rigplane/rigplane-core/compare/v2.1.1...v2.1.2
|
|
1284
1300
|
[2.1.1]: https://github.com/rigplane/rigplane-core/compare/v2.1.0...v2.1.1
|
|
1285
1301
|
[2.1.0]: https://github.com/rigplane/rigplane-core/compare/v2.0.3...v2.1.0
|
|
@@ -46,6 +46,7 @@ These routes are part of the Pro/supervisor compatibility surface:
|
|
|
46
46
|
| `GET` | `/healthz` | Process/API liveness, no API token required |
|
|
47
47
|
| `GET` | `/readyz` | Station readiness, returns `503` until radio is ready |
|
|
48
48
|
| `GET` | `/api/v1/runtime` | Process, bind, radio, rigctld, bridge, and diagnostic runtime status |
|
|
49
|
+
| `GET` | `/api/v1/station` | Friendly station-server identity, readiness, and next-action status |
|
|
49
50
|
| `GET` | `/api/v1/info` | Runtime model/capability summary |
|
|
50
51
|
| `GET` | `/api/v1/state` | Canonical current state snapshot |
|
|
51
52
|
| `GET` | `/api/v1/capabilities` | Full profile-backed capabilities |
|
|
@@ -147,6 +148,13 @@ When auth is configured, this endpoint requires the same bearer token as other
|
|
|
147
148
|
"controlConnected": true,
|
|
148
149
|
"radioReady": true
|
|
149
150
|
},
|
|
151
|
+
"station": {
|
|
152
|
+
"readiness": "ready_with_radio",
|
|
153
|
+
"radioAvailable": true,
|
|
154
|
+
"backend": "rigplane",
|
|
155
|
+
"authRequired": true,
|
|
156
|
+
"message": "Station server is ready with an attached radio."
|
|
157
|
+
},
|
|
150
158
|
"rigctld": {
|
|
151
159
|
"enabled": true,
|
|
152
160
|
"address": "127.0.0.1:4532"
|
|
@@ -159,6 +167,49 @@ When auth is configured, this endpoint requires the same bearer token as other
|
|
|
159
167
|
}
|
|
160
168
|
```
|
|
161
169
|
|
|
170
|
+
## `GET /api/v1/station`
|
|
171
|
+
|
|
172
|
+
Friendly station-server status for desktop supervisors and setup tools. When
|
|
173
|
+
auth is configured, this endpoint requires the same bearer token as other
|
|
174
|
+
`/api/*` routes.
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
{
|
|
178
|
+
"schema": "rigplane.station.status.v1",
|
|
179
|
+
"service": "rigplane",
|
|
180
|
+
"kind": "station_server",
|
|
181
|
+
"version": "2.0.3",
|
|
182
|
+
"displayName": "IC-7610",
|
|
183
|
+
"instanceId": null,
|
|
184
|
+
"baseUrl": "http://127.0.0.1:58421",
|
|
185
|
+
"healthUrl": "http://127.0.0.1:58421/healthz",
|
|
186
|
+
"readinessUrl": "http://127.0.0.1:58421/readyz",
|
|
187
|
+
"runtimeUrl": "http://127.0.0.1:58421/api/v1/runtime",
|
|
188
|
+
"stationUrl": "http://127.0.0.1:58421/api/v1/station",
|
|
189
|
+
"station": {
|
|
190
|
+
"readiness": "ready_with_radio",
|
|
191
|
+
"radioAvailable": true,
|
|
192
|
+
"backend": "rigplane",
|
|
193
|
+
"authRequired": true,
|
|
194
|
+
"message": "Station server is ready with an attached radio."
|
|
195
|
+
},
|
|
196
|
+
"radio": {
|
|
197
|
+
"model": "IC-7610",
|
|
198
|
+
"connected": true,
|
|
199
|
+
"controlConnected": true,
|
|
200
|
+
"radioReady": true
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Current readiness values are:
|
|
206
|
+
|
|
207
|
+
- `ready_with_radio`
|
|
208
|
+
- `radio_powered_off_or_unreachable`
|
|
209
|
+
- `no_usb_radio_connected`
|
|
210
|
+
- `lan_radio_unsupported_or_not_found`
|
|
211
|
+
- `requires_configuration_or_auth`
|
|
212
|
+
|
|
162
213
|
Managed runtimes also emit a single machine-readable startup event to stdout
|
|
163
214
|
after the web listener has bound successfully. Supervisors should use this JSON
|
|
164
215
|
line as the startup contract instead of parsing the human-readable banner:
|
|
@@ -669,6 +669,14 @@ After the web listener binds, `station` writes one JSON startup event to stdout:
|
|
|
669
669
|
Use this event for supervisor discovery when `--port 0` asks the OS to allocate
|
|
670
670
|
the actual port.
|
|
671
671
|
|
|
672
|
+
When UDP discovery is enabled, `rigplane station` and `rigplane web` answer
|
|
673
|
+
`RIGPLANE_DISCOVER\n` broadcasts with a `rigplane.station.discovery.v1` JSON
|
|
674
|
+
payload. The payload includes the base URL, `/healthz`, `/readyz`,
|
|
675
|
+
`/api/v1/runtime`, `/api/v1/station`, version, display name, radio model,
|
|
676
|
+
backend, auth-required flag, and a readiness value such as
|
|
677
|
+
`ready_with_radio`, `no_usb_radio_connected`, or
|
|
678
|
+
`radio_powered_off_or_unreachable`.
|
|
679
|
+
|
|
672
680
|
### `audio bridge`
|
|
673
681
|
|
|
674
682
|
Route radio audio to/from a virtual audio device (BlackHole, Loopback, VB-Audio).
|
|
@@ -44,6 +44,12 @@ STABLE_HTTP_ENDPOINTS: Final[tuple[HttpEndpoint, ...]] = (
|
|
|
44
44
|
"purpose": "managed runtime status",
|
|
45
45
|
"auth": "bearer",
|
|
46
46
|
},
|
|
47
|
+
{
|
|
48
|
+
"method": "GET",
|
|
49
|
+
"path": "/api/v1/station",
|
|
50
|
+
"purpose": "friendly station-server status",
|
|
51
|
+
"auth": "bearer",
|
|
52
|
+
},
|
|
47
53
|
{
|
|
48
54
|
"method": "GET",
|
|
49
55
|
"path": "/api/v1/info",
|
|
@@ -128,11 +134,27 @@ RESPONSE_FIELD_CONTRACTS: Final[dict[str, ResponseFieldContract]] = {
|
|
|
128
134
|
"authRequired",
|
|
129
135
|
"backend",
|
|
130
136
|
"radio",
|
|
137
|
+
"station",
|
|
131
138
|
"rigctld",
|
|
132
139
|
"bridge",
|
|
133
140
|
"lastError",
|
|
134
141
|
)
|
|
135
142
|
},
|
|
143
|
+
"/api/v1/station": {
|
|
144
|
+
"required": (
|
|
145
|
+
"schema",
|
|
146
|
+
"service",
|
|
147
|
+
"kind",
|
|
148
|
+
"version",
|
|
149
|
+
"displayName",
|
|
150
|
+
"baseUrl",
|
|
151
|
+
"healthUrl",
|
|
152
|
+
"readinessUrl",
|
|
153
|
+
"runtimeUrl",
|
|
154
|
+
"station",
|
|
155
|
+
"radio",
|
|
156
|
+
)
|
|
157
|
+
},
|
|
136
158
|
"/api/v1/info": {
|
|
137
159
|
"required": (
|
|
138
160
|
"server",
|
|
@@ -35,6 +35,12 @@ class RadioInfo:
|
|
|
35
35
|
|
|
36
36
|
model: str
|
|
37
37
|
connected: bool
|
|
38
|
+
control_connected: bool = False
|
|
39
|
+
radio_ready: bool = False
|
|
40
|
+
backend: str | None = None
|
|
41
|
+
readiness: str | None = None
|
|
42
|
+
message: str | None = None
|
|
43
|
+
auth_required: bool = False
|
|
38
44
|
|
|
39
45
|
|
|
40
46
|
class _DiscoveryProtocol(asyncio.DatagramProtocol):
|
|
@@ -153,12 +159,46 @@ class DiscoveryResponder:
|
|
|
153
159
|
name = "RigPlane"
|
|
154
160
|
|
|
155
161
|
payload: dict[str, object] = {
|
|
162
|
+
"schema": "rigplane.station.discovery.v1",
|
|
156
163
|
"service": "rigplane",
|
|
164
|
+
"kind": "station_server",
|
|
157
165
|
"version": __version__,
|
|
158
166
|
"url": f"{scheme}://{local_ip}:{self._web_port}",
|
|
167
|
+
"urls": {
|
|
168
|
+
"base": f"{scheme}://{local_ip}:{self._web_port}",
|
|
169
|
+
"health": f"{scheme}://{local_ip}:{self._web_port}/healthz",
|
|
170
|
+
"readiness": f"{scheme}://{local_ip}:{self._web_port}/readyz",
|
|
171
|
+
"runtime": (f"{scheme}://{local_ip}:{self._web_port}/api/v1/runtime"),
|
|
172
|
+
"station": (f"{scheme}://{local_ip}:{self._web_port}/api/v1/station"),
|
|
173
|
+
},
|
|
159
174
|
"name": name,
|
|
175
|
+
"displayName": name,
|
|
176
|
+
"instanceId": None,
|
|
177
|
+
"station": {
|
|
178
|
+
"readiness": (
|
|
179
|
+
radio_info.readiness
|
|
180
|
+
if radio_info and radio_info.readiness
|
|
181
|
+
else (
|
|
182
|
+
"ready_with_radio"
|
|
183
|
+
if radio_info
|
|
184
|
+
and (radio_info.radio_ready or radio_info.connected)
|
|
185
|
+
else "requires_configuration_or_auth"
|
|
186
|
+
)
|
|
187
|
+
),
|
|
188
|
+
"radioAvailable": bool(
|
|
189
|
+
radio_info and (radio_info.radio_ready or radio_info.connected)
|
|
190
|
+
),
|
|
191
|
+
"backend": radio_info.backend if radio_info else None,
|
|
192
|
+
"authRequired": bool(radio_info.auth_required) if radio_info else False,
|
|
193
|
+
"message": radio_info.message if radio_info else None,
|
|
194
|
+
},
|
|
160
195
|
"radio": (
|
|
161
|
-
{
|
|
196
|
+
{
|
|
197
|
+
"model": radio_info.model,
|
|
198
|
+
"connected": radio_info.connected,
|
|
199
|
+
"controlConnected": radio_info.control_connected,
|
|
200
|
+
"radioReady": radio_info.radio_ready,
|
|
201
|
+
}
|
|
162
202
|
if radio_info
|
|
163
203
|
else None
|
|
164
204
|
),
|
|
@@ -1386,6 +1386,85 @@ class WebServer:
|
|
|
1386
1386
|
scheme = "https" if self._config.tls else "http"
|
|
1387
1387
|
return f"{scheme}://{bind['host']}:{bind['port']}"
|
|
1388
1388
|
|
|
1389
|
+
def _radio_runtime_payload(self) -> dict[str, Any]:
|
|
1390
|
+
radio = self._radio
|
|
1391
|
+
raw_connected = (
|
|
1392
|
+
getattr(radio, "connected", False) if radio is not None else False
|
|
1393
|
+
)
|
|
1394
|
+
connected = raw_connected if isinstance(raw_connected, bool) else False
|
|
1395
|
+
raw_control_connected = (
|
|
1396
|
+
getattr(radio, "control_connected", False) if radio is not None else False
|
|
1397
|
+
)
|
|
1398
|
+
control_connected = (
|
|
1399
|
+
raw_control_connected if isinstance(raw_control_connected, bool) else False
|
|
1400
|
+
)
|
|
1401
|
+
return {
|
|
1402
|
+
"model": getattr(radio, "model", self._config.radio_model)
|
|
1403
|
+
if radio is not None
|
|
1404
|
+
else self._config.radio_model,
|
|
1405
|
+
"connected": connected,
|
|
1406
|
+
"controlConnected": control_connected,
|
|
1407
|
+
"radioReady": self._radio_ready(),
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
def _station_readiness_payload(self) -> dict[str, Any]:
|
|
1411
|
+
radio = self._radio
|
|
1412
|
+
backend = getattr(radio, "backend_id", None) if radio is not None else None
|
|
1413
|
+
radio_payload = self._radio_runtime_payload()
|
|
1414
|
+
health = self._build_radio_health()
|
|
1415
|
+
if radio_payload["radioReady"]:
|
|
1416
|
+
readiness = "ready_with_radio"
|
|
1417
|
+
message = "Station server is ready with an attached radio."
|
|
1418
|
+
elif radio is None:
|
|
1419
|
+
readiness = "requires_configuration_or_auth"
|
|
1420
|
+
message = "Start the station server with a configured radio target."
|
|
1421
|
+
elif backend in {"icom_serial", "yaesu_cat"}:
|
|
1422
|
+
readiness = "no_usb_radio_connected"
|
|
1423
|
+
message = "Connect the radio by USB and confirm serial permissions."
|
|
1424
|
+
elif backend == "rigplane":
|
|
1425
|
+
likely = health.get("likelyCause")
|
|
1426
|
+
readiness = (
|
|
1427
|
+
"radio_powered_off_or_unreachable"
|
|
1428
|
+
if likely in {"radio_powered_off_likely", "radio_not_responding"}
|
|
1429
|
+
else "lan_radio_unsupported_or_not_found"
|
|
1430
|
+
)
|
|
1431
|
+
message = "Power on the radio and confirm it is reachable on the LAN."
|
|
1432
|
+
else:
|
|
1433
|
+
readiness = "requires_configuration_or_auth"
|
|
1434
|
+
message = "Configure a supported radio target before using this station."
|
|
1435
|
+
return {
|
|
1436
|
+
"readiness": readiness,
|
|
1437
|
+
"radioAvailable": bool(radio_payload["radioReady"]),
|
|
1438
|
+
"backend": backend,
|
|
1439
|
+
"health": health,
|
|
1440
|
+
"authRequired": bool(self._config.auth_token),
|
|
1441
|
+
"message": message,
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
def _station_status_payload(self) -> dict[str, Any]:
|
|
1445
|
+
base_url = self._runtime_base_url()
|
|
1446
|
+
radio_payload = self._radio_runtime_payload()
|
|
1447
|
+
display_name = (
|
|
1448
|
+
radio_payload["model"]
|
|
1449
|
+
if radio_payload["model"]
|
|
1450
|
+
else self._config.radio_model
|
|
1451
|
+
)
|
|
1452
|
+
return {
|
|
1453
|
+
"schema": "rigplane.station.status.v1",
|
|
1454
|
+
"service": "rigplane",
|
|
1455
|
+
"kind": "station_server",
|
|
1456
|
+
"version": __version__,
|
|
1457
|
+
"displayName": display_name,
|
|
1458
|
+
"instanceId": None,
|
|
1459
|
+
"baseUrl": base_url,
|
|
1460
|
+
"healthUrl": f"{base_url}/healthz",
|
|
1461
|
+
"readinessUrl": f"{base_url}/readyz",
|
|
1462
|
+
"runtimeUrl": f"{base_url}/api/v1/runtime",
|
|
1463
|
+
"stationUrl": f"{base_url}/api/v1/station",
|
|
1464
|
+
"station": self._station_readiness_payload(),
|
|
1465
|
+
"radio": radio_payload,
|
|
1466
|
+
}
|
|
1467
|
+
|
|
1389
1468
|
def startup_event_payload(self) -> dict[str, Any]:
|
|
1390
1469
|
base_url = self._runtime_base_url()
|
|
1391
1470
|
return {
|
|
@@ -1424,16 +1503,6 @@ class WebServer:
|
|
|
1424
1503
|
self, writer: asyncio.StreamWriter, headers: dict[str, str] | None = None
|
|
1425
1504
|
) -> None:
|
|
1426
1505
|
radio = self._radio
|
|
1427
|
-
raw_connected = (
|
|
1428
|
-
getattr(radio, "connected", False) if radio is not None else False
|
|
1429
|
-
)
|
|
1430
|
-
connected = raw_connected if isinstance(raw_connected, bool) else False
|
|
1431
|
-
raw_control_connected = (
|
|
1432
|
-
getattr(radio, "control_connected", False) if radio is not None else False
|
|
1433
|
-
)
|
|
1434
|
-
control_connected = (
|
|
1435
|
-
raw_control_connected if isinstance(raw_control_connected, bool) else False
|
|
1436
|
-
)
|
|
1437
1506
|
body = json.dumps(
|
|
1438
1507
|
{
|
|
1439
1508
|
"pid": os.getpid(),
|
|
@@ -1445,14 +1514,8 @@ class WebServer:
|
|
|
1445
1514
|
"backend": getattr(radio, "backend_id", None)
|
|
1446
1515
|
if radio is not None
|
|
1447
1516
|
else None,
|
|
1448
|
-
"radio":
|
|
1449
|
-
|
|
1450
|
-
if radio is not None
|
|
1451
|
-
else self._config.radio_model,
|
|
1452
|
-
"connected": connected,
|
|
1453
|
-
"controlConnected": control_connected,
|
|
1454
|
-
"radioReady": self._radio_ready(),
|
|
1455
|
-
},
|
|
1517
|
+
"radio": self._radio_runtime_payload(),
|
|
1518
|
+
"station": self._station_readiness_payload(),
|
|
1456
1519
|
"rigctld": {
|
|
1457
1520
|
"enabled": self._runtime_rigctld_addr is not None,
|
|
1458
1521
|
"address": self._runtime_rigctld_addr,
|
|
@@ -1464,6 +1527,15 @@ class WebServer:
|
|
|
1464
1527
|
).encode()
|
|
1465
1528
|
await _send_json(writer, body, headers)
|
|
1466
1529
|
|
|
1530
|
+
async def _serve_station_status(
|
|
1531
|
+
self, writer: asyncio.StreamWriter, headers: dict[str, str] | None = None
|
|
1532
|
+
) -> None:
|
|
1533
|
+
body = json.dumps(
|
|
1534
|
+
self._station_status_payload(),
|
|
1535
|
+
separators=(",", ":"),
|
|
1536
|
+
).encode()
|
|
1537
|
+
await _send_json(writer, body, headers)
|
|
1538
|
+
|
|
1467
1539
|
async def _serve_state(
|
|
1468
1540
|
self, writer: asyncio.StreamWriter, headers: dict[str, str] | None = None
|
|
1469
1541
|
) -> None:
|
|
@@ -238,6 +238,8 @@ async def dispatch_http_request(
|
|
|
238
238
|
|
|
239
239
|
if path == "/api/v1/info":
|
|
240
240
|
await server._serve_info(writer, headers)
|
|
241
|
+
elif path == "/api/v1/station":
|
|
242
|
+
await server._serve_station_status(writer, headers)
|
|
241
243
|
elif path == "/api/v1/runtime":
|
|
242
244
|
await server._serve_runtime(writer, headers)
|
|
243
245
|
elif path == "/api/v1/state":
|
|
@@ -143,13 +143,23 @@ async def start_web_server(server: WebServer) -> None:
|
|
|
143
143
|
def _radio_provider() -> RadioInfo | None:
|
|
144
144
|
if radio is None:
|
|
145
145
|
return None
|
|
146
|
+
radio_payload = server._radio_runtime_payload()
|
|
147
|
+
station_payload = server._station_readiness_payload()
|
|
146
148
|
return RadioInfo(
|
|
147
|
-
model=
|
|
148
|
-
connected=bool(
|
|
149
|
+
model=str(radio_payload["model"]),
|
|
150
|
+
connected=bool(radio_payload["connected"]),
|
|
151
|
+
control_connected=bool(radio_payload["controlConnected"]),
|
|
152
|
+
radio_ready=bool(radio_payload["radioReady"]),
|
|
153
|
+
backend=station_payload["backend"]
|
|
154
|
+
if isinstance(station_payload["backend"], str)
|
|
155
|
+
else None,
|
|
156
|
+
readiness=str(station_payload["readiness"]),
|
|
157
|
+
message=str(station_payload["message"]),
|
|
158
|
+
auth_required=bool(station_payload["authRequired"]),
|
|
149
159
|
)
|
|
150
160
|
|
|
151
161
|
server._discovery = DiscoveryResponder(
|
|
152
|
-
web_port=server.
|
|
162
|
+
web_port=server._runtime_bind_payload()["port"],
|
|
153
163
|
tls=server._config.tls,
|
|
154
164
|
radio_provider=_radio_provider,
|
|
155
165
|
discovery_port=server._config.discovery_port,
|