/** 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)