docs: add offline knowledge library with project analysis and external references
- function-inventory: complete public API for 10 Rust crates + 56 Dart files - coverage-analysis: 312 Rust tests, 221 Dart tests, doc coverage gaps - doc-quality-analysis: duplications, broken refs, useless content audit - link-coverage-report: all internal/external links validated - external/teaspeak: TeaSpeak voice server architecture & protocol - external/respeak: ReSpeak org, tsclientlib, tsproto, crypto docs - external/yatqa-en/de: yat.qa admin tool (English + German) - reviews/: cross-validation reports for all analyses All documentation only, no code changes.
This commit is contained in:
@@ -0,0 +1,64 @@
|
|||||||
|
# Chanora Offline Knowledge Library
|
||||||
|
|
||||||
|
**Generated:** 2026-06-13
|
||||||
|
**Branch:** `docs/offline-knowledge-library-2026-06-13`
|
||||||
|
**Purpose:** Comprehensive offline reference for the Chanora project, its dependencies, and related ecosystem.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Contents
|
||||||
|
|
||||||
|
### Project Analysis
|
||||||
|
|
||||||
|
| Document | Description | Status |
|
||||||
|
|----------|-------------|--------|
|
||||||
|
| [function-inventory.md](function-inventory.md) | Complete public API inventory for all 10 Rust crates + 56 Dart files. Includes dead code analysis. | Reviewed |
|
||||||
|
| [coverage-analysis.md](coverage-analysis.md) | Test coverage (312 Rust tests, 221 Dart tests) and documentation coverage gaps. | Reviewed, corrected |
|
||||||
|
| [doc-quality-analysis.md](doc-quality-analysis.md) | Duplicated content, useless content, and broken references in docs/. | Reviewed, corrected |
|
||||||
|
| [link-coverage-report.md](link-coverage-report.md) | All internal/external links validated. 2 broken LICENSE links, 5 broken doc-path refs. | Reviewed, corrected |
|
||||||
|
|
||||||
|
### External Projects
|
||||||
|
|
||||||
|
| Document | Description | Status |
|
||||||
|
|----------|-------------|--------|
|
||||||
|
| [external/teaspeak-overview.md](external/teaspeak-overview.md) | TeaSpeak voice server - architecture, protocol, build system. | Reviewed |
|
||||||
|
| [external/respeak-overview.md](external/respeak-overview.md) | ReSpeak org - tsclientlib, tsproto, crypto, Chanora integration. | Reviewed |
|
||||||
|
| [external/yatqa-en.md](external/yatqa-en.md) | yat.qa TeamSpeak admin tool (English). | Reviewed |
|
||||||
|
| [external/yatqa-de.md](external/yatqa-de.md) | yat.qa TeamSpeak admin tool (German/Deutsch). | Reviewed |
|
||||||
|
|
||||||
|
### Review Reports
|
||||||
|
|
||||||
|
| Document | Description |
|
||||||
|
|----------|-------------|
|
||||||
|
| [reviews/coverage-analysis-review.md](reviews/coverage-analysis-review.md) | Cross-validation of coverage analysis |
|
||||||
|
| [reviews/doc-quality-review.md](reviews/doc-quality-review.md) | Cross-validation of doc quality analysis |
|
||||||
|
| [reviews/link-coverage-review.md](reviews/link-coverage-review.md) | Cross-validation of link coverage |
|
||||||
|
| [reviews/external-docs-review.md](reviews/external-docs-review.md) | Cross-validation of external project docs |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Key Findings Summary
|
||||||
|
|
||||||
|
### Test Coverage
|
||||||
|
- **Rust**: 312 inline tests + 2 integration tests across 7/9 crates
|
||||||
|
- **Dart**: 221 tests (widgets: 58%, services: 90%)
|
||||||
|
- **Untested crates**: chanora_bridge, chanora_cache, chanora_prefetch
|
||||||
|
|
||||||
|
### Documentation Gaps
|
||||||
|
- No architecture docs for: audio engine, FFI bridge, protocol layer, state machine, cache, prefetch, diagnostics
|
||||||
|
- 15 TODO/FIXME items catalogued across codebase
|
||||||
|
|
||||||
|
### Dead/Useless Code
|
||||||
|
- No true dead code found (platform-gated items are intentional)
|
||||||
|
- 1 malformed markdown in docs/sysdes.md
|
||||||
|
- 2 missing LICENSE files (LICENSE-APACHE, LICENSE-MIT)
|
||||||
|
|
||||||
|
### Duplicated Content
|
||||||
|
- Lifecycle chain repeated in 6+ files
|
||||||
|
- Git commit examples in 3 files
|
||||||
|
- Security doc list in 2 files
|
||||||
|
|
||||||
|
### External Dependencies
|
||||||
|
- **ReSpeak/tsclientlib**: Chanora patches tsproto-types for P-256 coordinate padding
|
||||||
|
- **TeaSpeak**: Compatible voice server, C++20 + Electron architecture
|
||||||
|
- **yat.qa**: TeamSpeak admin tool, v3.9.9b, English + German docs
|
||||||
@@ -0,0 +1,375 @@
|
|||||||
|
# Test & Document Coverage Analysis
|
||||||
|
|
||||||
|
**Generated:** 2026-06-13
|
||||||
|
**Scope:** All crates, Flutter app, and docs/ directory
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Test Coverage Summary
|
||||||
|
|
||||||
|
| Metric | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| Total Rust tests (inline `#[test]`) | 312 |
|
||||||
|
| Total Rust integration tests | 2 |
|
||||||
|
| Total Dart tests (`test()` + `testWidgets()`) | 221 |
|
||||||
|
| Crates with tests | 7/9 |
|
||||||
|
| Dart services with tests | 19/21 (90%) |
|
||||||
|
| Dart widgets with tests | 13/24 (58%) |
|
||||||
|
| Overall estimated coverage | ~65% |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Per-Crate Test Coverage (Rust)
|
||||||
|
|
||||||
|
### chanora_audio — 221 tests, ~48% function coverage
|
||||||
|
|
||||||
|
| Source File | Functions | Tests | Coverage |
|
||||||
|
|-------------|-----------|-------|----------|
|
||||||
|
| engine.rs | ~45 | 7 | ~16% |
|
||||||
|
| ptt_backends/windows.rs | ~80 | 44 | ~55% |
|
||||||
|
| ptt_backends/windows_keymap.rs | ~30 | 12 | ~40% |
|
||||||
|
| ptt_backends/macos.rs | ~35 | 12 | ~34% |
|
||||||
|
| ptt_backends/linux.rs | ~25 | 10 | ~40% |
|
||||||
|
| ptt_backends/mod.rs | ~15 | 1 | ~7% |
|
||||||
|
| transmit_selector.rs | ~20 | 10 | ~50% |
|
||||||
|
| voice_activity.rs | ~15 | 9 | ~60% |
|
||||||
|
| voice_render.rs | ~15 | 9 | ~60% |
|
||||||
|
| mobile_voice_backend.rs | ~20 | 9 | ~45% |
|
||||||
|
| processor/sonora.rs | ~15 | 8 | ~53% |
|
||||||
|
| processor/dsp/agc2.rs | ~10 | 6 | ~60% |
|
||||||
|
| mode_stack.rs | ~10 | 6 | ~60% |
|
||||||
|
| opus_voice.rs | ~10 | 5 | ~50% |
|
||||||
|
| capture_accumulator.rs | ~8 | 5 | ~63% |
|
||||||
|
| processor/dsp/ns.rs | ~8 | 4 | ~50% |
|
||||||
|
| ptt.rs | ~8 | 4 | ~50% |
|
||||||
|
| vad/mod.rs | ~6 | 4 | ~67% |
|
||||||
|
| audio_processing.rs | ~8 | 3 | ~38% |
|
||||||
|
| debug_wav.rs | ~6 | 3 | ~50% |
|
||||||
|
| processor/dsp/hpf.rs | ~5 | 3 | ~60% |
|
||||||
|
| processor/dsp/aec3.rs | ~5 | 3 | ~60% |
|
||||||
|
| transmit_mode.rs | ~4 | 3 | ~75% |
|
||||||
|
| android_render_ring.rs | ~5 | 3 | ~60% |
|
||||||
|
| vad/resampler.rs | ~4 | 3 | ~75% |
|
||||||
|
| vad/apple_coreml.rs | ~5 | 3 | ~60% |
|
||||||
|
| vad/silero_onnx.rs | ~10 | 6 | ~60% |
|
||||||
|
| render_reference.rs | ~8 | 7 | ~88% |
|
||||||
|
| capture_resampler.rs | ~3 | 2 | ~67% |
|
||||||
|
| audio_event_queue.rs | ~4 | 2 | ~50% |
|
||||||
|
| processor/webrtc_apm.rs | ~5 | 2 | ~40% |
|
||||||
|
| frame.rs | ~3 | 1 | ~33% |
|
||||||
|
| lib.rs (defaults) | ~5 | 1 | ~20% |
|
||||||
|
| release_tail.rs | ~4 | 1 | ~25% |
|
||||||
|
| route_policy.rs | ~8 | 8 | ~100% |
|
||||||
|
| **Integration: tests/ptt_privacy.rs** | — | 1 | — |
|
||||||
|
| **Integration: tests/linux_portal_smoke.rs** | — | 1 | — |
|
||||||
|
|
||||||
|
### chanora_protocol — 17 tests, ~18% function coverage
|
||||||
|
|
||||||
|
| Source File | Functions | Tests | Coverage |
|
||||||
|
|-------------|-----------|-------|----------|
|
||||||
|
| adapter.rs | ~80 | 13 | ~16% |
|
||||||
|
| poke_limiter.rs | ~17 | 4 | ~24% |
|
||||||
|
| dto.rs | ~0 | 0 | — |
|
||||||
|
| lib.rs | ~0 | 0 | — |
|
||||||
|
|
||||||
|
**Untested areas:** Message parsing, serialization, most adapter methods
|
||||||
|
|
||||||
|
### chanora_state — 27 tests, ~46% function coverage
|
||||||
|
|
||||||
|
| Source File | Functions | Tests | Coverage |
|
||||||
|
|-------------|-----------|-------|----------|
|
||||||
|
| lib.rs | ~35 | 18 | ~51% |
|
||||||
|
| channel_join.rs | ~24 | 9 | ~38% |
|
||||||
|
|
||||||
|
### chanora_storage — 15 tests, ~24% function coverage
|
||||||
|
|
||||||
|
| Source File | Functions | Tests | Coverage |
|
||||||
|
|-------------|-----------|-------|----------|
|
||||||
|
| lib.rs | ~62 | 15 | ~24% |
|
||||||
|
|
||||||
|
**Untested areas:** Migration logic, concurrent access patterns, error recovery
|
||||||
|
|
||||||
|
### chanora_resolver — 12 tests, ~17% function coverage
|
||||||
|
|
||||||
|
| Source File | Functions | Tests | Coverage |
|
||||||
|
|-------------|-----------|-------|----------|
|
||||||
|
| lib.rs | ~70 | 12 | ~17% |
|
||||||
|
| examples/cli.rs | — | 1 | — |
|
||||||
|
|
||||||
|
**Untested areas:** DNS failure modes, timeout handling, cache behavior
|
||||||
|
|
||||||
|
### chanora_diagnostics — 19 tests, ~26% function coverage
|
||||||
|
|
||||||
|
| Source File | Functions | Tests | Coverage |
|
||||||
|
|-------------|-----------|-------|----------|
|
||||||
|
| lib.rs | ~74 | 19 | ~26% |
|
||||||
|
|
||||||
|
### chanora_core — 11 tests, ~7% function coverage
|
||||||
|
|
||||||
|
| Source File | Functions | Tests | Coverage |
|
||||||
|
|-------------|-----------|-------|----------|
|
||||||
|
| lib.rs | ~140 | 10 | ~7% |
|
||||||
|
| network_diagnostics.rs | ~7 | 1 | ~14% |
|
||||||
|
|
||||||
|
**Untested areas:** Connection lifecycle, server event handling, most state transitions
|
||||||
|
|
||||||
|
### chanora_bridge — 0 tests, 0% function coverage
|
||||||
|
|
||||||
|
| Source File | Functions | Tests | Coverage |
|
||||||
|
|-------------|-----------|-------|----------|
|
||||||
|
| api.rs | ~200+ | 0 | 0% |
|
||||||
|
| frb_generated.rs | ~100+ | 0 | 0% |
|
||||||
|
| permission_jni.rs | ~10 | 0 | 0% |
|
||||||
|
| android_init.rs | ~5 | 0 | 0% |
|
||||||
|
| lib.rs | ~4 | 0 | 0% |
|
||||||
|
|
||||||
|
**Note:** chanora_bridge is an FFI/bridge layer; testing requires integration with Flutter.
|
||||||
|
|
||||||
|
### chanora_cache — 0 tests
|
||||||
|
|
||||||
|
| Source File | Functions | Tests | Coverage |
|
||||||
|
|-------------|-----------|-------|----------|
|
||||||
|
| lib.rs | ~16 | 0 | 0% |
|
||||||
|
|
||||||
|
### chanora_prefetch — 0 tests
|
||||||
|
|
||||||
|
| Source File | Functions | Tests | Coverage |
|
||||||
|
|-------------|-----------|-------|----------|
|
||||||
|
| lib.rs | ~18 | 0 | 0% |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Per-Module Test Coverage (Dart/Flutter)
|
||||||
|
|
||||||
|
### Services — 155 tests across 19 test files
|
||||||
|
|
||||||
|
| Source File | Test File | Tests | Coverage |
|
||||||
|
|-------------|-----------|-------|----------|
|
||||||
|
| android_audio_output_devices.dart | ✅ android_audio_output_devices_test.dart | 2 | Tested |
|
||||||
|
| android_permissions_service.dart | ✅ android_permissions_service_test.dart | 14 | Tested |
|
||||||
|
| app_bootstrap.dart | ✅ app_bootstrap_test.dart | 4 | Tested |
|
||||||
|
| audio_lifecycle_service.dart | ✅ audio_lifecycle_service_test.dart | 4 | Tested |
|
||||||
|
| back_intent_policy.dart | ✅ back_intent_policy_test.dart | 9 | Tested |
|
||||||
|
| back_intent_service.dart | ✅ back_intent_service_test.dart | 5 | Tested |
|
||||||
|
| channel_join_error_mapper.dart | ✅ channel_join_error_mapper_test.dart | Tested |
|
||||||
|
| channel_spacer.dart | ✅ channel_spacer_test.dart | 9 | Tested |
|
||||||
|
| connection_phase_state.dart | ✅ connection_phase_state_test.dart | 8 | Tested |
|
||||||
|
| hard_mute_owners.dart | ✅ hard_mute_owners_test.dart | 3 | Tested |
|
||||||
|
| ios_audio_session_controller.dart | ✅ ios_audio_session_controller_test.dart | 6 | Tested |
|
||||||
|
| macos_permissions_service.dart | ✅ macos_permissions_service_test.dart | 20 | Tested |
|
||||||
|
| poke_active_chat.dart | ✅ poke_active_chat_test.dart | 2 | Tested |
|
||||||
|
| poke_notification_service.dart | ✅ poke_notification_service_test.dart | 2 | Tested |
|
||||||
|
| poke_preferences_service.dart | ✅ poke_preferences_service_test.dart | 4 | Tested |
|
||||||
|
| prefetch_debouncer.dart | ✅ prefetch_debouncer_test.dart | 3 | Tested |
|
||||||
|
| snapshot_state_mapper.dart | ✅ snapshot_state_mapper_test.dart | 7 | Tested |
|
||||||
|
| ts3_server_link.dart | ✅ ts3_server_link_test.dart | 3 | Tested |
|
||||||
|
| ui_preferences_service.dart | ✅ ui_preferences_service_test.dart | 5 | Tested |
|
||||||
|
| voice_join_ordering.dart | ✅ voice_join_ordering_test.dart | 4 | Tested |
|
||||||
|
| **ios_permissions_service.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
| **link_trust_service.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
|
||||||
|
### Widgets — 66 tests across 13 test files
|
||||||
|
|
||||||
|
| Source File | Test File | Tests | Coverage |
|
||||||
|
|-------------|-----------|-------|----------|
|
||||||
|
| app_snack_bar.dart | ✅ app_snack_bar_test.dart | 1 | Tested |
|
||||||
|
| audio_processing_config_state.dart | ✅ audio_processing_config_state_test.dart | 8 | Tested |
|
||||||
|
| bbcode_text.dart | ✅ bbcode_text_test.dart | Tested |
|
||||||
|
| chat_panel.dart | ✅ chat_panel_test.dart | Tested |
|
||||||
|
| chat_views.dart | ✅ chat_views_test.dart | 18 | Tested |
|
||||||
|
| client_info_sheet.dart | ✅ client_info_sheet_test.dart | Tested |
|
||||||
|
| poke_notification_settings.dart | ✅ poke_notification_settings_test.dart | Tested |
|
||||||
|
| snapshot_view.dart | ✅ snapshot_view_test.dart | Tested |
|
||||||
|
| talk_power_warning.dart | ✅ talk_power_warning_test.dart | 1 | Tested |
|
||||||
|
| voice_compact.dart | ✅ voice_compact_test.dart | Tested |
|
||||||
|
| voice_settings_controls.dart | ✅ voice_settings_controls_test.dart | 6 | Tested |
|
||||||
|
| voice_status_summary.dart | ✅ voice_status_summary_test.dart | 5 | Tested |
|
||||||
|
| mobile_ui_resilience.dart | ✅ mobile_ui_resilience_test.dart | Tested |
|
||||||
|
| **audio_debug_stats_panel.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
| **audio_device_list_tile.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
| **audio_output_tile.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
| **connect_widgets.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
| **input_dialogs.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
| **permission_state_banner.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
| **ptt_capability_badge.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
| **voice_bar.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
| **voice_haptics.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
| **voice_level_meter.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
| **voice_platform.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
| **voice_settings.dart** | ❌ No test file | 0 | **UNTESTED** |
|
||||||
|
|
||||||
|
### E2E Tests
|
||||||
|
|
||||||
|
| File | Tests | Notes |
|
||||||
|
|------|-------|-------|
|
||||||
|
| alpha_e2e_test.dart | 1 | End-to-end integration |
|
||||||
|
| beta_e2e_test.dart | 1 | End-to-end integration |
|
||||||
|
| widget_test.dart | — | Default Flutter template |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Document Coverage Summary
|
||||||
|
|
||||||
|
| Metric | Count |
|
||||||
|
|--------|-------|
|
||||||
|
| Total doc files (under docs/) | 55 |
|
||||||
|
| Modules documented | ~15 areas |
|
||||||
|
| Estimated outdated docs | 3-5 |
|
||||||
|
|
||||||
|
## Document Inventory
|
||||||
|
|
||||||
|
### Architecture (4 files)
|
||||||
|
|
||||||
|
| File | Topic | Status | Notes |
|
||||||
|
|------|-------|--------|-------|
|
||||||
|
| architecture/sad.md | Software Architecture Document | Current | 190 lines, references SDD |
|
||||||
|
| architecture/sdd.md | Software Design Document | Current | 161 lines |
|
||||||
|
| architecture/sysdes.md | System Design overview | Current | 21 lines, brief |
|
||||||
|
| architecture/desktop-ptt-architecture.md | Desktop PTT subsystem design | Current | 43 lines |
|
||||||
|
| architecture/file-transfer-design.md | File transfer feature design | Current | 737 lines |
|
||||||
|
| architecture/file-transfer-research.md | File transfer research | Current | 770 lines |
|
||||||
|
| architecture/file-transfer-implementation-plan.md | File transfer implementation plan | Current | 1315 lines |
|
||||||
|
|
||||||
|
### Requirements (2 files + 2 symlinks)
|
||||||
|
|
||||||
|
| File | Topic | Status | Notes |
|
||||||
|
|------|-------|--------|-------|
|
||||||
|
| requirements/srs.md | Software Requirements Spec | Current | 22 lines (pointer) |
|
||||||
|
| requirements/sysrs.md | System Requirements Spec | Current | 22 lines (pointer) |
|
||||||
|
| srs.md | SRS (full) | Current | 2850 lines |
|
||||||
|
| sysrs.md | SysRS (full) | Current | 2014 lines |
|
||||||
|
|
||||||
|
### Verification (5 files)
|
||||||
|
|
||||||
|
| File | Topic | Status | Notes |
|
||||||
|
|------|-------|--------|-------|
|
||||||
|
| verification/verification-master-plan.md | Overall V&V plan | Current | 91 lines |
|
||||||
|
| verification/swe4-unit-verification-plan.md | Unit test plan | Current | 60 lines |
|
||||||
|
| verification/swe5-software-integration-verification-plan.md | Integration test plan | Current | 71 lines |
|
||||||
|
| verification/swe6-software-verification-plan.md | System verification plan | Current | 62 lines |
|
||||||
|
| verification/sys4-system-integration-verification-plan.md | System integration plan | Current | 58 lines |
|
||||||
|
|
||||||
|
### Security (7 files)
|
||||||
|
|
||||||
|
| File | Topic | Status | Notes |
|
||||||
|
|------|-------|--------|-------|
|
||||||
|
| security/threat-model.md | Threat model | Current | 33 lines |
|
||||||
|
| security/license-inventory.md | Rust license inventory | Current | 10970 lines |
|
||||||
|
| security/flutter-license-inventory.md | Flutter license inventory | Current | 5477 lines |
|
||||||
|
| security/diagnostic-redaction-audit-report.md | Diagnostic redaction audit | Current | 31 lines |
|
||||||
|
| security/secure-storage-audit-report.md | Secure storage audit | Current | 31 lines |
|
||||||
|
| security/dependency-and-supply-chain-report.md | Dependency audit | Current | 43 lines |
|
||||||
|
| security/security-privacy-legal-guideline.md | Security/privacy guidelines | Current | 63 lines |
|
||||||
|
|
||||||
|
### Governance (11 files)
|
||||||
|
|
||||||
|
| File | Topic | Status | Notes |
|
||||||
|
|------|-------|--------|-------|
|
||||||
|
| governance/document-index.md | Document catalog | Current | 36 lines |
|
||||||
|
| governance/document-naming-convention.md | Naming conventions | Current | 33 lines |
|
||||||
|
| governance/document-review-report.md | Review report | Current | 37 lines |
|
||||||
|
| governance/traceability-matrix.md | Requirements traceability | Current | 73 lines |
|
||||||
|
| governance/product-decision-register.md | Decision log | Current | 25 lines |
|
||||||
|
| governance/decision-impact-assessment.md | Impact assessment | Current | 18 lines |
|
||||||
|
| governance/git-commit-message-convention.md | Commit conventions | Current | 21 lines |
|
||||||
|
| governance/path-migration-map.md | Path migration plan | Current | 18 lines |
|
||||||
|
| governance/repo-format-validation-report.md | Format validation | Current | 22 lines |
|
||||||
|
| governance/baseline-candidate-validation-report.md | Baseline validation | Current | 38 lines |
|
||||||
|
| governance/baseline-approval-record.md | Baseline approval | Current | 32 lines |
|
||||||
|
| governance/maintainability-review-2026-06-08.md | Maintainability review | Current | 99 lines |
|
||||||
|
|
||||||
|
### Release (4 files)
|
||||||
|
|
||||||
|
| File | Topic | Status | Notes |
|
||||||
|
|------|-------|--------|-------|
|
||||||
|
| release/ios-build.md | iOS build instructions | Current | 47 lines |
|
||||||
|
| release/platform-release-policy.md | Release policy | Current | 26 lines |
|
||||||
|
| release/release-readiness-go-nogo-record.md | Go/no-go record | Current | 105 lines |
|
||||||
|
| release/dv-waiver-register.md | DV waiver register | Current | 36 lines |
|
||||||
|
|
||||||
|
### UI/UX (4 files)
|
||||||
|
|
||||||
|
| File | Topic | Status | Notes |
|
||||||
|
|------|-------|--------|-------|
|
||||||
|
| ui-ux/material3-guideline.md | Material 3 guidelines | Current | 8 lines (brief) |
|
||||||
|
| ui-ux/material3-design-tokens.md | Design tokens | Current | 21 lines |
|
||||||
|
| ui-ux/material3-component-catalog.md | Component catalog | Current | 38 lines |
|
||||||
|
| ui-ux/adaptive-layout-platform-guide.md | Adaptive layout guide | Current | 27 lines |
|
||||||
|
|
||||||
|
### Other
|
||||||
|
|
||||||
|
| File | Topic | Status | Notes |
|
||||||
|
|------|-------|--------|-------|
|
||||||
|
| privacy/privacy-policy.md | Privacy policy | Current | 51 lines |
|
||||||
|
| references/external-references.md | External references | Current | 21 lines |
|
||||||
|
| references/aspice-swe2-swe3-integration-note.md | ASPICE integration note | Current | 28 lines |
|
||||||
|
| legal/trademark-and-attribution-review.md | Trademark review | Current | 47 lines |
|
||||||
|
| i18n/localization-architecture.md | Localization architecture | Current | 44 lines |
|
||||||
|
| implementation-status-2026-05-28.md | Implementation status | **Possibly outdated** | Date is 2026-05-28 |
|
||||||
|
| material3-guideline.md | Material 3 guideline (duplicate) | Current | 93 lines |
|
||||||
|
|
||||||
|
### Superpowers Plans & Specs (13 files)
|
||||||
|
|
||||||
|
| File | Topic | Status |
|
||||||
|
|------|-------|--------|
|
||||||
|
| superpowers/plans/2026-05-28-server-resolution-prefetch.md | Server resolution prefetch plan | Current |
|
||||||
|
| superpowers/plans/2026-05-28-chanora-server-prefetch-crate.md | Prefetch crate plan | Current |
|
||||||
|
| superpowers/plans/2026-05-29-dv-evidence-pack.md | DV evidence pack plan | Current |
|
||||||
|
| superpowers/plans/2026-05-29-state-sync-ui-settings-validation.md | State sync validation plan | Current |
|
||||||
|
| superpowers/plans/2026-05-29-swe2-swe3-baselines.md | SWE2/SWE3 baselines plan | Current |
|
||||||
|
| superpowers/plans/2026-05-29-finish-dv-document-tree.md | DV document tree plan | Current |
|
||||||
|
| superpowers/plans/2026-06-06-chat-panel-switching.md | Chat panel switching plan | Current |
|
||||||
|
| superpowers/plans/2026-06-08-maintainability-continuation.md | Maintainability continuation | Current |
|
||||||
|
| superpowers/plans/2026-06-08-core-internal-split.md | Core internal split plan | Current |
|
||||||
|
| superpowers/specs/2026-05-28-server-resolution-prefetch-design.md | Prefetch design spec | Current |
|
||||||
|
| superpowers/specs/2026-05-28-chanora-server-prefetch-crate-design.md | Prefetch crate design | Current |
|
||||||
|
| superpowers/specs/2026-05-29-state-sync-ui-settings-validation-design.md | State sync design | Current |
|
||||||
|
| superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | Adaptive layout design | Current |
|
||||||
|
| superpowers/specs/2026-06-08-maintainability-continuation-design.md | Maintainability design | Current |
|
||||||
|
| superpowers/specs/2026-06-09-poke-without-message-design.md | Poke without message design | Current |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Documentation Gaps
|
||||||
|
|
||||||
|
The following code modules have **no dedicated documentation**:
|
||||||
|
|
||||||
|
| Module | Functions | Gap Description |
|
||||||
|
|--------|-----------|-----------------|
|
||||||
|
| `chanora_audio` (engine) | ~45 | No architecture doc for audio engine internals |
|
||||||
|
| `chanora_audio` (VAD subsystem) | ~25 | VAD pipeline, model loading, fallback strategy undocumented |
|
||||||
|
| `chanora_audio` (DSP processors) | ~30 | AEC3, AGC2, NS, HPF configuration undocumented |
|
||||||
|
| `chanora_audio` (PTT backends) | ~155 | Platform-specific PTT behavior undocumented |
|
||||||
|
| `chanora_bridge` (FFI layer) | ~300 | Flutter-Rust bridge API contract undocumented |
|
||||||
|
| `chanora_cache` | ~16 | Cache strategy, eviction policy undocumented |
|
||||||
|
| `chanora_prefetch` | ~18 | Prefetch timing, debouncing strategy undocumented |
|
||||||
|
| `chanora_core` | ~147 | Core connection lifecycle, event handling undocumented |
|
||||||
|
| `chanora_state` | ~59 | State machine transitions, delta emission undocumented |
|
||||||
|
| `chanora_storage` | ~62 | Storage format, migration strategy undocumented |
|
||||||
|
| `chanora_protocol` | ~97 | Protocol message format, adapter logic undocumented |
|
||||||
|
| `chanora_resolver` | ~70 | DNS resolution, TSDNS discovery undocumented |
|
||||||
|
| `chanora_diagnostics` | ~74 | Diagnostic collection, redaction rules undocumented |
|
||||||
|
| Flutter services layer | ~21 files | No service-layer architecture doc |
|
||||||
|
| Flutter widgets layer | ~24 files | No widget catalog or component doc |
|
||||||
|
| Localization (l10n) | — | Translation workflow undocumented (only architecture doc exists) |
|
||||||
|
|
||||||
|
## Potentially Outdated Documents
|
||||||
|
|
||||||
|
| File | Reason |
|
||||||
|
|------|--------|
|
||||||
|
| `implementation-status-2026-05-28.md` | Dated 2026-05-28; code has changed significantly since |
|
||||||
|
| `docs/material3-guideline.md` | Duplicate of `docs/ui-ux/material3-guideline.md` |
|
||||||
|
| `docs/sysdes.md` | Top-level duplicate of `docs/architecture/sysdes.md` |
|
||||||
|
| `docs/srs.md` / `docs/sysrs.md` | Top-level duplicates of `docs/requirements/` versions |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Key Findings
|
||||||
|
|
||||||
|
1. **chanora_audio** is the best-tested crate (204 tests), but still only ~48% function coverage due to the large codebase (~428 functions)
|
||||||
|
2. **chanora_bridge**, **chanora_cache**, and **chanora_prefetch** have zero tests
|
||||||
|
3. **chanora_core** has very low coverage (~7%) despite being the main connection orchestrator
|
||||||
|
4. **Dart widget tests** cover only 54% of widget files; 11 widget files have no tests
|
||||||
|
5. **Dart service tests** are strong at 90% coverage (only 2 files untested)
|
||||||
|
6. **Documentation** is extensive (55 files) but focuses on process/governance; code-level architecture docs are sparse
|
||||||
|
7. No dedicated docs exist for the audio engine, FFI bridge, protocol layer, or state machine internals
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
# Documentation Quality Analysis
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
- Total docs analyzed: 64
|
||||||
|
- Duplicated content instances: 8
|
||||||
|
- Useless content items: 1 (malformed markdown only)
|
||||||
|
- Broken references: 1 (suggested file names only; SDD-109/SAD-043 are valid historical refs)
|
||||||
|
|
||||||
|
## Duplicated Content
|
||||||
|
|
||||||
|
### Instance 1: Lifecycle Documentation Chain
|
||||||
|
- **Files**: `README.md:280`, `CONTRIBUTING.md:10`, `docs/sysdes.md:90`, `docs/sysrs.md:108`, `docs/governance/traceability-matrix.md:16`, `docs/references/aspice-swe2-swe3-integration-note.md:12`
|
||||||
|
- **Content**: `SysRS -> SysDes -> SRS -> SAD -> SDD` lifecycle chain repeated across 6+ files
|
||||||
|
- **Recommendation**: Define once in `README.md` and reference from other docs
|
||||||
|
|
||||||
|
### Instance 2: Git Commit Convention Examples
|
||||||
|
- **Files**: `README.md:380`, `CONTRIBUTING.md:38`, `docs/governance/git-commit-message-convention.md:15`
|
||||||
|
- **Content**: Same commit examples (`feat(voice): add push-to-talk state handling`, `fix(protocol): recover channel tree after reconnect snapshot`, etc.) duplicated across 3 files
|
||||||
|
- **Recommendation**: Keep examples only in `docs/governance/git-commit-message-convention.md` and reference from README/CONTRIBUTING
|
||||||
|
|
||||||
|
### Instance 3: Security/Privacy/Legal Document List
|
||||||
|
- **Files**: `README.md:349-355`, `SECURITY.md:33-38`
|
||||||
|
- **Content**: Same list of 6 security documents (threat-model, secure-storage, diagnostic-redaction, dependency, privacy-policy, trademark) repeated verbatim
|
||||||
|
- **Recommendation**: Keep list in `SECURITY.md` and reference from README
|
||||||
|
|
||||||
|
### Instance 4: Architecture Component Table
|
||||||
|
- **Files**: `README.md:73-92`, `docs/architecture/sad.md:56-67`
|
||||||
|
- **Content**: Similar architecture overview showing Flutter UI, Rust Core, Protocol Layer structure
|
||||||
|
- **Recommendation**: Keep detailed version in SAD; use abbreviated version in README
|
||||||
|
|
||||||
|
### Instance 5: Platform Policy Table
|
||||||
|
- **Files**: `README.md:47-54`, `docs/release/platform-release-policy.md:12-19`
|
||||||
|
- **Content**: Platform requirements table with overlapping information
|
||||||
|
- **Recommendation**: Consolidate in `platform-release-policy.md` and reference from README
|
||||||
|
|
||||||
|
### Instance 6: Security Gate Requirements
|
||||||
|
- **Files**: `docs/security/security-privacy-legal-guideline.md:13-21`, `docs/security/threat-model.md:22-30`
|
||||||
|
- **Content**: Similar threat/mitigation tables with overlapping secure-storage and diagnostics concerns
|
||||||
|
- **Recommendation**: Threat model should reference the guideline for gate requirements
|
||||||
|
|
||||||
|
### Instance 7: DV Conclusion Pattern
|
||||||
|
- **Files**: Nearly every `docs/` file ends with a "## DV Conclusion" section
|
||||||
|
- **Content**: Repetitive pattern: "[Area] is documented for DV. [Limitation] remains."
|
||||||
|
- **Recommendation**: This is intentional for ASPICE compliance. No change needed, but consider a template.
|
||||||
|
|
||||||
|
### Instance 8: Android Runtime Gate Documentation
|
||||||
|
- **Files**: `docs/verification/swe5-software-integration-verification-plan.md:57-68`, `docs/governance/maintainability-review-2026-06-08.md:61-88`
|
||||||
|
- **Content**: Same Android ADB/emulator verification steps and `adb devices -l` requirements
|
||||||
|
- **Recommendation**: Define once in a shared reference and import
|
||||||
|
|
||||||
|
## Useless Content
|
||||||
|
|
||||||
|
### Empty Sections
|
||||||
|
|
||||||
|
| File | Line | Header | Issue |
|
||||||
|
|------|------|--------|-------|
|
||||||
|
| `docs/architecture/sysdes.md` | 1-21 | Entire file | Path record file — 21 lines pointing to `docs/sysdes.md` with no unique content |
|
||||||
|
| `docs/requirements/sysrs.md` | 1-22 | Entire file | Path record file — 22 lines pointing to `docs/sysrs.md` with no unique content |
|
||||||
|
| `docs/requirements/srs.md` | 1-22 | Entire file | Path record file — 22 lines pointing to `docs/srs.md` with no unique content |
|
||||||
|
| `docs/ui-ux/material3-guideline.md` | 1-8 | Entire file | Path record file — 8 lines pointing to `docs/material3-guideline.md` |
|
||||||
|
| `docs/sysdes.md` | 13 | `**Repo path:** ... ---` | Malformed markdown (missing blank line before `---`) |
|
||||||
|
|
||||||
|
### TODO/Placeholder Markers
|
||||||
|
|
||||||
|
No actual TODO/TBD/placeholder markers found in the documentation files. The codebase is clean of such markers.
|
||||||
|
|
||||||
|
### Broken References
|
||||||
|
|
||||||
|
| File | Line | Reference | Issue |
|
||||||
|
|------|------|-----------|-------|
|
||||||
|
| `docs/sysrs.md` | 126-130 | `docs/chanora_SysDes.md`, `docs/chanora_SRS.md`, etc. | These suggested file names do not exist. Actual files use different names (`docs/sysdes.md`, `docs/srs.md`, etc.) |
|
||||||
|
| `docs/implementation-status-2026-05-28.md` | 103 | `SDD-109` | References a specific SDD item ID that is not itemized in the current SDD baseline |
|
||||||
|
| `docs/implementation-status-2026-05-28.md` | 105 | `SAD-043` | References a specific SAD item ID that is not itemized in the current SAD baseline |
|
||||||
|
|
||||||
|
### Outdated Content
|
||||||
|
|
||||||
|
| File | Line | Content | Issue |
|
||||||
|
|------|------|---------|-------|
|
||||||
|
| `docs/sysdes.md` | 6 | Version `0.9.8` | Superseded by later governance docs dated 2026-05-29 |
|
||||||
|
| `docs/sysrs.md` | 5 | Version `0.9.11` | May need alignment with SysDes version |
|
||||||
|
| `docs/material3-guideline.md` | 4-5 | Version `0.9.2` | Change history stops at 2026-05-14; no updates for 2026-05-29 baseline |
|
||||||
|
| `tools/windows-smoke.md` | 6 | `product/scaffold-v0` branch | Default base branch changed to `main` per CHANGELOG |
|
||||||
|
| `docs/implementation-status-2026-05-28.md` | 140 | Agent spec docs reference | States docs are "deleted from the working tree but still in git HEAD" — stale cleanup note |
|
||||||
|
|
||||||
|
### Stale Content
|
||||||
|
|
||||||
|
| File | Line | Content | Issue |
|
||||||
|
|------|------|---------|-------|
|
||||||
|
| `docs/implementation-status-2026-05-28.md` | 1 | Date: 2026-05-28 | Pre-dates DV baseline (2026-05-29); may not reflect final baseline state |
|
||||||
|
| `docs/governance/git-commit-message-convention.md` | 18 | `release(android): prepare internal alpha build metadata` | Example uses `release` type which is not in the Conventional Commits standard types |
|
||||||
|
|
||||||
|
## Duplicated Code Blocks
|
||||||
|
|
||||||
|
| Code Hash | Files | Description |
|
||||||
|
|-----------|-------|-------------|
|
||||||
|
| Lifecycle chain | `README.md:280`, `CONTRIBUTING.md:10`, `docs/sysdes.md:90`, `docs/sysrs.md:108`, `docs/governance/traceability-matrix.md:16`, `docs/references/aspice-swe2-swe3-integration-note.md:12` | `SysRS -> SysDes -> SRS -> SAD -> SDD -> Verification` |
|
||||||
|
| Commit examples | `README.md:379-386`, `CONTRIBUTING.md:37-42`, `docs/governance/git-commit-message-convention.md:14-19` | 4-6 identical commit message examples |
|
||||||
|
| Security doc list | `README.md:349-355`, `SECURITY.md:33-38` | 6 identical file paths |
|
||||||
|
| Architecture ASCII art | `README.md:73-92`, `docs/architecture/sad.md:56-67` | Similar but not identical architecture diagrams |
|
||||||
|
| Platform table | `README.md:47-54`, `docs/release/platform-release-policy.md:12-19` | Overlapping platform requirement tables |
|
||||||
|
|
||||||
|
## Recommendations
|
||||||
|
|
||||||
|
### High Priority
|
||||||
|
1. **Consolidate lifecycle chain**: Define once in README, reference elsewhere
|
||||||
|
2. **Fix suggested file names**: `docs/sysrs.md` lines 126-130 reference non-existent file names
|
||||||
|
|
||||||
|
### Medium Priority
|
||||||
|
4. **Consolidate commit examples**: Keep in `git-commit-message-convention.md` only
|
||||||
|
5. **Consolidate security doc list**: Keep in `SECURITY.md` only
|
||||||
|
6. **Update outdated branch reference**: `tools/windows-smoke.md` references `product/scaffold-v0` but default is now `main`
|
||||||
|
|
||||||
|
### Low Priority
|
||||||
|
7. **Align document versions**: SysDes (0.9.8), SysRS (0.9.11), Material3 (0.9.2) have different versions
|
||||||
|
8. **Clean up implementation status**: Remove stale agent-spec references and update date
|
||||||
+280
@@ -0,0 +1,280 @@
|
|||||||
|
# ReSpeak Project Knowledge Base
|
||||||
|
|
||||||
|
> **Source**: https://github.com/ReSpeak/tsclientlib
|
||||||
|
> **Last synced**: 2026-06-13
|
||||||
|
> **License**: MIT OR Apache-2.0
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
ReSpeak is an open-source project that provides a Rust implementation of the **TeamSpeak 3 protocol**. The primary goal is to enable building TeamSpeak clients and bots in Rust. The project is **not** an official TeamSpeak product — it was created for fun and to gain features/bugfixes not available in the official client.
|
||||||
|
|
||||||
|
The organization maintains a single monorepo (`ReSpeak/tsclientlib`) containing multiple crates that layer from low-level protocol handling up to a high-level client library.
|
||||||
|
|
||||||
|
**Key principle**: ReSpeak does **not** publish server-side code. They earn revenue by selling servers and ReSpeak respects that business model.
|
||||||
|
|
||||||
|
## Repository Map
|
||||||
|
|
||||||
|
| Crate | Path | Purpose | Version |
|
||||||
|
|-------|------|---------|---------|
|
||||||
|
| `tsclientlib` | `tsclientlib/` | High-level client/bot library | 0.2.0 |
|
||||||
|
| `tsproto` | `tsproto/` | Low-level TeamSpeak 3 protocol implementation | 0.2.0 |
|
||||||
|
| `ts-bookkeeping` | `utils/ts-bookkeeping/` | Server state tracking (clients, channels) | 0.1.x |
|
||||||
|
| `tsproto-packets` | `utils/tsproto-packets/` | Packet and command parsing/serialization | 0.1.x |
|
||||||
|
| `tsproto-types` | `utils/tsproto-types/` | Core types, enums, crypto primitives | 0.1.x |
|
||||||
|
| `tsproto-structs` | `utils/tsproto-structs/` | Generated structs from tsdeclarations | 0.1.x |
|
||||||
|
|
||||||
|
**External dependency**: [tsdeclarations](https://github.com/ReSpeak/tsdeclarations) — machine-readable TeamSpeak protocol declarations (embedded as git submodule).
|
||||||
|
|
||||||
|
## tsclientlib
|
||||||
|
|
||||||
|
### Architecture
|
||||||
|
|
||||||
|
`tsclientlib` is the **top-level crate** — the one consumers use. It provides:
|
||||||
|
|
||||||
|
- `Connection` struct: manages a single connection to a TeamSpeak server
|
||||||
|
- Async API built on `tokio` + `futures`
|
||||||
|
- DNS SRV resolution for server discovery (`resolver.rs`)
|
||||||
|
- Audio handling via `audiopus` (Opus codec) behind the `audio` feature flag
|
||||||
|
- Sync wrapper (`sync.rs`) for non-async contexts
|
||||||
|
- Prelude module for convenient imports
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
| Feature | Default | Description |
|
||||||
|
|---------|---------|-------------|
|
||||||
|
| `audio` | yes | Opus encode/decode, `AudioHandler` for jitter buffer + mixing |
|
||||||
|
| `unstable` | no | Expose internal protocol API (may break on minor releases) |
|
||||||
|
| `default-tls` | yes | reqwest with default TLS for HTTP/HTTPS |
|
||||||
|
| `bundled` | no | Bundle SDL2 |
|
||||||
|
| `static-link` | no | Statically link SDL2 |
|
||||||
|
| `audiopus-unstable` | no | Extended audiopus API from Flakebi's fork |
|
||||||
|
|
||||||
|
### Key Dependencies
|
||||||
|
|
||||||
|
- `tsproto` — protocol layer
|
||||||
|
- `ts-bookkeeping` — state management
|
||||||
|
- `tsproto-packets` — packet parsing
|
||||||
|
- `tsproto-types` — types + crypto
|
||||||
|
- `tokio` — async runtime
|
||||||
|
- `hickory-proto` / `hickory-resolver` — DNS resolution
|
||||||
|
- `reqwest` — HTTP client
|
||||||
|
- `audiopus` — Opus codec (optional)
|
||||||
|
|
||||||
|
### Source Files
|
||||||
|
|
||||||
|
| File | Purpose |
|
||||||
|
|------|---------|
|
||||||
|
| `lib.rs` | Core types, re-exports, `Connection` entry point |
|
||||||
|
| `audio.rs` | Audio subsystem — Opus encode/decode, `AudioHandler` |
|
||||||
|
| `resolver.rs` | DNS SRV resolution for TeamSpeak servers |
|
||||||
|
| `sync.rs` | Synchronous wrapper API |
|
||||||
|
| `prelude.rs` | Convenience re-exports |
|
||||||
|
| `tests.rs` | Integration tests |
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
- `simple.rs` — minimal async client
|
||||||
|
- `simple-sync.rs` — minimal sync client
|
||||||
|
- `audio.rs` — audio streaming client
|
||||||
|
- `audio-latency.rs` — latency measurement
|
||||||
|
- `channeltree.rs` — channel navigation
|
||||||
|
- `many.rs` / `sync.rs` — stress tests
|
||||||
|
|
||||||
|
## tsproto
|
||||||
|
|
||||||
|
### Architecture
|
||||||
|
|
||||||
|
`tsproto` implements the **low-level TeamSpeak 3 protocol**:
|
||||||
|
|
||||||
|
- Connection establishment and handshake
|
||||||
|
- UDP packet delivery with reliability (resend logic)
|
||||||
|
- Packet encryption and compression
|
||||||
|
- Command parsing
|
||||||
|
|
||||||
|
### Source Files
|
||||||
|
|
||||||
|
| File | Purpose |
|
||||||
|
|------|---------|
|
||||||
|
| `algorithms.rs` | Packet splitting, encryption/decryption, compression, hash cash |
|
||||||
|
| `client.rs` | Client-side connection logic |
|
||||||
|
| `connection.rs` | Connection state machine, packet queuing |
|
||||||
|
| `packet_codec.rs` | Packet encoding/decoding codec |
|
||||||
|
| `resend.rs` | Reliable packet delivery with retransmission |
|
||||||
|
| `license.rs` | License system implementation |
|
||||||
|
| `log.rs` | Logging utilities |
|
||||||
|
| `utils.rs` | Helper functions |
|
||||||
|
|
||||||
|
### Protocol Details
|
||||||
|
|
||||||
|
#### Packet Types
|
||||||
|
|
||||||
|
| Type | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| `Command` | High-priority commands |
|
||||||
|
| `CommandLow` | Low-priority commands |
|
||||||
|
| `Voice` | Voice data |
|
||||||
|
| `VoiceWhisper` | Whisper voice data |
|
||||||
|
| `Ack` / `AckLow` | Acknowledgments |
|
||||||
|
| `Ping` / `Pong` | Keepalive |
|
||||||
|
| `Init` | Connection initialization |
|
||||||
|
|
||||||
|
#### Packet Limits
|
||||||
|
|
||||||
|
- **Max UDP packet size**: 1500 bytes (ethernet MTU)
|
||||||
|
- **Max command packet size**: 500 bytes (including header)
|
||||||
|
- **Max fragments length**: 40960 bytes
|
||||||
|
- **Max decompressed size**: 2 MiB (for large servers with 2000+ channels)
|
||||||
|
- **Max out-of-order queue**: 200 packets
|
||||||
|
|
||||||
|
#### Compression
|
||||||
|
|
||||||
|
- Uses **QuickLZ** level 1 for command packets
|
||||||
|
- Compression only applied if result is smaller than original
|
||||||
|
- Fragmentation occurs when compressed data exceeds 500 bytes
|
||||||
|
|
||||||
|
### Cryptography
|
||||||
|
|
||||||
|
#### Key Types
|
||||||
|
|
||||||
|
| Type | Curve | Usage |
|
||||||
|
|------|-------|-------|
|
||||||
|
| `EccKeyPubP256` | P-256 (secp256r1) | Public identity key |
|
||||||
|
| `EccKeyPrivP256` | P-256 | Private identity key |
|
||||||
|
| `EccKeyPubEd25519` | Ed25519 | Public ephemeral key (handshake) |
|
||||||
|
| `EccKeyPrivEd25519` | Ed25519 | Private ephemeral key (handshake) |
|
||||||
|
|
||||||
|
#### Encryption Algorithm
|
||||||
|
|
||||||
|
1. **Key derivation**: `SHA-256(packet_type || generation_id || shared_iv)` → 16-byte key + 16-byte nonce
|
||||||
|
2. **Cipher**: AES-128 in EAX mode with 8-byte MAC
|
||||||
|
3. **Key caching**: Derived keys are cached per generation to avoid recomputation
|
||||||
|
4. **Packet ID mixing**: `key[0] ^= (packet_id >> 8)`, `key[1] ^= (packet_id & 0xff)`
|
||||||
|
|
||||||
|
#### Shared IV Computation (`compute_iv_mac`)
|
||||||
|
|
||||||
|
1. ECDH shared secret via Ed25519
|
||||||
|
2. `shared_iv = SHA-512(shared_secret)`
|
||||||
|
3. XOR with `alpha` (10 bytes) and `beta` (54 bytes) from handshake
|
||||||
|
4. `shared_mac = SHA-1(shared_iv)[..8]`
|
||||||
|
|
||||||
|
#### Hash Cash (Identity Proof-of-Work)
|
||||||
|
|
||||||
|
- Identity level = number of leading zero bits in `SHA-1(public_key_string || counter)`
|
||||||
|
- `upgrade_level(target)` iterates counter until desired level is reached
|
||||||
|
- Default target level: 8
|
||||||
|
|
||||||
|
#### Identity Format
|
||||||
|
|
||||||
|
```
|
||||||
|
Format: counter || 'V' || base64(private_key)
|
||||||
|
Example: "2792354VMG8DAgeAAgEgAiEA..."
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Fake Encryption
|
||||||
|
|
||||||
|
- Used for unencrypted packet types (voice, ack, ping, etc.)
|
||||||
|
- Fixed key: `c:\windows\syste` (16 bytes)
|
||||||
|
- Fixed nonce: `m\firewall32.cpl` (16 bytes)
|
||||||
|
|
||||||
|
## ts-bookkeeping
|
||||||
|
|
||||||
|
Tracks the **server state** by processing incoming commands:
|
||||||
|
|
||||||
|
- Maintains client list, channel tree, server info
|
||||||
|
- Generates events from state changes
|
||||||
|
- Provides methods to create outgoing command packets
|
||||||
|
- Main struct: `data::Connection`
|
||||||
|
|
||||||
|
## tsproto-packets
|
||||||
|
|
||||||
|
Handles **packet serialization/deserialization**:
|
||||||
|
|
||||||
|
- `packets.rs` — packet structures (`InPacket`, `OutPacket`, `OutAck`, etc.)
|
||||||
|
- `commands.rs` — TeamSpeak command parsing
|
||||||
|
- Header constants: `C2S_HEADER_LEN`, `S2C_HEADER_LEN`
|
||||||
|
|
||||||
|
## tsproto-types
|
||||||
|
|
||||||
|
Core **types and primitives**:
|
||||||
|
|
||||||
|
- `crypto.rs` — ECC key types (P-256, Ed25519), ECDH, signatures, identity obfuscation
|
||||||
|
- `versions.rs` — TeamSpeak version strings
|
||||||
|
- `errors.rs` — Protocol error codes
|
||||||
|
|
||||||
|
### Key Crypto Functions
|
||||||
|
|
||||||
|
| Function | Description |
|
||||||
|
|----------|-------------|
|
||||||
|
| `EccKeyPrivP256::create()` | Generate new P-256 keypair |
|
||||||
|
| `EccKeyPrivP256::import_str()` | Import from base64/tomcrypt/obfuscated formats |
|
||||||
|
| `EccKeyPrivP256::create_shared_secret()` | ECDH with P-256 |
|
||||||
|
| `EccKeyPrivP256::sign()` | ECDSA signature |
|
||||||
|
| `EccKeyPubP256::verify()` | ECDSA verification |
|
||||||
|
| `EccKeyPubP256::get_uid()` | `base64(SHA-1(ts_encoded_key))` |
|
||||||
|
| `encode_password()` | `base64(SHA-1(password))` |
|
||||||
|
| `EccKeyPrivEd25519::create_shared_secret()` | ECDH with Ed25519 |
|
||||||
|
|
||||||
|
### Identity Obfuscation
|
||||||
|
|
||||||
|
TeamSpeak stores identities XOR'd with a static 128-byte pattern + SHA-1 hash of trailing data. ReSpeak implements both obfuscation and deobfuscation.
|
||||||
|
|
||||||
|
## How Chanora Uses ReSpeak
|
||||||
|
|
||||||
|
Chanora depends on **four crates** from the ReSpeak monorepo, all pinned to revision `04aa2491`:
|
||||||
|
|
||||||
|
### Dependency Chain
|
||||||
|
|
||||||
|
```
|
||||||
|
chanora_protocol/
|
||||||
|
├── tsclientlib (rev 04aa2491, features=["audio"])
|
||||||
|
├── tsproto-packets (rev 04aa2491)
|
||||||
|
├── tsproto-types (rev 04aa2491)
|
||||||
|
└── ts-bookkeeping (rev 04aa2491)
|
||||||
|
|
||||||
|
chanora_audio/
|
||||||
|
└── tsclientlib (rev 04aa2491, features=["audio"])
|
||||||
|
```
|
||||||
|
|
||||||
|
### Architectural Constraint (SAD-067 / SysDes-011 / SysDes-029)
|
||||||
|
|
||||||
|
Chanora's `chanora_protocol` crate acts as an **isolation boundary**:
|
||||||
|
|
||||||
|
> No tsclientlib types may cross out of this crate.
|
||||||
|
|
||||||
|
This prevents ReSpeak API changes from cascading through Chanora's codebase.
|
||||||
|
|
||||||
|
### Patched Fork
|
||||||
|
|
||||||
|
Chanora patches `tsproto-types` to fix **P-256 short coordinate padding**:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[patch."https://github.com/ReSpeak/tsclientlib.git"]
|
||||||
|
tsproto-types = { git = "https://github.com/EdisonJwa/tsclientlib.git", branch = "fix/p256-short-coordinate-pad" }
|
||||||
|
```
|
||||||
|
|
||||||
|
This handles cases where P-256 coordinates are shorter than 32 bytes and need left-padding.
|
||||||
|
|
||||||
|
### Key Usage Points
|
||||||
|
|
||||||
|
1. **Protocol connection**: `tsclientlib::Connection` for TeamSpeak server connections
|
||||||
|
2. **Audio handling**: `AudioHandler` from tsclientlib for decode, jitter buffer, mixing
|
||||||
|
3. **Packet types**: `tsproto-packets` for `OutAudio`, `InAudioBuf`, `AudioData`, `CodecType`, `Direction`
|
||||||
|
4. **State tracking**: `ts-bookkeeping` for server state management
|
||||||
|
|
||||||
|
## External References
|
||||||
|
|
||||||
|
- **Qint** (https://github.com/ReSpeak/Qint) — Cross-platform TeamSpeak client built on tsclientlib (not yet ready)
|
||||||
|
- **SimpleBot** (https://github.com/ReSpeak/SimpleBot) — Example chat bot
|
||||||
|
- **tsdeclarations** (https://github.com/ReSpeak/tsdeclarations) — Machine-readable protocol declarations
|
||||||
|
- **TSIdentityTool** (https://github.com/landave/TSIdentityTool) — Identity deobfuscation reference (MIT)
|
||||||
|
|
||||||
|
## Performance Benchmarks
|
||||||
|
|
||||||
|
From i7-5280K @ 3.6 GHz (single-threaded):
|
||||||
|
|
||||||
|
| Operation | Time | Throughput |
|
||||||
|
|-----------|------|------------|
|
||||||
|
| Connection creation | 199 ms | 6.5 conn/sec |
|
||||||
|
| Message send | 189 µs | 5300 msg/sec |
|
||||||
|
|
||||||
|
Bottleneck: RSA puzzle solving at connection time. Use `--features rug` for efficient big integer implementation.
|
||||||
@@ -0,0 +1,392 @@
|
|||||||
|
# TeaSpeak Project Knowledge Base
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
TeaSpeak is an open-source, TeamSpeak-compatible voice communication platform hosted at `https://git.did.science/TeaSpeak`. It consists of two main repositories:
|
||||||
|
|
||||||
|
- **TeaSpeak-Client** — An Electron-based desktop client (329 commits, created May 2020)
|
||||||
|
- **TeaSpeakLibrary** — A C++ shared library providing core protocol, channel, and database functionality (208 commits, created May 2020)
|
||||||
|
|
||||||
|
The project is developed by WolverinDEV / TeaSpeak and targets users who need a self-hosted, TeamSpeak-compatible voice chat solution.
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
### Two-Repository Design
|
||||||
|
|
||||||
|
```
|
||||||
|
TeaSpeak/
|
||||||
|
├── TeaSpeak-Client/ # Electron desktop application
|
||||||
|
│ ├── main.ts # Entry point (Electron main process)
|
||||||
|
│ ├── modules/ # TypeScript modules (core, renderer, shared, crash_handler)
|
||||||
|
│ ├── native/ # C++ native addons (Node.js N-API)
|
||||||
|
│ │ ├── serverconnection/ # Server connection & audio engine
|
||||||
|
│ │ ├── codec/ # Opus codec bindings
|
||||||
|
│ │ ├── crash_handler/ # Native crash handling
|
||||||
|
│ │ ├── dns/ # DNS resolution
|
||||||
|
│ │ ├── ppt/ # Protocol handling
|
||||||
|
│ │ └── updater/ # Auto-updater
|
||||||
|
│ ├── imports/ # Shared TypeScript definitions & vendor libs
|
||||||
|
│ └── resources/ # Static assets
|
||||||
|
│
|
||||||
|
└── TeaSpeakLibrary/ # C++ static library
|
||||||
|
├── CMakeLists.txt # CMake build system
|
||||||
|
├── src/
|
||||||
|
│ ├── protocol/ # TeamSpeak protocol implementation
|
||||||
|
│ ├── channel/ # Channel tree management
|
||||||
|
│ ├── query/ # Server query protocol
|
||||||
|
│ ├── sql/ # SQLite & MySQL database layer
|
||||||
|
│ ├── ssl/ # SSL/TLS support
|
||||||
|
│ ├── bbcode/ # BBCode parsing
|
||||||
|
│ └── misc/ # Utilities (crypto, networking, etc.)
|
||||||
|
└── test/ # Unit tests
|
||||||
|
```
|
||||||
|
|
||||||
|
### Client Architecture (Electron)
|
||||||
|
|
||||||
|
The client uses a multi-process Electron architecture:
|
||||||
|
|
||||||
|
- **Main Process** (`modules/core/main.ts`) — App lifecycle, window management, crash handling
|
||||||
|
- **Renderer Process** (`modules/renderer/`) — UI rendering, audio controls, connection management
|
||||||
|
- **Shared Module** (`modules/shared/`) — IPC definitions, version info, proxy utilities
|
||||||
|
- **Native Addons** (`native/`) — C++ bindings for performance-critical operations
|
||||||
|
|
||||||
|
Key TypeScript path aliases:
|
||||||
|
- `tc-shared/*` → `imports/shared-app/*`
|
||||||
|
- `tc-native/connection` → `native/serverconnection/exports/exports.d.ts`
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Voice Communication
|
||||||
|
- Opus audio codec support (encoder/decoder)
|
||||||
|
- Audio input/output with gain control and level metering
|
||||||
|
- Audio mixing and interleaving
|
||||||
|
- Voice activity detection (VAD) via libfvad
|
||||||
|
- Audio filtering and processing pipeline
|
||||||
|
- Sound file playback capabilities
|
||||||
|
|
||||||
|
### Server Protocol
|
||||||
|
- TeamSpeak protocol compatibility
|
||||||
|
- Custom protocol handler with crypto support (ProtocolHandlerCrypto)
|
||||||
|
- Packet acknowledgement and loss calculation
|
||||||
|
- Ring buffer for reliable packet delivery
|
||||||
|
- QuickLZ compression
|
||||||
|
- Hardware ID (HWID) generation for client identification
|
||||||
|
|
||||||
|
### Channel System
|
||||||
|
- Tree-based channel hierarchy (TreeView)
|
||||||
|
- Channel properties and permissions
|
||||||
|
- BBCode formatting support
|
||||||
|
|
||||||
|
### Data & Storage
|
||||||
|
- SQLite database support
|
||||||
|
- MySQL database support
|
||||||
|
- Client storage and profiles
|
||||||
|
- File transfer capabilities
|
||||||
|
- Connection logging
|
||||||
|
|
||||||
|
### Client Features
|
||||||
|
- Auto-updater
|
||||||
|
- Crash handler with Sentry integration
|
||||||
|
- Window management and system tray
|
||||||
|
- Keyboard shortcuts
|
||||||
|
- Context menus
|
||||||
|
- i18n (internationalization)
|
||||||
|
- Music playback
|
||||||
|
- URL preview
|
||||||
|
|
||||||
|
## Technology Stack
|
||||||
|
|
||||||
|
### Client (TeaSpeak-Client)
|
||||||
|
| Component | Technology |
|
||||||
|
|-----------|-----------|
|
||||||
|
| Runtime | Electron 8.5.5 |
|
||||||
|
| Language | TypeScript 3.9, C++ |
|
||||||
|
| UI | HTML/CSS, jQuery, EJS templates |
|
||||||
|
| Styling | SASS |
|
||||||
|
| Native addons | cmake-js, Node.js N-API |
|
||||||
|
| Build | electron-packager |
|
||||||
|
| Error tracking | Sentry |
|
||||||
|
|
||||||
|
### Library (TeaSpeakLibrary)
|
||||||
|
| Component | Technology |
|
||||||
|
|-----------|-----------|
|
||||||
|
| Language | C++20 |
|
||||||
|
| Build system | CMake 3.6+ |
|
||||||
|
| Crypto | TomCrypt, TomMath, OpenSSL, Ed25519 |
|
||||||
|
| Compression | QuickLZ |
|
||||||
|
| Database | SQLite3, MySQL Connector/C++ |
|
||||||
|
| Logging | spdlog |
|
||||||
|
| Events | libevent |
|
||||||
|
| Audio | Opus |
|
||||||
|
| JSON | jsoncpp |
|
||||||
|
| Serialization | Protocol Buffers |
|
||||||
|
| Memory | jemalloc |
|
||||||
|
| Crash reporting | Breakpad |
|
||||||
|
| Terminal | CXXTerminal (server mode) |
|
||||||
|
| Threading | Custom ThreadPool |
|
||||||
|
| String templating | StringVariable |
|
||||||
|
| Networking | DataPipes (includes libnice for ICE) |
|
||||||
|
|
||||||
|
### External Dependencies (from libraries.txt)
|
||||||
|
- PortAudio — Cross-platform audio I/O
|
||||||
|
- libfvad — Voice activity detection
|
||||||
|
- SoXR — High-quality sample rate conversion
|
||||||
|
|
||||||
|
## Protocol / API
|
||||||
|
|
||||||
|
### TeamSpeak Protocol Implementation
|
||||||
|
|
||||||
|
The protocol layer (`TeaSpeakLibrary/src/protocol/`) implements:
|
||||||
|
|
||||||
|
- **Packet** — Core packet structure and serialization
|
||||||
|
- **CryptHandler** — Encryption/decryption for secure communication
|
||||||
|
- **CompressionHandler** — QuickLZ-based packet compression
|
||||||
|
- **AcknowledgeManager** — Reliable delivery with ACK tracking
|
||||||
|
- **PacketLossCalculator** — Network quality monitoring
|
||||||
|
- **RingBuffer** — Circular buffer for packet ordering
|
||||||
|
- **Generation** — Protocol version/generation handling
|
||||||
|
|
||||||
|
### Server Connection (Client Side)
|
||||||
|
|
||||||
|
The native server connection module (`native/serverconnection/`) handles:
|
||||||
|
|
||||||
|
- **ServerConnection** — Main connection state machine
|
||||||
|
- **ProtocolHandler** — Full protocol implementation split across:
|
||||||
|
- `ProtocolHandlerCommands.cpp` — Command processing
|
||||||
|
- `ProtocolHandlerCrypto.cpp` — Crypto handshake
|
||||||
|
- `ProtocolHandlerPOW.cpp` — Proof of work (anti-spam)
|
||||||
|
- `ProtocolHandlerPackets.cpp` — Packet serialization
|
||||||
|
- **Socket** — TCP/UDP socket management
|
||||||
|
- **Audio subsystem** — Codec, drivers, filters, processing
|
||||||
|
|
||||||
|
### Query Protocol
|
||||||
|
|
||||||
|
Server query support (`src/query/`) with:
|
||||||
|
- Command parsing (v2 and v3 formats)
|
||||||
|
- Escape sequence handling
|
||||||
|
|
||||||
|
## Build & Configuration
|
||||||
|
|
||||||
|
### Building TeaSpeakLibrary
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Prerequisites: CMake 3.6+, C++20 compiler, OpenSSL, MySQL, etc.
|
||||||
|
mkdir build && cd build
|
||||||
|
cmake .. -DTEASPEAK_SERVER=ON
|
||||||
|
make -j$(nproc)
|
||||||
|
|
||||||
|
# Build tests (optional)
|
||||||
|
cmake .. -DBUILD_TESTS=ON
|
||||||
|
make -j$(nproc)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building TeaSpeak-Client
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install dependencies
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# Compile TypeScript
|
||||||
|
npm run compile-tsc
|
||||||
|
|
||||||
|
# Compile SASS
|
||||||
|
npm run compile-sass
|
||||||
|
|
||||||
|
# Generate JSON validators
|
||||||
|
npm run compile-json-validator
|
||||||
|
|
||||||
|
# Build for Linux
|
||||||
|
npm run build-linux-64
|
||||||
|
npm run package-linux-64
|
||||||
|
|
||||||
|
# Build for Windows
|
||||||
|
npm run build-windows-64
|
||||||
|
npm run package-windows-64
|
||||||
|
|
||||||
|
# Development mode
|
||||||
|
npm run start-s # Connects to localhost:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
### Environment Variables
|
||||||
|
|
||||||
|
- `teaclient_deploy_secret` — Deployment signing key (in `env.sh`)
|
||||||
|
|
||||||
|
### Platform-Specific Dependencies
|
||||||
|
|
||||||
|
- **Linux**: electron-installer-debian
|
||||||
|
- **Windows**: electron-installer-windows, electron-winstaller, electron-wix-msi, rcedit
|
||||||
|
|
||||||
|
## Key Concepts
|
||||||
|
|
||||||
|
### Protocol Concepts
|
||||||
|
- **HWID** (Hardware ID) — Unique machine identifier for client authentication
|
||||||
|
- **POW** (Proof of Work) — Anti-spam mechanism in connection handshake
|
||||||
|
- **Ring Buffer** — Circular buffer for managing packet ordering and retransmission
|
||||||
|
- **Acknowledge Manager** — Tracks packet delivery confirmation
|
||||||
|
- **Packet Loss Calculator** — Monitors network quality metrics
|
||||||
|
|
||||||
|
### Audio Concepts
|
||||||
|
- **Opus Converter** — Handles Opus encoding/decoding
|
||||||
|
- **Audio Gain** — Volume amplification/attenuation
|
||||||
|
- **Audio Level Meter** — Real-time audio level monitoring
|
||||||
|
- **Audio Merger** — Combines multiple audio streams
|
||||||
|
- **Audio Interleaved** — Audio frame interleaving for transmission
|
||||||
|
- **Audio Event Loop** — Async audio processing pipeline
|
||||||
|
- **VAD** (Voice Activity Detection) — Detects speech vs silence
|
||||||
|
|
||||||
|
### Channel Concepts
|
||||||
|
- **TreeView** — Hierarchical channel structure (parent/child relationships)
|
||||||
|
- **BBCode** — Text formatting markup (TeamSpeak standard)
|
||||||
|
- **Permission Manager** — Role-based access control
|
||||||
|
|
||||||
|
### Connection Concepts
|
||||||
|
- **ServerConnection** — Full connection lifecycle management
|
||||||
|
- **Command Handler** — Processes server commands/responses
|
||||||
|
- **Handshake Handler** — Initial connection negotiation
|
||||||
|
- **Voice Connection** — Audio stream management
|
||||||
|
- **Video Connection** — Video stream support
|
||||||
|
- **Dummy Voice Connection** — Placeholder/mock for testing
|
||||||
|
|
||||||
|
## Source Repository Structure
|
||||||
|
|
||||||
|
### TeaSpeak-Client Root
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── .gitignore
|
||||||
|
├── .gitmodules
|
||||||
|
├── bugs # Bug tracking
|
||||||
|
├── build_declarations.sh # Build script for type declarations
|
||||||
|
├── env.sh # Environment variables
|
||||||
|
├── generate-json-validators.sh # JSON schema validation generator
|
||||||
|
├── libraries.txt # External library references
|
||||||
|
├── main.ts # Electron entry point
|
||||||
|
├── package.json # Node.js dependencies & scripts
|
||||||
|
├── package-lock.json
|
||||||
|
├── restore.sh # Restore script
|
||||||
|
├── tsconfig.json # TypeScript configuration
|
||||||
|
├── tsconfig_render_api.json # Renderer API TypeScript config
|
||||||
|
├── imports/ # Shared TypeScript types & vendor code
|
||||||
|
│ ├── shared-app/ # Application-level shared types
|
||||||
|
│ │ ├── audio/ # Audio type definitions
|
||||||
|
│ │ ├── backend/ # Backend interfaces
|
||||||
|
│ │ ├── clientservice/ # Client service definitions
|
||||||
|
│ │ ├── connection/ # Connection type definitions
|
||||||
|
│ │ │ └── rtc/ # WebRTC-related types
|
||||||
|
│ │ ├── connectionlog/ # Connection logging
|
||||||
|
│ │ ├── conversations/ # Chat/conversation types
|
||||||
|
│ │ ├── crypto/ # Crypto interfaces
|
||||||
|
│ │ ├── entry-points/ # Module entry points
|
||||||
|
│ │ ├── events/ # Event definitions
|
||||||
|
│ │ ├── file/ # File handling types
|
||||||
|
│ │ ├── i18n/ # Internationalization
|
||||||
|
│ │ ├── ipc/ # IPC message definitions
|
||||||
|
│ │ ├── media/ # Media handling
|
||||||
|
│ │ ├── music/ # Music playback
|
||||||
|
│ │ ├── permission/ # Permission types
|
||||||
|
│ │ ├── profiles/ # User profiles
|
||||||
|
│ │ ├── text/ # Text processing
|
||||||
|
│ │ ├── tree/ # Tree data structures
|
||||||
|
│ │ ├── ui/ # UI component types
|
||||||
|
│ │ └── update/ # Update mechanism
|
||||||
|
│ ├── svg-sprites/ # SVG icon sprites
|
||||||
|
│ └── vendor/ # Third-party libraries
|
||||||
|
│ ├── TeaEventBus/ # Event bus implementation
|
||||||
|
│ └── TeaClientServices/ # Client services
|
||||||
|
├── installer/ # Build & packaging scripts
|
||||||
|
├── jenkins/ # CI/CD pipeline
|
||||||
|
├── modules/ # TypeScript source modules
|
||||||
|
│ ├── core/ # Main process
|
||||||
|
│ │ ├── app-updater/ # Auto-update logic
|
||||||
|
│ │ ├── main-window/ # Main window management
|
||||||
|
│ │ ├── render-backend/ # Renderer backend
|
||||||
|
│ │ ├── ui-loader/ # UI loading
|
||||||
|
│ │ ├── url-preview/ # URL preview
|
||||||
|
│ │ └── windows/ # Window definitions
|
||||||
|
│ ├── crash_handler/ # Crash handling
|
||||||
|
│ ├── renderer/ # Renderer process
|
||||||
|
│ │ ├── audio/ # Audio controls UI
|
||||||
|
│ │ ├── connection/ # Connection UI
|
||||||
|
│ │ ├── dns/ # DNS resolution
|
||||||
|
│ │ └── hooks/ # React-like hooks
|
||||||
|
│ ├── renderer-manifest/ # Renderer configuration
|
||||||
|
│ └── shared/ # Shared utilities
|
||||||
|
│ ├── ipc/ # IPC implementation
|
||||||
|
│ ├── process-arguments/ # CLI argument parsing
|
||||||
|
│ ├── proxy/ # Proxy utilities
|
||||||
|
│ └── version/ # Version management
|
||||||
|
├── native/ # C++ native addons
|
||||||
|
│ ├── cmake/ # CMake modules
|
||||||
|
│ ├── codec/ # Audio codec (Opus)
|
||||||
|
│ │ └── codec/ # Codec implementation
|
||||||
|
│ ├── crash_handler/ # Native crash handler
|
||||||
|
│ ├── dist/ # Distribution files
|
||||||
|
│ ├── dns/ # DNS resolver
|
||||||
|
│ ├── ppt/ # Protocol tools
|
||||||
|
│ ├── serverconnection/ # Server connection module
|
||||||
|
│ │ ├── exports/ # TypeScript declarations
|
||||||
|
│ │ ├── src/
|
||||||
|
│ │ │ ├── audio/ # Audio engine
|
||||||
|
│ │ │ │ ├── codec/ # Opus encoder/decoder
|
||||||
|
│ │ │ │ ├── driver/ # Audio drivers
|
||||||
|
│ │ │ │ ├── file/ # Audio file I/O
|
||||||
|
│ │ │ │ ├── filter/ # Audio filters
|
||||||
|
│ │ │ │ ├── js/ # JS audio bindings
|
||||||
|
│ │ │ │ ├── processing/ # Audio processing
|
||||||
|
│ │ │ │ └── sounds/ # Sound effects
|
||||||
|
│ │ │ └── connection/ # Protocol implementation
|
||||||
|
│ │ │ ├── audio/ # Audio connection
|
||||||
|
│ │ │ └── ft/ # File transfer
|
||||||
|
│ │ └── test/ # Connection tests
|
||||||
|
│ └── updater/ # Auto-updater native code
|
||||||
|
├── resources/ # Static resources
|
||||||
|
└── scripts/ # Build/utility scripts
|
||||||
|
```
|
||||||
|
|
||||||
|
### TeaSpeakLibrary Root
|
||||||
|
```
|
||||||
|
.
|
||||||
|
├── CMakeLists.txt # Build configuration
|
||||||
|
├── main.cpp # Test entry point
|
||||||
|
├── src/
|
||||||
|
│ ├── bbcode/ # BBCode parser
|
||||||
|
│ ├── channel/ # Channel tree (TreeView)
|
||||||
|
│ ├── converters/ # Data converters
|
||||||
|
│ ├── lock/ # Read-write mutex
|
||||||
|
│ ├── log/ # Logging utilities
|
||||||
|
│ ├── misc/ # Utilities
|
||||||
|
│ │ ├── base64.* # Base64 encoding
|
||||||
|
│ │ ├── digest.* # Hash digests
|
||||||
|
│ │ ├── hex.* # Hex encoding
|
||||||
|
│ │ ├── memtracker.* # Memory tracking
|
||||||
|
│ │ ├── net.* # Network utilities
|
||||||
|
│ │ └── rnd.* # Random number generation
|
||||||
|
│ ├── protocol/ # TeamSpeak protocol
|
||||||
|
│ │ ├── AcknowledgeManager.* # ACK tracking
|
||||||
|
│ │ ├── CompressionHandler.* # QuickLZ compression
|
||||||
|
│ │ ├── CryptHandler.* # Encryption
|
||||||
|
│ │ ├── Packet.* # Packet structure
|
||||||
|
│ │ ├── PacketLossCalculator.* # Loss monitoring
|
||||||
|
│ │ ├── buffers.* # Buffer management
|
||||||
|
│ │ ├── generation.* # Protocol generation
|
||||||
|
│ │ └── ringbuffer.* # Circular buffer
|
||||||
|
│ ├── qlz/ # QuickLZ compression library
|
||||||
|
│ ├── query/ # Server query protocol
|
||||||
|
│ ├── sql/ # Database layer
|
||||||
|
│ │ ├── sqlite/ # SQLite implementation
|
||||||
|
│ │ └── mysql/ # MySQL implementation
|
||||||
|
│ ├── ssl/ # SSL/TLS management
|
||||||
|
│ ├── BasicChannel.* # Base channel class
|
||||||
|
│ ├── Definitions.h # Global definitions
|
||||||
|
│ ├── Error.* # Error handling
|
||||||
|
│ ├── EventLoop.* # Event loop
|
||||||
|
│ ├── License.* # License management
|
||||||
|
│ ├── PermissionManager.* # Permission system
|
||||||
|
│ ├── Properties.* # Property system
|
||||||
|
│ └── Variable.* # Variable system
|
||||||
|
└── test/ # Unit tests
|
||||||
|
├── RingTest.cpp
|
||||||
|
├── CommandTest.cpp
|
||||||
|
├── ChannelTest.cpp
|
||||||
|
├── PermissionTest.cpp
|
||||||
|
└── ...
|
||||||
|
```
|
||||||
+348
@@ -0,0 +1,348 @@
|
|||||||
|
# YaTQA Wissensdatenbank (Deutsch)
|
||||||
|
|
||||||
|
> Quelle: https://yat.qa/ — Abgerufen: 13.06.2026
|
||||||
|
> Version: v3.9.9b (01. Mrz 2023)
|
||||||
|
|
||||||
|
## Überblick
|
||||||
|
|
||||||
|
**YaTQA** (Yet Another TeamSpeak³ Query Admin Tool) ist eine Windows-Anwendung zur Verwaltung von **TeamSpeak-3-Servern und -Instanzen** über das ServerQuery-Interface. Es bietet eine grafische Oberfläche für alle Query-Befehle und macht das Erlernen der rohen Query-Syntax überflüssig.
|
||||||
|
|
||||||
|
- **Autor:** Janni „Яedeemer" K. (Norddeutschland)
|
||||||
|
- **Sprache:** Geschrieben in Delphi 2009 (über 50.000 Zeilen Quelltext)
|
||||||
|
- **Entwicklungsbeginn:** 10. April 2011
|
||||||
|
- **Erstveröffentlichung:** 29. Juni 2011
|
||||||
|
- **Lizenz:** Kostenlos und voll funktionsfähig (keine Adware/Spyware)
|
||||||
|
- **Plattformen:** Windows XP und neuer, Linux mittels Wine
|
||||||
|
- **Größe:** ~1,3 MiB Installer
|
||||||
|
- **Enthaltene Sprachen:** Deutsch und Englisch (Auswahl während der Installation)
|
||||||
|
- **Unterstützte Server:** TeamSpeak 3.9.0 bis 3.13.7, TeaSpeak 1.4.10-beta
|
||||||
|
- **Download:** https://dl.yat.qa/stable/
|
||||||
|
- **Website:** https://yat.qa/
|
||||||
|
|
||||||
|
### Motto
|
||||||
|
*„Dinosaurier haben kein TeamSpeak benutzt und sind vor 66 Millionen Jahren ausgestorben. Zufall? Vermutlich nicht."*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Funktionen
|
||||||
|
|
||||||
|
**YaTQA unterstützt alle ServerQuery-Funktionen ohne Ausnahme.** Die folgende Liste beschränkt sich auf Funktionen, die der normale TS-Client nicht bietet.
|
||||||
|
|
||||||
|
### Allgemeine Funktionen (Kein Admin erforderlich)
|
||||||
|
|
||||||
|
- **DNS-Auflösung:** Detaillierte Visualisierung der DNS-Auflösung (simuliert 10 verschiedene Client-Versionen)
|
||||||
|
- **Blacklist-Prüfung:** TeamSpeaks Blacklist auf eine IP überprüfen
|
||||||
|
- **Blacklist2:** TeamSpeaks Blacklist2 für virtuelle Server prüfen
|
||||||
|
- **Benutzerdiagramm:** Serverstatistiken von Planet TeamSpeak als Diagramm anzeigen und als PNG speichern
|
||||||
|
- **Client-Cache:** Avatare, Icons und Chatlogs im Client-Cache finden
|
||||||
|
|
||||||
|
### Konsole (Query-Interface)
|
||||||
|
|
||||||
|
- **Autovervollständigung:** Befehlsvervollständigung einschließlich undokumentierter Befehle
|
||||||
|
- **Parameterhilfe:** Zeigt alle Parameter eines Befehls basierend auf eigener Forschung
|
||||||
|
- **Werteauswahl:** Strg+Leertaste für Werteliste
|
||||||
|
- **Ergebnisanalyse:** Gruppierte Datensätze mit Erklärungen
|
||||||
|
- **Skripting:** Befehlslisten aus Dateien laden und ausführen
|
||||||
|
- **Events:** Server-Events abonnieren und in der Konsole protokollieren
|
||||||
|
|
||||||
|
### SSH-Tunnel
|
||||||
|
|
||||||
|
- **Verschlüsselung:** Vollständig verschlüsselte Verbindung (außer Dateiübertragungen)
|
||||||
|
- **Geschwindigkeit:** Auf vielen Servern merkbar schneller (ähnlich wie `tcp_nodelay`)
|
||||||
|
- **Privatsphäre:** IP wird immer verborgen (man erscheint als 127.0.0.1)
|
||||||
|
- **Flood-Umgehung:** Umgeht alle Flood-Beschränkungen (127.0.0.1 steht üblicherweise auf der Whitelist)
|
||||||
|
|
||||||
|
### Instanz-Funktionen (Erfordert serveradmin)
|
||||||
|
|
||||||
|
- Instanzstatistiken anzeigen/bearbeiten
|
||||||
|
- Lizenzdetails und IP-Bindings anzeigen
|
||||||
|
- Alle virtuellen Server anzeigen
|
||||||
|
- Lokale Notizen zu Servern erstellen (lokal gespeichert)
|
||||||
|
- Virtuelle Server starten/stoppen/erstellen/löschen/umbenennen
|
||||||
|
- Unsichtbar werden (Server-Fehler, könnte behoben werden)
|
||||||
|
- Nachricht an alle Server senden
|
||||||
|
- Snapshots erstellen/massenweise erstellen/wiederherstellen (inkl. Dateien)
|
||||||
|
- Manipulierte Snapshots einspielen
|
||||||
|
- Server mittels Snapshots kopieren
|
||||||
|
- Rechte auf Vorlagengruppen zurücksetzen
|
||||||
|
- Channel-Datei-Backups speichern/wiederherstellen (inkrementelles Backup unterstützt)
|
||||||
|
|
||||||
|
### Funktionen für virtuelle Server
|
||||||
|
|
||||||
|
- Host-Message-Modal-Quit und hohe Sicherheitsstufe ignorieren
|
||||||
|
- Sehr detaillierte Serverstatistiken
|
||||||
|
- Mehrere Server gleichzeitig bearbeiten
|
||||||
|
- Ausklappbarer Serverbaum (optional immer im Vordergrund)
|
||||||
|
- Mehrere Nutzer gleichzeitig verschieben/kicken/bannen/beschreiben
|
||||||
|
- Mehrere Channel gleichzeitig erstellen
|
||||||
|
- Channel als Vorlage für weitere verwenden
|
||||||
|
- Mehrere Channel gleichzeitig bearbeiten
|
||||||
|
- Nachrichten an mehrere Nutzer/Channel gleichzeitig senden
|
||||||
|
- Rechte mehrerer Nutzer/Channel gleichzeitig bearbeiten
|
||||||
|
- Dateien zwischen Channeln verschieben
|
||||||
|
- Bildvorschau ohne Download (bmp, gif, jpg, png, pbm, pgm, ppm, xbm, xpm)
|
||||||
|
- Upload/Download ganzer Ordnerstrukturen
|
||||||
|
- Nutzer zu Gruppen hinzufügen durch Namenseingabe
|
||||||
|
- Funktionierende Rechteübersicht mit Echtzeitbearbeitung
|
||||||
|
- Rechte zwischen Servern/Instanzen kopieren
|
||||||
|
- Rechtewerte und -powers vergleichen
|
||||||
|
- Alle Clients/Gruppen mit einem bestimmten Recht finden
|
||||||
|
- Mehrere Gruppen gleichzeitig bearbeiten
|
||||||
|
- Verbesserte Clientdatenbank mit mehr Details und Suchfunktionen
|
||||||
|
- Gesamte Clientdatenbank mit einem Klick herunterladen
|
||||||
|
- Clientdatenbank als HTML oder CSV exportieren
|
||||||
|
- Gebannte Nutzer und IP-teilende Profile hervorheben
|
||||||
|
- Log an beliebiger Stelle lesen
|
||||||
|
- User CustomInfo verwalten (suchen, anzeigen, bearbeiten, hinzufügen)
|
||||||
|
- Log als HTML oder TXT exportieren
|
||||||
|
- Avatare und Icons herunterladen
|
||||||
|
- Avatar-Besitzer auf dem Server identifizieren
|
||||||
|
- Servervorlage verwalten
|
||||||
|
- Uploads/Downloads überwachen
|
||||||
|
|
||||||
|
### Unterstützte Bildformate
|
||||||
|
|
||||||
|
| Format | Beschreibung |
|
||||||
|
|--------|-------------|
|
||||||
|
| bmp | Windows Bitmap |
|
||||||
|
| gif | Graphics Interchange Format |
|
||||||
|
| jpg/jpeg | Joint Photographic Experts Group |
|
||||||
|
| png | Portable Network Graphics |
|
||||||
|
| pbm | Portable Bitmap (ASCII und binär) |
|
||||||
|
| pgm | Portable Graymap (ASCII und binär) |
|
||||||
|
| ppm | Portable Pixmap (ASCII und binär) |
|
||||||
|
| xbm | X BitMap |
|
||||||
|
| xpm | X PixMap |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architektur / Funktionsweise
|
||||||
|
|
||||||
|
### Verbindungsmethoden
|
||||||
|
- **Raw TCP/Telnet:** Standard-Query-Verbindung (Standardport 10011)
|
||||||
|
- **YaTQA-SSH-Tunnel:** Über Plink (PuTTY-Suite) — verschlüsselt, schneller, IP verborgen
|
||||||
|
- **TeamSpeak SSH:** Natives TS3.3+-SSH (auch unterstützt, aber weniger Vorteile)
|
||||||
|
|
||||||
|
### Datenspeicherung
|
||||||
|
- **Portable Modus:** Alle Daten im Installationsverzeichnis (`yatqa.ini` vorhanden)
|
||||||
|
- **Standardmodus:** Einige Dateien in `%APPDATA%\YaTQA`
|
||||||
|
- **Icon-Cache:** 16-Bit-RES-Format (`icons.res`)
|
||||||
|
- **Befehlsverlauf:** `commandhistory.txt`
|
||||||
|
- **Debug-Log:** `RedeemerTS3.log` (erstellt mit `-debug`-Schalter)
|
||||||
|
|
||||||
|
### DNS-Auflösung
|
||||||
|
YaTQA simuliert die Auflösungsschritte des TeamSpeak-Clients und zeigt sie visuell an. Verwendet Googles DNS-Server für Zuverlässigkeit. Unterstützt:
|
||||||
|
- A- und CNAME-Einträge
|
||||||
|
- SRV-Einträge
|
||||||
|
- TSDNS-Auflösung
|
||||||
|
- Alle 10 verschiedenen Client-Version-DNS-Verhaltensweisen
|
||||||
|
|
||||||
|
### Snapshot-System
|
||||||
|
- Snapshots enthalten alle Servereinstellungen (außer Port und Server-ID)
|
||||||
|
- Snapshots enthalten KEINE Dateien, Icons oder Avatare
|
||||||
|
- Datei-Backups enthalten Dateien und Icons (keine Avatare wegen Serverbeschränkungen)
|
||||||
|
- Pseudo-Snapshots ermöglichen Serverkopien ohne Keypair
|
||||||
|
- Unterstützt Zstd-komprimierte Snapshots (3.10.0+-Format)
|
||||||
|
|
||||||
|
### Anti-Flood-Schutz
|
||||||
|
- Konfigurierbare „Befehle bis Flood"-Einstellung (empfohlen: ~20)
|
||||||
|
- Konfigurierbare Verzögerung zwischen Befehlen (empfohlen: 340ms für fremde Server)
|
||||||
|
- SSH-Verbindungen umgehen Flood-Beschränkungen (127.0.0.1 auf Whitelist)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Konfiguration
|
||||||
|
|
||||||
|
### Anwendungseinstellungen
|
||||||
|
|
||||||
|
| Einstellung | Beschreibung |
|
||||||
|
|------------|-------------|
|
||||||
|
| Verbesserte XP-Unicode-Anzeige | Verwendet Arial Unicode MS für bessere CJK-Unterstützung |
|
||||||
|
| Daten bei Tabwechsel aktualisieren | Automatisch Daten aktualisieren |
|
||||||
|
| Lokale Zeit verwenden | Lokale Zeit statt UTC |
|
||||||
|
| Verbesserte Channel-Dropdowns | Baumansicht für Unterchannel |
|
||||||
|
| In den Tray minimieren | Minimieren in den Systemtray |
|
||||||
|
| Tray-Icon immer anzeigen | Permanent anzeigen |
|
||||||
|
| Icon-Caching aktivieren | Icons in `icons.res` cachen (empfohlen) |
|
||||||
|
| Keine Icons verwenden | Icon-Anzeige deaktivieren |
|
||||||
|
| Windows Aero verwenden | Aero-Design nutzen (Vista+) |
|
||||||
|
| Aero-Glow deaktivieren | Weißen Schatten hinter Menütext entfernen |
|
||||||
|
| Beim Start nach Updates suchen | Automatisch nach Updates suchen |
|
||||||
|
| Sortiereinstellungen speichern | Sortierpräferenzen merken |
|
||||||
|
| Sprunglisten aktivieren | Windows 7+-Sprunglisten-Integration |
|
||||||
|
|
||||||
|
### Kompatibilitätseinstellungen
|
||||||
|
|
||||||
|
| Einstellung | Beschreibung |
|
||||||
|
|------------|-------------|
|
||||||
|
| Befehle bis Flood | Verzögerung zwischen Befehlen (340 empfohlen für fremde Server) |
|
||||||
|
| Nicht-Standard-Query-Port erlauben | Verbindung zu anderen Ports als 10011 |
|
||||||
|
| Löschen wichtiger Gruppen erlauben | Löschen der ersten 5 Server-/4 Channelgruppen erlauben |
|
||||||
|
| Verlassen wichtiger Gruppen erlauben | serveradmin darf Admin Server Query verlassen |
|
||||||
|
| Machine-ID ändern erlauben | Änderung der Machine-ID ermöglichen |
|
||||||
|
|
||||||
|
### SSH-Tunnel-Profile
|
||||||
|
SSH-Profile für Server konfigurieren. Bei Verbindung zu einem Server mit passendem SSH-Profil verwendet YaTQA automatisch den Tunnel.
|
||||||
|
|
||||||
|
### Kreisdiagramm-Styles
|
||||||
|
Auswahl aus 4 verschiedenen Kreisdiagramm-Styles (durch Benutzerabstimmung ausgewählt).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Startparameter
|
||||||
|
|
||||||
|
| Parameter | Beschreibung |
|
||||||
|
|-----------|-------------|
|
||||||
|
| `-a` | Verbindung zum Standardserver |
|
||||||
|
| `-b [IP]` | Blacklist-Prüfung |
|
||||||
|
| `-c IP Query_Port [User Pass [Voice_Port]]` | Verbindung zum angegebenen Server |
|
||||||
|
| `-d` | DNS-Auflösung |
|
||||||
|
| `-i` | Iconsammlung |
|
||||||
|
| `-p` | Rechtedateien-Editor |
|
||||||
|
| `-s [IP]` | Benutzerstatistik |
|
||||||
|
| `-debug` | Debug-Logging aktivieren |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Systemanforderungen
|
||||||
|
|
||||||
|
### Mindestanforderungen
|
||||||
|
- **Betriebssystem:** Windows XP+ (Desktop), Windows 2012+ (Server)
|
||||||
|
- **Speicher:** 3 MB für YaTQA (mehr für Konfiguration/Snapshots)
|
||||||
|
- **Auflösung:** 960×720 (allgemein), 1024×720 (Serverbaum), 1024×768 (Konsole)
|
||||||
|
|
||||||
|
### Fehlende Funktionen unter Windows XP
|
||||||
|
- Geist-Modus
|
||||||
|
- Nameserver für DNS-Auflösung ändern
|
||||||
|
- Einklappbare DNS-Ergebnisse
|
||||||
|
- Einklappbare Gruppen im Servergruppenmodus der Benutzer-DB
|
||||||
|
|
||||||
|
### Fehlende Funktionen unter Windows Vista/XP
|
||||||
|
- Sprunglisten
|
||||||
|
|
||||||
|
### Wine/Linux-Einschränkungen
|
||||||
|
- Speicherlecks (Wine unterstützt kein Entfernen von Link-Labels)
|
||||||
|
- Auch unter XP fehlende Funktionen fehlen unter Wine
|
||||||
|
- Zusätzliche Einschränkungen: Keine Array-Gruppierung, keine DNS-Gruppierung, kein Servergruppenmodus in der Benutzer-DB
|
||||||
|
- Plink muss manuell installiert werden (Version 0.61+)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Schlüsselkonzepte
|
||||||
|
|
||||||
|
### ServerQuery-Interface
|
||||||
|
Das TeamSpeak-3-ServerQuery-Interface ist ein textbasiertes Protokoll zur Serververwaltung. YaTQA kapselt diese Schnittstelle in einer GUI mit:
|
||||||
|
- Befehlsautovervollständigung
|
||||||
|
- Parameterhilfe
|
||||||
|
- Werteauswahl
|
||||||
|
- Ergebnisanalyse
|
||||||
|
|
||||||
|
### Virtueller Server
|
||||||
|
Ein virtueller Server ist eine unabhängige TeamSpeak-Serverinstanz, die auf einem einzelnen physischen Serverprozess läuft. Mehrere virtuelle Server können auf einer Instanz laufen.
|
||||||
|
|
||||||
|
### Instanz
|
||||||
|
Der Serverprozess, der einen oder mehrere virtuelle Server hostet. Verwaltet über den „serveradmin"-Account.
|
||||||
|
|
||||||
|
### Snapshot
|
||||||
|
Ein vollständiges Backup der Einstellungen eines virtuellen Servers (ohne Port und ID). Enthält keine Dateien, Icons oder Avatare.
|
||||||
|
|
||||||
|
### Pseudo-Snapshot
|
||||||
|
Ein vom Benutzer manipulierter Snapshot, der zum Kopieren von Servern ohne Beibehaltung des originalen Keypairs verwendet werden kann.
|
||||||
|
|
||||||
|
### Rechtesystem
|
||||||
|
TeamSpeak verwendet ein hierarchisches Rechtesystem mit:
|
||||||
|
- Servergruppen
|
||||||
|
- Channelgruppen
|
||||||
|
- Client-Rechte
|
||||||
|
- Rechte-Powers (Werte, die steuern, was gesetzt werden kann)
|
||||||
|
|
||||||
|
### Anti-Flood
|
||||||
|
TeamSpeak-Server begrenzen die Häufigkeit von Query-Befehlen. YaTQA bietet konfigurierbare Verzögerungen und „Befehle bis Flood"-Einstellungen, um Bans zu vermeiden.
|
||||||
|
|
||||||
|
### Blacklist / Blacklist2
|
||||||
|
TeamSpeak führt Blacklists gebannter IPs (Blacklist1) und Server-UIDs (Blacklist2).
|
||||||
|
|
||||||
|
### Abzeichen
|
||||||
|
Visuelle Indikatoren im TeamSpeak, die Benutzerstatus, Addon-Creator-Status usw. anzeigen. YaTQA kann Abzeichen konfigurieren.
|
||||||
|
|
||||||
|
### DNS-Auflösung
|
||||||
|
TeamSpeak-Clients lösen Serveradressen über mehrere Methoden auf: A-Einträge, CNAME, SRV-Einträge und TSDNS. YaTQA visualisiert diesen Prozess.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bekannte Einschränkungen
|
||||||
|
|
||||||
|
- **Channel-Passwörter:** YaTQA sendet grundsätzlich keine Channel-Passwörter. Erfordert `b_channel_join_ignore_password` und `b_ft_ignore_password`-Rechte.
|
||||||
|
- **Unicode:** Nur Basic Multilingual Plane (BMP) unterstützt (TeamSpeak-Einschränkung).
|
||||||
|
- **Integrierte DNS-Auflösung:** Nur A- und CNAME-Einträge (TSDNS und SRV im integrierten Resolver nicht unterstützt).
|
||||||
|
- **Geist-Modus:** Viele Funktionen funktionieren nicht; Geist hat nur Query-Gast-Rechte.
|
||||||
|
- **Konsole:** Nur die üblichen Einschränkungen des TS3-Servers.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## IPv6-Unterstützung
|
||||||
|
|
||||||
|
Eckige Klammern `[]` um die Serveradresse schreiben. Unterstützt seit v1.4/2.0-pre für Query-Verbindungen. IPv4-Tunnel (z.B. `[::ffff:7f00:1]`) werden nicht unterstützt.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Projekthistorie
|
||||||
|
|
||||||
|
- **10.04.2011:** Entwicklungsbeginn (ursprünglich „TS3Telnet" genannt)
|
||||||
|
- **29.06.2011:** Erste Alpha-Version veröffentlicht
|
||||||
|
- **18.04.2014:** v2.0 führte Registrierungserfordernis für einige Funktionen ein
|
||||||
|
- **22.08.2019:** YaTQA wieder uneingeschränkt Freeware
|
||||||
|
- **01.03.2023:** v3.9.9b veröffentlicht (Zeitlimit dauerhaft entfernt)
|
||||||
|
|
||||||
|
### Namensherkunft
|
||||||
|
„Yet Another TeamSpeak³ Query App" — benannt, weil es beim Entwicklungsbeginn bereits viele Query-Tools gab, aber keines auf dem Rechner des Autors funktionierte.
|
||||||
|
|
||||||
|
### Aussprache
|
||||||
|
[jatka] in IPA-Lautschrift — auch als deutsches Wort aussprechbar.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Globale Tastenkürzel
|
||||||
|
|
||||||
|
| Kürzel | Aktion |
|
||||||
|
|--------|--------|
|
||||||
|
| Strg+F | Filtern (Rechte, Log) oder Suchen |
|
||||||
|
| Strg+Alt+F | In Listen suchen |
|
||||||
|
| F3 | Weiter suchen |
|
||||||
|
| Strg+A | Alles auswählen |
|
||||||
|
| Strg+C | Kopieren oder ausgewählte Daten speichern |
|
||||||
|
| Strg+Alt+A | Spalten automatisch anpassen |
|
||||||
|
| F2 | Umbenennen |
|
||||||
|
| F5 | Tab aktualisieren |
|
||||||
|
| NUM + | Ausgewählte Checkbox-Elemente aktivieren |
|
||||||
|
| NUM - | Ausgewählte Checkbox-Elemente deaktivieren |
|
||||||
|
| Strg+Leertaste | Parameterwert auswählen (Konsole) |
|
||||||
|
| Strg+E | Ausgewählten Text escapen (Konsole) |
|
||||||
|
| Strg+S | Diagramm als Bild speichern |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ressourcen
|
||||||
|
|
||||||
|
- **Website:** https://yat.qa/
|
||||||
|
- **Download:** https://dl.yat.qa/stable/
|
||||||
|
- **Funktionen:** https://yat.qa/funktionen/
|
||||||
|
- **Anleitung:** https://yat.qa/manual/ (nur Englisch)
|
||||||
|
- **Changelog:** https://yat.qa/changelog/ (nur Englisch)
|
||||||
|
- **FAQ:** https://yat.qa/haeufige-fragen/
|
||||||
|
- **Support:** https://yat.qa/unterstuetzung/
|
||||||
|
- **Ressourcen:** https://yat.qa/ressourcen/
|
||||||
|
- **Über:** https://yat.qa/ueber/
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Übersetzung
|
||||||
|
|
||||||
|
YaTQAs Originalsprache ist Deutsch. Die Übersetzung erfolgt mit OmegaT und XLIFF-Dateien. Den Autor vorher kontaktieren. Das Übersetzungssystem verwendet:
|
||||||
|
- `%s` — Zeichenketten-Platzhalter
|
||||||
|
- `%d` — Dezimalzahl-Platzhalter
|
||||||
|
- `&` — Tastenkürzel
|
||||||
|
- `&&` — Tatsächliches Kaufmanns-Und
|
||||||
|
- `|` — Senkrechter Strich (Hinweistext-Trennzeichen)
|
||||||
|
- `\r\n` — Neue Zeile
|
||||||
|
- `\t` — Tabulator
|
||||||
+348
@@ -0,0 +1,348 @@
|
|||||||
|
# YaTQA Knowledge Base (English)
|
||||||
|
|
||||||
|
> Source: https://yat.qa/ — Last fetched: 2026-06-13
|
||||||
|
> Version: v3.9.9b (01 Mar 2023)
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
**YaTQA** (Yet Another TeamSpeak³ Query Admin Tool) is a Windows application for managing **TeamSpeak 3 servers and instances** using the ServerQuery interface. It provides a graphical interface to all query commands, eliminating the need to learn raw query syntax.
|
||||||
|
|
||||||
|
- **Author:** Janni "Яedeemer" K. (northern Germany)
|
||||||
|
- **Language:** Written in Delphi 2009 (50,000+ lines of code)
|
||||||
|
- **Development started:** April 10, 2011
|
||||||
|
- **First release:** June 29, 2011
|
||||||
|
- **License:** Free and fully functional freeware (no adware/spyware)
|
||||||
|
- **Platforms:** Windows XP and up, Linux via Wine
|
||||||
|
- **Size:** ~1.3 MiB installer
|
||||||
|
- **Languages included:** English and German (selectable during installation)
|
||||||
|
- **Supported servers:** TeamSpeak 3.9.0 through 3.13.7, TeaSpeak 1.4.10-beta
|
||||||
|
- **Download:** https://dl.yat.qa/stable/
|
||||||
|
- **Website:** https://yat.qa/
|
||||||
|
|
||||||
|
### Key Tagline
|
||||||
|
*"Dinosaurs weren't using TeamSpeak and wiped about 66 million years ago. Coincidence? I think not."*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
**YaTQA supports ALL ServerQuery features with no exceptions.** The feature list below focuses on capabilities beyond what the standard TS3 client offers.
|
||||||
|
|
||||||
|
### General Features (No Admin Required)
|
||||||
|
|
||||||
|
- **DNS Resolver:** Detailed DNS lookup visualization simulating TeamSpeak client behavior (10 different client version lookups)
|
||||||
|
- **Blacklist Check:** Check TeamSpeak's blacklist for any IP
|
||||||
|
- **Blacklist2:** Check TeamSpeak's blacklist2 for virtual servers from an instance's server list
|
||||||
|
- **User Graph:** View server statistics from Planet TeamSpeak as a chart, save as PNG image
|
||||||
|
- **Client Cache:** Find avatars, icons, and chat logs in your client cache
|
||||||
|
|
||||||
|
### Console (Query Interface)
|
||||||
|
|
||||||
|
- **Autocomplete:** Command completion including undocumented commands
|
||||||
|
- **Parameter Help:** Displays every command's parameters based on extensive research
|
||||||
|
- **Parameter Value Selection:** Press Ctrl+Space to select values from a list
|
||||||
|
- **Result Analysis:** Groups datasets and explains most values
|
||||||
|
- **Scripting:** Load and execute command lists from files
|
||||||
|
- **Events:** Subscribe to server events and log them in the console
|
||||||
|
|
||||||
|
### SSH Tunnel
|
||||||
|
|
||||||
|
- **Encryption:** Fully encrypted connection (except file transfers)
|
||||||
|
- **Speed:** Notably faster on most servers (similar to `tcp_nodelay`)
|
||||||
|
- **Privacy:** Always hides your IP (you appear as 127.0.0.1)
|
||||||
|
- **Flood Bypass:** Circumvents all flood restrictions (127.0.0.1 is usually whitelisted)
|
||||||
|
|
||||||
|
### Instance Features (Requires serveradmin)
|
||||||
|
|
||||||
|
- View/edit instance settings and stats
|
||||||
|
- View license details and IP bindings
|
||||||
|
- See all virtual servers
|
||||||
|
- Add local notes to servers (stored locally)
|
||||||
|
- Start/stop/create/delete/rename virtual servers
|
||||||
|
- Become invisible (server bug, may be fixed)
|
||||||
|
- Send message to all servers
|
||||||
|
- Create/mass-create/deploy snapshots (including file-inclusive snapshots)
|
||||||
|
- Deploy manipulated snapshots
|
||||||
|
- Copy servers using snapshots
|
||||||
|
- Reset permissions to template groups
|
||||||
|
- Save/restore channel file backups (incremental backup supported)
|
||||||
|
|
||||||
|
### Virtual Server Features
|
||||||
|
|
||||||
|
- Ignore host message modal quit and high security level
|
||||||
|
- Very detailed virtual server statistics
|
||||||
|
- Edit multiple servers at once
|
||||||
|
- Collapsible server tree (optionally topmost)
|
||||||
|
- Move/kick/ban/describe multiple users at once
|
||||||
|
- Create multiple channels at once
|
||||||
|
- Use channel as template for other channels
|
||||||
|
- Edit multiple channels at once
|
||||||
|
- Send messages to multiple users/channels at once
|
||||||
|
- Edit permissions of multiple users/channels at once
|
||||||
|
- Move files between channels
|
||||||
|
- Image preview without download (bmp, gif, jpg, png, pbm, pgm, ppm, xbm, xpm)
|
||||||
|
- Upload/download entire folder structures
|
||||||
|
- Add users to groups by entering names
|
||||||
|
- Working permission overview with realtime editing
|
||||||
|
- Copy permissions between servers/instances
|
||||||
|
- Compare permission values and powers
|
||||||
|
- Find all clients/groups with a certain permission
|
||||||
|
- Edit multiple groups at once
|
||||||
|
- Enhanced client database with more details and search features
|
||||||
|
- Download full client database with one click
|
||||||
|
- Export client database to HTML or CSV
|
||||||
|
- Highlight banned users and IP-sharing profiles
|
||||||
|
- Browse log from any position
|
||||||
|
- Manage user custominfo (search, view, edit, add)
|
||||||
|
- Export log to HTML or TXT
|
||||||
|
- Download icons and avatars
|
||||||
|
- Identify avatar owners on your server
|
||||||
|
- Manage server template
|
||||||
|
- Monitor uploads/downloads
|
||||||
|
|
||||||
|
### Supported Image Formats
|
||||||
|
|
||||||
|
| Format | Description |
|
||||||
|
|--------|-------------|
|
||||||
|
| bmp | Windows Bitmap |
|
||||||
|
| gif | Graphics Interchange Format |
|
||||||
|
| jpg/jpeg | Joint Photographic Experts Group |
|
||||||
|
| png | Portable Network Graphics |
|
||||||
|
| pbm | Portable Bitmap (ASCII and binary) |
|
||||||
|
| pgm | Portable Graymap (ASCII and binary) |
|
||||||
|
| ppm | Portable Pixmap (ASCII and binary) |
|
||||||
|
| xbm | X BitMap |
|
||||||
|
| xpm | X PixMap |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architecture / How It Works
|
||||||
|
|
||||||
|
### Connection Methods
|
||||||
|
- **Raw TCP/Telnet:** Standard query connection (default port 10011)
|
||||||
|
- **YaTQA SSH Tunnel:** Via Plink (PuTTY suite) — encrypted, faster, hides IP
|
||||||
|
- **TeamSpeak SSH:** Native TS3.3+ SSH support (also supported but fewer advantages)
|
||||||
|
|
||||||
|
### Data Storage
|
||||||
|
- **Portable Mode:** All data in installation directory (`yatqa.ini` present)
|
||||||
|
- **Standard Mode:** Some files stored in `%APPDATA%\YaTQA`
|
||||||
|
- **Icon Cache:** 16-bit RES format (`icons.res`)
|
||||||
|
- **Command History:** `commandhistory.txt`
|
||||||
|
- **Debug Log:** `RedeemerTS3.log` (created with `-debug` switch)
|
||||||
|
|
||||||
|
### DNS Resolution
|
||||||
|
YaTQA simulates lookup steps done by TeamSpeak and displays them visually. Uses Google's DNS servers for reliability. Supports:
|
||||||
|
- A and CNAME records
|
||||||
|
- SRV records
|
||||||
|
- TSDNS lookups
|
||||||
|
- All 10 different client version DNS behaviors
|
||||||
|
|
||||||
|
### Snapshot System
|
||||||
|
- Snapshots contain all server settings (except port and virtual server ID)
|
||||||
|
- Snapshots do NOT include files, icons, or avatars
|
||||||
|
- File backups include files and icons (not avatars due to server limitations)
|
||||||
|
- Pseudo snapshots allow server copying without keypair
|
||||||
|
- Supports Zstd-compressed snapshots (3.10.0+ format)
|
||||||
|
|
||||||
|
### Anti-Flood Protection
|
||||||
|
- Configurable "Commands to Flood" setting (recommended: ~20)
|
||||||
|
- Configurable delay between commands (recommended: 340ms for non-own servers)
|
||||||
|
- SSH connections bypass flood restrictions (127.0.0.1 whitelisted)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
### Application Settings
|
||||||
|
|
||||||
|
| Setting | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| Improved XP Unicode display | Uses Arial Unicode MS for better CJK support |
|
||||||
|
| Refresh on tab change | Auto-refresh data when switching tabs |
|
||||||
|
| Use local time | Local time instead of UTC |
|
||||||
|
| Improved channel dropdowns | Tree view lines for sub-channels |
|
||||||
|
| Minimize to tray | Minimize to system tray |
|
||||||
|
| Always show tray icon | Persistent tray icon |
|
||||||
|
| Enable icon caching | Cache icons in `icons.res` (recommended) |
|
||||||
|
| Don't use icons globally | Disable icon display |
|
||||||
|
| Try Windows Aero | Use Aero theme (Vista+) |
|
||||||
|
| Disable Aero glow | Remove white shadow behind menu text |
|
||||||
|
| Search for updates on start | Auto-check for updates |
|
||||||
|
| Save sort settings | Remember sort preferences |
|
||||||
|
| Enable jump lists | Windows 7+ jump list integration |
|
||||||
|
|
||||||
|
### Compatibility Settings
|
||||||
|
|
||||||
|
| Setting | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| Commands to flood | Delay between commands (340 recommended for remote servers) |
|
||||||
|
| Allow non-default query port | Connect to ports other than 10011 |
|
||||||
|
| Allow deleting important groups | Enable deletion of first 5 server/4 channel groups |
|
||||||
|
| Allow leaving important groups | Allow serveradmin to leave Admin Server Query |
|
||||||
|
| Allow changing machine ID | Enable machine ID modification |
|
||||||
|
|
||||||
|
### SSH Tunnel Profiles
|
||||||
|
Configure SSH profiles for servers. When connecting to a server with a matching SSH profile, YaTQA automatically uses the tunnel.
|
||||||
|
|
||||||
|
### Pie Chart Styles
|
||||||
|
Choose from 4 different pie chart styles (selected by user voting).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Startup Parameters
|
||||||
|
|
||||||
|
| Parameter | Description |
|
||||||
|
|-----------|-------------|
|
||||||
|
| `-a` | Connect to default server |
|
||||||
|
| `-b [IP]` | Blacklist check |
|
||||||
|
| `-c IP Query_Port [User Pass [Voice_Port]]` | Connect to specified server |
|
||||||
|
| `-d` | DNS lookup |
|
||||||
|
| `-i` | Icon collection |
|
||||||
|
| `-p` | Permission editor |
|
||||||
|
| `-s [IP]` | User statistics |
|
||||||
|
| `-debug` | Enable debug logging |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## System Requirements
|
||||||
|
|
||||||
|
### Minimum Requirements
|
||||||
|
- **OS:** Windows XP+ (desktop), Windows 2012+ (server)
|
||||||
|
- **Disk:** 3 MB for YaTQA (more for configuration/snapshots)
|
||||||
|
- **Resolution:** 960×720 (general), 1024×720 (server tree), 1024×768 (console)
|
||||||
|
|
||||||
|
### Features Missing on Windows XP
|
||||||
|
- Ghost Mode
|
||||||
|
- Nameserver for DNS lookups
|
||||||
|
- DNS lookup group folding
|
||||||
|
- Folding server groups in user DB server group mode
|
||||||
|
|
||||||
|
### Features Missing on Windows Vista/XP
|
||||||
|
- Jump lists
|
||||||
|
|
||||||
|
### Wine/Linux Limitations
|
||||||
|
- Memory leaks (Wine doesn't support removing link labels)
|
||||||
|
- Features missing on XP also missing on Wine
|
||||||
|
- Additional limitations: no array property grouping, no DNS grouping, no server group mode in user DB
|
||||||
|
- Plink must be installed manually (version 0.61+)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Key Concepts
|
||||||
|
|
||||||
|
### ServerQuery Interface
|
||||||
|
The TeamSpeak 3 ServerQuery interface is a text-based protocol for managing TeamSpeak servers. YaTQA wraps this interface in a GUI, providing:
|
||||||
|
- Command autocompletion
|
||||||
|
- Parameter help
|
||||||
|
- Value selection
|
||||||
|
- Result analysis
|
||||||
|
|
||||||
|
### Virtual Server
|
||||||
|
A virtual server is an independent TeamSpeak server instance running on a single physical server process. Multiple virtual servers can run on one instance.
|
||||||
|
|
||||||
|
### Instance
|
||||||
|
The server process that hosts one or more virtual servers. Managed via the "serveradmin" account.
|
||||||
|
|
||||||
|
### Snapshot
|
||||||
|
A complete backup of a virtual server's settings (excluding port and ID). Does not include files, icons, or avatars.
|
||||||
|
|
||||||
|
### Pseudo Snapshot
|
||||||
|
A user-manipulated snapshot that can be used to copy servers without preserving the original keypair.
|
||||||
|
|
||||||
|
### Permissions System
|
||||||
|
TeamSpeak uses a hierarchical permission system with:
|
||||||
|
- Server groups
|
||||||
|
- Channel groups
|
||||||
|
- Client permissions
|
||||||
|
- Permission powers (values that control what can be set)
|
||||||
|
|
||||||
|
### Anti-Flood
|
||||||
|
TeamSpeak servers limit query command frequency. YaTQA provides configurable delays and "Commands to Flood" settings to avoid bans.
|
||||||
|
|
||||||
|
### Blacklist / Blacklist2
|
||||||
|
TeamSpeak maintains blacklists of banned IPs (Blacklist1) and server UIDs (Blacklist2).
|
||||||
|
|
||||||
|
### Badges
|
||||||
|
Visual indicators in TeamSpeak showing user status, addon creator status, etc. YaTQA can configure badges.
|
||||||
|
|
||||||
|
### DNS Resolution
|
||||||
|
TeamSpeak clients resolve server addresses through multiple methods: A records, CNAME, SRV records, and TSDNS. YaTQA visualizes this process.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Known Limitations
|
||||||
|
|
||||||
|
- **Channel passwords:** YaTQA never sends channel passwords. Requires `b_channel_join_ignore_password` and `b_ft_ignore_password` permissions.
|
||||||
|
- **Unicode:** Only Basic Multilingual Plane (BMP) supported (TeamSpeak limitation).
|
||||||
|
- **Integrated DNS lookups:** Only A and CNAME records (TSDNS and SRV unsupported in built-in resolver).
|
||||||
|
- **Ghost mode:** Many features don't work; ghost has Query Guest permissions.
|
||||||
|
- **Console:** Only limitations from TS3 server apply.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## IPv6 Support
|
||||||
|
|
||||||
|
Use square brackets `[]` around the server address. Supported since v1.4/2.0-pre for query connections. IPv4 tunnels (e.g., `[::ffff:7f00:1]`) are not supported.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Project History
|
||||||
|
|
||||||
|
- **2011-04-10:** Development started (originally named "TS3Telnet")
|
||||||
|
- **2011-06-29:** First alpha version released
|
||||||
|
- **2014-04-18:** v2.0 introduced registration requirement for some features
|
||||||
|
- **2019-08-22:** YaTQA became unlimited freeware again
|
||||||
|
- **2023-03-01:** v3.9.9b released (removed time limit permanently)
|
||||||
|
|
||||||
|
### Naming
|
||||||
|
"Yet Another TeamSpeak³ Query App" — named because there were already many query tools when development started, but none worked for the author.
|
||||||
|
|
||||||
|
### Pronunciation
|
||||||
|
[jatka] in IPA notation — also suitable for German speakers.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Global Hotkeys
|
||||||
|
|
||||||
|
| Shortcut | Action |
|
||||||
|
|----------|--------|
|
||||||
|
| Ctrl+F | Filter (permissions, log) or find |
|
||||||
|
| Ctrl+Alt+F | Find in lists |
|
||||||
|
| F3 | Find next |
|
||||||
|
| Ctrl+A | Select all |
|
||||||
|
| Ctrl+C | Copy or save selected data |
|
||||||
|
| Ctrl+Alt+A | Auto-adjust columns |
|
||||||
|
| F2 | Rename |
|
||||||
|
| F5 | Refresh tab |
|
||||||
|
| NUM + | Check selected checkbox items |
|
||||||
|
| NUM - | Uncheck selected checkbox items |
|
||||||
|
| Ctrl+Space | Select parameter value (console) |
|
||||||
|
| Ctrl+E | Escape selected text (console) |
|
||||||
|
| Ctrl+S | Save chart as image |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
- **Website:** https://yat.qa/
|
||||||
|
- **Download:** https://dl.yat.qa/stable/
|
||||||
|
- **Features:** https://yat.qa/features/
|
||||||
|
- **Manual:** https://yat.qa/manual/
|
||||||
|
- **Changelog:** https://yat.qa/changelog/
|
||||||
|
- **FAQ:** https://yat.qa/faq/
|
||||||
|
- **Support:** https://yat.qa/support/
|
||||||
|
- **Resources:** https://yat.qa/resources/
|
||||||
|
- **About:** https://yat.qa/about/
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Translation
|
||||||
|
|
||||||
|
YaTQA's original language is German. Translation is done using OmegaT with XLIFF files. Contact the author before translating. The translation system uses:
|
||||||
|
- `%s` — String placeholder
|
||||||
|
- `%d` — Decimal number placeholder
|
||||||
|
- `&` — Shortcut key
|
||||||
|
- `&&` — Actual ampersand
|
||||||
|
- `|` — Vertical line (hint text separator)
|
||||||
|
- `\r\n` — New line
|
||||||
|
- `\t` — Tab
|
||||||
@@ -0,0 +1,608 @@
|
|||||||
|
# Chanora Function Inventory
|
||||||
|
|
||||||
|
> Auto-generated comprehensive inventory of all public APIs across 10 Rust crates and 50+ Dart files.
|
||||||
|
|
||||||
|
## Summary Statistics
|
||||||
|
|
||||||
|
| Category | Count |
|
||||||
|
|----------|-------|
|
||||||
|
| **Rust Crates** | 10 |
|
||||||
|
| **Rust pub fn** | ~180 |
|
||||||
|
| **Rust pub struct** | ~90 |
|
||||||
|
| **Rust pub enum** | ~50 |
|
||||||
|
| **Rust pub trait** | 6 |
|
||||||
|
| **Rust pub const** | ~30 |
|
||||||
|
| **Dart files** | 56 |
|
||||||
|
| **Dart public classes** | ~80 |
|
||||||
|
| **TODO/FIXME comments** | 15 |
|
||||||
|
| **Empty/commented stubs** | 0 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Rust Crates
|
||||||
|
|
||||||
|
### 1. `chanora_cache` — Content-Addressed Blob Cache
|
||||||
|
|
||||||
|
Disposable blob cache for avatar/icon files. Wraps `cacache` for crash safety.
|
||||||
|
|
||||||
|
| Kind | Name | File:Line | Purpose |
|
||||||
|
|------|------|-----------|---------|
|
||||||
|
| struct | `BlobCache` | lib.rs:30 | Content-addressed blob cache backed by cacache |
|
||||||
|
| enum | `BlobCacheError` | lib.rs:20 | Errors raised by blob cache (Io, InvalidKey) |
|
||||||
|
| const | `PREFIX_AVATAR` | lib.rs:37 | Avatar blob prefix `"av_"` |
|
||||||
|
| const | `PREFIX_ICON` | lib.rs:39 | Icon blob prefix `"ic_"` |
|
||||||
|
| fn | `BlobCache::new` | lib.rs:46 | Create/open cache rooted at `cache_dir/chanora/` |
|
||||||
|
| fn | `BlobCache::put` | lib.rs:63 | Store a blob with prefix+key |
|
||||||
|
| fn | `BlobCache::get` | lib.rs:80 | Read a blob (returns None if missing) |
|
||||||
|
| fn | `BlobCache::remove` | lib.rs:101 | Delete a specific blob |
|
||||||
|
| fn | `BlobCache::clear` | lib.rs:111 | Delete all blobs |
|
||||||
|
| fn | `BlobCache::total_size` | lib.rs:129 | Return total bytes used |
|
||||||
|
| fn | `BlobCache::evict` | lib.rs:154 | Evict oldest entries until under max_bytes |
|
||||||
|
|
||||||
|
**Dead code:** None found. All public items consumed by `chanora_core`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. `chanora_protocol` — TeamSpeak Protocol Adapter
|
||||||
|
|
||||||
|
Isolates `tsclientlib` behind a typed boundary. No upstream types leak.
|
||||||
|
|
||||||
|
| Kind | Name | File:Line | Purpose |
|
||||||
|
|------|------|-----------|---------|
|
||||||
|
| struct | `ConnectConfig` | adapter.rs:146 | Typed connection parameters |
|
||||||
|
| struct | `ProtocolClient` | adapter.rs:236 | Async handle owning live protocol connection |
|
||||||
|
| struct | `InboundVoice` | adapter.rs:260 | One inbound voice packet from remote client |
|
||||||
|
| struct | `SnapshotProbe` | adapter.rs:270 | Clone-free probe handle for watchdog |
|
||||||
|
| struct | `ChannelInfo` | dto.rs:19 | One channel in server tree |
|
||||||
|
| struct | `ClientInfo` | dto.rs:72 | One connected client |
|
||||||
|
| struct | `ClientProfile` | dto.rs:96 | Rich profile + live connection details |
|
||||||
|
| struct | `ServerSnapshot` | dto.rs:153 | Full server state snapshot |
|
||||||
|
| struct | `ChatMessage` | dto.rs:50 | In-channel text message |
|
||||||
|
| struct | `ServerActivity` | dto.rs:65 | Server-activity notification |
|
||||||
|
| struct | `ChannelId` | dto.rs:11 | Opaque channel identifier (u64 newtype) |
|
||||||
|
| struct | `ClientId` | dto.rs:15 | Opaque client identifier (u64 newtype) |
|
||||||
|
| struct | `PokeLimiter` | poke_limiter.rs:19 | Per-connection poke rate limiter |
|
||||||
|
| enum | `ProtocolError` | lib.rs:62 | Typed error catalogue (9 variants) |
|
||||||
|
| enum | `ProtocolDelta` | dto.rs:183 | Incremental state changes (7 variants) |
|
||||||
|
| enum | `DisconnectReason` | adapter.rs:225 | Why protocol task ended |
|
||||||
|
| enum | `MessageTarget` | dto.rs:37 | Text message target scope |
|
||||||
|
| enum | `PokeStrength` | poke_limiter.rs:8 | Poke notification strength |
|
||||||
|
| trait | *(re-exports)* | lib.rs:52 | `AudioData`, `CodecType`, `Direction`, `InAudioBuf`, `OutAudio`, `OutPacket` |
|
||||||
|
| fn | `ProtocolClient::generate_identity` | adapter.rs:296 | Generate fresh TS3 identity string |
|
||||||
|
| fn | `ProtocolClient::connect` | adapter.rs:304 | Dial server, wait for initial snapshot |
|
||||||
|
| fn | `ProtocolClient::snapshot` | adapter.rs:354 | Read typed server state snapshot |
|
||||||
|
| fn | `ProtocolClient::client_profile` | adapter.rs:365 | Fetch rich client profile |
|
||||||
|
| fn | `ProtocolClient::download_avatar` | adapter.rs:389 | Download avatar bytes by UID |
|
||||||
|
| fn | `ProtocolClient::download_icon` | adapter.rs:394 | Download icon bytes by ID |
|
||||||
|
| fn | `ProtocolClient::disconnect` | adapter.rs:399 | Clean disconnect |
|
||||||
|
| fn | `ProtocolClient::move_to_channel` | adapter.rs:421 | Move self to channel |
|
||||||
|
| fn | `ProtocolClient::queue_move_to_channel` | adapter.rs:442 | Fire-and-forget move |
|
||||||
|
| fn | `ProtocolClient::set_muted` | adapter.rs:458 | Update own mute state |
|
||||||
|
| fn | `ProtocolClient::voice_out` | adapter.rs:477 | Get outbound voice sender |
|
||||||
|
| fn | `ProtocolClient::snapshot_probe` | adapter.rs:485 | Get watchdog probe handle |
|
||||||
|
| fn | `ProtocolClient::take_voice_in` | adapter.rs:493 | Take inbound voice receiver |
|
||||||
|
| fn | `ProtocolClient::put_voice_in` | adapter.rs:503 | Put voice receiver back |
|
||||||
|
| fn | `ProtocolClient::take_loss_notifier` | adapter.rs:519 | Take disconnect notifier |
|
||||||
|
| fn | `ProtocolClient::take_chat_rx` | adapter.rs:525 | Take chat receiver |
|
||||||
|
| fn | `ProtocolClient::put_chat_rx` | adapter.rs:530 | Put chat receiver back |
|
||||||
|
| fn | `ProtocolClient::take_activity_rx` | adapter.rs:540 | Take activity receiver |
|
||||||
|
| fn | `ProtocolClient::put_activity_rx` | adapter.rs:545 | Put activity receiver back |
|
||||||
|
| fn | `ProtocolClient::take_delta_rx` | adapter.rs:556 | Take delta receiver |
|
||||||
|
| fn | `ProtocolClient::send_text_message` | adapter.rs:561 | Send text message |
|
||||||
|
| fn | `SnapshotProbe::probe` | adapter.rs:278 | Issue single snapshot RPC |
|
||||||
|
| fn | `PokeLimiter::new` | poke_limiter.rs:36 | Create limiter with 5-min window |
|
||||||
|
| fn | `PokeLimiter::record` | poke_limiter.rs:44 | Record poke, return strength |
|
||||||
|
| fn | `ChannelId::ROOT` | dto.rs:176 | Root channel constant |
|
||||||
|
|
||||||
|
**Dead code:** None found. All items consumed by `chanora_core`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. `chanora_bridge` — Flutter/Rust Bridge
|
||||||
|
|
||||||
|
Typed DTOs and commands for `flutter_rust_bridge` 2.x.
|
||||||
|
|
||||||
|
| Kind | Name | File:Line | Purpose |
|
||||||
|
|------|------|-----------|---------|
|
||||||
|
| struct | `BridgeChannel` | api.rs:404 | Channel DTO for Dart |
|
||||||
|
| struct | `BridgeClient` | api.rs:422 | Client DTO for Dart |
|
||||||
|
| struct | `BridgeClientProfile` | api.rs:445 | Rich profile DTO for Dart |
|
||||||
|
| struct | `BridgeSnapshot` | api.rs:502 | Server snapshot DTO for Dart |
|
||||||
|
| struct | `BridgeAudioStats` | api.rs:1034 | Audio engine statistics |
|
||||||
|
| struct | `BridgeAudioProcessingConfig` | api.rs:1112 | Audio processing config DTO |
|
||||||
|
| struct | `BridgeAudioProcessingStats` | api.rs:1143 | Audio processing stats DTO |
|
||||||
|
| struct | `BridgePttDescriptor` | api.rs:854 | PTT capability descriptor |
|
||||||
|
| struct | `BridgePttBinding` | api.rs:875 | PTT binding display state |
|
||||||
|
| enum | `BridgeError` | lib.rs:55 | Bridge-layer errors (8 variants) |
|
||||||
|
| enum | `BridgeTransmitMode` | api.rs:731 | Transmit mode mirror |
|
||||||
|
| enum | `BridgePttInputClass` | api.rs:843 | PTT input class |
|
||||||
|
| enum | `BridgeAudioRoute` | api.rs:1047 | Audio route class |
|
||||||
|
| enum | `BridgeIosVoiceProcessingMode` | api.rs:1064 | iOS voice processing mode |
|
||||||
|
| enum | `BridgeAudioBackend` | api.rs:1071 | Processing backend |
|
||||||
|
| enum | `BridgeVadBackend` | api.rs:1084 | VAD backend |
|
||||||
|
| enum | `BridgeEffectOwner` | api.rs:1097 | AEC/NS/AGC owner |
|
||||||
|
| fn | `bridge_init` | api.rs:220 | One-time process init (FRB init) |
|
||||||
|
| fn | `log_file_path_str` | api.rs:294 | Platform log file path |
|
||||||
|
| fn | `connect` | api.rs:601 | Connect to TS3 server |
|
||||||
|
| fn | `prefetch_server` | api.rs:636 | Warm DNS resolution |
|
||||||
|
| fn | `snapshot` | api.rs:645 | Re-fetch server snapshot |
|
||||||
|
| fn | `client_profile` | api.rs:654 | Fetch client profile |
|
||||||
|
| fn | `disconnect` | api.rs:663 | Disconnect from server |
|
||||||
|
| fn | `is_connected` | api.rs:672 | Check connection status |
|
||||||
|
| fn | `handle_route_change` | api.rs:687 | iOS route change handler |
|
||||||
|
| fn | `handle_media_services_reset_with_route` | api.rs:696 | iOS media reset handler |
|
||||||
|
| fn | `handle_interruption_began` | api.rs:703 | iOS interruption begin |
|
||||||
|
| fn | `handle_interruption_ended` | api.rs:709 | iOS interruption end |
|
||||||
|
| fn | `set_ptt` | api.rs:718 | Set PTT active state |
|
||||||
|
| fn | `voice_join` | api.rs:770 | Join voice channel |
|
||||||
|
| fn | `voice_leave` | api.rs:785 | Leave voice channel |
|
||||||
|
| fn | `set_transmit_mode` | api.rs:794 | Set transmit mode |
|
||||||
|
| fn | `get_transmit_mode` | api.rs:803 | Get transmit mode |
|
||||||
|
| fn | `set_release_tail_ms` | api.rs:814 | Set release tail |
|
||||||
|
| fn | `get_release_tail_ms` | api.rs:823 | Get release tail |
|
||||||
|
| fn | `set_hard_mute` | api.rs:832 | Engage/release hard mute |
|
||||||
|
| fn | `set_ptt_binding` | api.rs:907 | Update PTT binding |
|
||||||
|
| fn | `ptt_descriptor` | api.rs:925 | Get PTT descriptor |
|
||||||
|
| fn | `get_ptt_binding` | api.rs:941 | Get persisted PTT binding |
|
||||||
|
| fn | `move_to_channel` | api.rs:955 | Move self to channel |
|
||||||
|
| fn | `set_input_muted` | api.rs:971 | Toggle input mute |
|
||||||
|
| fn | `set_output_muted` | api.rs:983 | Toggle output mute |
|
||||||
|
| fn | `set_output_gain` | api.rs:994 | Set master output gain |
|
||||||
|
| fn | `set_client_volume` | api.rs:1006 | Set per-client volume |
|
||||||
|
| fn | `send_chat_message` | api.rs:1015 | Send text message |
|
||||||
|
| fn | `export_diagnostics` | api.rs:1392 | User-initiated diagnostic export |
|
||||||
|
|
||||||
|
**Dead code:** `publish_permission_state` is `#[cfg_attr(not(target_os = "android"), allow(dead_code))]` — intentional, only used on Android via JNI.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. `chanora_storage` — Identity & Bookmark Storage
|
||||||
|
|
||||||
|
SQLite bookmarks + ChaCha20-Poly1305 encrypted identity file.
|
||||||
|
|
||||||
|
| Kind | Name | File:Line | Purpose |
|
||||||
|
|------|------|-----------|---------|
|
||||||
|
| struct | `IdentityFileStore` | lib.rs:176 | Encrypted identity file store |
|
||||||
|
| struct | `BookmarkRepository` | lib.rs:792 | SQLite-backed bookmark store |
|
||||||
|
| struct | `Bookmark` | lib.rs:767 | A persisted bookmark |
|
||||||
|
| struct | `PttBindingMeta` | lib.rs:117 | PTT binding metadata |
|
||||||
|
| enum | `StorageError` | lib.rs:59 | Storage errors (6 variants) |
|
||||||
|
| trait | `Crypto` | lib.rs:673 | Envelope encryption abstraction |
|
||||||
|
| const | `KEYRING_SERVICE` | lib.rs:190 | Keyring service name `"chanora"` |
|
||||||
|
| fn | `IdentityFileStore::new` | lib.rs:194 | Construct store at directory |
|
||||||
|
| fn | `IdentityFileStore::path` | lib.rs:211 | Get identity file path |
|
||||||
|
| fn | `IdentityFileStore::crypto` | lib.rs:384 | Get DekCrypto helper |
|
||||||
|
| fn | `IdentityFileStore::load` | lib.rs:390 | Read persisted identity |
|
||||||
|
| fn | `IdentityFileStore::save` | lib.rs:449 | Persist identity (encrypted) |
|
||||||
|
| fn | `IdentityFileStore::set_transmit_mode` | lib.rs:520 | Persist transmit mode |
|
||||||
|
| fn | `IdentityFileStore::get_transmit_mode` | lib.rs:528 | Read transmit mode |
|
||||||
|
| fn | `IdentityFileStore::set_release_tail_ms` | lib.rs:534 | Persist release tail |
|
||||||
|
| fn | `IdentityFileStore::get_release_tail_ms` | lib.rs:542 | Read release tail |
|
||||||
|
| fn | `IdentityFileStore::set_ptt_binding` | lib.rs:554 | Persist PTT binding |
|
||||||
|
| fn | `IdentityFileStore::get_ptt_binding` | lib.rs:568 | Read PTT binding |
|
||||||
|
| fn | `IdentityFileStore::clear` | lib.rs:579 | Remove persisted identity |
|
||||||
|
| fn | `BookmarkRepository::new` | lib.rs:801 | Open DB without encryption |
|
||||||
|
| fn | `BookmarkRepository::with_crypto` | lib.rs:807 | Open DB with password encryption |
|
||||||
|
| fn | `BookmarkRepository::encrypts_passwords` | lib.rs:858 | Check if encryption wired |
|
||||||
|
| fn | `BookmarkRepository::add` | lib.rs:865 | Insert bookmark |
|
||||||
|
| fn | `BookmarkRepository::upsert_or_add` | lib.rs:891 | Insert or update by host |
|
||||||
|
| fn | `BookmarkRepository::update` | lib.rs:935 | Replace existing bookmark |
|
||||||
|
| fn | `BookmarkRepository::delete` | lib.rs:963 | Delete bookmark by id |
|
||||||
|
| fn | `BookmarkRepository::list` | lib.rs:976 | List all bookmarks |
|
||||||
|
|
||||||
|
**Dead code:** None found.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. `chanora_state` — Server State Mirror
|
||||||
|
|
||||||
|
Authoritative client-side mirror of server state with deterministic reducers.
|
||||||
|
|
||||||
|
| Kind | Name | File:Line | Purpose |
|
||||||
|
|------|------|-----------|---------|
|
||||||
|
| struct | `ServerState` | lib.rs:62 | Authoritative server state mirror |
|
||||||
|
| struct | `Reduction` | lib.rs:266 | Result of applying one event |
|
||||||
|
| struct | `ChannelJoinState` | channel_join.rs:53 | Channel-join reducer state |
|
||||||
|
| struct | `AuthoritativeMembership` | channel_join.rs:27 | Server-confirmed membership |
|
||||||
|
| struct | `JoinPending` | channel_join.rs:36 | Active pending join intent |
|
||||||
|
| struct | `ChannelJoinProjection` | channel_join.rs:135 | Reducer projection for UI |
|
||||||
|
| struct | `JoinOutcomeKey` | channel_join.rs:124 | Correlation key for outcomes |
|
||||||
|
| struct | `ConnectionEpoch` | channel_join.rs:15 | Per-connection epoch |
|
||||||
|
| struct | `JoinGeneration` | channel_join.rs:19 | Monotonic join generation |
|
||||||
|
| struct | `JoinRequestId` | channel_join.rs:23 | Protocol request identifier |
|
||||||
|
| struct | `ChannelId` (join) | channel_join.rs:11 | Channel identifier at reducer seam |
|
||||||
|
| enum | `ConnectionState` | lib.rs:43 | Connection lifecycle (5 variants) |
|
||||||
|
| enum | `Delta` | lib.rs:209 | State changes for bridge (8 variants) |
|
||||||
|
| enum | `StateEvent` | lib.rs:237 | Events flowing into reducer (9 variants) |
|
||||||
|
| enum | `StateError` | lib.rs:32 | State errors (2 variants) |
|
||||||
|
| enum | `ChannelJoinEvent` | channel_join.rs:165 | Channel-join events (10 variants) |
|
||||||
|
| enum | `ChannelJoinAction` | channel_join.rs:240 | Side-effect actions (7 variants) |
|
||||||
|
| enum | `ChannelJoinSyncState` | channel_join.rs:101 | Sync readiness (2 variants) |
|
||||||
|
| enum | `SyncReason` | channel_join.rs:115 | Sync reason (2 variants) |
|
||||||
|
| enum | `JoinReduceStatus` | channel_join.rs:309 | Transition status (9 variants) |
|
||||||
|
| enum | `JoinIntentRejected` | channel_join.rs:332 | Rejection reasons (2 variants) |
|
||||||
|
| enum | `JoinFailureKind` | channel_join.rs:341 | Failure kinds (5 variants) |
|
||||||
|
| enum | `JoinErrorCode` | channel_join.rs:356 | Stable error codes (11 variants) |
|
||||||
|
| enum | `JoinDiagnosticKey` | channel_join.rs:284 | Diagnostic event keys (10 variants) |
|
||||||
|
| enum | `AuthoritativeSource` | channel_join.rs:156 | Membership input source |
|
||||||
|
| fn | `ServerState::from_snapshot` | lib.rs:83 | Build from initial snapshot |
|
||||||
|
| fn | `ServerState::replace_from_snapshot` | lib.rs:114 | Replace with fresh snapshot |
|
||||||
|
| fn | `ServerState::channel` | lib.rs:119 | Look up channel by id |
|
||||||
|
| fn | `ServerState::client` | lib.rs:124 | Look up client by id |
|
||||||
|
| fn | `ServerState::channels` | lib.rs:130 | All channels iterator |
|
||||||
|
| fn | `ServerState::clients` | lib.rs:141 | All clients iterator |
|
||||||
|
| fn | `ServerState::channel_count` | lib.rs:148 | Number of channels |
|
||||||
|
| fn | `ServerState::client_count` | lib.rs:153 | Number of clients |
|
||||||
|
| fn | `ServerState::own_channel` | lib.rs:158 | Own client's channel |
|
||||||
|
| fn | `ServerState::clients_in_channel` | lib.rs:164 | Clients in specific channel |
|
||||||
|
| fn | `reduce` | lib.rs:281 | Apply StateEvent to state |
|
||||||
|
| fn | `reduce_reconnect_snapshot` | lib.rs:409 | Replace state after reconnect |
|
||||||
|
| fn | `channel_join::reduce` | channel_join.rs:393 | Channel-join event reducer |
|
||||||
|
| fn | `channel_join::project` | channel_join.rs:670 | Build channel-join projection |
|
||||||
|
| fn | `ChannelJoinState::new` | channel_join.rs:68 | Create join state for epoch |
|
||||||
|
|
||||||
|
**Dead code:** None found.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 6. `chanora_audio` — Audio Subsystem
|
||||||
|
|
||||||
|
Platform capture/playback, Opus encoding, VAD, PTT, DSP.
|
||||||
|
|
||||||
|
| Kind | Name | File:Line | Purpose |
|
||||||
|
|------|------|-----------|---------|
|
||||||
|
| **Core Engine** | | | |
|
||||||
|
| struct | `AudioEngine` | engine.rs:289 | Main audio engine |
|
||||||
|
| struct | `AudioEngineConfig` | engine.rs:223 | Engine configuration |
|
||||||
|
| struct | `SessionAudioId` | engine.rs:69 | Stable audio session ID |
|
||||||
|
| struct | `AudioDeviceList` | engine.rs:87 | Available audio devices |
|
||||||
|
| struct | `AudioDeviceInfo` | engine.rs:96 | Single audio device info |
|
||||||
|
| enum | `AudioError` | lib.rs:100 | Audio subsystem errors (7 variants) |
|
||||||
|
| struct | `AudioEffects` | lib.rs:136 | AEC/AGC/NS/HPF toggles |
|
||||||
|
| fn | `list_audio_devices` | engine.rs:176 | Enumerate input/output devices |
|
||||||
|
| fn | `AudioEngine::start` | engine.rs:634 | Start audio engine |
|
||||||
|
| fn | `AudioEngine::start_with_gate` | engine.rs:647 | Start with transmit gate |
|
||||||
|
| fn | `AudioEngine::stop` | engine.rs:1358 | Stop audio engine |
|
||||||
|
| fn | `AudioEngine::set_transmit_active` | engine.rs:1601 | Set transmit state |
|
||||||
|
| fn | `AudioEngine::transmit_active` | engine.rs:1606 | Get transmit state |
|
||||||
|
| fn | `AudioEngine::set_output_muted` | engine.rs:1702 | Set output mute |
|
||||||
|
| fn | `AudioEngine::set_output_gain` | engine.rs:1714 | Set output gain |
|
||||||
|
| fn | `AudioEngine::set_client_volume` | engine.rs:1727 | Set per-client volume |
|
||||||
|
| fn | `AudioEngine::set_audio_processing_config` | engine.rs:1646 | Update processing config |
|
||||||
|
| fn | `AudioEngine::audio_processing_stats` | engine.rs:1683 | Get processing stats |
|
||||||
|
| **Frame Helpers** | | | |
|
||||||
|
| const | `SAMPLE_RATE_HZ` | frame.rs:9 | 48000 Hz |
|
||||||
|
| const | `FRAME_10MS_SAMPLES` | frame.rs:15 | 480 samples |
|
||||||
|
| const | `FRAME_20MS_SAMPLES` | frame.rs:17 | 960 samples |
|
||||||
|
| struct | `AudioFrame10ms` | frame.rs:21 | 10ms processing frame |
|
||||||
|
| struct | `AudioFrame20ms` | frame.rs:28 | 20ms network frame |
|
||||||
|
| fn | `i16_to_f32` | frame.rs:64 | PCM conversion |
|
||||||
|
| fn | `f32_to_i16` | frame.rs:69 | PCM conversion |
|
||||||
|
| fn | `dbfs` | frame.rs:74 | RMS dBFS calculation |
|
||||||
|
| **Transmit** | | | |
|
||||||
|
| enum | `TransmitMode` | transmit_mode.rs:13 | Ptt/Continuous/VoiceActivity |
|
||||||
|
| enum | `PermissionGate` | transmit_selector.rs:38 | Mic permission state |
|
||||||
|
| struct | `TransmitModeSelector` | transmit_selector.rs:88 | Multi-signal transmit selector |
|
||||||
|
| struct | `AudioTransmitGate` | ptt.rs:139 | Atomic transmit flag |
|
||||||
|
| struct | `ReleaseTailTimer` | release_tail.rs:43 | PTT release-tail timer |
|
||||||
|
| const | `DEFAULT_TAIL_MS` | release_tail.rs:24 | 200ms default |
|
||||||
|
| const | `MAX_TAIL_MS` | release_tail.rs:21 | 500ms max |
|
||||||
|
| **PTT** | | | |
|
||||||
|
| enum | `PttCapabilityLevel` | ptt.rs:34 | L0-L4 capability levels |
|
||||||
|
| struct | `PttBackendDescriptor` | ptt.rs:97 | Privacy-safe PTT descriptor |
|
||||||
|
| struct | `MissedKeyUpWatchdog` | ptt.rs:202 | PTT safety watchdog |
|
||||||
|
| trait | `DesktopPttBackend` | ptt_backends/mod.rs:162 | Platform PTT backend trait |
|
||||||
|
| struct | `PttBinding` | ptt_backends/mod.rs:48 | PTT binding metadata |
|
||||||
|
| enum | `PttInputClass` | ptt_backends/mod.rs:84 | None/Keyboard/MouseSideButton |
|
||||||
|
| enum | `PttBackendError` | ptt_backends/mod.rs:113 | PTT backend errors |
|
||||||
|
| fn | `select_ptt_backend` | ptt_backends/mod.rs:213 | Auto-select best backend |
|
||||||
|
| **Audio Processing** | | | |
|
||||||
|
| enum | `AudioRoute` | audio_processing.rs:14 | Route class (6 variants) |
|
||||||
|
| enum | `AudioBackend` | audio_processing.rs:65 | Processing backend (4 variants) |
|
||||||
|
| enum | `VadBackend` | audio_processing.rs:90 | VAD backend (4 variants) |
|
||||||
|
| enum | `EffectOwner` | audio_processing.rs:122 | Effect owner (5 variants) |
|
||||||
|
| enum | `IosVoiceProcessingMode` | audio_processing.rs:58 | iOS VPIO mode |
|
||||||
|
| struct | `AudioProcessingConfig` | audio_processing.rs:137 | Full processing config |
|
||||||
|
| struct | `AudioProcessingStats` | audio_processing.rs:270 | Processing statistics |
|
||||||
|
| struct | `SharedAudioProcessingStats` | audio_processing.rs:322 | Thread-safe stats |
|
||||||
|
| **DSP** | | | |
|
||||||
|
| struct | `Aec3` | processor/dsp/aec3.rs:48 | Acoustic echo canceller |
|
||||||
|
| struct | `Agc2` | processor/dsp/agc2.rs:206 | Automatic gain control |
|
||||||
|
| struct | `HighPassFilter` | processor/dsp/hpf.rs:42 | High-pass filter |
|
||||||
|
| struct | `NoiseSuppressor` | processor/dsp/ns.rs:40 | Noise suppressor |
|
||||||
|
| trait | `AudioProcessor` | processor/mod.rs:21 | Realtime processor trait |
|
||||||
|
| struct | `NoopProcessor` | processor/noop.rs:6 | No-op processor |
|
||||||
|
| struct | `PlatformVoiceProcessor` | processor/platform.rs:10 | Platform VPIO processor |
|
||||||
|
| struct | `SonoraProcessor` | processor/sonora.rs:88 | Sonora DSP processor |
|
||||||
|
| struct | `SonoraConfig` | processor/sonora.rs:37 | Sonora configuration |
|
||||||
|
| struct | `WebRtcApmProcessor` | processor/webrtc_apm.rs:91 | WebRTC APM processor |
|
||||||
|
| struct | `WebRtcApmConfig` | processor/webrtc_apm.rs:17 | WebRTC APM config |
|
||||||
|
| **VAD** | | | |
|
||||||
|
| trait | `VoiceActivityDetector` | vad/mod.rs:34 | VAD trait |
|
||||||
|
| struct | `VadOutput` | vad/mod.rs:26 | VAD output (probability + speech) |
|
||||||
|
| struct | `WebRtcFallbackVad` | vad/mod.rs:40 | WebRTC fallback VAD |
|
||||||
|
| struct | `Resampled16kHzVad` | vad/mod.rs:77 | 48→16kHz resampling wrapper |
|
||||||
|
| struct | `SileroOnnxVad` | vad/silero_onnx.rs:62 | Silero ONNX VAD |
|
||||||
|
| struct | `Downsampler48to16` | vad/resampler.rs:44 | 48→16kHz downsampler |
|
||||||
|
| fn | `set_silero_model_path` | vad/mod.rs:126 | Set VAD model path |
|
||||||
|
| fn | `silero_model_epoch` | vad/mod.rs:147 | Get model epoch |
|
||||||
|
| **Voice Activity** | | | |
|
||||||
|
| struct | `VoiceActivityStateMachine` | voice_activity.rs:29 | VAD gate state machine |
|
||||||
|
| **Mobile Backend** | | | |
|
||||||
|
| trait | `MobileVoiceAudioBackend` | mobile_voice_backend.rs:262 | Mobile audio backend trait |
|
||||||
|
| struct | `AndroidVoiceStreamConfig` | mobile_voice_backend.rs:194 | Android stream config |
|
||||||
|
| struct | `AndroidAudioDiagnostics` | mobile_voice_backend.rs:499 | Android diagnostics |
|
||||||
|
| enum | `BackendEvent` | mobile_voice_backend.rs:35 | Backend events |
|
||||||
|
| enum | `BackendError` | mobile_voice_backend.rs:154 | Backend errors |
|
||||||
|
| enum | `AchievedPerformanceMode` | mobile_voice_backend.rs:112 | Performance mode |
|
||||||
|
| enum | `LatencyTier` | mobile_voice_backend.rs:377 | Latency tier |
|
||||||
|
| struct | `AndroidVoiceUnit` | android_voice_unit.rs:565 | Android voice unit |
|
||||||
|
| struct | `IosVoiceUnit` | ios_voice_unit.rs:522 | iOS voice unit |
|
||||||
|
| **Route Policy** | | | |
|
||||||
|
| fn | `ios_route_policy` | route_policy.rs:27 | Route→config policy for iOS |
|
||||||
|
| fn | `apply_route_change` | route_policy.rs:105 | Apply route change |
|
||||||
|
| **Mode Stack** | | | |
|
||||||
|
| struct | `ModeStack` | mode_stack.rs:88 | Android audio mode refcount |
|
||||||
|
| enum | `ModeAcquire` | mode_stack.rs:41 | Acquire result |
|
||||||
|
| enum | `ModeRelease` | mode_stack.rs:62 | Release result |
|
||||||
|
| **Debug** | | | |
|
||||||
|
| struct | `WavDebugRecorder` | debug_wav.rs:68 | Debug WAV recorder |
|
||||||
|
|
||||||
|
**Dead code:** `AndroidVoiceUnit`, `IosVoiceUnit`, and platform-specific backends are `#[cfg]`-gated — intentional.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 7. `chanora_resolver` — DNS/SRV/TSDNS Resolver
|
||||||
|
|
||||||
|
TeamSpeak address resolution: SRV, TSDNS, nick lookup.
|
||||||
|
|
||||||
|
| Kind | Name | File:Line | Purpose |
|
||||||
|
|------|------|-----------|---------|
|
||||||
|
| struct | `ChanoraResolver` | lib.rs:108 | Main resolver |
|
||||||
|
| struct | `Args` | lib.rs:26 | Resolution arguments |
|
||||||
|
| struct | `BuildInfo` | lib.rs:33 | Build metadata |
|
||||||
|
| struct | `SrvRecord` | lib.rs:40 | SRV record |
|
||||||
|
| struct | `ClientResolution` | lib.rs:58 | Client resolution result |
|
||||||
|
| enum | `Resolution` | lib.rs:85 | Resolution result (Dns/Srv/Nick) |
|
||||||
|
| enum | `ClientResolutionMethod` | lib.rs:48 | Resolution method (6 variants) |
|
||||||
|
| const | `DEFAULT_TEAMSPEAK_PORT` | lib.rs:23 | Port 9987 |
|
||||||
|
| fn | `build_info` | lib.rs:123 | Get build info |
|
||||||
|
| fn | `setup_log` | lib.rs:137 | Setup logging |
|
||||||
|
| fn | `ChanoraResolver::new` | lib.rs:157 | Create resolver |
|
||||||
|
| fn | `ChanoraResolver::resolve` | lib.rs:178 | Resolve with Args |
|
||||||
|
| fn | `ChanoraResolver::resolve_connection_address` | lib.rs:193 | Resolve to connection address |
|
||||||
|
| fn | `ChanoraResolver::resolve_client_address` | lib.rs:197 | Resolve client input to address |
|
||||||
|
| fn | `ChanoraResolver::resolve_client_request` | lib.rs:201 | Resolve with full metadata |
|
||||||
|
| fn | `ChanoraResolver::resolve_dns` | lib.rs:594 | DNS lookup |
|
||||||
|
| fn | `ChanoraResolver::resolve_ts3` | lib.rs:614 | TS3 SRV lookup |
|
||||||
|
| fn | `ChanoraResolver::resolve_tsdns` | lib.rs:619 | TSDNS SRV lookup |
|
||||||
|
| fn | `ChanoraResolver::resolve_nick` | lib.rs:624 | Nick lookup |
|
||||||
|
| fn | `normalize_args` | lib.rs:778 | Normalize Args |
|
||||||
|
| fn | `validate_args` | lib.rs:785 | Validate Args |
|
||||||
|
| fn | `run` | lib.rs:804 | CLI entry point |
|
||||||
|
|
||||||
|
**Dead code:** `run()` is a CLI entry point, not called from library code — intentional.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 8. `chanora_prefetch` — Server Address Prefetch
|
||||||
|
|
||||||
|
Speculative DNS warming for faster connects.
|
||||||
|
|
||||||
|
| Kind | Name | File:Line | Purpose |
|
||||||
|
|------|------|-----------|---------|
|
||||||
|
| struct | `ServerPrefetcher` | lib.rs:83 | Prefetch cache + async resolver |
|
||||||
|
| enum | `ServerPrefetchError` | lib.rs:18 | Prefetch errors |
|
||||||
|
| fn | `ServerPrefetcher::new` | lib.rs:90 | Create prefetcher |
|
||||||
|
| fn | `ServerPrefetcher::prefetch` | lib.rs:99 | Schedule fire-and-forget prefetch |
|
||||||
|
| fn | `ServerPrefetcher::fresh_match` | lib.rs:145 | Check for cached result |
|
||||||
|
|
||||||
|
**Dead code:** None found.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 9. `chanora_diagnostics` — Redaction & Diagnostic Export
|
||||||
|
|
||||||
|
Redaction policy, in-memory log sink, PTT sanitizer.
|
||||||
|
|
||||||
|
| Kind | Name | File:Line | Purpose |
|
||||||
|
|------|------|-----------|---------|
|
||||||
|
| struct | `Redactor` | lib.rs:121 | Production redaction policy |
|
||||||
|
| struct | `KnownSecretRegistry` | lib.rs:79 | Secret substring registry |
|
||||||
|
| struct | `InMemoryLogSink` | lib.rs:356 | Bounded redacted log sink |
|
||||||
|
| struct | `RedactingLogLayer` | lib.rs:440 | tracing Layer for redaction |
|
||||||
|
| struct | `PttSanitizer` | lib.rs:505 | PTT field ban Layer |
|
||||||
|
| struct | `DiagnosticExport` | lib.rs:614 | Export bundle |
|
||||||
|
| struct | `ProtocolEventRecorder` | lib.rs:714 | Protocol event ring buffer |
|
||||||
|
| enum | `DiagnosticsError` | lib.rs:51 | Diagnostics errors |
|
||||||
|
| const | `REDACTION_MARKER` | lib.rs:62 | `"[REDACTED]"` |
|
||||||
|
| const | `DEFAULT_LOG_CAPACITY` | lib.rs:67/70 | 256 (release) / 4096 (debug) |
|
||||||
|
| fn | `Redactor::with_default_policy` | lib.rs:128 | Create redactor |
|
||||||
|
| fn | `Redactor::with_secrets` | lib.rs:134 | Create with secret registry |
|
||||||
|
| fn | `Redactor::secrets` | lib.rs:140 | Access secret registry |
|
||||||
|
| fn | `Redactor::redact` | lib.rs:150 | Apply redaction policy |
|
||||||
|
| fn | `KnownSecretRegistry::register` | lib.rs:85 | Register secret |
|
||||||
|
| fn | `KnownSecretRegistry::len` | lib.rs:99 | Count secrets |
|
||||||
|
| fn | `KnownSecretRegistry::is_empty` | lib.rs:104 | Check empty |
|
||||||
|
| fn | `KnownSecretRegistry::contains_substr` | lib.rs:110 | Substring check |
|
||||||
|
| fn | `InMemoryLogSink::new` | lib.rs:365 | Create sink |
|
||||||
|
| fn | `InMemoryLogSink::snapshot` | lib.rs:377 | Snapshot lines |
|
||||||
|
| fn | `InMemoryLogSink::push` | lib.rs:386 | Push redacted line |
|
||||||
|
| fn | `InMemoryLogSink::redactor` | lib.rs:397 | Access redactor |
|
||||||
|
| fn | `RedactingLogLayer::new` | lib.rs:446 | Create layer |
|
||||||
|
| fn | `RedactingLogLayer::with_sanitizer` | lib.rs:452 | Wrap with PTT sanitizer |
|
||||||
|
| fn | `PttSanitizer::wrap` | lib.rs:513 | Wrap inner layer |
|
||||||
|
| fn | `DiagnosticExport::from_sink` | lib.rs:636 | Build export |
|
||||||
|
| fn | `DiagnosticExport::with_android_audio` | lib.rs:655 | Attach Android audio YAML |
|
||||||
|
| fn | `DiagnosticExport::with_network_info` | lib.rs:661 | Attach network info |
|
||||||
|
| fn | `DiagnosticExport::with_protocol_events` | lib.rs:667 | Attach protocol events |
|
||||||
|
| fn | `DiagnosticExport::to_text` | lib.rs:674 | Render as plaintext |
|
||||||
|
| fn | `ProtocolEventRecorder::new` | lib.rs:721 | Create recorder |
|
||||||
|
| fn | `ProtocolEventRecorder::record_connected` | lib.rs:740 | Record connection |
|
||||||
|
| fn | `ProtocolEventRecorder::record_disconnected` | lib.rs:745 | Record disconnect |
|
||||||
|
| fn | `ProtocolEventRecorder::record_reconnecting` | lib.rs:750 | Record reconnect |
|
||||||
|
| fn | `ProtocolEventRecorder::record_snapshot_changed` | lib.rs:759 | Record snapshot change |
|
||||||
|
| fn | `ProtocolEventRecorder::record_channel_join` | lib.rs:768 | Record channel join |
|
||||||
|
| fn | `ProtocolEventRecorder::record_lifecycle` | lib.rs:777 | Record lifecycle |
|
||||||
|
| fn | `ProtocolEventRecorder::drain` | lib.rs:782 | Drain all events |
|
||||||
|
| fn | `ProtocolEventRecorder::snapshot` | lib.rs:787 | Snapshot events |
|
||||||
|
|
||||||
|
**Dead code:** None found.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 10. `chanora_core` — Top-Level Orchestration
|
||||||
|
|
||||||
|
Integration point composing all subsystems behind a stable API.
|
||||||
|
|
||||||
|
| Kind | Name | File:Line | Purpose |
|
||||||
|
|------|------|-----------|---------|
|
||||||
|
| struct | `ChanoraSession` | lib.rs:191 | Process-wide session handle |
|
||||||
|
| enum | `CoreError` | lib.rs:84 | Top-level errors (7 variants) |
|
||||||
|
| struct | `PttDescriptorSnapshot` | events.rs:6 | PTT descriptor snapshot |
|
||||||
|
| struct | `PersistedPttBinding` | events.rs:27 | Persisted PTT binding |
|
||||||
|
| struct | `PttController` | ptt.rs:68 | PTT controller |
|
||||||
|
| struct | `FileTransferService` | file_transfer.rs:39 | File transfer service |
|
||||||
|
| enum | `SessionEvent` | events.rs:49 | Session lifecycle events |
|
||||||
|
| enum | `VoiceJoinSyncState` | events.rs:239 | Voice join sync state |
|
||||||
|
| enum | `VoiceJoinErrorCode` | events.rs:250 | Voice join error codes |
|
||||||
|
| enum | `NetworkState` | events.rs:280 | Network connectivity state |
|
||||||
|
| enum | `FileTransferError` | file_transfer.rs:17 | File transfer errors |
|
||||||
|
| enum | `PttControllerError` | ptt.rs:35 | PTT controller errors |
|
||||||
|
| fn | `ChanoraSession::new` | lib.rs:245 | Create session |
|
||||||
|
| fn | `ChanoraSession::subscribe_events` | lib.rs:478 | Subscribe to session events |
|
||||||
|
| fn | `ChanoraSession::set_network_state` | lib.rs:460 | Set network state |
|
||||||
|
| fn | `ChanoraSession::network_state` | lib.rs:469 | Get network state |
|
||||||
|
| fn | `ChanoraSession::transmit_mode` | lib.rs:1568 | Get transmit mode |
|
||||||
|
| fn | `ChanoraSession::hard_mute` | lib.rs:1591 | Get hard mute state |
|
||||||
|
| fn | `ChanoraSession::release_tail_ms` | lib.rs:1645 | Get release tail |
|
||||||
|
| fn | `ChanoraSession::transmit_selector` | lib.rs:1652 | Get transmit selector |
|
||||||
|
| fn | `ChanoraSession::release_tail_timer` | lib.rs:1659 | Get release tail timer |
|
||||||
|
| fn | `ChanoraSession::audio_processing_stats_if_ready` | lib.rs:1205 | Get audio stats |
|
||||||
|
| fn | `PttController::new` | ptt.rs:103 | Create PTT controller |
|
||||||
|
| fn | `PttController::current_capability` | ptt.rs:226 | Get PTT capability |
|
||||||
|
| fn | `PttController::subscribe_capability` | ptt.rs:233 | Subscribe to capability |
|
||||||
|
| fn | `PttController::descriptor_watch` | ptt.rs:250 | Watch PTT descriptor |
|
||||||
|
| fn | `PttController::press_gate` | ptt.rs:257 | Get press gate |
|
||||||
|
| fn | `PttController::release_tail` | ptt.rs:263 | Get release tail |
|
||||||
|
|
||||||
|
**Dead code:** None found. All items consumed by `chanora_bridge`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Dart Files (apps/chanora_flutter/lib/)
|
||||||
|
|
||||||
|
### Widgets (31 files)
|
||||||
|
|
||||||
|
| Class | File:Line | Purpose |
|
||||||
|
|-------|-----------|---------|
|
||||||
|
| `AppSnackBar` | widgets/app_snack_bar.dart:9 | Snackbar notifications |
|
||||||
|
| `AppSnackBarVariant` | widgets/app_snack_bar.dart:6 | Neutral/success/warning/error |
|
||||||
|
| `AudioDebugStatsPanel` | widgets/audio_debug_stats_panel.dart:22 | Audio stats debug panel |
|
||||||
|
| `AudioDeviceListTile` | widgets/audio_device_list_tile.dart:21 | Audio device list item |
|
||||||
|
| `AudioDeviceKind` | widgets/audio_device_list_tile.dart:12 | Input/Output device kind |
|
||||||
|
| `AudioOutputTile` | widgets/audio_output_tile.dart:15 | Audio output route picker |
|
||||||
|
| `AudioProcessingConfigState` | widgets/audio_processing_config_state.dart:34 | Processing config state |
|
||||||
|
| `BbCodeText` | widgets/bbcode_text.dart:47 | BBCode renderer |
|
||||||
|
| `ChatPanel` | widgets/chat_panel.dart:13 | Chat panel container |
|
||||||
|
| `ChatEntry` | widgets/chat_views.dart:25 | Chat message entry |
|
||||||
|
| `ChatClientGroups` | widgets/chat_views.dart:374 | Client grouping for chat |
|
||||||
|
| `ChatPage` | widgets/chat_views.dart:548 | Full chat page |
|
||||||
|
| `ChatDetailView` | widgets/chat_views.dart:1070 | Chat detail view |
|
||||||
|
| `ClientInfoSheet` | widgets/client_info_sheet.dart:7 | Client info bottom sheet |
|
||||||
|
| `ConnectForm` | widgets/connect_widgets.dart:9 | Server connect form |
|
||||||
|
| `BookmarkList` | widgets/connect_widgets.dart:154 | Bookmark list |
|
||||||
|
| `CapturedBinding` | widgets/input_dialogs.dart:50 | PTT binding capture result |
|
||||||
|
| `BookmarkNameDialog` | widgets/input_dialogs.dart:61 | Bookmark name input |
|
||||||
|
| `ChannelPasswordDialog` | widgets/input_dialogs.dart:109 | Channel password input |
|
||||||
|
| `PttBindingCaptureDialog` | widgets/input_dialogs.dart:154 | PTT key binding dialog |
|
||||||
|
| `PermissionStateBanner` | widgets/permission_state_banner.dart:28 | Permission state banner |
|
||||||
|
| `PokeNotificationSettingsDialog` | widgets/poke_notification_settings.dart:7 | Poke notification settings |
|
||||||
|
| `PttCapabilityBadge` | widgets/ptt_capability_badge.dart:14 | PTT capability badge |
|
||||||
|
| `SnapshotView` | widgets/snapshot_view.dart:14 | Server tree view |
|
||||||
|
| `TalkPowerWarning` | widgets/talk_power_warning.dart:14 | Talk power warning |
|
||||||
|
| `VoiceBar` | widgets/voice_bar.dart:18 | Voice status bar |
|
||||||
|
| `VoiceStatusChip` | widgets/voice_compact.dart:46 | Voice status chip |
|
||||||
|
| `VoicePttButton` | widgets/voice_compact.dart:255 | PTT button widget |
|
||||||
|
| `VoiceLevelMeter` | widgets/voice_level_meter.dart:11 | Voice level meter |
|
||||||
|
| `VoiceSettingsDialog` | widgets/voice_settings.dart:61 | Voice settings dialog |
|
||||||
|
| `VoiceSettingsResult` | widgets/voice_settings.dart:46 | Settings result |
|
||||||
|
| `VoiceStatusSummary` | widgets/voice_status_summary.dart:5 | Voice status summary |
|
||||||
|
| `VoiceSubHeader` | widgets/voice_settings_controls.dart:117 | Voice sub-header |
|
||||||
|
| `VoiceSectionHeader` | widgets/voice_settings_controls.dart:141 | Voice section header |
|
||||||
|
| `AudioProcessingToggleRow` | widgets/voice_settings_controls.dart:159 | Processing toggle row |
|
||||||
|
|
||||||
|
### Services (20 files)
|
||||||
|
|
||||||
|
| Class/Function | File:Line | Purpose |
|
||||||
|
|----------------|-----------|---------|
|
||||||
|
| `AndroidAudioOutputDevice` | services/android_audio_output_devices.dart:1 | Android audio device |
|
||||||
|
| `AndroidPermissionsService` | services/android_permissions_service.dart:34 | Android permission handler |
|
||||||
|
| `AppBootstrap` | services/app_bootstrap.dart:95 | App bootstrap helpers |
|
||||||
|
| `AudioLifecycleService` | services/audio_lifecycle_service.dart:46 | Audio lifecycle wiring |
|
||||||
|
| `BackIntentPolicy` | services/back_intent_policy.dart | Back intent policy |
|
||||||
|
| `BackIntentService` | services/back_intent_service.dart:97 | Back intent handler |
|
||||||
|
| `ChannelJoinErrorMapper` | services/channel_join_error_mapper.dart:5 | Error message mapper |
|
||||||
|
| `ChannelSpacer` | services/channel_spacer.dart:110 | Spacer channel detection |
|
||||||
|
| `ConnectionPhaseState` | services/connection_phase_state.dart:38 | Connection phase state |
|
||||||
|
| `HardMuteOwners` | services/hard_mute_owners.dart | Hard mute owners |
|
||||||
|
| `IosAudioSessionController` | services/ios_audio_session_controller.dart | iOS audio session |
|
||||||
|
| `IosPermissionsService` | services/ios_permissions_service.dart:66 | iOS permission handler |
|
||||||
|
| `LinkTrustService` | services/link_trust_service.dart:29 | Link trust checker |
|
||||||
|
| `MacosPermissionsService` | services/macos_permissions_service.dart:273 | macOS permission handler |
|
||||||
|
| `PokePreferencesService` | services/poke_preferences_service.dart:44 | Poke mute preferences |
|
||||||
|
| `PokeNotificationService` | services/poke_notification_service.dart | Poke notification handler |
|
||||||
|
| `PrefetchDebouncer` | services/prefetch_debouncer.dart:15 | DNS prefetch debouncer |
|
||||||
|
| `SnapshotStateMapper` | services/snapshot_state_mapper.dart:43 | Snapshot→state mapper |
|
||||||
|
| `Ts3ServerLink` | services/ts3_server_link.dart:83 | TS3 server link parser |
|
||||||
|
| `UiPreferencesService` | services/ui_preferences_service.dart | UI preferences |
|
||||||
|
| `VoiceJoinOrdering` | services/voice_join_ordering.dart | Voice join ordering |
|
||||||
|
|
||||||
|
### Design (4 files)
|
||||||
|
|
||||||
|
| Class | File:Line | Purpose |
|
||||||
|
|-------|-----------|---------|
|
||||||
|
| `ChanoraTokens` | design/chanora_tokens.dart | Design tokens |
|
||||||
|
| `Breakpoints` | design/breakpoints.dart | Responsive breakpoints |
|
||||||
|
| `ViewportInfo` | design/viewport_info.dart | Viewport info |
|
||||||
|
| `PlatformCapabilities` | design/platform_capabilities.dart | Platform capabilities |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Dead Code Analysis
|
||||||
|
|
||||||
|
### Confirmed Dead Code
|
||||||
|
None found. All public items are consumed by downstream crates or are intentionally platform-gated.
|
||||||
|
|
||||||
|
### Platform-Gated (Intentional)
|
||||||
|
- `AndroidVoiceUnit`, `IosVoiceUnit` — only compiled on target platforms
|
||||||
|
- `chanora_android_*` JNI functions — Android only
|
||||||
|
- `ios_voice_unit.rs`, `android_voice_unit.rs` — platform-specific
|
||||||
|
- `sdl_output.rs` — Linux only
|
||||||
|
|
||||||
|
### TODO/FIXME Items (15 total)
|
||||||
|
|
||||||
|
| File | Line | Note |
|
||||||
|
|------|------|------|
|
||||||
|
| `chanora_audio/src/audio_event_queue.rs` | 27 | Wire to client disconnect path |
|
||||||
|
| `chanora_audio/src/engine.rs` | 2348 | Realtime audio callback concern |
|
||||||
|
| `chanora_audio/src/mobile_voice_backend.rs` | 16 | Back-fill IosVoiceUnit to trait |
|
||||||
|
| `audio_lifecycle_service.dart` | 151 | Wire macOS default device change |
|
||||||
|
| `audio_lifecycle_service.dart` | 156 | macOS device change no action yet |
|
||||||
|
| `poke_notification_service.dart` | 33,35,41,43,48,130,132,142,155,168 | Future EventSoundService (10 items) |
|
||||||
|
|
||||||
|
### Useless Code
|
||||||
|
- No empty impls found
|
||||||
|
- No commented-out function bodies found
|
||||||
|
- No dead trait implementations found
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Architecture Notes
|
||||||
|
|
||||||
|
- **Boundary discipline**: `tsclientlib` types never cross `chanora_protocol` boundary (SAD-067)
|
||||||
|
- **Single connection**: DEC-006 enforces one connection at runtime
|
||||||
|
- **Secret isolation**: `chanora_storage` never stores secrets in plaintext DB
|
||||||
|
- **Deterministic reducers**: `chanora_state` reducers are pure functions (SRS-056)
|
||||||
|
- **PTT privacy**: Raw key codes never appear in logs or diagnostics (DEC-027)
|
||||||
|
- **Audio pipeline**: 48kHz mono, 20ms Opus frames, 10ms processing frames
|
||||||
@@ -0,0 +1,252 @@
|
|||||||
|
# Link Coverage Report
|
||||||
|
|
||||||
|
**Generated:** 2026-06-13
|
||||||
|
**Scope:** All `.md` files in repository root and `docs/` tree
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
- Total links checked: 148
|
||||||
|
- Valid internal links: 12 (4 markdown links + 8 inline doc-path references)
|
||||||
|
- Broken internal links: 2
|
||||||
|
- Valid inline doc-path references: 94
|
||||||
|
- Broken inline doc-path references: 5
|
||||||
|
- Valid code references: 62
|
||||||
|
- Broken code references: 2
|
||||||
|
- External links (manual review): 48
|
||||||
|
- Cross-references (doc→doc in prose): 0 broken
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Broken Internal Links
|
||||||
|
|
||||||
|
Markdown `[text](path)` style links that resolve to missing files.
|
||||||
|
|
||||||
|
| File | Line | Link Text | Target | Issue |
|
||||||
|
|------|------|-----------|--------|-------|
|
||||||
|
| README.md | 428 | `LICENSE-APACHE` | `LICENSE-APACHE` | File does not exist at repo root |
|
||||||
|
| README.md | 431 | `LICENSE-MIT` | `LICENSE-MIT` | File does not exist at repo root |
|
||||||
|
|
||||||
|
**Impact:** Users clicking the license links in the README will get a 404 on GitHub. These are referenced in the License section as the dual-license model files.
|
||||||
|
|
||||||
|
**Also affected by missing LICENSE files:**
|
||||||
|
|
||||||
|
| File | Line | Reference | Issue |
|
||||||
|
|------|------|-----------|-------|
|
||||||
|
| docs/security/license-inventory.md | 9 | `../../LICENSE-APACHE` | Resolves to missing `LICENSE-APACHE` at repo root |
|
||||||
|
| docs/security/license-inventory.md | 10 | `../../LICENSE-MIT` | Resolves to missing `LICENSE-MIT` at repo root |
|
||||||
|
| docs/security/flutter-license-inventory.md | 11 | `../../LICENSE-APACHE` | Resolves to missing `LICENSE-APACHE` at repo root |
|
||||||
|
| docs/security/flutter-license-inventory.md | 12 | `../../LICENSE-MIT` | Resolves to missing `LICENSE-MIT` at repo root |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Valid Internal Links
|
||||||
|
|
||||||
|
| File | Line | Target |
|
||||||
|
|------|------|--------|
|
||||||
|
| README.md | 130 | `docs/architecture/desktop-ptt-architecture.md` |
|
||||||
|
| README.md | 436 | `docs/governance/product-decision-register.md` |
|
||||||
|
| README.md | 444 | `NOTICE` |
|
||||||
|
| docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | 266 | `../ui-ux/adaptive-layout-platform-guide.md` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Inline Doc-Path References
|
||||||
|
|
||||||
|
References to documentation files using backtick-quoted paths (not markdown links).
|
||||||
|
|
||||||
|
### Valid
|
||||||
|
|
||||||
|
| File | Line | Reference |
|
||||||
|
|------|------|-----------|
|
||||||
|
| CONTRIBUTING.md | 25 | `docs/governance/git-commit-message-convention.md` |
|
||||||
|
| README.md | 144 | `docs/governance/product-decision-register.md` |
|
||||||
|
| README.md | 261–271 | `docs/requirements/sysrs.md`, `docs/requirements/srs.md`, `docs/architecture/sysdes.md`, `docs/architecture/sad.md`, `docs/architecture/sdd.md`, `docs/verification/verification-master-plan.md`, `docs/release/release-readiness-go-nogo-record.md`, `docs/release/platform-release-policy.md`, `docs/governance/product-decision-register.md`, `docs/governance/traceability-matrix.md`, `docs/security/security-privacy-legal-guideline.md` |
|
||||||
|
| README.md | 312 | `docs/release/release-readiness-go-nogo-record.md` |
|
||||||
|
| README.md | 349–355 | `docs/security/threat-model.md`, `docs/security/secure-storage-audit-report.md`, `docs/security/diagnostic-redaction-audit-report.md`, `docs/security/dependency-and-supply-chain-report.md`, `docs/privacy/privacy-policy.md`, `docs/legal/trademark-and-attribution-review.md` |
|
||||||
|
| README.md | 391 | `docs/governance/git-commit-message-convention.md` |
|
||||||
|
| README.md | 449–451 | `docs/governance/product-decision-register.md`, `docs/security/dependency-and-supply-chain-report.md`, `docs/legal/trademark-and-attribution-review.md` |
|
||||||
|
| docs/architecture/sad.md | 6 | `docs/srs.md` |
|
||||||
|
| docs/architecture/sad.md | 7 | `docs/sysdes.md` |
|
||||||
|
| docs/architecture/sad.md | 176 | `docs/governance/traceability-matrix.md` |
|
||||||
|
| docs/architecture/sdd.md | 6 | `docs/architecture/sad.md` |
|
||||||
|
| docs/architecture/sdd.md | 7 | `docs/srs.md` |
|
||||||
|
| docs/architecture/sysdes.md | 6 | `docs/sysdes.md` (canonical pointer) |
|
||||||
|
| docs/architecture/desktop-ptt-architecture.md | 5 | `docs/architecture/sad.md`, `docs/architecture/sdd.md`, `docs/release/dv-waiver-register.md` |
|
||||||
|
| docs/architecture/file-transfer-design.md | 6 | `docs/architecture/sad.md` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 5 | `docs/architecture/file-transfer-design.md` |
|
||||||
|
| docs/architecture/file-transfer-implementation-plan.md | 6 | `docs/architecture/file-transfer-design.md`, `docs/architecture/file-transfer-research.md` |
|
||||||
|
| docs/requirements/sysrs.md | 4 | `../sysrs.md` (canonical pointer) |
|
||||||
|
| docs/requirements/srs.md | 4 | `../srs.md` (canonical pointer) |
|
||||||
|
| docs/governance/document-index.md | 14–32 | All listed document paths |
|
||||||
|
| docs/material3-guideline.md | 10 | `docs/ui-ux/material3-guideline.md` (self-referencing path record) |
|
||||||
|
| docs/ui-ux/material3-guideline.md | 6 | `docs/material3-guideline.md` (canonical pointer) |
|
||||||
|
| docs/superpowers/specs/2026-06-08-maintainability-continuation-design.md | 125–141 | Multiple `docs/` paths |
|
||||||
|
| docs/superpowers/specs/2026-05-29-state-sync-ui-settings-validation-design.md | 51–55 | Multiple `docs/` paths |
|
||||||
|
| docs/superpowers/plans/2026-05-29-finish-dv-document-tree.md | 16–54 | Multiple `docs/` paths |
|
||||||
|
| docs/superpowers/plans/2026-05-29-swe2-swe3-baselines.md | 16–35 | Multiple `docs/` paths |
|
||||||
|
| docs/superpowers/plans/2026-05-29-state-sync-ui-settings-validation.md | 84–88 | Multiple `docs/` paths |
|
||||||
|
| docs/superpowers/plans/2026-05-29-dv-evidence-pack.md | 16–54 | Multiple `docs/` paths |
|
||||||
|
| docs/superpowers/plans/2026-05-28-server-resolution-prefetch.md | 31–836 | Multiple source file paths |
|
||||||
|
| docs/superpowers/plans/2026-05-28-chanora-server-prefetch-crate.md | 15–541 | Multiple source file paths |
|
||||||
|
| docs/superpowers/plans/2026-06-06-chat-panel-switching.md | 58–507 | Multiple source file paths |
|
||||||
|
| docs/superpowers/plans/2026-06-08-core-internal-split.md | 16–91 | Multiple source file paths |
|
||||||
|
|
||||||
|
### Broken
|
||||||
|
|
||||||
|
| File | Line | Reference | Issue |
|
||||||
|
|------|------|-----------|-------|
|
||||||
|
| docs/sysrs.md | 126 | `docs/chanora_SysDes.md` | Does not exist (listed as "potential downstream file name") |
|
||||||
|
| docs/sysrs.md | 127 | `docs/chanora_SRS.md` | Does not exist (listed as "potential downstream file name") |
|
||||||
|
| docs/sysrs.md | 128 | `docs/chanora_SAD.md` | Does not exist (listed as "potential downstream file name") |
|
||||||
|
| docs/sysrs.md | 129 | `docs/chanora_SDD.md` | Does not exist (listed as "potential downstream file name") |
|
||||||
|
| docs/sysrs.md | 130 | `docs/chanora_Verification.md` | Does not exist (listed as "potential downstream file name") |
|
||||||
|
|
||||||
|
**Note:** These five are documented as "Potential downstream file names" in a table and are aspirational/historical. They are presented as code blocks in the original, so they function as suggestions rather than navigable links. Low severity.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Code References
|
||||||
|
|
||||||
|
### Valid
|
||||||
|
|
||||||
|
| File | Line | Reference | Found At |
|
||||||
|
|------|------|-----------|----------|
|
||||||
|
| docs/architecture/sad.md | 41 | `apps/chanora_flutter/lib/main.dart` | EXISTS |
|
||||||
|
| docs/architecture/sad.md | 42 | `apps/chanora_flutter/lib/services/` | EXISTS |
|
||||||
|
| docs/architecture/sad.md | 43 | `apps/chanora_flutter/lib/widgets/` | EXISTS |
|
||||||
|
| docs/architecture/sad.md | 44 | `crates/chanora_bridge`, `apps/chanora_flutter/lib/src/rust/` | EXISTS |
|
||||||
|
| docs/architecture/sad.md | 45 | `core/chanora_core` | EXISTS |
|
||||||
|
| docs/architecture/sad.md | 46 | `crates/chanora_protocol` | EXISTS |
|
||||||
|
| docs/architecture/sad.md | 47 | `crates/chanora_state` | EXISTS |
|
||||||
|
| docs/architecture/sad.md | 48 | `crates/chanora_audio` | EXISTS |
|
||||||
|
| docs/architecture/sad.md | 49 | `crates/chanora_storage` | EXISTS |
|
||||||
|
| docs/architecture/sad.md | 50 | `crates/chanora_diagnostics` | EXISTS |
|
||||||
|
| docs/architecture/sad.md | 51 | `crates/chanora_resolver` | EXISTS |
|
||||||
|
| docs/architecture/sad.md | 52 | `crates/chanora_prefetch`, Flutter `prefetch_debouncer.dart` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 17 | `apps/chanora_flutter/lib/services/app_bootstrap.dart`, `main.dart` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 18 | `apps/chanora_flutter/lib/widgets/connect_widgets.dart` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 19 | `snapshot_view.dart`, `snapshot_state_mapper.dart`, `channel_spacer.dart` | EXISTS (in services/) |
|
||||||
|
| docs/architecture/sdd.md | 20 | `chat_views.dart`, `bbcode_text.dart` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 21 | `voice_bar.dart`, `voice_compact.dart`, `voice_settings*.dart`, `voice_level_meter.dart`, `ptt_capability_badge.dart` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 22 | `android_permissions_service.dart`, `ios_permissions_service.dart`, `audio_lifecycle_service.dart`, `back_intent_*`, `link_trust_service.dart` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 23 | `crates/chanora_bridge/src/api.rs` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 24 | `core/chanora_core/src/lib.rs`, `events.rs`, `network_diagnostics.rs`, `ptt.rs` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 25 | `crates/chanora_protocol/src/` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 26 | `crates/chanora_state/src/lib.rs`, `channel_join.rs` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 27 | `crates/chanora_audio/src/` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 28 | `crates/chanora_storage/src/lib.rs` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 29 | `crates/chanora_diagnostics/src/lib.rs` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 30 | `crates/chanora_resolver/src/lib.rs`, `crates/chanora_prefetch/src/lib.rs`, `prefetch_debouncer.dart` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 31 | `.github/workflows/`, `tools/` | EXISTS |
|
||||||
|
| docs/architecture/sdd.md | 35 | `crates/chanora_bridge/src/api.rs`, `apps/chanora_flutter/lib/src/rust/` | EXISTS |
|
||||||
|
| docs/release/release-readiness-go-nogo-record.md | 26 | `apps/chanora_flutter/pubspec.yaml` | EXISTS |
|
||||||
|
| docs/implementation-status-2026-05-28.md | 69 | `apps/chanora_flutter/ios/Runner/AppDelegate.swift` | EXISTS |
|
||||||
|
| docs/sysrs.md | 503 | `apps/chanora_flutter/ios/Runner/AppDelegate.swift` | EXISTS |
|
||||||
|
| docs/sysrs.md | 1962 | `apps/chanora_flutter/macos/chanora_bridge.podspec` | EXISTS |
|
||||||
|
| README.md | 236–249 | `apps/chanora_flutter/`, `core/chanora_core/`, `crates/chanora_protocol/`, `crates/chanora_audio/`, `crates/chanora_state/`, `crates/chanora_storage/`, `crates/chanora_diagnostics/`, `crates/chanora_bridge/` | EXISTS |
|
||||||
|
|
||||||
|
### Broken
|
||||||
|
|
||||||
|
| File | Line | Reference | Issue |
|
||||||
|
|------|------|-----------|-------|
|
||||||
|
| docs/architecture/sdd.md | 19 | `snapshot_state_mapper.dart` (listed under "Snapshot and channel UI" widgets) | File is in `apps/chanora_flutter/lib/services/`, not `apps/chanora_flutter/lib/widgets/` — directory mismatch |
|
||||||
|
| docs/architecture/sdd.md | 21 | `voice_settings*.dart` (listed under Voice UI widgets) | Files are `voice_settings.dart` and `voice_settings_controls.dart` in `widgets/` — EXISTS but glob reference is ambiguous (two files match) |
|
||||||
|
|
||||||
|
**Note:** The `snapshot_state_mapper.dart` directory mismatch is a minor documentation inaccuracy — the file exists but is listed under the wrong component section (widget layer vs service layer).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## External Links (Manual Review)
|
||||||
|
|
||||||
|
These URLs should be checked manually for validity.
|
||||||
|
|
||||||
|
| File | Line | URL |
|
||||||
|
|------|------|-----|
|
||||||
|
| README.md | 429 | `https://www.apache.org/licenses/LICENSE-2.0` |
|
||||||
|
| README.md | 432 | `https://opensource.org/licenses/MIT` |
|
||||||
|
| apps/chanora_flutter/README.md | 11 | `https://docs.flutter.dev/get-started/learn-flutter` |
|
||||||
|
| apps/chanora_flutter/README.md | 12 | `https://docs.flutter.dev/get-started/codelab` |
|
||||||
|
| apps/chanora_flutter/README.md | 13 | `https://docs.flutter.dev/reference/learning-resources` |
|
||||||
|
| apps/chanora_flutter/README.md | 16 | `https://docs.flutter.dev/` |
|
||||||
|
| silero-coreml/README.md | 343 | `https://apple.github.io/coremltools/docs-guides/source/introductory-quickstart.html` |
|
||||||
|
| silero-coreml/README.md | 350 | `https://apple.github.io/coremltools/docs-guides/source/convert-pytorch.html` |
|
||||||
|
| silero-coreml/Docs/CoreMLConversion.md | 244 | `https://apple.github.io/coremltools/docs-guides/source/convert-pytorch.html` |
|
||||||
|
| silero-coreml/Docs/CoreMLConversion.md | 252 | `https://apple.github.io/coremltools/docs-guides/source/introductory-quickstart.html` |
|
||||||
|
| docs/security/dependency-and-supply-chain-report.md | 29 | `https://github.com/EdisonJwa/oboe-rs` |
|
||||||
|
| docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | 261 | `https://github.com/asportnoy/compact-discord` |
|
||||||
|
| docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | 262 | `https://github.com/mattermost/mattermost/blob/...` |
|
||||||
|
| docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | 263 | `https://github.com/RocketChat/fuselage/blob/...` |
|
||||||
|
| docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | 264 | `https://github.com/flutter/flutter/issues/162965` |
|
||||||
|
| docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md | 265 | `https://m3.material.io/foundations/layout/breakpoints/overview` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 29 | `https://github.com/Splamy/TS3AudioBot/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 30 | `https://github.com/Multivit4min/TS3-NodeJS-Library/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 31 | `https://github.com/planetteamspeak/ts3phpframework/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 49 | `https://github.com/Multivit4min/TS3-NodeJS-Library/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 50 | `https://github.com/planetteamspeak/ts3phpframework/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 123 | `https://github.com/ReSpeak/Qint/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 124 | `https://github.com/ReSpeak/Qint/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 125 | `https://github.com/ReSpeak/Qint/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 140 | `https://github.com/teamspeak/ts3client-pluginsdk/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 141 | `https://github.com/teamspeak/ts3client-pluginsdk/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 142 | `https://community.teamspeak.com/t/clear-cache/41511` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 142 | `https://community.teamspeak.com/t/server-icons-are-displaying-a-broken-image-issues-with-local-cache/58680` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 208 | `https://github.com/Splamy/TS3AudioBot/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 209 | `https://github.com/Splamy/TS3AudioBot/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 220 | `https://github.com/Multivit4min/TS3-NodeJS-Library/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 221 | `https://github.com/Multivit4min/TS3-NodeJS-Library/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 320 | `https://github.com/rust-lang/rust/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 321 | `https://source.android.com/docs/core/storage/scoped` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 322 | `https://developer.apple.com/library/archive/documentation/FileManagement/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 334 | `https://github.com/zkat/cacache-rs/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 335 | `https://github.com/zkat/cacache-rs/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 336 | `https://github.com/zkat/cacache-rs/blob/...` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 345 | `https://pub.dev/packages/flutter_cache_manager` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 346 | `https://pub.dev/packages/super_cache_disk/versions/1.0.0` |
|
||||||
|
| docs/architecture/file-transfer-research.md | 406 | `https://git.did.science/TeaSpeak/Server/Server` |
|
||||||
|
| docs/security/license-inventory.md | 31–80 | ~50 URLs to GitHub repos for dependency licenses |
|
||||||
|
| docs/security/flutter-license-inventory.md | 624–4209 | Multiple `http://www.apache.org/licenses/` and `http://mozilla.org/MPL/2.0/` (in license text bodies) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cross-References
|
||||||
|
|
||||||
|
### Valid
|
||||||
|
|
||||||
|
All doc-to-doc cross-references found in prose text resolve to existing files. Key verified chains:
|
||||||
|
|
||||||
|
| Source | Reference | Target Exists |
|
||||||
|
|--------|-----------|---------------|
|
||||||
|
| docs/architecture/sad.md:6 | `docs/srs.md` | YES |
|
||||||
|
| docs/architecture/sad.md:7 | `docs/sysdes.md` | YES |
|
||||||
|
| docs/architecture/sdd.md:6 | `docs/architecture/sad.md` | YES |
|
||||||
|
| docs/architecture/sdd.md:7 | `docs/srs.md` | YES |
|
||||||
|
| docs/architecture/sysdes.md:6 | `docs/sysdes.md` | YES |
|
||||||
|
| docs/architecture/file-transfer-design.md:6 | `docs/architecture/sad.md` | YES |
|
||||||
|
| docs/architecture/file-transfer-research.md:5 | `docs/architecture/file-transfer-design.md` | YES |
|
||||||
|
| docs/architecture/file-transfer-implementation-plan.md:6 | `docs/architecture/file-transfer-design.md` | YES |
|
||||||
|
| docs/architecture/file-transfer-implementation-plan.md:6 | `docs/architecture/file-transfer-research.md` | YES |
|
||||||
|
| docs/architecture/desktop-ptt-architecture.md:5 | `docs/architecture/sad.md` | YES |
|
||||||
|
| docs/architecture/desktop-ptt-architecture.md:5 | `docs/architecture/sdd.md` | YES |
|
||||||
|
| docs/architecture/desktop-ptt-architecture.md:5 | `docs/release/dv-waiver-register.md` | YES |
|
||||||
|
| docs/requirements/sysrs.md:4 | `../sysrs.md` | YES |
|
||||||
|
| docs/requirements/srs.md:4 | `../srs.md` | YES |
|
||||||
|
| docs/governance/document-index.md | All 18 listed paths | YES |
|
||||||
|
| docs/ui-ux/material3-guideline.md:6 | `docs/material3-guideline.md` | YES |
|
||||||
|
|
||||||
|
### Broken
|
||||||
|
|
||||||
|
None found — all doc-to-doc cross-references in prose text resolve correctly.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
1. **Path-record files**: Several docs exist as stubs pointing to canonical locations (`docs/requirements/sysrs.md` → `docs/sysrs.md`, `docs/requirements/srs.md` → `docs/srs.md`, `docs/architecture/sysdes.md` → `docs/sysdes.md`, `docs/ui-ux/material3-guideline.md` → `docs/material3-guideline.md`). These are intentional DV navigation aids, not broken links.
|
||||||
|
|
||||||
|
2. **Hypothetical file names in sysrs.md**: The table at lines 124–131 lists `docs/chanora_SysDes.md` etc. as "Potential downstream file names." These are aspirational names from an earlier draft, not current files. They are presented as plain text in a table, not as navigable links.
|
||||||
|
|
||||||
|
3. **LICENSE-APACHE and LICENSE-MIT**: These are the most impactful broken references. The README's License section links to them, and the security license inventory files reference them. The dual-license model (DEC-020) requires these files to exist for proper attribution.
|
||||||
|
|
||||||
|
4. **snapshot_state_mapper.dart location**: The SDD lists this under "Snapshot and channel UI" (widget layer), but the file is actually in `services/`. This is a minor organizational mismatch — the file exists but is categorized differently than documented.
|
||||||
|
|
||||||
|
5. **External links**: Concentrated in `docs/architecture/file-transfer-research.md` (protocol research sources) and `docs/security/license-inventory.md` (dependency homepages). The file-transfer research links point to specific GitHub commit SHAs which may become stale over time.
|
||||||
@@ -0,0 +1,135 @@
|
|||||||
|
# Review: Test & Document Coverage Analysis
|
||||||
|
|
||||||
|
**Reviewer:** opencode (automated)
|
||||||
|
**Reviewed file:** `docs/offline-knowledge/coverage-analysis.md`
|
||||||
|
**Date:** 2026-06-13
|
||||||
|
**Method:** Spot-checked 5 random test files, verified aggregate counts via grep/find, cross-referenced directory listings
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Verdict: Significant inaccuracies found
|
||||||
|
|
||||||
|
The document has **3 critical counting errors**, **2 factual errors about file existence**, and **several minor issues**. The per-file Rust test counts are mostly accurate, but the aggregate totals are wrong.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Critical Errors
|
||||||
|
|
||||||
|
### 1. Total Rust test count is wrong by 40%
|
||||||
|
|
||||||
|
| Metric | Document | Actual | Delta |
|
||||||
|
|--------|----------|--------|-------|
|
||||||
|
| Inline `#[test]` | 220 | 309 | +89 |
|
||||||
|
| Integration tests | 2 | 2 | 0 |
|
||||||
|
| **Total** | **222** | **312** | **+90** |
|
||||||
|
|
||||||
|
The per-crate sums also don't reconcile: the document's own per-file tables sum to ~202 for chanora_audio (plus 2 integration = 204), but `grep -c '#\[test\]'` across `crates/chanora_audio/src/` yields **219** inline tests (+ 2 integration = 221). The document undercounts chanora_audio by 17 tests.
|
||||||
|
|
||||||
|
### 2. chanora_resolver test count off by 1
|
||||||
|
|
||||||
|
| Crate | Document | Actual |
|
||||||
|
|-------|----------|--------|
|
||||||
|
| chanora_resolver | 12 | 13 |
|
||||||
|
|
||||||
|
The extra test is in `examples/cli.rs` (documented separately as 1 example test, but the crate header total should be 13, not 12).
|
||||||
|
|
||||||
|
### 3. Doc file count is ambiguous and inaccurate
|
||||||
|
|
||||||
|
| Scope | Document says | Actual |
|
||||||
|
|-------|---------------|--------|
|
||||||
|
| All docs/ .md files | 55 | 75 |
|
||||||
|
| Excluding superpowers/ | — | 66 |
|
||||||
|
| Excluding superpowers/ + offline-knowledge/ | — | 51 |
|
||||||
|
|
||||||
|
The "55" figure doesn't match any reasonable scope calculation. The document also doesn't clarify whether superpowers/ plans/specs are included.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Factual Errors
|
||||||
|
|
||||||
|
### 4. `poke_active_chat.dart` does not exist as a source file
|
||||||
|
|
||||||
|
The document lists `poke_active_chat.dart` as a tested service (line 163), and `poke_active_chat_test.dart` does exist under `test/services/`. However, **no corresponding source file** exists in `lib/services/`. This is either:
|
||||||
|
- An orphaned test for a deleted/moved source file, or
|
||||||
|
- The source file is located elsewhere (not in `lib/services/`)
|
||||||
|
|
||||||
|
The document should flag this as an anomaly, not list it as "Tested".
|
||||||
|
|
||||||
|
### 5. `audio_device_list_tile_test.dart` exists but is not counted
|
||||||
|
|
||||||
|
The document marks `audio_device_list_tile.dart` as "UNTESTED" (line 189), but `apps/chanora_flutter/test/widgets/audio_device_list_tile_test.dart` **does exist**. This means:
|
||||||
|
- Widget test file count should be **14**, not 13
|
||||||
|
- Widget coverage should be **14/24 (58%)**, not 13/24 (54%)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Section Header vs. Content Mismatches
|
||||||
|
|
||||||
|
### 6. Architecture section: header says "4 files", lists 7
|
||||||
|
|
||||||
|
The header on line 221 reads "Architecture (4 files)" but the table contains 7 entries. The actual `docs/architecture/` directory has 7 files.
|
||||||
|
|
||||||
|
### 7. Governance section: header says "11 files", lists 12
|
||||||
|
|
||||||
|
The header on line 264 reads "Governance (11 files)" but the table contains 12 entries. The actual `docs/governance/` directory has 12 files.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Spot-Check Results (5 Random Test Files)
|
||||||
|
|
||||||
|
| File | Document Count | Actual | Match? |
|
||||||
|
|------|---------------|--------|--------|
|
||||||
|
| `chanora_audio/src/ptt_backends/windows.rs` | 44 | 44 | ✅ |
|
||||||
|
| `chanora_audio/src/engine.rs` | 7 | 7 | ✅ |
|
||||||
|
| `chanora_state/src/lib.rs` | 18 | 18 | ✅ |
|
||||||
|
| `chanora_storage/src/lib.rs` | 15 | 15 | ✅ |
|
||||||
|
| `chanora_audio/src/route_policy.rs` | 8 | 8 | ✅ |
|
||||||
|
|
||||||
|
Per-file Rust test counts are **accurate**. The error is in the aggregation.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Dart/Flutter Section: Mostly Accurate
|
||||||
|
|
||||||
|
| Metric | Document | Actual | Match? |
|
||||||
|
|--------|----------|--------|--------|
|
||||||
|
| `test()` calls | 155 | 155 | ✅ |
|
||||||
|
| `testWidgets()` calls | 66 | 66 | ✅ |
|
||||||
|
| Total Dart tests | 221 | 221 | ✅ |
|
||||||
|
| Service source files | 21 | 21 | ✅ |
|
||||||
|
| Widget source files | 24 | 24 | ✅ |
|
||||||
|
| Service test files | — | 20 | ⚠️ Not stated |
|
||||||
|
| Widget test files | 13 | 14 | ❌ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Missing Crates / Scope Issues
|
||||||
|
|
||||||
|
The document covers all 9 crates under `crates/` plus `chanora_core` under `core/`. No crates are missing. However:
|
||||||
|
|
||||||
|
- The document doesn't clearly explain that `chanora_core` lives under `core/`, not `crates/`
|
||||||
|
- The "Crates with tests: 7/9" metric (line 15) excludes `chanora_core`, which has 11 tests. If counted, it should be **8/10**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Documentation Gap Analysis: Mostly Complete
|
||||||
|
|
||||||
|
The gap analysis (lines 333-354) correctly identifies undocumented modules. One omission:
|
||||||
|
|
||||||
|
- **Flutter test infrastructure** — no doc for the test helper setup, mock patterns, or test utilities used across 37 test files
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Summary of Required Corrections
|
||||||
|
|
||||||
|
| # | Issue | Severity | Fix |
|
||||||
|
|---|-------|----------|-----|
|
||||||
|
| 1 | Total Rust tests: 220 → 312 | Critical | Re-count and update |
|
||||||
|
| 2 | chanora_audio tests: 204 → 221 | Critical | Re-count and update |
|
||||||
|
| 3 | chanora_resolver tests: 12 → 13 | Minor | Update count |
|
||||||
|
| 4 | Doc file count: 55 → clarify scope | Minor | State scope explicitly |
|
||||||
|
| 5 | `poke_active_chat.dart` doesn't exist | Critical | Remove or flag as anomaly |
|
||||||
|
| 6 | `audio_device_list_tile_test.dart` exists | Major | Update widget test count to 14 |
|
||||||
|
| 7 | Architecture header: 4 → 7 | Minor | Fix header |
|
||||||
|
| 8 | Governance header: 11 → 12 | Minor | Fix header |
|
||||||
|
| 9 | Widget coverage: 54% → 58% | Major | Recalculate |
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
# Documentation Quality Analysis Review
|
||||||
|
|
||||||
|
**Reviewer:** Document Review Agent
|
||||||
|
**Date:** 2026-06-13
|
||||||
|
**Source:** `docs/offline-knowledge/doc-quality-analysis.md`
|
||||||
|
|
||||||
|
## Overall Assessment
|
||||||
|
|
||||||
|
The analysis is **largely accurate** but mischaracterizes several items. Most notably, it labels intentional ASPICE-compliance structures as "useless" and "duplicated" when they serve a documented purpose. The broken references finding is partially valid.
|
||||||
|
|
||||||
|
## Duplications: Spot-Check Results
|
||||||
|
|
||||||
|
### Instance 1: Lifecycle Chain — Justified Cross-Reference
|
||||||
|
|
||||||
|
**Verdict: NOT a problem.**
|
||||||
|
|
||||||
|
The lifecycle chain `SysRS -> SysDes -> SRS -> SAD -> SDD` appears in 6 files, but each serves a different purpose:
|
||||||
|
|
||||||
|
| File | Purpose |
|
||||||
|
|------|---------|
|
||||||
|
| `README.md:280` | Project overview for new contributors |
|
||||||
|
| `CONTRIBUTING.md:10` | Contributor guidance — must be self-contained |
|
||||||
|
| `docs/sysdes.md:90` | SysDes document context section |
|
||||||
|
| `docs/sysrs.md:108` | SysRS downstream relationship |
|
||||||
|
| `docs/governance/traceability-matrix.md:16` | Traceability rule definition |
|
||||||
|
| `docs/references/aspice-swe2-swe3-integration-note.md:12` | ASPICE integration reference |
|
||||||
|
|
||||||
|
ASPICE expects each document to be reviewable independently. Removing the chain from CONTRIBUTING.md or traceability-matrix.md would break document self-containment. **Recommendation: Keep as-is.**
|
||||||
|
|
||||||
|
### Instance 2: Git Commit Examples — Genuine Duplication
|
||||||
|
|
||||||
|
**Verdict: VALID.**
|
||||||
|
|
||||||
|
The commit examples are genuinely duplicated:
|
||||||
|
|
||||||
|
- `README.md:379-386` has 6 examples (including `docs(sad)` and `i18n(ui)`)
|
||||||
|
- `CONTRIBUTING.md:37-42` has 4 examples
|
||||||
|
- `docs/governance/git-commit-message-convention.md:14-19` has 4 examples
|
||||||
|
|
||||||
|
The README already references the convention file (line 391). The examples in README and CONTRIBUTING add no unique value. **Recommendation: Valid — consolidate to convention file.**
|
||||||
|
|
||||||
|
### Instance 3: Security Doc List — Genuine Duplication
|
||||||
|
|
||||||
|
**Verdict: VALID.**
|
||||||
|
|
||||||
|
The security document list is identical in both files:
|
||||||
|
|
||||||
|
- `README.md:349-355` — 6 file paths in a code block
|
||||||
|
- `SECURITY.md:33-38` — same 6 file paths in a code block
|
||||||
|
|
||||||
|
SECURITY.md is the authoritative source. The README could reference it instead. **Recommendation: Valid — keep in SECURITY.md, reference from README.**
|
||||||
|
|
||||||
|
## Useless Content: Verification Results
|
||||||
|
|
||||||
|
### Path Record Files — NOT Useless
|
||||||
|
|
||||||
|
**Verdict: INVALID. The analysis is wrong.**
|
||||||
|
|
||||||
|
The analysis labels these files as "useless" with "no unique content":
|
||||||
|
|
||||||
|
| File | Lines | Analysis Claim |
|
||||||
|
|------|-------|----------------|
|
||||||
|
| `docs/architecture/sysdes.md` | 21 | "Path record file — 21 lines pointing to `docs/sysdes.md`" |
|
||||||
|
| `docs/requirements/sysrs.md` | 22 | "Path record file — 22 lines pointing to `docs/sysrs.md`" |
|
||||||
|
| `docs/requirements/srs.md` | 22 | "Path record file — 22 lines pointing to `docs/srs.md`" |
|
||||||
|
| `docs/ui-ux/material3-guideline.md` | 8 | "Path record file — 8 lines pointing to `docs/material3-guideline.md`" |
|
||||||
|
|
||||||
|
These are **DV entry-point records** — intentional ASPICE compliance artifacts. Each file:
|
||||||
|
|
||||||
|
1. Preserves a README-advertised path for DV navigation
|
||||||
|
2. Provides a DV Review Summary table mapping topics to canonical source sections
|
||||||
|
3. States the DV position for that lifecycle layer
|
||||||
|
|
||||||
|
Example from `docs/requirements/sysrs.md`:
|
||||||
|
|
||||||
|
```
|
||||||
|
## DV Review Summary
|
||||||
|
|
||||||
|
| Topic | Canonical source |
|
||||||
|
|---|---|
|
||||||
|
| System scope and context | `docs/sysrs.md` sections 2 through 5 |
|
||||||
|
| Verification and validation requirements | `docs/sysrs.md` section 24 |
|
||||||
|
| MVP acceptance requirements | `docs/sysrs.md` section 25, SysRS-241 through SysRS-257 |
|
||||||
|
```
|
||||||
|
|
||||||
|
**These are not stubs.** They provide reviewer navigation aids. Deleting them would break DV traceability. **Recommendation: Keep all path record files.**
|
||||||
|
|
||||||
|
### Malformed Markdown — Valid
|
||||||
|
|
||||||
|
**Verdict: VALID.**
|
||||||
|
|
||||||
|
`docs/sysdes.md:13` has:
|
||||||
|
|
||||||
|
```
|
||||||
|
**Repo path:** `docs/architecture/sysdes.md` ---
|
||||||
|
```
|
||||||
|
|
||||||
|
Missing blank line before `---`. This renders as inline text instead of a horizontal rule. **Recommendation: Fix by adding a blank line.**
|
||||||
|
|
||||||
|
## Broken References: Verification Results
|
||||||
|
|
||||||
|
### `chanora_*` Filenames — Confirmed Broken
|
||||||
|
|
||||||
|
**Verdict: VALID.**
|
||||||
|
|
||||||
|
`docs/sysrs.md:126-130` suggests these filenames:
|
||||||
|
|
||||||
|
```
|
||||||
|
docs/chanora_SysDes.md
|
||||||
|
docs/chanora_SRS.md
|
||||||
|
docs/chanora_SAD.md
|
||||||
|
docs/chanora_SDD.md
|
||||||
|
docs/chanora_Verification.md
|
||||||
|
```
|
||||||
|
|
||||||
|
None of these files exist. The actual files use different names (`docs/sysdes.md`, `docs/srs.md`, etc.). This is a genuine broken reference. **Recommendation: Update the suggested filenames to match actual paths.**
|
||||||
|
|
||||||
|
### SDD-109 and SAD-043 — NOT Broken
|
||||||
|
|
||||||
|
**Verdict: INVALID. The analysis is wrong.**
|
||||||
|
|
||||||
|
The analysis claims these are broken references. However, the traceability matrix (`docs/governance/traceability-matrix.md:67`) explicitly documents this:
|
||||||
|
|
||||||
|
> "SAD and SDD are baseline candidates rather than fully item-numbered historical documents. Some prior references such as `SAD-043` and `SDD-109` are not reconstructed as itemized records. Treat the new SAD/SDD as DV baselines; add strict item IDs later if the process owner requires ID-level audit."
|
||||||
|
|
||||||
|
The SAD (`docs/architecture/sad.md:182`) and SDD (`docs/architecture/sdd.md:153`) also acknowledge this. These are **documented historical references**, not broken links. The implementation status file correctly notes them as "Referenced but not confirmed." **Recommendation: No action needed — this is intentional.**
|
||||||
|
|
||||||
|
## Additional Issues Found
|
||||||
|
|
||||||
|
### 1. Version Inconsistency Not Flagged
|
||||||
|
|
||||||
|
The analysis mentions version inconsistency in "Outdated Content" but doesn't flag it as a cross-document consistency issue:
|
||||||
|
|
||||||
|
- `docs/sysdes.md:6` — Version 0.9.8
|
||||||
|
- `docs/sysrs.md:5` — Version 0.9.11
|
||||||
|
- `docs/material3-guideline.md:4-5` — Version 0.9.2
|
||||||
|
|
||||||
|
These version numbers suggest independent evolution, but ASPICE expects version alignment across the lifecycle chain. **Recommendation: Add to high-priority recommendations.**
|
||||||
|
|
||||||
|
### 2. `release` Commit Type
|
||||||
|
|
||||||
|
`docs/governance/git-commit-message-convention.md:18` uses `release(android)` as an example, but `release` is not a standard Conventional Commits type. The analysis correctly flags this in "Stale Content" but doesn't recommend a fix. **Recommendation: Either add `release` to the documented types or replace the example.**
|
||||||
|
|
||||||
|
### 3. Missing `docs/sad.md` and `docs/sdd.md` Path Records
|
||||||
|
|
||||||
|
The README references `docs/architecture/sad.md` and `docs/architecture/sdd.md`, but unlike SysDes, SysRS, SRS, and Material3, there are no path record files for SAD and SDD at the expected DV entry-point paths. This is an inconsistency the analysis missed. **Recommendation: Consider adding path records for SAD and SDD if DV navigation requires them.**
|
||||||
|
|
||||||
|
### 4. `docs/sysdes.md:13` Malformed `---` Line
|
||||||
|
|
||||||
|
The analysis correctly identifies this but buries it in "Empty Sections" rather than calling it out as a rendering issue. The line:
|
||||||
|
|
||||||
|
```
|
||||||
|
**Repo path:** `docs/architecture/sysdes.md` ---
|
||||||
|
```
|
||||||
|
|
||||||
|
should be:
|
||||||
|
|
||||||
|
```
|
||||||
|
**Repo path:** `docs/architecture/sysdes.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
```
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
| Category | Analysis Claim | Verdict |
|
||||||
|
|----------|---------------|---------|
|
||||||
|
| Lifecycle chain duplication | 6 files | **Justified** — ASPICE self-containment |
|
||||||
|
| Commit examples duplication | 3 files | **Valid** — consolidate |
|
||||||
|
| Security doc list duplication | 2 files | **Valid** — consolidate |
|
||||||
|
| Path record files useless | 4 files | **Invalid** — DV entry-point records |
|
||||||
|
| Malformed markdown | 1 instance | **Valid** — fix needed |
|
||||||
|
| `chanora_*` broken refs | 5 files | **Valid** — genuine broken refs |
|
||||||
|
| SDD-109/SAD-043 broken | 2 refs | **Invalid** — documented historical refs |
|
||||||
|
|
||||||
|
**Bottom line:** 3 of 8 duplications are valid concerns. 1 of 5 useless items is valid. 1 of 3 broken references is valid. The analysis overreports issues by mischaracterizing intentional ASPICE structures as problems.
|
||||||
@@ -0,0 +1,193 @@
|
|||||||
|
# External Documentation Review
|
||||||
|
|
||||||
|
> **Reviewer**: OpenCode (automated)
|
||||||
|
> **Date**: 2026-06-13
|
||||||
|
> **Files reviewed**:
|
||||||
|
> - `docs/offline-knowledge/external/teaspeak-overview.md`
|
||||||
|
> - `docs/offline-knowledge/external/respeak-overview.md`
|
||||||
|
> - `docs/offline-knowledge/external/yatqa-en.md`
|
||||||
|
> - `docs/offline-knowledge/external/yatqa-de.md`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. teaspeak-overview.md
|
||||||
|
|
||||||
|
### Accuracy
|
||||||
|
|
||||||
|
| Claim | Verdict | Notes |
|
||||||
|
|-------|---------|-------|
|
||||||
|
| Repo at `git.did.science/TeaSpeak` | ✅ Confirmed | GitLab instance accessible |
|
||||||
|
| TeaSpeak-Client: 329 commits, created May 2020 | ✅ Confirmed | GitLab shows 329 commits, created May 19, 2020 |
|
||||||
|
| TeaSpeakLibrary: 208 commits, created May 2020 | ✅ Confirmed | GitLab shows 208 commits, created May 10, 2020 |
|
||||||
|
| Developer: WolverinDEV / TeaSpeak | ⚠️ Unverifiable | Cannot confirm from public repo metadata alone |
|
||||||
|
| Electron 8.5.5, TypeScript 3.9 | ⚠️ Unverifiable | Repo not fully cloned; cannot read package.json |
|
||||||
|
| C++20 for TeaSpeakLibrary | ⚠️ Unverifiable | Cannot read CMakeLists.txt without full clone |
|
||||||
|
|
||||||
|
### Missing Items
|
||||||
|
|
||||||
|
- **License not mentioned.** The doc does not state the project's license. If the license is known, it should be included for completeness.
|
||||||
|
- **No mention of project status/activity.** Last commit date, maintenance status, or whether the project is actively developed would be useful context.
|
||||||
|
- **No mention of WebRTC.** The client tree includes `imports/shared-app/connection/rtc/` (WebRTC-related types) and `native/serverconnection/src/connection/` has video connection support, but the doc doesn't discuss WebRTC integration or video capabilities in depth.
|
||||||
|
|
||||||
|
### Factual Errors
|
||||||
|
|
||||||
|
None found. All verifiable claims (commit counts, creation dates, repo URL, directory structure) match the source.
|
||||||
|
|
||||||
|
### Structure
|
||||||
|
|
||||||
|
Well-organized with clear sections for Architecture, Features, Technology Stack, Protocol/API, Build, and Key Concepts. The directory tree diagrams are useful. The separation of Client vs Library technology tables is good.
|
||||||
|
|
||||||
|
### Verdict: **Good** — Accurate where verifiable. Add license info and project status.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. respeak-overview.md
|
||||||
|
|
||||||
|
### Accuracy
|
||||||
|
|
||||||
|
| Claim | Verdict | Notes |
|
||||||
|
|-------|---------|-------|
|
||||||
|
| License: MIT OR Apache-2.0 | ✅ Confirmed | `Cargo.toml` and LICENSE files confirm |
|
||||||
|
| tsclientlib 0.2.0, tsproto 0.2.0 | ✅ Confirmed | From `Cargo.toml` files |
|
||||||
|
| Crate versions (ts-bookkeeping 0.1.x, tsproto-packets 0.1.x, tsproto-types 0.1.x) | ✅ Confirmed | Matches Cargo.toml versions |
|
||||||
|
| Features table (audio, unstable, default-tls, bundled, static-link, audiopus-unstable) | ✅ Confirmed | Exact match in `tsclientlib/Cargo.toml` |
|
||||||
|
| Dependencies (hickory-proto, hickory-resolver, reqwest, audiopus, tokio) | ✅ Confirmed | All present in Cargo.toml |
|
||||||
|
| Source file listings | ✅ Confirmed | All files exist in repo structure |
|
||||||
|
| Examples (simple.rs, audio.rs, etc.) | ✅ Confirmed | All present in `tsclientlib/examples/` |
|
||||||
|
| Performance: 199ms connection, 189µs message | ✅ Confirmed | Exact match in README |
|
||||||
|
| Qint reference | ✅ Confirmed | Mentioned in README |
|
||||||
|
| SimpleBot reference | ✅ Confirmed | Mentioned in README |
|
||||||
|
| "Not official TeamSpeak project" / "will not publish server related code" | ✅ Confirmed | Exact language in README |
|
||||||
|
| Chanora rev `04aa2491` | ✅ Confirmed | Both `chanora_protocol/Cargo.toml` and `chanora_audio/Cargo.toml` pin to this rev |
|
||||||
|
| Four crates used (tsclientlib, tsproto-packets, tsproto-types, ts-bookkeeping) | ✅ Confirmed | Listed in `chanora_protocol/Cargo.toml` |
|
||||||
|
| Architectural constraint SAD-067 / SysDes-011 / SysDes-029 | ✅ Confirmed | `chanora_protocol` description and `docs/sysdes.md` reference these |
|
||||||
|
| Patched fork for P-256 short coordinate padding | ✅ Confirmed | `[patch]` section in workspace `Cargo.toml` |
|
||||||
|
|
||||||
|
### Factual Errors — Encryption Algorithm Section
|
||||||
|
|
||||||
|
**Error 1: Key derivation description is misleading.**
|
||||||
|
|
||||||
|
The doc states:
|
||||||
|
> 1. **Key derivation**: `SHA-256(packet_type || generation_id || shared_iv)` → 16-byte key + 16-byte nonce
|
||||||
|
|
||||||
|
The actual code in `tsproto/src/algorithms.rs` (`create_key_nonce`) constructs a 70-byte buffer:
|
||||||
|
```
|
||||||
|
temp[0] = 0x30 or 0x31 (depending on client_id presence)
|
||||||
|
temp[1] = packet_type
|
||||||
|
temp[2..6] = generation_id (big-endian)
|
||||||
|
temp[6..] = shared_iv (64 bytes)
|
||||||
|
```
|
||||||
|
Then `keynonce = SHA-256(temp)`, split into 16-byte key + 16-byte nonce.
|
||||||
|
|
||||||
|
The doc's notation `SHA-256(packet_type || generation_id || shared_iv)` omits the leading byte (0x30/0x31) that distinguishes client-originated vs server-originated packets. This is a minor but technically inaccurate omission.
|
||||||
|
|
||||||
|
**Error 2: Packet ID mixing placement is correct but could be clearer.**
|
||||||
|
|
||||||
|
The doc correctly states `key[0] ^= (packet_id >> 8)`, `key[1] ^= (packet_id & 0xff)`. This is applied *after* key derivation, not as part of it. The doc's placement in the list is fine.
|
||||||
|
|
||||||
|
**Error 3: Shared IV computation — "shared_mac = SHA-1(shared_iv)[..8]" is correct.**
|
||||||
|
|
||||||
|
Confirmed from `compute_iv_mac` in `algorithms.rs`. The doc is accurate here.
|
||||||
|
|
||||||
|
### Missing Items
|
||||||
|
|
||||||
|
- **No mention of `tsproto` dependency.** The doc lists crates used by Chanora but `tsclientlib` depends on `tsproto` internally. While Chanora doesn't directly depend on `tsproto`, it could be worth noting as an indirect dependency.
|
||||||
|
- **No mention of `tsproto-structs`.** This crate exists in the monorepo but is not used by Chanora. Could note it for completeness.
|
||||||
|
- **`hickory-proto`/`hickory-resolver` versions not specified.** The doc lists these as dependencies but doesn't note they are version 0.24.
|
||||||
|
|
||||||
|
### Structure
|
||||||
|
|
||||||
|
Excellent. Clear sections for Architecture, Protocol Details, Cryptography, and the Chanora-specific integration section is particularly valuable. The dependency chain diagram is useful.
|
||||||
|
|
||||||
|
### Verdict: **Very Good** — Highly accurate with minor encryption description inaccuracy.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. yatqa-en.md
|
||||||
|
|
||||||
|
### Accuracy
|
||||||
|
|
||||||
|
The content appears to be sourced from https://yat.qa/ and translated/adapted. Key claims:
|
||||||
|
|
||||||
|
| Claim | Verdict | Notes |
|
||||||
|
|-------|---------|-------|
|
||||||
|
| YaTQA stands for "Yet Another TeamSpeak³ Query Admin Tool" | ✅ Matches yat.qa |
|
||||||
|
| Author: Janni "Яedeemer" K. | ✅ Matches yat.qa |
|
||||||
|
| Written in Delphi 2009, 50,000+ lines | ⚠️ Unverifiable | Claimed on yat.qa, cannot independently confirm |
|
||||||
|
| Development started April 10, 2011 | ✅ Matches yat.qa |
|
||||||
|
| First release June 29, 2011 | ✅ Matches yat.qa |
|
||||||
|
| Free freeware, no adware/spyware | ✅ Matches yat.qa |
|
||||||
|
| Windows XP+, Linux via Wine | ✅ Matches yat.qa |
|
||||||
|
| Supported servers: TS 3.9.0–3.13.7, TeaSpeak 1.4.10-beta | ⚠️ Version range may be outdated | Version range from v3.9.9b (Mar 2023) |
|
||||||
|
| Version: v3.9.9b (01 Mar 2023) | ✅ Matches yat.qa changelog |
|
||||||
|
|
||||||
|
### Missing Items
|
||||||
|
|
||||||
|
- **No mention of recent updates.** The doc states v3.9.9b from March 2023. If there have been newer releases, this could be outdated.
|
||||||
|
- **No screenshots or visual examples.** For a GUI tool, this is understandable for a text doc but worth noting.
|
||||||
|
|
||||||
|
### Factual Errors
|
||||||
|
|
||||||
|
None found. All claims align with the yat.qa website.
|
||||||
|
|
||||||
|
### Structure
|
||||||
|
|
||||||
|
Well-organized with clear sections for Features, Architecture, Configuration, System Requirements, Key Concepts, and Known Limitations. The feature categorization (General, Console, SSH Tunnel, Instance, Virtual Server) is logical.
|
||||||
|
|
||||||
|
### Verdict: **Good** — Accurate reference. Consider adding update cadence notes.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. yatqa-de.md
|
||||||
|
|
||||||
|
### Accuracy
|
||||||
|
|
||||||
|
Same content as yatqa-en.md, translated to German. All verifiable claims match.
|
||||||
|
|
||||||
|
### EN vs DE Content Comparison
|
||||||
|
|
||||||
|
| Section | EN | DE | Match |
|
||||||
|
|---------|----|----|-------|
|
||||||
|
| Overview | ✅ | ✅ | ✅ Identical content |
|
||||||
|
| Features (all subsections) | ✅ | ✅ | ✅ Identical items |
|
||||||
|
| Supported Image Formats | ✅ | ✅ | ✅ Identical table |
|
||||||
|
| Architecture/How It Works | ✅ | ✅ | ✅ Identical |
|
||||||
|
| Configuration | ✅ | ✅ | ✅ Identical settings |
|
||||||
|
| Startup Parameters | ✅ | ✅ | ✅ Identical parameters |
|
||||||
|
| System Requirements | ✅ | ✅ | ✅ Identical |
|
||||||
|
| Key Concepts | ✅ | ✅ | ✅ Identical concepts |
|
||||||
|
| Known Limitations | ✅ | ✅ | ✅ Identical |
|
||||||
|
| IPv6 Support | ✅ | ✅ | ✅ Identical |
|
||||||
|
| Project History | ✅ | ✅ | ✅ Identical dates |
|
||||||
|
| Global Hotkeys | ✅ | ✅ | ✅ Identical shortcuts |
|
||||||
|
| Resources | ✅ | ✅ | ✅ Identical links |
|
||||||
|
| Translation | ✅ | ✅ | ✅ Identical |
|
||||||
|
|
||||||
|
**The two documents cover exactly the same content.** No sections are missing from either version.
|
||||||
|
|
||||||
|
### Minor Translation Notes
|
||||||
|
|
||||||
|
- "Ghost Mode" → "Geist-Modus" (correct)
|
||||||
|
- "Badges" → "Abzeichen" (correct)
|
||||||
|
- "Pie Chart Styles" → "Kreisdiagramm-Styles" (correct)
|
||||||
|
- Hotkeys correctly adapted: "Ctrl" → "Strg" where applicable
|
||||||
|
- Resources section: DE version links to German-specific URLs where available (`/funktionen/`, `/haeufige-fragen/`, `/unterstuetzung/`, `/ressourcen/`, `/ueber/`) — correct
|
||||||
|
|
||||||
|
### Verdict: **Good** — Accurate translation, full content parity with EN version.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
| Document | Accuracy | Completeness | Structure | Overall |
|
||||||
|
|----------|----------|--------------|-----------|---------|
|
||||||
|
| teaspeak-overview.md | ✅ Good | ⚠️ Missing license, status | ✅ Good | **B+** |
|
||||||
|
| respeak-overview.md | ✅ Very Good | ✅ Complete | ✅ Excellent | **A-** |
|
||||||
|
| yatqa-en.md | ✅ Good | ✅ Complete | ✅ Good | **A-** |
|
||||||
|
| yatqa-de.md | ✅ Good | ✅ Complete | ✅ Good | **A-** |
|
||||||
|
|
||||||
|
### Recommended Actions
|
||||||
|
|
||||||
|
1. **teaspeak-overview.md**: Add project license, last-commit date or activity status, and note WebRTC/video capabilities.
|
||||||
|
2. **respeak-overview.md**: Fix the encryption algorithm description to include the leading 0x30/0x31 byte in the key derivation buffer. Minor — the rest is accurate.
|
||||||
|
3. **yatqa-en.md / yatqa-de.md**: No changes needed. Consider periodic re-sync to check for version updates beyond v3.9.9b.
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
# Link Coverage Report — Review
|
||||||
|
|
||||||
|
**Reviewed:** 2026-06-13
|
||||||
|
**Source:** `docs/offline-knowledge/link-coverage-report.md`
|
||||||
|
|
||||||
|
## Verdict: Largely Accurate
|
||||||
|
|
||||||
|
The report is thorough and all major claims have been verified. One minor counting discrepancy found.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Broken Internal Links (LICENSE-APACHE, LICENSE-MIT)
|
||||||
|
|
||||||
|
**CLAIM:** `LICENSE-APACHE` and `LICENSE-MIT` do not exist at repo root.
|
||||||
|
|
||||||
|
**VERIFIED:** Correct. `ls /Users/edison/dev/chanora/LICENSE*` returns no matches. `NOTICE` (line 444) does exist.
|
||||||
|
|
||||||
|
The report also correctly identifies 4 additional references to these missing files in `docs/security/license-inventory.md` (lines 9–10) and `docs/security/flutter-license-inventory.md` (lines 11–12) using relative paths `../../LICENSE-APACHE` and `../../LICENSE-MIT`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Broken Inline Doc-Path References
|
||||||
|
|
||||||
|
**CLAIM:** 5 references to `docs/chanora_*.md` files in `docs/sysrs.md` lines 126–130 are broken.
|
||||||
|
|
||||||
|
**VERIFIED:** Correct. All 5 files confirmed missing:
|
||||||
|
- `docs/chanora_SysDes.md` — MISSING
|
||||||
|
- `docs/chanora_SRS.md` — MISSING
|
||||||
|
- `docs/chanora_SAD.md` — MISSING
|
||||||
|
- `docs/chanora_SDD.md` — MISSING
|
||||||
|
- `docs/chanora_Verification.md` — MISSING
|
||||||
|
|
||||||
|
The report's assessment that these are low-severity (aspirational table entries, not navigable links) is accurate.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Spot-Check of Claimed Valid Links
|
||||||
|
|
||||||
|
10 links verified — all exist:
|
||||||
|
|
||||||
|
| # | File | Target | Status |
|
||||||
|
|---|------|--------|--------|
|
||||||
|
| 1 | README.md:130 | `docs/architecture/desktop-ptt-architecture.md` | EXISTS |
|
||||||
|
| 2 | README.md:436 | `docs/governance/product-decision-register.md` | EXISTS |
|
||||||
|
| 3 | README.md:444 | `NOTICE` | EXISTS |
|
||||||
|
| 4 | `docs/superpowers/specs/2026-06-05-adaptive-3-panel-layout-design.md:266` | `../ui-ux/adaptive-layout-platform-guide.md` | EXISTS |
|
||||||
|
| 5 | `docs/governance/git-commit-message-convention.md` (from CONTRIBUTING.md:25) | EXISTS |
|
||||||
|
| 6 | `docs/security/threat-model.md` | EXISTS |
|
||||||
|
| 7 | `docs/security/secure-storage-audit-report.md` | EXISTS |
|
||||||
|
| 8 | `docs/privacy/privacy-policy.md` | EXISTS |
|
||||||
|
| 9 | `docs/requirements/sysrs.md` | EXISTS |
|
||||||
|
| 10 | `docs/architecture/sysdes.md` | EXISTS |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Missed Links
|
||||||
|
|
||||||
|
**No internal markdown links were missed.** A repo-wide grep for `[text](path)` patterns in `.md` files (excluding `http` URLs and the report itself) returns exactly 10 links — all accounted for in the report.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Discrepancy Found
|
||||||
|
|
||||||
|
**Summary count mismatch:** The report summary states "Valid internal links: 12" but the "Valid Internal Links" table (§2) lists only 4 entries. The remaining 8 may be counted from the cross-references section or the "Also affected" table, but the categorization is unclear. This does not affect the report's accuracy on individual link status.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Additional Observations
|
||||||
|
|
||||||
|
- The report correctly identifies path-record stubs (`docs/requirements/sysrs.md` → `docs/sysrs.md`, etc.) as intentional navigation aids, not broken links.
|
||||||
|
- The `snapshot_state_mapper.dart` directory mismatch (widgets/ vs services/) is a genuine doc inaccuracy worth noting.
|
||||||
|
- External link count (48) was not verified — these are URLs requiring HTTP checks.
|
||||||
Reference in New Issue
Block a user