rigplane 2.2.0__tar.gz → 2.3.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 → rigplane-2.3.0}/.github/scripts/check-rebrand-allowlist.sh +6 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/workflows/agent-review-gate.yml +3 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/workflows/full.yml +10 -1
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/workflows/quick.yml +21 -1
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/workflows/rebrand-gate.yml +3 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.gitignore +3 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/PKG-INFO +5 -4
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/CHANGELOG.md +50 -1
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/audio-recipes.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/cli.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/commands.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/configuration.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/connection.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/diagnostic-reports.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/ic705-usb-setup.md +13 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/ic7300-usb-setup.md +13 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/ic7610-usb-setup.md +13 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/ic9700-usb-setup.md +13 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/installation.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/profiles.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/quickstart.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/radios.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/rig-profiles.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/troubleshooting.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/web-ui.md +4 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/guide/wsjtx-setup.md +13 -0
- rigplane-2.3.0/docs/i18n/core-string-inventory.md +910 -0
- rigplane-2.3.0/docs/i18n/locale-contract.md +150 -0
- rigplane-2.3.0/docs/i18n/translating.md +375 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/index.md +5 -0
- rigplane-2.3.0/docs/migrate.md +88 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/.gitignore +5 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/package-lock.json +241 -340
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/package.json +3 -1
- rigplane-2.3.0/frontend/playwright.i18n.config.ts +59 -0
- rigplane-2.3.0/frontend/scripts/i18n-check.mjs +518 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/App.svelte +4 -3
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/shared/Toast.svelte +46 -6
- rigplane-2.3.0/frontend/src/components/shared/__tests__/Toast.component.test.ts +171 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/SpectrumPanel.svelte +2 -1
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/InstallPrompt.svelte +3 -2
- rigplane-2.3.0/frontend/src/components-v2/controls/LanguageSelector.svelte +155 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/__tests__/CollapsiblePanel.test.ts +3 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/__tests__/InstallPrompt.test.ts +11 -0
- rigplane-2.3.0/frontend/src/components-v2/controls/__tests__/LanguageSelector.test.ts +161 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/install-prompt-utils.ts +4 -3
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/dialogs/SendReportDialog.svelte +46 -42
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/LcdLayout.svelte +5 -4
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/MobileNav.svelte +21 -2
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/MobileRadioLayout.svelte +51 -26
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/RadioLayout.svelte +11 -5
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/StatusBar.svelte +51 -44
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/__tests__/MobileRadioLayout.component.svelte.test.ts +49 -2
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/mobile-chip-bar.svelte +3 -1
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/RxAudioPanel.svelte +2 -1
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/TxPanel.svelte +50 -7
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/TxPanel.test.ts +70 -4
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/audio-scope/AudioSpectrumPanel.svelte +3 -1
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/audio/__tests__/audio-manager.test.ts +37 -1
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/audio/__tests__/constants.test.ts +5 -0
- rigplane-2.3.0/frontend/src/lib/audio/__tests__/tx-mic.test.ts +145 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/audio/audio-manager.ts +21 -2
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/audio/constants.ts +2 -2
- rigplane-2.3.0/frontend/src/lib/audio/tx-mic.ts +256 -0
- rigplane-2.3.0/frontend/src/lib/i18n/CONTRIBUTING.md +32 -0
- rigplane-2.3.0/frontend/src/lib/i18n/__tests__/index.test.ts +150 -0
- rigplane-2.3.0/frontend/src/lib/i18n/__tests__/locale-contract.test.ts +224 -0
- rigplane-2.3.0/frontend/src/lib/i18n/__tests__/plural.test.ts +86 -0
- rigplane-2.3.0/frontend/src/lib/i18n/__tests__/pseudo-locale.smoke.test.ts +131 -0
- rigplane-2.3.0/frontend/src/lib/i18n/__tests__/pseudo.test.ts +85 -0
- rigplane-2.3.0/frontend/src/lib/i18n/__tests__/runtime.test.ts +131 -0
- rigplane-2.3.0/frontend/src/lib/i18n/__tests__/store.test.ts +53 -0
- rigplane-2.3.0/frontend/src/lib/i18n/index.ts +160 -0
- rigplane-2.3.0/frontend/src/lib/i18n/locale-contract.ts +168 -0
- rigplane-2.3.0/frontend/src/lib/i18n/locales/en-US.json +174 -0
- rigplane-2.3.0/frontend/src/lib/i18n/locales/ja-JP.json +174 -0
- rigplane-2.3.0/frontend/src/lib/i18n/locales/ru-RU.json +174 -0
- rigplane-2.3.0/frontend/src/lib/i18n/plural.ts +96 -0
- rigplane-2.3.0/frontend/src/lib/i18n/pseudo.ts +124 -0
- rigplane-2.3.0/frontend/src/lib/i18n/runtime.ts +142 -0
- rigplane-2.3.0/frontend/src/lib/i18n/store.svelte.ts +117 -0
- rigplane-2.3.0/frontend/src/lib/i18n/types.ts +52 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/types/protocol.ts +11 -1
- rigplane-2.3.0/frontend/tests/e2e/i18n/README.md +85 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/en-US/app-shell-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/en-US/app-shell-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/en-US/connection-overlay-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/en-US/connection-overlay-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/en-US/send-report-dialog-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/en-US/send-report-dialog-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/en-US/settings-modal-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/en-US/settings-modal-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/en-US/status-bar-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/en-US/status-bar-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/en-US/toast-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/en-US/toast-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/ja-JP/app-shell-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/ja-JP/app-shell-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/ja-JP/connection-overlay-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/ja-JP/connection-overlay-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/ja-JP/send-report-dialog-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/ja-JP/send-report-dialog-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/ja-JP/settings-modal-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/ja-JP/settings-modal-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/ja-JP/status-bar-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/ja-JP/status-bar-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/ja-JP/toast-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/ja-JP/toast-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/qps-ploc/app-shell-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/qps-ploc/app-shell-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/qps-ploc/connection-overlay-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/qps-ploc/connection-overlay-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/qps-ploc/send-report-dialog-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/qps-ploc/send-report-dialog-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/qps-ploc/settings-modal-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/qps-ploc/settings-modal-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/qps-ploc/status-bar-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/qps-ploc/status-bar-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/qps-ploc/toast-desktop.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/__screenshots__/i18n/qps-ploc/toast-mobile.png +0 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/fixtures.ts +176 -0
- rigplane-2.3.0/frontend/tests/e2e/i18n/i18n-visual.spec.ts +399 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/mkdocs.yml +21 -2
- {rigplane-2.2.0 → rigplane-2.3.0}/pyproject.toml +8 -5
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/__init__.py +3 -5
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/cli/_diagnose.py +25 -36
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/__init__.py +8 -9
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/_control_phase.py +12 -1
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/handlers/audio.py +59 -14
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/server.py +51 -6
- rigplane-2.2.0/src/rigplane/web/static/assets/ControlButtonDemo-Cdx5v8jW.js → rigplane-2.3.0/src/rigplane/web/static/assets/ControlButtonDemo-CbVyzA0h.js +1 -1
- rigplane-2.3.0/src/rigplane/web/static/assets/index-BRBm4QAp.js +48 -0
- rigplane-2.2.0/src/rigplane/web/static/assets/index-DV-TVNde.css → rigplane-2.3.0/src/rigplane/web/static/assets/index-CvOPafTi.css +1 -1
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/index.html +2 -2
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_cli_diagnose_lazy_import.py +1 -1
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_handlers_coverage.py +92 -4
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_radio_connect.py +100 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_web_server.py +38 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_web_server_coverage.py +63 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/uv.lock +3 -3
- rigplane-2.2.0/frontend/src/lib/audio/__tests__/tx-mic.test.ts +0 -63
- rigplane-2.2.0/frontend/src/lib/audio/tx-mic.ts +0 -137
- rigplane-2.2.0/src/rigplane/web/static/assets/index-DcFOgVs1.js +0 -48
- {rigplane-2.2.0 → rigplane-2.3.0}/.claude/commands/analyze-failure.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.claude/commands/audit-ui.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.claude/commands/decompose-issue.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.claude/commands/generate-tests.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.claude/commands/next.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.claude/commands/refactor.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.claude/commands/regression-check.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.claude/commands/scan-issues.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.claude/commands/solve-issue.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.claude/skills/release/SKILL.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/ISSUE_TEMPLATE/epic.yml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/ISSUE_TEMPLATE/radio_report.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/ISSUE_TEMPLATE/ui-component.yml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/pull_request_template.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/workflows/docs.yml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.github/workflows/publish.yml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/.importlinter +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/AGENTS.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/ARCHITECTURE.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/CHANGELOG.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/CLAUDE.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/CONTRIBUTING.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/LICENSE +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/README.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/ROADMAP.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/band-plans/_config.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/band-plans/arrl-hf.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/band-plans/broadcast.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/band-plans/iaru-r1.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/band-plans/utility.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/AUDIO_STREAMING_PROFILE.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/CNAME +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/EXTENDED_PROTOCOL_RESEARCH.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/PERFORMANCE.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/PROJECT.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/SECURITY.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/audio.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/auth.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/backends-icom7610-drivers.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/backends-icom7610.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/backends.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/commander.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/commands.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/exceptions.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/public-api-surface.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/radio.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/radios.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/rig-loader.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/rigctld.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/scope.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/sync.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/transport.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/types.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/api/web.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/architecture/open-core-policy.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/assets/scope-example.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/capabilities-matrix.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/contracts/diagnostic-bundle-v1.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/contracts/diagnostic-bundle-v2.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/internals/architecture.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/internals/cli-design.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/internals/contributing.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/internals/github-project-workflow.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/internals/protocol.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/internals/reliability-semantics.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/internals/rfc-audio-v1-mini.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/operations/managed-runtime-packaging.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/opuslib-macos-fix.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/overrides/main.html +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/parity/README.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/parity/ic7610_command_matrix.json +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/parity/test_mapping.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-03-07-ui-architecture.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-05-desktop-companion-architecture.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-09-audio-backend-design.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-11-frontend-migration-plan.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-11-parity-matrix.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-11-presentation-architecture.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-11-rx-audio-trace.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-11-shared-frontend-runtime-contract.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-11-v2-lcd-runtime-audit.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-12-architecture-presentation.html +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-12-target-frontend-architecture.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-18-desktop-meters-panel.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-18-lcd-display-enhancements.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-18-mobile-ia.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-18-receiver-activation.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-18-spectrum-controls.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-18-ui-refinements-execution.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-19-lcd-layout-redesign-v2.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-19-lcd-layout-redesign.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-29-modularization-discovery.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-29-modularization-plan.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-29-panel-adapter-migration.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-04-29-ui-v1-deprecation-audit.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-05-03-diagnostic-data-collection-design.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-05-07-audio-route-resolver-design.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-05-08-audio-capability-probing.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-05-08-audio-codec-policy.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-05-08-audio-profile-policy-audit.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/2026-05-08-usb-audio-negotiation.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/archive/2026-03-04-dx-cluster.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/archive/2026-03-m5-m6-roadmap.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/archive/2026-04-19-lcd-twin-skins.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/build_orphan_report.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/classify_cycle_edges.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/cycles-classified.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/cycles.txt +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/discovery_graph.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/external-usage.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/file-inventory.json +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/file-inventory.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/import-graph.dot +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/importlinter-config-draft.ini +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/init-snapshot.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/orphan-candidates.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/tach-config-draft.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/test-inventory.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/discovery-artifacts/tooling-assessment.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/00-epic-final.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/00-epic.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/01-skeleton.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/02-core-foundationals.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/03-core-contracts.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/04-commands.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/05-profiles.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/06-scope.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/07-audio.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/08-runtime-radio.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/09-runtime-mixins.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/10-runtime-pollers.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/11-discovery-to-backends.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/12-cli.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/13-import-linter.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/14-followup-tests.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/15-followup-web-startup.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/2026-05-07-core-audio-pipeline-test-harness.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/plans/issue-drafts/2026-05-07-core-audio-route-resolver.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/radio-protocol.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/robots.txt +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/screenshots/amber-lcd.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/screenshots/hero.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/docs/screenshots/lcd-scope.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/README.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/eslint.config.js +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/index.html +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/playwright.config.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/pnpm-lock.yaml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/apple-touch-icon.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/brand/lockup-dark.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/brand/lockup-light.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/brand/lockup-mono.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/brand/mark-dark.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/brand/mark-light.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/brand/mark-mono.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/brand/marketing/github-social-preview.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/brand/marketing/readme-banner.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/brand/wordmark-dark.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/brand/wordmark-light.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/brand/wordmark-mono.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicon-16.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicon-32.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicon-48.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicon.ico +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/ink/favicon-128.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/ink/favicon-16.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/ink/favicon-180.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/ink/favicon-192.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/ink/favicon-256.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/ink/favicon-32.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/ink/favicon-48.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/ink/favicon-512.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/ink/favicon-64.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/ink/favicon.ico +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/paper/favicon-128.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/paper/favicon-16.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/paper/favicon-180.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/paper/favicon-192.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/paper/favicon-256.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/paper/favicon-32.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/paper/favicon-48.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/paper/favicon-512.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/paper/favicon-64.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/paper/favicon.ico +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/transparent/favicon-128.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/transparent/favicon-16.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/transparent/favicon-180.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/transparent/favicon-192.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/transparent/favicon-256.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/transparent/favicon-32.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/transparent/favicon-48.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/transparent/favicon-512.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/favicons/transparent/favicon-64.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/manifest.json +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/og-image.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/pwa-192x192.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/pwa-512x512.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/public/twitter-card.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/app.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/assets/svelte.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/BandPlanOverlay.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/DxOverlay.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/EiBiBrowser.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/ScopeSettingsPopover.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/SpectrumCanvas.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/SpectrumToolbar.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/WaterfallCanvas.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/__tests__/BandPlanOverlay.component.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/__tests__/DxOverlay.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/__tests__/EiBiBrowser.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/__tests__/SpectrumPanel.component.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/__tests__/SpectrumToolbar.component.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/__tests__/band-plan-overlay.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/__tests__/click-to-tune.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/__tests__/passband-geometry.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/__tests__/spectrum-panel-logic.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/__tests__/spectrum-toolbar.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/__tests__/tuning-indicator.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/band-plan-logic.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/passband-geometry.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/spectrum-logic.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components/spectrum/spectrum-toolbar-logic.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/AttenuatorControl.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/BandSelector.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/BottomSheet.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/CollapsiblePanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/ControlButtonDemo.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/PttFab.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/PullToRefresh.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/SegmentedButton.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/StatusBadge.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/ThemePicker.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/ValueControlLab.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/__tests__/AttenuatorControl.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/__tests__/BandSelector.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/__tests__/BottomSheet.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/__tests__/PullToRefresh.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/__tests__/SegmentedButton.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/__tests__/StatusBadge.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/__tests__/broadcast-presets.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/band-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/broadcast-presets.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/button-tokens.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/control-button.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/status-badge-style.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/BipolarRenderer.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/DiscreteRenderer.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/DualParamRenderer.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/HBarRenderer.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/KnobRenderer.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/ValueControl.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/__tests__/ValueControl.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/__tests__/value-control-core.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/index.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/skin.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/skins/ProfessionalKnob.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/skins/index.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/value-control-core.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/controls/value-control/value-control.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/dialogs/__tests__/SendReportDialog.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/display/FrequencyDisplay.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/display/FrequencyDisplayInteractive.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/display/__tests__/FrequencyDisplay.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/display/__tests__/frequency-tuning.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/display/frequency-format.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/display/frequency-tuning.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/KeyboardHandler.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/LeftSidebar.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/RightSidebar.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/VfoHeader.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/__tests__/KeyboardHandler.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/__tests__/LeftSidebar.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/__tests__/RadioLayout.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/__tests__/SpectrumPanelStub.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/__tests__/keyboard-map.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/__tests__/mobile-layout-logic.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/__tests__/mobile-nav.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/__tests__/top-row-visual-regression.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/__tests__/vfo-header.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/__tests__/vfo-layout-tokens.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/keyboard-map.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/layout-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/mobile-layout-logic.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/mobile-nav-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/responsive.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/shortcut-hints.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/layout/vfo-layout-tokens.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/meters/BarGauge.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/meters/LinearSMeter.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/meters/NeedleGauge.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/meters/SMeterDemo.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/meters/__tests__/BarGauge.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/meters/__tests__/LinearSMeter.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/meters/__tests__/NeedleGauge.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/meters/bar-gauge-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/meters/needle-gauge-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/meters/smeter-scale.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/AgcPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/AntennaPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/AudioRoutingControl.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/CwPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/DockMeterPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/DspPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/EssentialsPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/FilterPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/MemoryPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/MeterPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/MetersDockPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/ModePanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/RfFrontEnd.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/RitXitPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/ScanPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/VoxPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/AgcPanel.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/AudioRoutingControl.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/CwPanel.component.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/DspPanel.component.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/DspPanel.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/FilterPanel.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/MeterPanel.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/MetersDockPanel.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/ModePanel.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/RfFrontEnd.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/RitXitPanel.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/RxAudioPanel.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/cw-panel-logic.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/dsp-panel-logic.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/__tests__/filter-controls.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/agc-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/audio-scope/AudioSpectrumCanvas.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/audio-scope/__tests__/audio-spectrum-renderer.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/audio-scope/audio-spectrum-renderer.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/audio-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/cw-panel-logic.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/dsp-panel-logic.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/dsp-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/filter-controls.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/filter-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/AmberAfScope.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/AmberCockpit.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/AmberFilterGhost.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/AmberFrequency.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/AmberIndStrip.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/AmberLcdDisplay.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/AmberMemoryStrip.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/AmberScope.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/AmberSmeter.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/AmberSparkline.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/AmberTelemetryStrip.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/LcdContrastControl.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/LcdDisplayModeControl.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/VfoControlPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/__tests__/lcd-components.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/__tests__/scope-frame.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/lcd/lcd-vintage.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/meter-utils.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/meter-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/rf-frontend-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/rit-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/tx-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/vfo/DualVfoDisplay.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/panels/vfo/__tests__/DualVfoDisplay.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/fonts-digital.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/fonts.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/index.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/theme-switcher.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/amoled-black.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/ayu-dark.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/catppuccin-latte.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/catppuccin-mocha.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/crt-green.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/custom-ic7610.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/dracula.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/github-light.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/gruvbox-dark.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/gruvbox-light.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/high-contrast.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/index.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/lcd-blue.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/lcd-warm.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/nixie-tube.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/nord-light.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/nord.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/one-dark.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/solarized-dark.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/solarized-light.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/themes/tokyo-night.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/tokens.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/vfo-themes/crt-green.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/vfo-themes/index.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/vfo-themes/lcd-blue.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/theme/vfo-themes/nixie-tube.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/vfo/ActiveReceiverToggle.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/vfo/VfoOps.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/vfo/VfoPanel.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/vfo/__tests__/ActiveReceiverToggle.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/vfo/__tests__/VfoOps.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/vfo/__tests__/VfoPanel.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/vfo/vfo-ops-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/vfo/vfo-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/wiring/__tests__/double-click.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/wiring/__tests__/focus-mode-race.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/wiring/__tests__/keyboard-wiring.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/wiring/__tests__/state-adapter.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/wiring/__tests__/vfo-wiring.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/wiring/command-bus.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/wiring/double-click.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/components-v2/wiring/state-adapter.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/Button/ControlButton.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/Button/DotButton.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/Button/FillButton.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/Button/HardwareButton.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/Button/HardwarePlainButton.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/Button/StatusIndicator.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/Button/__tests__/ControlButton.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/Button/__tests__/ControlledHarness.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/Button/index.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/Button/roleMapping.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/Button/types.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/SegmentedControl/index.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/__tests__/drag-reorder.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/__tests__/migrate-legacy-storage.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/actions/keyboard.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/api/__tests__/diagnostics.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/api/diagnostics.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/audio/__tests__/rx-player.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/audio/rx-player.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/data/__tests__/arrl-band-plan.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/data/arrl-band-plan.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/drag-reorder.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/gestures/gesture-recognizer.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/gestures/use-gesture.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/local-extensions/LocalExtensionsHost.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/local-extensions/__tests__/dock-layout.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/local-extensions/__tests__/host-api.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/local-extensions/__tests__/manifest.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/local-extensions/dock-layout.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/local-extensions/host-api.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/local-extensions/keyboard-scope.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/local-extensions/manifest.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/media/__tests__/media-session.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/media/media-session.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/migrate-legacy-storage.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/radio/filter-controls.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/radio/pending-focus.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/radio/pending-focus.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/renderers/__tests__/spectrum-renderer.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/renderers/__tests__/waterfall-renderer.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/renderers/spectrum-renderer.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/renderers/waterfall-renderer.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/__tests__/frontend-runtime.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/__tests__/scope-controller.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/adapters/audio-adapter.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/adapters/capabilities-adapter.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/adapters/lcd-chrome-adapter.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/adapters/panel-adapters.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/adapters/qsy-history-adapter.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/adapters/scope-adapter.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/adapters/tx-adapter.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/adapters/vfo-adapter.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/commands/panel-commands.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/frontend-runtime.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/index.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/props/panel-props.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/scope-controller.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/runtime/system-controller.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/__tests__/audio.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/__tests__/capabilities.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/__tests__/commands.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/__tests__/connection.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/__tests__/radio.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/__tests__/ui.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/audio.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/capabilities.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/commands.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/connection.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/connection.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/layout.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/lcd-contrast.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/lcd-display-mode.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/qsy-history.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/radio.svelte.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/radio.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/tuning.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/stores/ui.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/transport/__tests__/http-client.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/transport/__tests__/ws-client.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/transport/http-client.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/transport/ws-client.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/types/capabilities.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/types/state.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/utils/__tests__/battery.test.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/utils/battery.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/utils/filter-width.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/utils/haptics.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/utils/meter-utils.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/utils/smoothing.svelte.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/utils/tx-permit.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/lib/utils/uuid.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/main.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/skins/amber-lcd/LcdSkin.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/skins/desktop-v2/DesktopSkin.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/skins/lcd-cockpit/LcdCockpitSkin.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/skins/lcd-scope/LcdScopeSkin.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/skins/mobile/MobileSkin.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/skins/registry.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/skins/sdr-test/SdrTestSkin.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/skins/sdr-test/SdrVfoScreen.svelte +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/styles/animations.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/styles/tokens.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/types/pwa.d.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/src/types/webcodecs.d.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/static/fonts/DSEG7Classic-Bold.woff2 +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/svelte.config.js +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/tests/e2e/v2-ui-interactive.impl.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/tsconfig.app.json +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/tsconfig.json +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/tsconfig.node.json +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/frontend/vite.config.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/_keyboard-default.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/_schema.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/_schema_v2.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/examples/ftx1.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/examples/lab599_tx500.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/examples/sdrplay_rspdx.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/examples/xiegu_x6200.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/ftx1.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/ic705.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/ic7300.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/ic7610.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/ic9700.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/tx500.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/rigs/x6100.toml +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/icom_lan/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/icom_lan/_cli_shim.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/__main__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_audio_codecs.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_audio_recovery.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_audio_runtime_mixin.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_audio_transcoder.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_bounded_queue.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_bridge_metrics.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_bridge_state.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_civ_rx.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_connection_state.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_control_phase.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_dual_rx_runtime.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_optional_deps.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_platformdirs_migration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_poller_types.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_queue_pressure.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_runtime_protocols.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_scope_runtime.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_shared_state_runtime.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_state_cache.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/_state_queries.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/LAYER.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/_bridge_metrics.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/_bridge_state.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/_codecs.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/_macos_uid.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/_transcoder.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/_usb_resolve.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/analyzer.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/backend.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/bridge.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/bus.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/config.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/dsp.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/fft_scope.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/lan_stream.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/probe.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/probe_profile.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/probe_runner.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/resample.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/route.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio/usb_driver.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio_analyzer.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio_bridge.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio_bus.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/audio_fft_scope.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/auth.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/LAYER.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/_icom_serial_base.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/config.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/discovery.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/factory.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/ic705/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/ic705/core.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/ic705/serial.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/ic7300/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/ic7300/core.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/ic7300/serial.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/ic9700/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/ic9700/core.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/ic9700/serial.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/icom7610/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/icom7610/drivers/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/icom7610/drivers/contracts.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/icom7610/drivers/serial_civ_link.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/icom7610/drivers/serial_session.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/icom7610/drivers/serial_stub.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/icom7610/drivers/usb_audio.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/icom7610/lan.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/icom7610/serial.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/yaesu_cat/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/yaesu_cat/parser.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/yaesu_cat/poller.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/yaesu_cat/radio.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/backends/yaesu_cat/transport.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/capabilities.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/civ.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/cli/LAYER.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/cli/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/command_map.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/command_spec.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commander.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/LAYER.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/_builders.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/_codec.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/_frame.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/antenna.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/command_map.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/command_spec.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/commander.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/config.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/cw.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/dsp.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/freq.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/levels.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/memory.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/meters.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/mode.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/power.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/ptt.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/scope.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/speech.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/system.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/tone.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/tx_band.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/commands/vfo.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/LAYER.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/_bounded_queue.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/_optional_deps.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/_queue_pressure.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/_state_cache.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/auth.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/capabilities.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/civ.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/env_config.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/exceptions.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/protocol.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/radio_protocol.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/radio_state.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/transport.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/core/types.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/cw_auto_tuner.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/_discovery.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/_error_ring.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/_errors.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/_logging.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/_manifest.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/bundle.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/contributor.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/contributors/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/contributors/audio.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/contributors/config.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/contributors/dependencies.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/contributors/errors.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/contributors/invocation.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/contributors/logs.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/contributors/radio.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/contributors/state.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/contributors/system.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/redaction.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/diagnostics/upload.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/discovery.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/dsp/LAYER.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/dsp/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/dsp/exceptions.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/dsp/nodes/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/dsp/nodes/base.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/dsp/nodes/nr_scipy.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/dsp/pipeline.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/dsp/resample.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/dsp/tap_registry.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/env_config.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/exceptions.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/ic705.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/meter_cal.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/profiles/LAYER.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/profiles/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/profiles/rig_loader.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/profiles_runtime.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/protocol.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/proxy.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/py.typed +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/radio.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/radio_initial_state.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/radio_protocol.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/radio_reconnect.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/radio_state.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/radio_state_snapshot.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/radios.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rig_loader.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rigctld/LAYER.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rigctld/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rigctld/audit.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rigctld/circuit_breaker.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rigctld/contract.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rigctld/handler.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rigctld/poller.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rigctld/protocol.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rigctld/routing.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rigctld/server.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rigctld/state_cache.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/rigctld/utils.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/LAYER.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/_audio_recovery.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/_audio_runtime_mixin.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/_civ_rx.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/_connection_state.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/_dual_rx_runtime.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/_poller_types.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/_runtime_protocols.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/_scope_runtime.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/_shared_state_runtime.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/_state_queries.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/cw_auto_tuner.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/ic705.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/meter_cal.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/profiles_runtime.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/proxy.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/radio.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/radio_initial_state.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/radio_reconnect.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/radio_state_snapshot.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/radios.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/startup_checks.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/runtime/sync.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/scope/LAYER.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/scope/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/scope/render.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/scope_render.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/startup_checks.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/sync.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/transport.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/types.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/usb_audio_resolve.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/LAYER.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/_delta_encoder.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/api_contract.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/band_plan.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/discovery.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/dx_cluster.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/eibi.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/handlers/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/handlers/control.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/handlers/diagnostics.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/handlers/scope.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/protocol.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/radio_poller.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/rtc.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/runtime_helpers.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/apple-touch-icon.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/assets/ControlButtonDemo-Ddi7py1_.css +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/brand/lockup-dark.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/brand/lockup-light.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/brand/lockup-mono.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/brand/mark-dark.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/brand/mark-light.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/brand/mark-mono.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/brand/marketing/github-social-preview.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/brand/marketing/readme-banner.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/brand/wordmark-dark.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/brand/wordmark-light.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/brand/wordmark-mono.svg +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicon-16.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicon-32.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicon-48.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicon.ico +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/ink/favicon-128.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/ink/favicon-16.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/ink/favicon-180.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/ink/favicon-192.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/ink/favicon-256.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/ink/favicon-32.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/ink/favicon-48.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/ink/favicon-512.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/ink/favicon-64.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/ink/favicon.ico +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/paper/favicon-128.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/paper/favicon-16.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/paper/favicon-180.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/paper/favicon-192.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/paper/favicon-256.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/paper/favicon-32.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/paper/favicon-48.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/paper/favicon-512.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/paper/favicon-64.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/paper/favicon.ico +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/transparent/favicon-128.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/transparent/favicon-16.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/transparent/favicon-180.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/transparent/favicon-192.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/transparent/favicon-256.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/transparent/favicon-32.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/transparent/favicon-48.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/transparent/favicon-512.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/favicons/transparent/favicon-64.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/manifest.json +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/og-image.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/pwa-192x192.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/pwa-512x512.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static/twitter-card.png +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/static.old/index.html +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/tls.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/web_routing.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/web_startup.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/src/rigplane/web/websocket.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/_audio_pipeline_helpers.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/_audio_stream_fake.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/_caps.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/_command_test_helpers.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/_diagnostics_mock_server.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/_helpers.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/_perf_helpers.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/conftest.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/contracts/__init__.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/contracts/test_lazy_imports.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/e2e/package.json +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/e2e/v2-ui-interactive.spec.ts +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/fixtures/civ_rx_frames.json +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/golden/dump_state_ic7610.txt +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/golden/dump_state_yaesu.txt +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/golden/fldigi_dual_rx_session.txt +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/golden/js8call_dual_rx_session.txt +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/golden/protocol_golden.json +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/golden/wsjtx_dual_rx_session.txt +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/hardware/test_ic7610_audio_pipeline.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/README.md +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/conftest.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/full_handshake.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/logging_utils.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/probe_handshake.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/probe_login.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_audio_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_audio_routing.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_connect.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_controls_extended_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_dsp_levels_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_get_freq.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_media_scope_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_memory_set_only.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_negative_auth_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_operator_toggles_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_radio_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_reliability_matrix_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_rigctld_audio_pipeline.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_rigctld_golden_replay.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_rigctld_wsjtx.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_rit_tuner_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_scope_advanced_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_tone_tsql_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/integration/test_vfo_dual_watch_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/mock_server.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_analyzer.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_backend.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_bridge.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_bridge_stereo.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_bus.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_codec.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_codecs.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_config.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_dsp.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_fft_scope.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_fullduplex.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_pipeline_harness.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_pipeline_os_smoke.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_probe.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_probe_profile.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_probe_runner.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_recovery.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_resample.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_route.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_rx_tx_transition.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_stress.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_transcoder.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_transcoder_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audio_watchdog.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_audit.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_auth.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_backend_contract_matrix.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_backend_factory.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_bounded_queue.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_bsr_band_switching.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_circuit_breaker.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_civ.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_civ_command_profiling.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_civ_rx_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_civ_rx_dispatch_golden.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_civ_rx_mixin_host.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_cli.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_cli_async.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_cli_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_cli_diagnose.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_cli_e2e.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_cli_model.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_cmd29_parsing.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_command_map_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_command_spec.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_commander.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_commands.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_commands_extended.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_cw_auto_tune_wiring.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_cw_auto_tuner.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_data_mode.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_delta_encoder.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_diagnostics_bundle.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_diagnostics_contributor.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_diagnostics_contributors_batch1.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_diagnostics_contributors_batch2.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_diagnostics_contributors_batch3.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_diagnostics_e2e.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_diagnostics_logging.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_diagnostics_privacy_invariants.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_diagnostics_redaction.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_diagnostics_upload.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_discovery.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_discovery_responder.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_docs_runtime_sync.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_dsp_filter_family.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_dsp_levels_part1.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_dsp_levels_part2.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_dsp_nodes.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_dsp_nr_scipy.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_dsp_pipeline.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_dx_cluster.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_env_config.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_exports.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_frontend_e2e_config.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_ftx1_audio.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_ftx1_radio.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_golden_protocol.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_handlers_dsp_407_408.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_handlers_protocol_gap_399.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_handlers_sys_band.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_ic705.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_ic705_backend.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_ic7300_backend.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_ic7610_parity_matrix.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_ic9700_backend.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_icom7610_serial_radio.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_icom_lan_shim.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_icom_receiver_tier.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_issue_141_core_refactor.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_jitter_buffer.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_lifecycle_diagnostics.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_macos_audio_uid.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_main_sub_tracking.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_managed_runtime_packaging_doc.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_memory_commands.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_mock_integration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_naming_parity.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_operator_toggles.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_pcm_e2e.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_per_receiver_vfo_roundtrip.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_performance_regressions.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_platformdirs_migration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_poller.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_poller_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_power_unit_extension.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_profiles_routing.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_profiles_runtime.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_protocol.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_proxy.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_proxy_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_public_api_surface.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_radio.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_radio_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_radio_extended.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_radio_poller_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_radio_protocol.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_radio_state.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_radios.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rate_limiter.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_reconnect.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rf_gain_af_level.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rig_ic7300.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rig_ic7610.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rig_loader.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rig_multi_vendor.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rig_schema.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rigctld_consistency.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rigctld_dump_state_snapshot.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rigctld_handler.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rigctld_init_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rigctld_protocol.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rigctld_routable_extension.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rigctld_server.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rigctld_server_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_rigctld_utils.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_scope.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_scope_render.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_scope_render_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_scope_stress.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_security_headers.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_selected_freq_mode.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_serial_backend_smoke.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_serial_civ_link.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_serial_stub_framing.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_server_wire.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_shared_state_runtime.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_state_cache.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_state_cache_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_state_pollable_extension.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_state_queries.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_supports_command.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_swr_calibration.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_sync.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_sync_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_tap_registry.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_tls.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_token_renewal.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_tone_tsql.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_transport.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_tx_band_edge.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_usb_audio_capable_extension.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_usb_audio_resolve.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_usb_audio_stub.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_vfo_dual_watch.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_vox_tone_state.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_web_api_contract.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_web_audio_streaming_profile.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_web_auth_compare_digest.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_web_capability_guards.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_web_cw_http_control.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_web_diagnostics.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_web_post_body_cap.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_web_ptt_readonly.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_web_runtime_helpers.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_web_server_token_redaction.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_webrtc_signaling.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_websocket_coverage.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_yaesu_audio.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_yaesu_cat_parser.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_yaesu_cat_poller.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_yaesu_cat_transport.py +0 -0
- {rigplane-2.2.0 → rigplane-2.3.0}/tests/test_yaesu_cli_factory.py +0 -0
|
@@ -44,6 +44,12 @@ ALLOWLIST=(
|
|
|
44
44
|
# Intentional historical / migration references.
|
|
45
45
|
'README.md'
|
|
46
46
|
'docs/CHANGELOG.md'
|
|
47
|
+
# User-facing migration guide for v1.x icom-lan -> v2.x rigplane;
|
|
48
|
+
# the legacy names are the literal subject of the page.
|
|
49
|
+
'docs/migrate.md'
|
|
50
|
+
# mkdocs nav label for the migration guide reads
|
|
51
|
+
# "Migration from icom-lan" -- legacy name is intentional.
|
|
52
|
+
'mkdocs.yml'
|
|
47
53
|
'tests/golden/wsjtx_dual_rx_session.txt'
|
|
48
54
|
# pyproject.toml — preserved console-script alias `icom-lan` (line 43),
|
|
49
55
|
# hatch packages list keeping `src/icom_lan` shim, ruff per-file-ignores
|
|
@@ -20,6 +20,9 @@ jobs:
|
|
|
20
20
|
agent-review:
|
|
21
21
|
name: Update Agent Review Gate status
|
|
22
22
|
if: github.event_name == 'pull_request' || github.event.issue.pull_request
|
|
23
|
+
# API-only workflow via actions/github-script -- no compile/test toolchain
|
|
24
|
+
# needed. Keep this on GitHub-hosted runners so PR merges are not blocked
|
|
25
|
+
# when self-hosted build runners are offline or occupied.
|
|
23
26
|
runs-on: ubuntu-latest
|
|
24
27
|
timeout-minutes: 2
|
|
25
28
|
|
|
@@ -19,7 +19,11 @@ jobs:
|
|
|
19
19
|
if: >-
|
|
20
20
|
github.event_name != 'push' ||
|
|
21
21
|
contains(github.event.head_commit.message, '[full-ci]')
|
|
22
|
-
|
|
22
|
+
# Self-hosted Mac mini build-tier runner. Python 3.11/3.12/3.13, uv,
|
|
23
|
+
# Node 24, Rust, and the Tauri/audio system libs are pre-baked in the
|
|
24
|
+
# image, so the matrix avoids ubuntu-latest pickup + apt install passes.
|
|
25
|
+
# Operator doc: rigplane-tower/docs/development/mac-mini-self-hosted-runners.md.
|
|
26
|
+
runs-on: [self-hosted, linux, build]
|
|
23
27
|
timeout-minutes: 25
|
|
24
28
|
strategy:
|
|
25
29
|
matrix:
|
|
@@ -54,6 +58,11 @@ jobs:
|
|
|
54
58
|
cd frontend
|
|
55
59
|
npm ci
|
|
56
60
|
|
|
61
|
+
- name: i18n catalog lint
|
|
62
|
+
run: |
|
|
63
|
+
cd frontend
|
|
64
|
+
npm run i18n:check
|
|
65
|
+
|
|
57
66
|
- name: Frontend type-check
|
|
58
67
|
run: |
|
|
59
68
|
cd frontend
|
|
@@ -28,7 +28,11 @@ concurrency:
|
|
|
28
28
|
|
|
29
29
|
jobs:
|
|
30
30
|
quick:
|
|
31
|
-
|
|
31
|
+
# Self-hosted Mac mini build-tier runner. Python 3.11+/uv/Node 24/Rust
|
|
32
|
+
# and the Tauri/audio system libs are pre-baked in the image, so this
|
|
33
|
+
# job avoids the ubuntu-latest pickup + apt install passes. Operator
|
|
34
|
+
# doc: rigplane-tower/docs/development/mac-mini-self-hosted-runners.md.
|
|
35
|
+
runs-on: [self-hosted, linux, build]
|
|
32
36
|
timeout-minutes: 10
|
|
33
37
|
|
|
34
38
|
steps:
|
|
@@ -78,6 +82,7 @@ jobs:
|
|
|
78
82
|
run: |
|
|
79
83
|
cd frontend
|
|
80
84
|
npm ci
|
|
85
|
+
npm run i18n:check
|
|
81
86
|
npm run check
|
|
82
87
|
npx vitest run
|
|
83
88
|
npm run build
|
|
@@ -85,6 +90,21 @@ jobs:
|
|
|
85
90
|
mkdir -p ../src/rigplane/web/static
|
|
86
91
|
cp -r dist/* ../src/rigplane/web/static/
|
|
87
92
|
|
|
93
|
+
- name: Frontend i18n visual smoke (RP-ML-006)
|
|
94
|
+
if: steps.filter.outputs.frontend == 'true'
|
|
95
|
+
# Runs the localization screenshot pack against the freshly built
|
|
96
|
+
# `frontend/dist/`. The self-hosted Mac mini Linux runner needs the
|
|
97
|
+
# Playwright system deps (libnss3, libnspr4, etc.) installed at the
|
|
98
|
+
# OS level via `npx playwright install --with-deps chromium` (one
|
|
99
|
+
# time, by the runner operator) before this step can pass. Marked
|
|
100
|
+
# continue-on-error until provisioning lands; the baseline tests
|
|
101
|
+
# still run + the screenshots upload as artifacts for review.
|
|
102
|
+
continue-on-error: true
|
|
103
|
+
run: |
|
|
104
|
+
cd frontend
|
|
105
|
+
npx playwright install chromium >/dev/null 2>&1 || true
|
|
106
|
+
npm run test:e2e:i18n
|
|
107
|
+
|
|
88
108
|
- name: Type-check web boundary
|
|
89
109
|
if: steps.filter.outputs.frontend == 'true'
|
|
90
110
|
run: uv run mypy --strict src/rigplane/web
|
|
@@ -21,6 +21,9 @@ concurrency:
|
|
|
21
21
|
|
|
22
22
|
jobs:
|
|
23
23
|
grep-gate:
|
|
24
|
+
# Sub-second git-grep + bash filter, no toolchain needed. Keep this on a
|
|
25
|
+
# GitHub-hosted runner so protected-branch merges are not blocked when
|
|
26
|
+
# self-hosted runners are offline or occupied.
|
|
24
27
|
runs-on: ubuntu-latest
|
|
25
28
|
timeout-minutes: 2
|
|
26
29
|
|
|
@@ -41,6 +41,7 @@ config/
|
|
|
41
41
|
.firecrawl/
|
|
42
42
|
.playwright-mcp/
|
|
43
43
|
.copilot-tmp/
|
|
44
|
+
.agents/
|
|
44
45
|
|
|
45
46
|
# Backups (local safety copies, not for repo)
|
|
46
47
|
.backups/
|
|
@@ -75,6 +76,8 @@ mockups/
|
|
|
75
76
|
scripts/
|
|
76
77
|
# But CI scripts under .github/ are tracked.
|
|
77
78
|
!.github/scripts/
|
|
79
|
+
# And frontend tooling scripts (e.g. i18n lint) are tracked.
|
|
80
|
+
!frontend/scripts/
|
|
78
81
|
|
|
79
82
|
# Local RAG / AI tooling
|
|
80
83
|
.rag-update.sh
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rigplane
|
|
3
|
-
Version: 2.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 2.3.0
|
|
4
|
+
Summary: Multi-vendor radio control library and Web UI for IP-connected ham transceivers (Icom, Yaesu, Xiegu, Lab599) — no wfview/hamlib required
|
|
5
5
|
Project-URL: Homepage, https://rigplane.dev/
|
|
6
6
|
Project-URL: Documentation, https://rigplane.dev/
|
|
7
7
|
Project-URL: Repository, https://github.com/rigplane/rigplane-core
|
|
@@ -9,8 +9,8 @@ Project-URL: Issues, https://github.com/rigplane/rigplane-core/issues
|
|
|
9
9
|
Author-email: Sergey Morozik <morozsm@gmail.com>
|
|
10
10
|
License-Expression: MIT
|
|
11
11
|
License-File: LICENSE
|
|
12
|
-
Keywords: amateur-radio,ci-v,ham-radio,ic-705,ic-7610,icom,rigplane,transceiver
|
|
13
|
-
Classifier: Development Status ::
|
|
12
|
+
Keywords: amateur-radio,cat,ci-v,ftx-1,ham-radio,ic-705,ic-7300,ic-7610,icom,lab599,rigctld,rigplane,transceiver,xiegu,yaesu
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
14
|
Classifier: Intended Audience :: Developers
|
|
15
15
|
Classifier: License :: OSI Approved :: MIT License
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.11
|
|
@@ -18,6 +18,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.13
|
|
19
19
|
Classifier: Topic :: Communications :: Ham Radio
|
|
20
20
|
Requires-Python: >=3.11
|
|
21
|
+
Requires-Dist: aiohttp>=3.13.3
|
|
21
22
|
Requires-Dist: numpy
|
|
22
23
|
Requires-Dist: opuslib
|
|
23
24
|
Requires-Dist: platformdirs>=4.2
|
|
@@ -7,6 +7,54 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.3.0] — 2026-05-20
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Added the Core Svelte i18n runtime, locale store, pluralization helpers,
|
|
14
|
+
pseudo-locale tooling, and bundled `en-US`, `ru-RU`, and `ja-JP` locale
|
|
15
|
+
catalogs for the first localized Core web surfaces (#1528, #1534, #1536).
|
|
16
|
+
- Added the Core language preference UX and the cross-app locale preference
|
|
17
|
+
contract used by local shells and integrations to hand off language hints
|
|
18
|
+
without overwriting the user's stable Core preference (#1529, #1531).
|
|
19
|
+
- Added localization QA coverage: string inventory, runtime/unit tests,
|
|
20
|
+
pseudo-locale smoke tests, visual QA fixtures, and Playwright i18n
|
|
21
|
+
screenshot coverage for desktop and mobile app surfaces (#1530, #1533).
|
|
22
|
+
- Added localized server toast reason codes and migrated the P0 Core web
|
|
23
|
+
surfaces to the i18n runtime, including app shell, status bar, install
|
|
24
|
+
prompt, language selector, diagnostics dialog, and shared toasts (#1532).
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
- Moved quick/full/rebrand/agent-review CI workflows to the Mac mini
|
|
28
|
+
build-tier runner while preserving the existing required gates (#1512,
|
|
29
|
+
#1513, #1514).
|
|
30
|
+
- Moved the lightweight rebrand and agent-review gate jobs to GitHub-hosted
|
|
31
|
+
runners so protected-branch release fixes are not blocked when the
|
|
32
|
+
self-hosted gate runner is unavailable.
|
|
33
|
+
- Refined public packaging metadata and docs SEO/navigation for the
|
|
34
|
+
multi-vendor RigPlane framing, including Project Overview, migration
|
|
35
|
+
guidance, per-page descriptions, and setup-guide download CTAs (#1510,
|
|
36
|
+
#1511, #1538, #1540, #1541, #1542).
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
- Stabilized the audio-scope aspect ratio in the web UI (#1519).
|
|
40
|
+
- Fixed WebView/Tauri audio compatibility by allowing browser clients to
|
|
41
|
+
request PCM16 RX transport, adding a PCM16 TX microphone fallback when
|
|
42
|
+
WebCodecs are unavailable, and guarding async PTT startup/release races
|
|
43
|
+
before keying transmit (#1543).
|
|
44
|
+
- Fixed Japanese pilot copy after linguistic validation (#1537).
|
|
45
|
+
- Fixed release packaging so the generated frontend bundle is included in
|
|
46
|
+
sdist/wheel artifacts without relying on a local absolute `web/static`
|
|
47
|
+
symlink.
|
|
48
|
+
- Fixed PyPI runtime dependency metadata so installed wheels can import and
|
|
49
|
+
serve the Web UI diagnostics upload path without relying on dev-only
|
|
50
|
+
dependencies.
|
|
51
|
+
- Refreshed the frontend lockfile to pick up Svelte/devalue security fixes;
|
|
52
|
+
`npm audit --omit=dev` now reports zero vulnerabilities.
|
|
53
|
+
|
|
54
|
+
### Docs
|
|
55
|
+
- Added the Core user-facing string inventory, locale contract, translator
|
|
56
|
+
guide, i18n contribution notes, and visual QA documentation (#1527, #1535).
|
|
57
|
+
|
|
10
58
|
## [2.2.0] — 2026-05-11
|
|
11
59
|
|
|
12
60
|
### Added
|
|
@@ -1294,7 +1342,8 @@ These deprecation closures were announced in v0.19 and dropped on schedule.
|
|
|
1294
1342
|
- Transport layer, authentication, CI-V commands, meters, PTT, keep-alive.
|
|
1295
1343
|
- Clean-room Icom LAN UDP protocol implementation.
|
|
1296
1344
|
|
|
1297
|
-
[Unreleased]: https://github.com/rigplane/rigplane-core/compare/v2.
|
|
1345
|
+
[Unreleased]: https://github.com/rigplane/rigplane-core/compare/v2.3.0...HEAD
|
|
1346
|
+
[2.3.0]: https://github.com/rigplane/rigplane-core/compare/v2.2.0...v2.3.0
|
|
1298
1347
|
[2.2.0]: https://github.com/rigplane/rigplane-core/compare/v2.1.2...v2.2.0
|
|
1299
1348
|
[2.1.2]: https://github.com/rigplane/rigplane-core/compare/v2.1.1...v2.1.2
|
|
1300
1349
|
[2.1.1]: https://github.com/rigplane/rigplane-core/compare/v2.1.0...v2.1.1
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Full RigPlane CLI reference — connect, scan, tune, serve the Web UI, run rigctld, and stream audio from the terminal on macOS, Linux, and Windows.
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# CLI Reference
|
|
2
6
|
|
|
3
7
|
The `rigplane` CLI provides quick access to radio control from the terminal.
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: CI-V commands supported by RigPlane — frequency, mode, filter, AGC, attenuator, preamp, meters, and per-radio extensions exposed in a Python API.
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# CI-V Commands
|
|
2
6
|
|
|
3
7
|
The library supports a comprehensive set of CI-V commands for controlling your Icom transceiver.
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Understand the RigPlane connection lifecycle to an Icom radio — discovery, login, keep-alive, control and audio streams, and clean shutdown.
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# Connection Lifecycle
|
|
2
6
|
|
|
3
7
|
Understanding the connection sequence helps with debugging and advanced usage.
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Generate redacted RigPlane diagnostic reports — bundle logs, radio state, runtime config, and environment into a single ZIP for support and triage.
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# Diagnostic Reports
|
|
2
6
|
|
|
3
7
|
When something goes wrong with `rigplane` — a CAT timeout, a stuck audio
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Configure the Icom IC-705 for USB serial CI-V and USB audio control from macOS with RigPlane — field-friendly setup with no network required.
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# IC-705 USB Serial Backend Setup (macOS)
|
|
2
6
|
|
|
3
7
|
This guide shows how to control the IC-705 via **USB serial CI-V + USB audio devices** instead of the default LAN backend.
|
|
@@ -355,3 +359,12 @@ ls -l /dev/cu.*
|
|
|
355
359
|
|
|
356
360
|
**Software validation:** Contract tests with mock IC-705 profile pass (13/13 tests).
|
|
357
361
|
**Hardware validation:** Blocked on IC-705 procurement (tracked in MSMA-20).
|
|
362
|
+
|
|
363
|
+
## Get the Packaged Desktop App
|
|
364
|
+
|
|
365
|
+
!!! tip "Prefer a packaged desktop app?"
|
|
366
|
+
This guide covers the open-source `rigplane` Python library. If you want
|
|
367
|
+
a polished desktop application with a GUI for IC-705 control on macOS
|
|
368
|
+
and Linux, check out RigPlane Pro.
|
|
369
|
+
|
|
370
|
+
[Download RigPlane Pro for Mac and Linux →](https://rigplane.com/downloads/?utm_source=docs.rigplane.dev&utm_medium=cta&utm_campaign=ic705-usb-setup)
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Set up the Icom IC-7300 over USB serial CI-V and USB audio from macOS with RigPlane — low-latency direct control without LAN, hamlib, or RS-BA1.
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# IC-7300 USB Serial Backend Setup (macOS)
|
|
2
6
|
|
|
3
7
|
This guide shows how to control the IC-7300 via **USB serial CI-V + USB audio devices** instead of the default LAN backend.
|
|
@@ -246,3 +250,12 @@ os.environ["ICOM_SERIAL_CIV_MIN_INTERVAL_MS"] = "100"
|
|
|
246
250
|
- [IC-705 USB Setup](ic705-usb-setup.md) — Portable transceiver
|
|
247
251
|
- [Audio Recipes](audio-recipes.md) — RX/TX examples
|
|
248
252
|
- [WSJT-X Setup](wsjtx-setup.md) — Digital mode integration
|
|
253
|
+
|
|
254
|
+
## Get the Packaged Desktop App
|
|
255
|
+
|
|
256
|
+
!!! tip "Prefer a packaged desktop app?"
|
|
257
|
+
This guide covers the open-source `rigplane` Python library. If you want
|
|
258
|
+
a polished desktop application with a GUI for IC-7300 control on macOS
|
|
259
|
+
and Linux, check out RigPlane Pro.
|
|
260
|
+
|
|
261
|
+
[Download RigPlane Pro for Mac and Linux →](https://rigplane.com/downloads/?utm_source=docs.rigplane.dev&utm_medium=cta&utm_campaign=ic7300-usb-setup)
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Step-by-step guide to control the Icom IC-7610 from macOS over USB serial CI-V and USB audio with RigPlane — no LAN, hamlib, or RS-BA1 required.
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# IC-7610 USB Serial Backend Setup (macOS)
|
|
2
6
|
|
|
3
7
|
This guide shows how to control the IC-7610 via **USB serial CI-V + USB audio devices** instead of the default LAN backend.
|
|
@@ -468,3 +472,12 @@ If you're currently using the LAN backend and want to switch to serial:
|
|
|
468
472
|
---
|
|
469
473
|
|
|
470
474
|
**Hardware validated**: 2026-03-06, IC-7610 over USB on macOS (Darwin arm64), Python 3.11.14, pytest 9.0.2 (issue #146)
|
|
475
|
+
|
|
476
|
+
## Get the Packaged Desktop App
|
|
477
|
+
|
|
478
|
+
!!! tip "Prefer a packaged desktop app?"
|
|
479
|
+
This guide covers the open-source `rigplane` Python library. If you want
|
|
480
|
+
a polished desktop application with a GUI for IC-7610 control on macOS
|
|
481
|
+
and Linux, check out RigPlane Pro.
|
|
482
|
+
|
|
483
|
+
[Download RigPlane Pro for Mac and Linux →](https://rigplane.com/downloads/?utm_source=docs.rigplane.dev&utm_medium=cta&utm_campaign=ic7610-usb-setup)
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Control the dual-receiver Icom IC-9700 via USB serial CI-V or LAN from macOS with RigPlane — both transport options covered end to end.
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# IC-9700 USB Serial Backend Setup (macOS)
|
|
2
6
|
|
|
3
7
|
This guide shows how to control the **IC-9700 dual-receiver transceiver** via USB serial CI-V + USB audio devices or LAN network connection.
|
|
@@ -311,3 +315,12 @@ ConnectionError: failed to connect to 192.168.1.100
|
|
|
311
315
|
- [IC-7300 USB Setup](ic7300-usb-setup.md) — Single-receiver desktop radio
|
|
312
316
|
- [Audio Recipes](audio-recipes.md) — RX/TX dual-receiver examples
|
|
313
317
|
- [Web UI Guide](web-ui.md) — Dual-receiver web interface
|
|
318
|
+
|
|
319
|
+
## Get the Packaged Desktop App
|
|
320
|
+
|
|
321
|
+
!!! tip "Prefer a packaged desktop app?"
|
|
322
|
+
This guide covers the open-source `rigplane` Python library. If you want
|
|
323
|
+
a polished desktop application with a GUI for IC-9700 control on macOS
|
|
324
|
+
and Linux, check out RigPlane Pro.
|
|
325
|
+
|
|
326
|
+
[Download RigPlane Pro for Mac and Linux →](https://rigplane.com/downloads/?utm_source=docs.rigplane.dev&utm_medium=cta&utm_campaign=ic9700-usb-setup)
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Declarative operating profiles for RigPlane — describe desired radio state (frequency, mode, data, VOX) and let the library reconcile it for you.
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# Radio Profiles
|
|
2
6
|
|
|
3
7
|
Radio profiles let you describe the **desired radio state** declaratively — set only the fields you want to change, and the system figures out how to get there.
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: RigPlane's built-in browser Web UI for ham radio control — live tuning, scope and waterfall, meters, and RX/TX audio streaming from any browser.
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# Web UI
|
|
2
6
|
|
|
3
7
|
rigplane ships with a built-in browser UI for live control, scope/waterfall, meters,
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Configure WSJT-X, JTDX, and JS8Call against RigPlane's built-in rigctld server for FT8, FT4, and JS8 on Icom radios — no Hamlib install needed.
|
|
3
|
+
---
|
|
4
|
+
|
|
1
5
|
# WSJT-X / JTDX / JS8Call Setup Guide
|
|
2
6
|
|
|
3
7
|
This guide covers configuring WSJT-X (and compatible apps like JTDX, JS8Call)
|
|
@@ -194,3 +198,12 @@ Tested with:
|
|
|
194
198
|
- **MacLoggerDX** (macOS logging)
|
|
195
199
|
|
|
196
200
|
Any application that supports `Hamlib NET rigctl` should work.
|
|
201
|
+
|
|
202
|
+
## Get the Packaged Desktop App
|
|
203
|
+
|
|
204
|
+
!!! tip "Prefer a packaged desktop app?"
|
|
205
|
+
This guide covers the open-source `rigplane` Python library. If you want
|
|
206
|
+
a polished desktop application with a GUI that handles WSJT-X / JTDX /
|
|
207
|
+
JS8Call integration on macOS and Linux, check out RigPlane Pro.
|
|
208
|
+
|
|
209
|
+
[Download RigPlane Pro for Mac and Linux →](https://rigplane.com/downloads/?utm_source=docs.rigplane.dev&utm_medium=cta&utm_campaign=wsjtx-setup)
|