/** What a pick may offer and what it may copy. The filter is the document
 *  sheet's own, comma-separated ("audio/mpeg,audio/flac"); blank offers
 *  every type. `maxCopyBytes` is how big a document may be COPIED into the
 *  app's cache when it has no path of its own on this phone — 0 refuses the
 *  copy, which is what an audio-sized pick wants. Both are plain scalars on
 *  purpose: String / Int / Boolean is what the other plugins' args prove. */
@InvokeArg
class PickFileArgs {
    var mimeTypes: String? = null
    var maxCopyBytes: Int = 0
}

/** The copy walked past what the caller allowed. Its own exception, so the
 *  partial file can be deleted and the caller told in megabytes rather than
 *  in "could not be read". */
private class TooBig(message: String) : Exception(message)
