Package-level declarations
Types
Locale-invariant, deterministic human-readable byte-count formatter. Port of the Swift DeterministicByteCount. Uses Long arithmetic because Kotlin Int is 32-bit and bytes * 10 overflows at GB scale. Decimal (1000-based) units; unit chosen by magnitude, then rounded half-up within it (never re-promoted), so 999_999 -> "1000 KB". Pinned by the wire spec.
Entry point: holds a transport and a DeviceInfo provider, and submits reports. The Android-specific provider (via android.os.Build) is added in the Android library module; here the provider is supplied explicitly.
A single user-supplied feedback submission. Attachments (raw files) and the device-info collector are platform concerns handled in later phases.
Thrown by transports when a submission fails. status is the HTTP status when applicable.
Where a report gets delivered. Concrete implementations (GitHub direct, relay) are added in P1b. Returns the backend-assigned identifier (the GitHub issue number for the GitHub transport).
Bug report or feature request. The raw value is also the GitHub label string.
Posts a report directly to the GitHub Issues REST API. The token is held by the caller (acceptable for a native app's secure storage).
Renders a report + device info (+ uploaded attachments) into the exact issue body the parser understands. Port of the Swift IssueBodyFormatter.
Inverse of IssueBodyFormatter: pulls structured fields out of an issue body. Tolerant of hand-written / legacy bodies. Port of the Swift IssueBodyParser.
Posts a report to an adopter-operated relay (per the relay contract). The GitHub credential lives on the relay, never in the app.
An attachment already uploaded; drives the body's attachment block.