diff --git a/PRIVACY.md b/PRIVACY.md index 1c65093..77a3b35 100644 --- a/PRIVACY.md +++ b/PRIVACY.md @@ -4,12 +4,14 @@ Stand / Last updated: 21. August 2026 ## Deutsch -WallpaperFlow verarbeitet die vom Nutzer ausgewählten Bilder ausschließlich lokal auf dem Android-Gerät. Die Bilder werden in den privaten App-Speicher kopiert und nur dazu verwendet, Vorschaubilder anzuzeigen und das vom Nutzer gewählte Hintergrund- oder Sperrbildschirmbild zu setzen. +WallpaperFlow verarbeitet die vom Nutzer ausgewählten Bilder grundsätzlich lokal auf dem Android-Gerät. Die Bilder werden in den privaten App-Speicher kopiert und nur dazu verwendet, Vorschaubilder anzuzeigen und das vom Nutzer gewählte Hintergrund- oder Sperrbildschirmbild zu setzen. + +Optional kann der Nutzer die App mit einem eigenen, selbst gehosteten Immich-Server verbinden. In diesem Fall sendet WallpaperFlow den API-Key ausschließlich an die eingetragene Server-URL, um die Verbindung zu prüfen, Alben und Vorschaubilder abzurufen und ausdrücklich ausgewählte Bilder herunterzuladen. Der API-Key wird mit einem Schlüssel aus dem Android Keystore verschlüsselt gespeichert. Die Server-URL und der angezeigte Benutzername werden im privaten App-Speicher abgelegt. WallpaperFlow lädt keine Bilder zu Immich hoch und verändert keine Daten auf dem Server. Bei einer unverschlüsselten HTTP-URL weist die App auf die fehlende Transportverschlüsselung hin. WallpaperFlow: - erhebt keine personenbezogenen Daten, -- überträgt keine Bilder oder Einstellungen an einen Server, +- überträgt keine Bilder oder Einstellungen an fremde Server, - gibt keine Daten an Dritte weiter, - enthält keine Werbung, Analyse-, Tracking- oder Profiling-Dienste und - verlangt keine Registrierung und kein Benutzerkonto. @@ -23,12 +25,14 @@ https://git.cbsk-tech.de/Christoph/LockScreenWallpaper/issues ## English -WallpaperFlow processes user-selected images exclusively on the local Android device. Images are copied into the app's private storage and are used only to display previews and to set the wallpaper or lock-screen image selected by the user. +WallpaperFlow generally processes user-selected images on the local Android device. Images are copied into the app's private storage and are used only to display previews and to set the wallpaper or lock-screen image selected by the user. + +Users may optionally connect the app to their own self-hosted Immich server. In this case, WallpaperFlow sends the API key only to the configured server URL to test the connection, retrieve albums and thumbnails, and download explicitly selected images. The API key is encrypted with a key held in the Android Keystore. The server URL and displayed user name are stored in the app's private storage. WallpaperFlow does not upload images to Immich or modify server data. The app warns users when an unencrypted HTTP URL is used. WallpaperFlow: - does not collect personal data, -- does not transmit images or settings to a server, +- does not transmit images or settings to third-party servers, - does not share data with third parties, - contains no advertising, analytics, tracking or profiling services, and - requires no registration or user account. diff --git a/README.md b/README.md index 4c51559..da416b9 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ WallpaperFlow ist eine freie Tauri-2-App für Android, die aus einer frei wählb - automatischer Wechsel alle 5, 15 oder 30 Minuten beziehungsweise alle 1, 3, 6 oder 12 Stunden - Neustart des Dienstes nach einem Geräte-Neustart, soweit die Android-Version Hintergrundstarts zulässt - lokale Vorschaubilder; die Originalbilder verlassen das Gerät nicht +- optionaler Import aus einem selbst gehosteten Immich-Server über einen eingeschränkten API-Key - vollständig lokale Oberfläche in Deutsch, Englisch, Französisch, Spanisch, Italienisch, Niederländisch, Polnisch, Portugiesisch, Japanisch, Koreanisch und vereinfachtem Chinesisch Android hält den Zeitgeber über einen Foreground Service aktiv. Solange ein Wechselintervall ausgewählt ist, zeigt das System deshalb eine dauerhafte, stille Benachrichtigung. Auf Geräten mit aggressivem Energiesparen muss LockScreenWallpaper gegebenenfalls von der Akku-Optimierung ausgenommen werden. @@ -52,7 +53,7 @@ Der native Android-Code liegt als lokales Tauri-Plugin in `plugins/android`. Er ## Datenschutz -WallpaperFlow verarbeitet die ausgewählten Bilder ausschließlich lokal auf dem Gerät. Die App enthält keine Werbung, kein Tracking und keine Analysedienste. Bilder werden weder hochgeladen noch an Dritte weitergegeben. +WallpaperFlow verarbeitet importierte Bilder lokal auf dem Gerät. Die optionale Immich-Anbindung kommuniziert ausschließlich mit dem vom Nutzer eingetragenen, selbst gehosteten Server und lädt nur ausdrücklich ausgewählte Bilder herunter. Die App enthält keine Werbung, kein Tracking und keine Analysedienste. Bilder werden nicht hochgeladen oder an andere Server weitergegeben. Weitere Einzelheiten stehen in der [Datenschutzerklärung](PRIVACY.md). diff --git a/fastlane/metadata/android/de-DE/changelogs/1000.txt b/fastlane/metadata/android/de-DE/changelogs/1000.txt index 0f9a0de..a687ec8 100644 --- a/fastlane/metadata/android/de-DE/changelogs/1000.txt +++ b/fastlane/metadata/android/de-DE/changelogs/1000.txt @@ -1 +1 @@ -Erste öffentliche Version von WallpaperFlow mit automatischem Bildwechsel, lokaler Galerie, Mehrfachauswahl, Intervallsteuerung und mehrsprachiger Oberfläche. +Erste öffentliche Version mit automatischem Bildwechsel, lokaler Galerie, Mehrfachauswahl, Immich-Import, Intervallsteuerung und mehrsprachiger Oberfläche. diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt index 8ebe31e..fa8fd46 100644 --- a/fastlane/metadata/android/de-DE/full_description.txt +++ b/fastlane/metadata/android/de-DE/full_description.txt @@ -6,7 +6,8 @@ Funktionen: * zufällige oder fortlaufende Reihenfolge * nur den Sperrbildschirm oder das allgemeine Hintergrundbild ändern * Bilder gemeinsam auswählen und löschen +* Bilder aus einem eigenen Immich-Server auswählen und lokal importieren * Wechsel nach einem Neustart automatisch fortsetzen * Oberfläche in mehreren europäischen und asiatischen Sprachen -Alle Bilder und Einstellungen bleiben lokal auf deinem Gerät. WallpaperFlow enthält keine Werbung, kein Tracking und keine Analysedienste. +Importierte Bilder und Einstellungen bleiben lokal auf deinem Gerät. Die optionale Immich-Verbindung kommuniziert nur mit deinem eingetragenen Server. WallpaperFlow enthält keine Werbung, kein Tracking und keine Analysedienste. diff --git a/fastlane/metadata/android/en-US/changelogs/1000.txt b/fastlane/metadata/android/en-US/changelogs/1000.txt index 9249fbd..127ada2 100644 --- a/fastlane/metadata/android/en-US/changelogs/1000.txt +++ b/fastlane/metadata/android/en-US/changelogs/1000.txt @@ -1 +1 @@ -First public release of WallpaperFlow with automatic rotation, a local gallery, multi-selection, configurable intervals and a multilingual interface. +First public release with automatic rotation, a local gallery, multi-selection, Immich import, configurable intervals and a multilingual interface. diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index 2b966de..567ef6a 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -6,7 +6,8 @@ Features: * shuffle or sequential order * change only the lock screen or the general wallpaper * select and delete several images at once +* select images from your own Immich server and import them locally * resume rotation after a device restart * interface in multiple European and Asian languages -All images and settings remain locally on your device. WallpaperFlow contains no advertising, tracking or analytics services. +Imported images and settings remain locally on your device. The optional Immich connection communicates only with the server you configure. WallpaperFlow contains no advertising, tracking or analytics services. diff --git a/plugins/android/src/main/java/ImmichClient.kt b/plugins/android/src/main/java/ImmichClient.kt new file mode 100644 index 0000000..fece4f9 --- /dev/null +++ b/plugins/android/src/main/java/ImmichClient.kt @@ -0,0 +1,291 @@ +package de.wechselbild.wallpaper + +import android.content.Context +import android.graphics.BitmapFactory +import android.security.keystore.KeyGenParameterSpec +import android.security.keystore.KeyProperties +import android.util.Base64 +import app.tauri.plugin.JSArray +import app.tauri.plugin.JSObject +import java.io.ByteArrayOutputStream +import java.io.File +import java.io.IOException +import java.net.HttpURLConnection +import java.net.URI +import java.net.URLEncoder +import java.nio.charset.StandardCharsets +import java.security.KeyStore +import java.util.concurrent.Callable +import java.util.concurrent.Executors +import javax.crypto.Cipher +import javax.crypto.KeyGenerator +import javax.crypto.SecretKey +import javax.crypto.spec.GCMParameterSpec +import org.json.JSONArray +import org.json.JSONObject + +object ImmichClient { + private const val PREFS = "wechselbild" + private const val KEY_SERVER_URL = "immich_server_url" + private const val KEY_USER_NAME = "immich_user_name" + private const val KEY_API_KEY_DATA = "immich_api_key_data" + private const val KEY_API_KEY_IV = "immich_api_key_iv" + private const val KEY_ALIAS = "wallpaperflow_immich_api_key" + private val assetIdPattern = Regex("^[0-9a-fA-F-]{36}$") + private val thumbnailPool = Executors.newFixedThreadPool(4) + + private data class Credentials(val serverUrl: String, val apiKey: String) + + private fun prefs(context: Context) = context.getSharedPreferences(PREFS, Context.MODE_PRIVATE) + + private fun normalizeServerUrl(value: String): String { + val raw = value.trim().trimEnd('/') + require(raw.isNotBlank()) { "Bitte gib die URL deines Immich-Servers ein." } + val uri = runCatching { URI(raw) }.getOrNull() + ?: throw IllegalArgumentException("Die Immich-URL ist ungültig.") + require(uri.scheme.equals("https", true) || uri.scheme.equals("http", true)) { + "Die Immich-URL muss mit https:// oder http:// beginnen." + } + require(!uri.host.isNullOrBlank()) { "Die Immich-URL enthält keinen gültigen Hostnamen." } + require(uri.userInfo == null && uri.query == null && uri.fragment == null) { "Die Immich-URL ist ungültig." } + val basePath = (uri.path ?: "").trimEnd('/') + val apiPath = if (basePath.endsWith("/api")) basePath else "$basePath/api" + return URI(uri.scheme.lowercase(), null, uri.host, uri.port, apiPath, null, null).toString().trimEnd('/') + } + + private fun secretKey(): SecretKey { + val keyStore = KeyStore.getInstance("AndroidKeyStore").apply { load(null) } + (keyStore.getKey(KEY_ALIAS, null) as? SecretKey)?.let { return it } + return KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore").run { + init( + KeyGenParameterSpec.Builder(KEY_ALIAS, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT) + .setBlockModes(KeyProperties.BLOCK_MODE_GCM) + .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) + .build() + ) + generateKey() + } + } + + private fun encryptApiKey(context: Context, value: String) { + val cipher = Cipher.getInstance("AES/GCM/NoPadding").apply { init(Cipher.ENCRYPT_MODE, secretKey()) } + val encrypted = cipher.doFinal(value.toByteArray(StandardCharsets.UTF_8)) + prefs(context).edit() + .putString(KEY_API_KEY_DATA, Base64.encodeToString(encrypted, Base64.NO_WRAP)) + .putString(KEY_API_KEY_IV, Base64.encodeToString(cipher.iv, Base64.NO_WRAP)) + .apply() + } + + private fun decryptApiKey(context: Context): String? = runCatching { + val preferences = prefs(context) + val encrypted = Base64.decode(preferences.getString(KEY_API_KEY_DATA, null), Base64.NO_WRAP) + val iv = Base64.decode(preferences.getString(KEY_API_KEY_IV, null), Base64.NO_WRAP) + val cipher = Cipher.getInstance("AES/GCM/NoPadding").apply { + init(Cipher.DECRYPT_MODE, secretKey(), GCMParameterSpec(128, iv)) + } + String(cipher.doFinal(encrypted), StandardCharsets.UTF_8) + }.getOrNull() + + private fun credentials(context: Context): Credentials { + val serverUrl = prefs(context).getString(KEY_SERVER_URL, null).orEmpty() + val apiKey = decryptApiKey(context).orEmpty() + check(serverUrl.isNotBlank() && apiKey.isNotBlank()) { "Immich ist noch nicht verbunden." } + return Credentials(serverUrl, apiKey) + } + + private fun connectionObject(context: Context): JSObject { + val preferences = prefs(context) + val serverUrl = preferences.getString(KEY_SERVER_URL, "").orEmpty() + return JSObject().apply { + put("configured", serverUrl.isNotBlank() && !decryptApiKey(context).isNullOrBlank()) + put("serverUrl", serverUrl) + put("userName", preferences.getString(KEY_USER_NAME, "").orEmpty()) + } + } + + fun connection(context: Context) = connectionObject(context) + + fun connect(context: Context, serverUrl: String, apiKey: String): JSObject { + val normalized = normalizeServerUrl(serverUrl) + require(apiKey.isNotBlank()) { "Bitte gib deinen Immich API-Key ein." } + val user = requestJson(normalized, apiKey.trim(), "/users/me") + val userName = user.optString("name").ifBlank { user.optString("email") }.ifBlank { "Immich" } + encryptApiKey(context, apiKey.trim()) + prefs(context).edit().putString(KEY_SERVER_URL, normalized).putString(KEY_USER_NAME, userName).apply() + return connectionObject(context) + } + + fun disconnect(context: Context): JSObject { + prefs(context).edit() + .remove(KEY_SERVER_URL) + .remove(KEY_USER_NAME) + .remove(KEY_API_KEY_DATA) + .remove(KEY_API_KEY_IV) + .apply() + return connectionObject(context) + } + + private fun openConnection( + serverUrl: String, + apiKey: String, + path: String, + method: String = "GET", + body: String? = null, + ): HttpURLConnection { + val connection = URI(serverUrl + path).toURL().openConnection() as HttpURLConnection + connection.requestMethod = method + connection.connectTimeout = 15_000 + connection.readTimeout = 60_000 + connection.instanceFollowRedirects = true + connection.setRequestProperty("Accept", "application/json, image/*, application/octet-stream") + connection.setRequestProperty("x-api-key", apiKey) + if (body != null) { + connection.doOutput = true + connection.setRequestProperty("Content-Type", "application/json") + connection.outputStream.use { it.write(body.toByteArray(StandardCharsets.UTF_8)) } + } + return connection + } + + private fun errorMessage(connection: HttpURLConnection): String { + val detail = runCatching { + connection.errorStream?.bufferedReader()?.use { it.readText().take(600) }.orEmpty() + }.getOrDefault("") + val message = runCatching { JSONObject(detail).optString("message") }.getOrDefault("") + return when (connection.responseCode) { + 401, 403 -> "Immich hat den API-Key abgelehnt. Prüfe die Berechtigungen des Schlüssels." + 404 -> "Die Immich-API wurde unter dieser URL nicht gefunden." + else -> message.ifBlank { "Immich antwortet mit HTTP ${connection.responseCode}." } + } + } + + private fun requestJson(serverUrl: String, apiKey: String, path: String, method: String = "GET", body: String? = null): JSONObject { + val connection = openConnection(serverUrl, apiKey, path, method, body) + try { + if (connection.responseCode !in 200..299) throw IOException(errorMessage(connection)) + return JSONObject(connection.inputStream.bufferedReader().use { it.readText() }) + } finally { connection.disconnect() } + } + + private fun requestArray(serverUrl: String, apiKey: String, path: String): JSONArray { + val connection = openConnection(serverUrl, apiKey, path) + try { + if (connection.responseCode !in 200..299) throw IOException(errorMessage(connection)) + return JSONArray(connection.inputStream.bufferedReader().use { it.readText() }) + } finally { connection.disconnect() } + } + + private fun requestBytes(serverUrl: String, apiKey: String, path: String): Pair { + val connection = openConnection(serverUrl, apiKey, path) + try { + if (connection.responseCode !in 200..299) throw IOException(errorMessage(connection)) + val bytes = connection.inputStream.use { input -> ByteArrayOutputStream().use { output -> input.copyTo(output); output.toByteArray() } } + return bytes to connection.contentType.orEmpty().substringBefore(';') + } finally { connection.disconnect() } + } + + private fun downloadToFile(serverUrl: String, apiKey: String, path: String, target: File): String { + val connection = openConnection(serverUrl, apiKey, path) + try { + if (connection.responseCode !in 200..299) throw IOException(errorMessage(connection)) + connection.inputStream.use { input -> target.outputStream().use { output -> input.copyTo(output) } } + return connection.contentType.orEmpty().substringBefore(';') + } catch (error: Exception) { + target.delete() + throw error + } finally { connection.disconnect() } + } + + private fun thumbnailDataUrl(credentials: Credentials, assetId: String): String = runCatching { + val encoded = URLEncoder.encode(assetId, StandardCharsets.UTF_8.name()) + val (bytes, contentType) = requestBytes(credentials.serverUrl, credentials.apiKey, "/assets/$encoded/thumbnail?size=thumbnail") + val mime = if (contentType.startsWith("image/")) contentType else "image/jpeg" + "data:$mime;base64," + Base64.encodeToString(bytes, Base64.NO_WRAP) + }.getOrDefault("") + + fun albums(context: Context): JSObject { + val credentials = credentials(context) + val response = requestArray(credentials.serverUrl, credentials.apiKey, "/albums") + val albums = JSArray() + (0 until response.length()).map { response.getJSONObject(it) } + .sortedBy { it.optString("albumName").lowercase() } + .forEach { album -> + albums.put(JSObject().apply { + put("id", album.getString("id")) + put("name", album.optString("albumName", "Album")) + put("assetCount", album.optInt("assetCount", 0)) + put("thumbnailUrl", "") + }) + } + return JSObject().apply { put("albums", albums) } + } + + fun assets(context: Context, albumId: String?, page: Int, size: Int): JSObject { + val credentials = credentials(context) + val safePage = page.coerceAtLeast(1) + val safeSize = size.coerceIn(1, 60) + val body = JSONObject().apply { + put("type", "IMAGE") + put("page", safePage) + put("size", safeSize) + put("order", "desc") + if (!albumId.isNullOrBlank()) put("albumIds", JSONArray().put(albumId)) + } + val response = requestJson(credentials.serverUrl, credentials.apiKey, "/search/metadata", "POST", body.toString()) + .getJSONObject("assets") + val jsonItems = response.getJSONArray("items") + val raw = (0 until jsonItems.length()).map { jsonItems.getJSONObject(it) } + val thumbnails = thumbnailPool.invokeAll(raw.map { asset -> Callable { thumbnailDataUrl(credentials, asset.getString("id")) } }) + val items = JSArray() + raw.forEachIndexed { index, asset -> + items.put(JSObject().apply { + put("id", asset.getString("id")) + put("fileName", asset.optString("originalFileName", "Immich image")) + put("thumbnailUrl", runCatching { thumbnails[index].get() }.getOrDefault("")) + put("takenAt", asset.optString("localDateTime", asset.optString("fileCreatedAt", ""))) + }) + } + return JSObject().apply { + put("items", items) + put("page", safePage) + put("hasMore", !response.isNull("nextPage") && response.optString("nextPage").isNotBlank()) + } + } + + private fun extension(contentType: String) = when (contentType.lowercase()) { + "image/png" -> "png" + "image/webp" -> "webp" + "image/heic", "image/heif" -> "heic" + else -> "jpg" + } + + private fun importOne(context: Context, credentials: Credentials, assetId: String) { + require(assetIdPattern.matches(assetId)) { "Ungültige Immich-Bild-ID." } + if (WallpaperStore.files(context).any { it.name.startsWith("immich-$assetId.") }) return + val encoded = URLEncoder.encode(assetId, StandardCharsets.UTF_8.name()) + val directory = WallpaperStore.directory(context) + val temporary = File(directory, ".immich-$assetId.download") + var contentType = downloadToFile(credentials.serverUrl, credentials.apiKey, "/assets/$encoded/original", temporary) + val bounds = BitmapFactory.Options().apply { inJustDecodeBounds = true } + BitmapFactory.decodeFile(temporary.absolutePath, bounds) + if (bounds.outWidth <= 0 || bounds.outHeight <= 0) { + temporary.delete() + contentType = downloadToFile(credentials.serverUrl, credentials.apiKey, "/assets/$encoded/thumbnail?size=preview", temporary) + BitmapFactory.decodeFile(temporary.absolutePath, bounds) + require(bounds.outWidth > 0 && bounds.outHeight > 0) { "Immich hat kein unterstütztes Bildformat geliefert." } + } + val target = File(directory, "immich-$assetId.${extension(contentType)}") + if (!temporary.renameTo(target)) { + temporary.copyTo(target, overwrite = true) + temporary.delete() + } + } + + fun importAssets(context: Context, ids: List): JSObject { + require(ids.isNotEmpty()) { "Wähle mindestens ein Immich-Bild aus." } + require(ids.size <= 100) { "Bitte importiere höchstens 100 Bilder auf einmal." } + val credentials = credentials(context) + ids.distinct().forEach { importOne(context, credentials, it) } + return WallpaperStore.state(context) + } +} diff --git a/plugins/android/src/main/java/WallpaperPlugin.kt b/plugins/android/src/main/java/WallpaperPlugin.kt index eb0649c..3cbd1c6 100644 --- a/plugins/android/src/main/java/WallpaperPlugin.kt +++ b/plugins/android/src/main/java/WallpaperPlugin.kt @@ -40,6 +40,15 @@ class ImageCropArgs { var positionY: Double = 0.5 } +@InvokeArg +class ImmichConnectArgs { lateinit var serverUrl: String; lateinit var apiKey: String } + +@InvokeArg +class ImmichAssetsArgs { var albumId: String? = null; var page: Int = 1; var size: Int = 30 } + +@InvokeArg +class ImmichImportArgs { var ids: Array = emptyArray() } + @TauriPlugin class WallpaperPlugin(private val activity: Activity) : Plugin(activity) { private val io = Executors.newSingleThreadExecutor() @@ -136,4 +145,38 @@ class WallpaperPlugin(private val activity: Activity) : Plugin(activity) { @Command fun nextWallpaper(invoke: Invoke) = io.execute { if (WallpaperStore.applyNext(activity)) invoke.resolve(WallpaperStore.state(activity)) else invoke.reject("Bitte wähle zuerst Bilder aus") } + + @Command fun getImmichConnection(invoke: Invoke) = io.execute { + invoke.resolve(ImmichClient.connection(activity)) + } + + @Command fun connectImmich(invoke: Invoke) = io.execute { + try { + val args = invoke.parseArgs(ImmichConnectArgs::class.java) + invoke.resolve(ImmichClient.connect(activity, args.serverUrl, args.apiKey)) + } catch (error: Exception) { invoke.reject(error.message ?: "Immich-Verbindung fehlgeschlagen") } + } + + @Command fun disconnectImmich(invoke: Invoke) = io.execute { + invoke.resolve(ImmichClient.disconnect(activity)) + } + + @Command fun getImmichAlbums(invoke: Invoke) = io.execute { + try { invoke.resolve(ImmichClient.albums(activity)) } + catch (error: Exception) { invoke.reject(error.message ?: "Immich-Alben konnten nicht geladen werden") } + } + + @Command fun getImmichAssets(invoke: Invoke) = io.execute { + try { + val args = invoke.parseArgs(ImmichAssetsArgs::class.java) + invoke.resolve(ImmichClient.assets(activity, args.albumId, args.page, args.size)) + } catch (error: Exception) { invoke.reject(error.message ?: "Immich-Bilder konnten nicht geladen werden") } + } + + @Command fun importImmichAssets(invoke: Invoke) = io.execute { + try { + val args = invoke.parseArgs(ImmichImportArgs::class.java) + invoke.resolve(ImmichClient.importAssets(activity, args.ids.toList())) + } catch (error: Exception) { invoke.reject(error.message ?: "Immich-Bilder konnten nicht importiert werden") } + } } diff --git a/plugins/build.rs b/plugins/build.rs index 7146dfc..77125e2 100644 --- a/plugins/build.rs +++ b/plugins/build.rs @@ -9,6 +9,12 @@ const COMMANDS: &[&str] = &[ "set_setting", "set_interval", "next_wallpaper", + "get_immich_connection", + "connect_immich", + "disconnect_immich", + "get_immich_albums", + "get_immich_assets", + "import_immich_assets", ]; fn main() { diff --git a/plugins/permissions/autogenerated/commands/connect_immich.toml b/plugins/permissions/autogenerated/commands/connect_immich.toml new file mode 100644 index 0000000..2f687bc --- /dev/null +++ b/plugins/permissions/autogenerated/commands/connect_immich.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-connect-immich" +description = "Enables the connect_immich command without any pre-configured scope." +commands.allow = ["connect_immich"] + +[[permission]] +identifier = "deny-connect-immich" +description = "Denies the connect_immich command without any pre-configured scope." +commands.deny = ["connect_immich"] diff --git a/plugins/permissions/autogenerated/commands/disconnect_immich.toml b/plugins/permissions/autogenerated/commands/disconnect_immich.toml new file mode 100644 index 0000000..fa3d5b4 --- /dev/null +++ b/plugins/permissions/autogenerated/commands/disconnect_immich.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-disconnect-immich" +description = "Enables the disconnect_immich command without any pre-configured scope." +commands.allow = ["disconnect_immich"] + +[[permission]] +identifier = "deny-disconnect-immich" +description = "Denies the disconnect_immich command without any pre-configured scope." +commands.deny = ["disconnect_immich"] diff --git a/plugins/permissions/autogenerated/commands/get_immich_albums.toml b/plugins/permissions/autogenerated/commands/get_immich_albums.toml new file mode 100644 index 0000000..98ba4f6 --- /dev/null +++ b/plugins/permissions/autogenerated/commands/get_immich_albums.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-get-immich-albums" +description = "Enables the get_immich_albums command without any pre-configured scope." +commands.allow = ["get_immich_albums"] + +[[permission]] +identifier = "deny-get-immich-albums" +description = "Denies the get_immich_albums command without any pre-configured scope." +commands.deny = ["get_immich_albums"] diff --git a/plugins/permissions/autogenerated/commands/get_immich_assets.toml b/plugins/permissions/autogenerated/commands/get_immich_assets.toml new file mode 100644 index 0000000..aba0e00 --- /dev/null +++ b/plugins/permissions/autogenerated/commands/get_immich_assets.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-get-immich-assets" +description = "Enables the get_immich_assets command without any pre-configured scope." +commands.allow = ["get_immich_assets"] + +[[permission]] +identifier = "deny-get-immich-assets" +description = "Denies the get_immich_assets command without any pre-configured scope." +commands.deny = ["get_immich_assets"] diff --git a/plugins/permissions/autogenerated/commands/get_immich_connection.toml b/plugins/permissions/autogenerated/commands/get_immich_connection.toml new file mode 100644 index 0000000..d56e0f0 --- /dev/null +++ b/plugins/permissions/autogenerated/commands/get_immich_connection.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-get-immich-connection" +description = "Enables the get_immich_connection command without any pre-configured scope." +commands.allow = ["get_immich_connection"] + +[[permission]] +identifier = "deny-get-immich-connection" +description = "Denies the get_immich_connection command without any pre-configured scope." +commands.deny = ["get_immich_connection"] diff --git a/plugins/permissions/autogenerated/commands/import_immich_assets.toml b/plugins/permissions/autogenerated/commands/import_immich_assets.toml new file mode 100644 index 0000000..b459c0f --- /dev/null +++ b/plugins/permissions/autogenerated/commands/import_immich_assets.toml @@ -0,0 +1,13 @@ +# Automatically generated - DO NOT EDIT! + +"$schema" = "../../schemas/schema.json" + +[[permission]] +identifier = "allow-import-immich-assets" +description = "Enables the import_immich_assets command without any pre-configured scope." +commands.allow = ["import_immich_assets"] + +[[permission]] +identifier = "deny-import-immich-assets" +description = "Denies the import_immich_assets command without any pre-configured scope." +commands.deny = ["import_immich_assets"] diff --git a/plugins/permissions/autogenerated/reference.md b/plugins/permissions/autogenerated/reference.md index e5d03f5..5c61838 100644 --- a/plugins/permissions/autogenerated/reference.md +++ b/plugins/permissions/autogenerated/reference.md @@ -14,6 +14,12 @@ Allow the LockScreenWallpaper app to manage its wallpaper collection - `allow-set-setting` - `allow-set-interval` - `allow-next-wallpaper` +- `allow-get-immich-connection` +- `allow-connect-immich` +- `allow-disconnect-immich` +- `allow-get-immich-albums` +- `allow-get-immich-assets` +- `allow-import-immich-assets` ## Permission Table @@ -24,6 +30,32 @@ Allow the LockScreenWallpaper app to manage its wallpaper collection + + + +`wallpaper:allow-connect-immich` + + + + +Enables the connect_immich command without any pre-configured scope. + + + + + + + +`wallpaper:deny-connect-immich` + + + + +Denies the connect_immich command without any pre-configured scope. + + + + @@ -79,6 +111,32 @@ Denies the delete_images command without any pre-configured scope. +`wallpaper:allow-disconnect-immich` + + + + +Enables the disconnect_immich command without any pre-configured scope. + + + + + + + +`wallpaper:deny-disconnect-immich` + + + + +Denies the disconnect_immich command without any pre-configured scope. + + + + + + + `wallpaper:allow-get-gallery` @@ -131,6 +189,84 @@ Denies the get_image_ids command without any pre-configured scope. +`wallpaper:allow-get-immich-albums` + + + + +Enables the get_immich_albums command without any pre-configured scope. + + + + + + + +`wallpaper:deny-get-immich-albums` + + + + +Denies the get_immich_albums command without any pre-configured scope. + + + + + + + +`wallpaper:allow-get-immich-assets` + + + + +Enables the get_immich_assets command without any pre-configured scope. + + + + + + + +`wallpaper:deny-get-immich-assets` + + + + +Denies the get_immich_assets command without any pre-configured scope. + + + + + + + +`wallpaper:allow-get-immich-connection` + + + + +Enables the get_immich_connection command without any pre-configured scope. + + + + + + + +`wallpaper:deny-get-immich-connection` + + + + +Denies the get_immich_connection command without any pre-configured scope. + + + + + + + `wallpaper:allow-get-state` @@ -157,6 +293,32 @@ Denies the get_state command without any pre-configured scope. +`wallpaper:allow-import-immich-assets` + + + + +Enables the import_immich_assets command without any pre-configured scope. + + + + + + + +`wallpaper:deny-import-immich-assets` + + + + +Denies the import_immich_assets command without any pre-configured scope. + + + + + + + `wallpaper:allow-next-wallpaper` diff --git a/plugins/permissions/default.toml b/plugins/permissions/default.toml index 7dcd215..c37e79c 100644 --- a/plugins/permissions/default.toml +++ b/plugins/permissions/default.toml @@ -1,3 +1,3 @@ [default] description = "Allow the LockScreenWallpaper app to manage its wallpaper collection" -permissions = ["allow-get-state", "allow-get-gallery", "allow-select-images", "allow-delete-image", "allow-get-image-ids", "allow-delete-images", "allow-set-image-crop", "allow-set-setting", "allow-set-interval", "allow-next-wallpaper"] +permissions = ["allow-get-state", "allow-get-gallery", "allow-select-images", "allow-delete-image", "allow-get-image-ids", "allow-delete-images", "allow-set-image-crop", "allow-set-setting", "allow-set-interval", "allow-next-wallpaper", "allow-get-immich-connection", "allow-connect-immich", "allow-disconnect-immich", "allow-get-immich-albums", "allow-get-immich-assets", "allow-import-immich-assets"] diff --git a/plugins/permissions/schemas/schema.json b/plugins/permissions/schemas/schema.json index 10e8395..4d6930c 100644 --- a/plugins/permissions/schemas/schema.json +++ b/plugins/permissions/schemas/schema.json @@ -294,6 +294,18 @@ "PermissionKind": { "type": "string", "oneOf": [ + { + "description": "Enables the connect_immich command without any pre-configured scope.", + "type": "string", + "const": "allow-connect-immich", + "markdownDescription": "Enables the connect_immich command without any pre-configured scope." + }, + { + "description": "Denies the connect_immich command without any pre-configured scope.", + "type": "string", + "const": "deny-connect-immich", + "markdownDescription": "Denies the connect_immich command without any pre-configured scope." + }, { "description": "Enables the delete_image command without any pre-configured scope.", "type": "string", @@ -318,6 +330,18 @@ "const": "deny-delete-images", "markdownDescription": "Denies the delete_images command without any pre-configured scope." }, + { + "description": "Enables the disconnect_immich command without any pre-configured scope.", + "type": "string", + "const": "allow-disconnect-immich", + "markdownDescription": "Enables the disconnect_immich command without any pre-configured scope." + }, + { + "description": "Denies the disconnect_immich command without any pre-configured scope.", + "type": "string", + "const": "deny-disconnect-immich", + "markdownDescription": "Denies the disconnect_immich command without any pre-configured scope." + }, { "description": "Enables the get_gallery command without any pre-configured scope.", "type": "string", @@ -342,6 +366,42 @@ "const": "deny-get-image-ids", "markdownDescription": "Denies the get_image_ids command without any pre-configured scope." }, + { + "description": "Enables the get_immich_albums command without any pre-configured scope.", + "type": "string", + "const": "allow-get-immich-albums", + "markdownDescription": "Enables the get_immich_albums command without any pre-configured scope." + }, + { + "description": "Denies the get_immich_albums command without any pre-configured scope.", + "type": "string", + "const": "deny-get-immich-albums", + "markdownDescription": "Denies the get_immich_albums command without any pre-configured scope." + }, + { + "description": "Enables the get_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "allow-get-immich-assets", + "markdownDescription": "Enables the get_immich_assets command without any pre-configured scope." + }, + { + "description": "Denies the get_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "deny-get-immich-assets", + "markdownDescription": "Denies the get_immich_assets command without any pre-configured scope." + }, + { + "description": "Enables the get_immich_connection command without any pre-configured scope.", + "type": "string", + "const": "allow-get-immich-connection", + "markdownDescription": "Enables the get_immich_connection command without any pre-configured scope." + }, + { + "description": "Denies the get_immich_connection command without any pre-configured scope.", + "type": "string", + "const": "deny-get-immich-connection", + "markdownDescription": "Denies the get_immich_connection command without any pre-configured scope." + }, { "description": "Enables the get_state command without any pre-configured scope.", "type": "string", @@ -354,6 +414,18 @@ "const": "deny-get-state", "markdownDescription": "Denies the get_state command without any pre-configured scope." }, + { + "description": "Enables the import_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "allow-import-immich-assets", + "markdownDescription": "Enables the import_immich_assets command without any pre-configured scope." + }, + { + "description": "Denies the import_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "deny-import-immich-assets", + "markdownDescription": "Denies the import_immich_assets command without any pre-configured scope." + }, { "description": "Enables the next_wallpaper command without any pre-configured scope.", "type": "string", @@ -415,10 +487,10 @@ "markdownDescription": "Denies the set_setting command without any pre-configured scope." }, { - "description": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`", + "description": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`\n- `allow-get-immich-connection`\n- `allow-connect-immich`\n- `allow-disconnect-immich`\n- `allow-get-immich-albums`\n- `allow-get-immich-assets`\n- `allow-import-immich-assets`", "type": "string", "const": "default", - "markdownDescription": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`" + "markdownDescription": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`\n- `allow-get-immich-connection`\n- `allow-connect-immich`\n- `allow-disconnect-immich`\n- `allow-get-immich-albums`\n- `allow-get-immich-assets`\n- `allow-import-immich-assets`" } ] } diff --git a/plugins/src/commands.rs b/plugins/src/commands.rs index 805955b..15a7921 100644 --- a/plugins/src/commands.rs +++ b/plugins/src/commands.rs @@ -69,3 +69,45 @@ pub(crate) async fn set_interval(app: AppHandle, minutes: usize) pub(crate) async fn next_wallpaper(app: AppHandle) -> Result { app.wallpaper().next_wallpaper() } + +#[command] +pub(crate) async fn get_immich_connection(app: AppHandle) -> Result { + app.wallpaper().get_immich_connection() +} + +#[command] +pub(crate) async fn connect_immich( + app: AppHandle, + server_url: String, + api_key: String, +) -> Result { + app.wallpaper().connect_immich(ImmichConnectRequest { server_url, api_key }) +} + +#[command] +pub(crate) async fn disconnect_immich(app: AppHandle) -> Result { + app.wallpaper().disconnect_immich() +} + +#[command] +pub(crate) async fn get_immich_albums(app: AppHandle) -> Result { + app.wallpaper().get_immich_albums() +} + +#[command] +pub(crate) async fn get_immich_assets( + app: AppHandle, + album_id: Option, + page: usize, + size: usize, +) -> Result { + app.wallpaper().get_immich_assets(ImmichAssetsRequest { album_id, page, size }) +} + +#[command] +pub(crate) async fn import_immich_assets( + app: AppHandle, + ids: Vec, +) -> Result { + app.wallpaper().import_immich_assets(ImmichImportRequest { ids }) +} diff --git a/plugins/src/desktop.rs b/plugins/src/desktop.rs index 4a8b18c..5f2d1ae 100644 --- a/plugins/src/desktop.rs +++ b/plugins/src/desktop.rs @@ -100,4 +100,47 @@ impl Wallpaper { state.current_index = 1; Ok(state) } + pub fn get_immich_connection(&self) -> crate::Result { + Ok(ImmichConnection::default()) + } + pub fn connect_immich(&self, payload: ImmichConnectRequest) -> crate::Result { + Ok(ImmichConnection { + configured: true, + server_url: payload.server_url, + user_name: "Demo User".into(), + }) + } + pub fn disconnect_immich(&self) -> crate::Result { + Ok(ImmichConnection::default()) + } + pub fn get_immich_albums(&self) -> crate::Result { + Ok(ImmichAlbumsResponse { + albums: vec![ImmichAlbum { + id: "demo-album".into(), + name: "Nature".into(), + asset_count: 3, + thumbnail_url: "/wallpapers/alpine.png".into(), + }], + }) + } + pub fn get_immich_assets(&self, payload: ImmichAssetsRequest) -> crate::Result { + let urls = Self::demo().image_urls; + Ok(ImmichAssetsPage { + items: urls + .into_iter() + .enumerate() + .map(|(index, thumbnail_url)| ImmichAsset { + id: format!("immich-demo-{index}"), + file_name: format!("wallpaper-{}.jpg", index + 1), + thumbnail_url, + taken_at: "2026-08-21T12:00:00Z".into(), + }) + .collect(), + page: payload.page, + has_more: false, + }) + } + pub fn import_immich_assets(&self, _payload: ImmichImportRequest) -> crate::Result { + Ok(Self::demo()) + } } diff --git a/plugins/src/lib.rs b/plugins/src/lib.rs index 9aaf930..a0f1b3c 100644 --- a/plugins/src/lib.rs +++ b/plugins/src/lib.rs @@ -45,7 +45,13 @@ pub fn init() -> TauriPlugin { commands::set_image_crop, commands::set_setting, commands::set_interval, - commands::next_wallpaper + commands::next_wallpaper, + commands::get_immich_connection, + commands::connect_immich, + commands::disconnect_immich, + commands::get_immich_albums, + commands::get_immich_assets, + commands::import_immich_assets ]) .setup(|app, api| { #[cfg(mobile)] diff --git a/plugins/src/mobile.rs b/plugins/src/mobile.rs index 8c3cdfc..6de0381 100644 --- a/plugins/src/mobile.rs +++ b/plugins/src/mobile.rs @@ -70,4 +70,22 @@ impl Wallpaper { .run_mobile_plugin("nextWallpaper", ()) .map_err(Into::into) } + pub fn get_immich_connection(&self) -> crate::Result { + self.0.run_mobile_plugin("getImmichConnection", ()).map_err(Into::into) + } + pub fn connect_immich(&self, payload: ImmichConnectRequest) -> crate::Result { + self.0.run_mobile_plugin("connectImmich", payload).map_err(Into::into) + } + pub fn disconnect_immich(&self) -> crate::Result { + self.0.run_mobile_plugin("disconnectImmich", ()).map_err(Into::into) + } + pub fn get_immich_albums(&self) -> crate::Result { + self.0.run_mobile_plugin("getImmichAlbums", ()).map_err(Into::into) + } + pub fn get_immich_assets(&self, payload: ImmichAssetsRequest) -> crate::Result { + self.0.run_mobile_plugin("getImmichAssets", payload).map_err(Into::into) + } + pub fn import_immich_assets(&self, payload: ImmichImportRequest) -> crate::Result { + self.0.run_mobile_plugin("importImmichAssets", payload).map_err(Into::into) + } } diff --git a/plugins/src/models.rs b/plugins/src/models.rs index 08be60a..a3efa30 100644 --- a/plugins/src/models.rs +++ b/plugins/src/models.rs @@ -78,3 +78,64 @@ pub struct GalleryPage { pub total: usize, pub items: Vec, } + +#[derive(Debug, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ImmichConnectRequest { + pub server_url: String, + pub api_key: String, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ImmichConnection { + pub configured: bool, + pub server_url: String, + pub user_name: String, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ImmichAlbum { + pub id: String, + pub name: String, + pub asset_count: usize, + pub thumbnail_url: String, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ImmichAlbumsResponse { + pub albums: Vec, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ImmichAssetsRequest { + pub album_id: Option, + pub page: usize, + pub size: usize, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ImmichAsset { + pub id: String, + pub file_name: String, + pub thumbnail_url: String, + pub taken_at: String, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ImmichAssetsPage { + pub items: Vec, + pub page: usize, + pub has_more: bool, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ImmichImportRequest { + pub ids: Vec, +} diff --git a/src-tauri/gen/android/app/build.gradle.kts b/src-tauri/gen/android/app/build.gradle.kts index 63b7e0c..2802377 100644 --- a/src-tauri/gen/android/app/build.gradle.kts +++ b/src-tauri/gen/android/app/build.gradle.kts @@ -17,7 +17,9 @@ android { compileSdk = 36 namespace = "de.wechselbild.app" defaultConfig { - manifestPlaceholders["usesCleartextTraffic"] = "false" + // Immich is frequently hosted on a private LAN without TLS. The app only + // connects to the server URL explicitly entered by the user. + manifestPlaceholders["usesCleartextTraffic"] = "true" applicationId = "de.wechselbild.app" minSdk = 24 targetSdk = 36 @@ -68,4 +70,4 @@ dependencies { androidTestImplementation("androidx.test.espresso:espresso-core:3.5.0") } -apply(from = "tauri.build.gradle.kts") \ No newline at end of file +apply(from = "tauri.build.gradle.kts") diff --git a/src-tauri/gen/schemas/acl-manifests.json b/src-tauri/gen/schemas/acl-manifests.json index 1a4eeb7..8945355 100644 --- a/src-tauri/gen/schemas/acl-manifests.json +++ b/src-tauri/gen/schemas/acl-manifests.json @@ -1 +1 @@ -{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier","allow-bundle-type","allow-register-listener","allow-remove-listener","allow-supports-multiple-windows"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-bundle-type":{"identifier":"allow-bundle-type","description":"Enables the bundle_type command without any pre-configured scope.","commands":{"allow":["bundle_type"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-remove-listener":{"identifier":"allow-remove-listener","description":"Enables the remove_listener command without any pre-configured scope.","commands":{"allow":["remove_listener"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-set-dock-visibility":{"identifier":"allow-set-dock-visibility","description":"Enables the set_dock_visibility command without any pre-configured scope.","commands":{"allow":["set_dock_visibility"],"deny":[]}},"allow-supports-multiple-windows":{"identifier":"allow-supports-multiple-windows","description":"Enables the supports_multiple_windows command without any pre-configured scope.","commands":{"allow":["supports_multiple_windows"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-bundle-type":{"identifier":"deny-bundle-type","description":"Denies the bundle_type command without any pre-configured scope.","commands":{"allow":[],"deny":["bundle_type"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"Denies the identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["identifier"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-data-store":{"identifier":"deny-remove-data-store","description":"Denies the remove_data_store command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_data_store"]}},"deny-remove-listener":{"identifier":"deny-remove-listener","description":"Denies the remove_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_listener"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-set-dock-visibility":{"identifier":"deny-set-dock-visibility","description":"Denies the set_dock_visibility command without any pre-configured scope.","commands":{"allow":[],"deny":["set_dock_visibility"]}},"deny-supports-multiple-windows":{"identifier":"deny-supports-multiple-windows","description":"Denies the supports_multiple_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["supports_multiple_windows"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-icon-with-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-icon-with-as-template":{"identifier":"allow-set-icon-with-as-template","description":"Enables the set_icon_with_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_with_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-icon-with-as-template":{"identifier":"deny-set-icon-with-as-template","description":"Denies the set_icon_with_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_with_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-auto-resize":{"identifier":"allow-set-webview-auto-resize","description":"Enables the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":["set_webview_auto_resize"],"deny":[]}},"allow-set-webview-background-color":{"identifier":"allow-set-webview-background-color","description":"Enables the set_webview_background_color command without any pre-configured scope.","commands":{"allow":["set_webview_background_color"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-auto-resize":{"identifier":"deny-set-webview-auto-resize","description":"Denies the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_auto_resize"]}},"deny-set-webview-background-color":{"identifier":"deny-set-webview-background-color","description":"Denies the set_webview_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_background_color"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-is-always-on-top","allow-activity-name","allow-scene-identifier","allow-internal-toggle-maximize"]},"permissions":{"allow-activity-name":{"identifier":"allow-activity-name","description":"Enables the activity_name command without any pre-configured scope.","commands":{"allow":["activity_name"],"deny":[]}},"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-always-on-top":{"identifier":"allow-is-always-on-top","description":"Enables the is_always_on_top command without any pre-configured scope.","commands":{"allow":["is_always_on_top"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-scene-identifier":{"identifier":"allow-scene-identifier","description":"Enables the scene_identifier command without any pre-configured scope.","commands":{"allow":["scene_identifier"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-background-color":{"identifier":"allow-set-background-color","description":"Enables the set_background_color command without any pre-configured scope.","commands":{"allow":["set_background_color"],"deny":[]}},"allow-set-badge-count":{"identifier":"allow-set-badge-count","description":"Enables the set_badge_count command without any pre-configured scope.","commands":{"allow":["set_badge_count"],"deny":[]}},"allow-set-badge-label":{"identifier":"allow-set-badge-label","description":"Enables the set_badge_label command without any pre-configured scope.","commands":{"allow":["set_badge_label"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-focusable":{"identifier":"allow-set-focusable","description":"Enables the set_focusable command without any pre-configured scope.","commands":{"allow":["set_focusable"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-overlay-icon":{"identifier":"allow-set-overlay-icon","description":"Enables the set_overlay_icon command without any pre-configured scope.","commands":{"allow":["set_overlay_icon"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-simple-fullscreen":{"identifier":"allow-set-simple-fullscreen","description":"Enables the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":["set_simple_fullscreen"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-activity-name":{"identifier":"deny-activity-name","description":"Denies the activity_name command without any pre-configured scope.","commands":{"allow":[],"deny":["activity_name"]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-always-on-top":{"identifier":"deny-is-always-on-top","description":"Denies the is_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["is_always_on_top"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-scene-identifier":{"identifier":"deny-scene-identifier","description":"Denies the scene_identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["scene_identifier"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-background-color":{"identifier":"deny-set-background-color","description":"Denies the set_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_background_color"]}},"deny-set-badge-count":{"identifier":"deny-set-badge-count","description":"Denies the set_badge_count command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_count"]}},"deny-set-badge-label":{"identifier":"deny-set-badge-label","description":"Denies the set_badge_label command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_label"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-focusable":{"identifier":"deny-set-focusable","description":"Denies the set_focusable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focusable"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-overlay-icon":{"identifier":"deny-set-overlay-icon","description":"Denies the set_overlay_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_overlay_icon"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-simple-fullscreen":{"identifier":"deny-set-simple-fullscreen","description":"Denies the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_simple_fullscreen"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"wallpaper":{"default_permission":{"identifier":"default","description":"Allow the LockScreenWallpaper app to manage its wallpaper collection","permissions":["allow-get-state","allow-get-gallery","allow-select-images","allow-delete-image","allow-get-image-ids","allow-delete-images","allow-set-image-crop","allow-set-setting","allow-set-interval","allow-next-wallpaper"]},"permissions":{"allow-delete-image":{"identifier":"allow-delete-image","description":"Enables the delete_image command without any pre-configured scope.","commands":{"allow":["delete_image"],"deny":[]}},"allow-delete-images":{"identifier":"allow-delete-images","description":"Enables the delete_images command without any pre-configured scope.","commands":{"allow":["delete_images"],"deny":[]}},"allow-get-gallery":{"identifier":"allow-get-gallery","description":"Enables the get_gallery command without any pre-configured scope.","commands":{"allow":["get_gallery"],"deny":[]}},"allow-get-image-ids":{"identifier":"allow-get-image-ids","description":"Enables the get_image_ids command without any pre-configured scope.","commands":{"allow":["get_image_ids"],"deny":[]}},"allow-get-state":{"identifier":"allow-get-state","description":"Enables the get_state command without any pre-configured scope.","commands":{"allow":["get_state"],"deny":[]}},"allow-next-wallpaper":{"identifier":"allow-next-wallpaper","description":"Enables the next_wallpaper command without any pre-configured scope.","commands":{"allow":["next_wallpaper"],"deny":[]}},"allow-select-images":{"identifier":"allow-select-images","description":"Enables the select_images command without any pre-configured scope.","commands":{"allow":["select_images"],"deny":[]}},"allow-set-image-crop":{"identifier":"allow-set-image-crop","description":"Enables the set_image_crop command without any pre-configured scope.","commands":{"allow":["set_image_crop"],"deny":[]}},"allow-set-interval":{"identifier":"allow-set-interval","description":"Enables the set_interval command without any pre-configured scope.","commands":{"allow":["set_interval"],"deny":[]}},"allow-set-setting":{"identifier":"allow-set-setting","description":"Enables the set_setting command without any pre-configured scope.","commands":{"allow":["set_setting"],"deny":[]}},"deny-delete-image":{"identifier":"deny-delete-image","description":"Denies the delete_image command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_image"]}},"deny-delete-images":{"identifier":"deny-delete-images","description":"Denies the delete_images command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_images"]}},"deny-get-gallery":{"identifier":"deny-get-gallery","description":"Denies the get_gallery command without any pre-configured scope.","commands":{"allow":[],"deny":["get_gallery"]}},"deny-get-image-ids":{"identifier":"deny-get-image-ids","description":"Denies the get_image_ids command without any pre-configured scope.","commands":{"allow":[],"deny":["get_image_ids"]}},"deny-get-state":{"identifier":"deny-get-state","description":"Denies the get_state command without any pre-configured scope.","commands":{"allow":[],"deny":["get_state"]}},"deny-next-wallpaper":{"identifier":"deny-next-wallpaper","description":"Denies the next_wallpaper command without any pre-configured scope.","commands":{"allow":[],"deny":["next_wallpaper"]}},"deny-select-images":{"identifier":"deny-select-images","description":"Denies the select_images command without any pre-configured scope.","commands":{"allow":[],"deny":["select_images"]}},"deny-set-image-crop":{"identifier":"deny-set-image-crop","description":"Denies the set_image_crop command without any pre-configured scope.","commands":{"allow":[],"deny":["set_image_crop"]}},"deny-set-interval":{"identifier":"deny-set-interval","description":"Denies the set_interval command without any pre-configured scope.","commands":{"allow":[],"deny":["set_interval"]}},"deny-set-setting":{"identifier":"deny-set-setting","description":"Denies the set_setting command without any pre-configured scope.","commands":{"allow":[],"deny":["set_setting"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file +{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier","allow-bundle-type","allow-register-listener","allow-remove-listener","allow-supports-multiple-windows"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-bundle-type":{"identifier":"allow-bundle-type","description":"Enables the bundle_type command without any pre-configured scope.","commands":{"allow":["bundle_type"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-remove-listener":{"identifier":"allow-remove-listener","description":"Enables the remove_listener command without any pre-configured scope.","commands":{"allow":["remove_listener"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-set-dock-visibility":{"identifier":"allow-set-dock-visibility","description":"Enables the set_dock_visibility command without any pre-configured scope.","commands":{"allow":["set_dock_visibility"],"deny":[]}},"allow-supports-multiple-windows":{"identifier":"allow-supports-multiple-windows","description":"Enables the supports_multiple_windows command without any pre-configured scope.","commands":{"allow":["supports_multiple_windows"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-bundle-type":{"identifier":"deny-bundle-type","description":"Denies the bundle_type command without any pre-configured scope.","commands":{"allow":[],"deny":["bundle_type"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"Denies the identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["identifier"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-data-store":{"identifier":"deny-remove-data-store","description":"Denies the remove_data_store command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_data_store"]}},"deny-remove-listener":{"identifier":"deny-remove-listener","description":"Denies the remove_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_listener"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-set-dock-visibility":{"identifier":"deny-set-dock-visibility","description":"Denies the set_dock_visibility command without any pre-configured scope.","commands":{"allow":[],"deny":["set_dock_visibility"]}},"deny-supports-multiple-windows":{"identifier":"deny-supports-multiple-windows","description":"Denies the supports_multiple_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["supports_multiple_windows"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-icon-with-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-icon-with-as-template":{"identifier":"allow-set-icon-with-as-template","description":"Enables the set_icon_with_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_with_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-icon-with-as-template":{"identifier":"deny-set-icon-with-as-template","description":"Denies the set_icon_with_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_with_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-auto-resize":{"identifier":"allow-set-webview-auto-resize","description":"Enables the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":["set_webview_auto_resize"],"deny":[]}},"allow-set-webview-background-color":{"identifier":"allow-set-webview-background-color","description":"Enables the set_webview_background_color command without any pre-configured scope.","commands":{"allow":["set_webview_background_color"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-auto-resize":{"identifier":"deny-set-webview-auto-resize","description":"Denies the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_auto_resize"]}},"deny-set-webview-background-color":{"identifier":"deny-set-webview-background-color","description":"Denies the set_webview_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_background_color"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-is-always-on-top","allow-activity-name","allow-scene-identifier","allow-internal-toggle-maximize"]},"permissions":{"allow-activity-name":{"identifier":"allow-activity-name","description":"Enables the activity_name command without any pre-configured scope.","commands":{"allow":["activity_name"],"deny":[]}},"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-always-on-top":{"identifier":"allow-is-always-on-top","description":"Enables the is_always_on_top command without any pre-configured scope.","commands":{"allow":["is_always_on_top"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-scene-identifier":{"identifier":"allow-scene-identifier","description":"Enables the scene_identifier command without any pre-configured scope.","commands":{"allow":["scene_identifier"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-background-color":{"identifier":"allow-set-background-color","description":"Enables the set_background_color command without any pre-configured scope.","commands":{"allow":["set_background_color"],"deny":[]}},"allow-set-badge-count":{"identifier":"allow-set-badge-count","description":"Enables the set_badge_count command without any pre-configured scope.","commands":{"allow":["set_badge_count"],"deny":[]}},"allow-set-badge-label":{"identifier":"allow-set-badge-label","description":"Enables the set_badge_label command without any pre-configured scope.","commands":{"allow":["set_badge_label"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-focusable":{"identifier":"allow-set-focusable","description":"Enables the set_focusable command without any pre-configured scope.","commands":{"allow":["set_focusable"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-overlay-icon":{"identifier":"allow-set-overlay-icon","description":"Enables the set_overlay_icon command without any pre-configured scope.","commands":{"allow":["set_overlay_icon"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-simple-fullscreen":{"identifier":"allow-set-simple-fullscreen","description":"Enables the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":["set_simple_fullscreen"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-activity-name":{"identifier":"deny-activity-name","description":"Denies the activity_name command without any pre-configured scope.","commands":{"allow":[],"deny":["activity_name"]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-always-on-top":{"identifier":"deny-is-always-on-top","description":"Denies the is_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["is_always_on_top"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-scene-identifier":{"identifier":"deny-scene-identifier","description":"Denies the scene_identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["scene_identifier"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-background-color":{"identifier":"deny-set-background-color","description":"Denies the set_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_background_color"]}},"deny-set-badge-count":{"identifier":"deny-set-badge-count","description":"Denies the set_badge_count command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_count"]}},"deny-set-badge-label":{"identifier":"deny-set-badge-label","description":"Denies the set_badge_label command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_label"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-focusable":{"identifier":"deny-set-focusable","description":"Denies the set_focusable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focusable"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-overlay-icon":{"identifier":"deny-set-overlay-icon","description":"Denies the set_overlay_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_overlay_icon"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-simple-fullscreen":{"identifier":"deny-set-simple-fullscreen","description":"Denies the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_simple_fullscreen"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"wallpaper":{"default_permission":{"identifier":"default","description":"Allow the LockScreenWallpaper app to manage its wallpaper collection","permissions":["allow-get-state","allow-get-gallery","allow-select-images","allow-delete-image","allow-get-image-ids","allow-delete-images","allow-set-image-crop","allow-set-setting","allow-set-interval","allow-next-wallpaper","allow-get-immich-connection","allow-connect-immich","allow-disconnect-immich","allow-get-immich-albums","allow-get-immich-assets","allow-import-immich-assets"]},"permissions":{"allow-connect-immich":{"identifier":"allow-connect-immich","description":"Enables the connect_immich command without any pre-configured scope.","commands":{"allow":["connect_immich"],"deny":[]}},"allow-delete-image":{"identifier":"allow-delete-image","description":"Enables the delete_image command without any pre-configured scope.","commands":{"allow":["delete_image"],"deny":[]}},"allow-delete-images":{"identifier":"allow-delete-images","description":"Enables the delete_images command without any pre-configured scope.","commands":{"allow":["delete_images"],"deny":[]}},"allow-disconnect-immich":{"identifier":"allow-disconnect-immich","description":"Enables the disconnect_immich command without any pre-configured scope.","commands":{"allow":["disconnect_immich"],"deny":[]}},"allow-get-gallery":{"identifier":"allow-get-gallery","description":"Enables the get_gallery command without any pre-configured scope.","commands":{"allow":["get_gallery"],"deny":[]}},"allow-get-image-ids":{"identifier":"allow-get-image-ids","description":"Enables the get_image_ids command without any pre-configured scope.","commands":{"allow":["get_image_ids"],"deny":[]}},"allow-get-immich-albums":{"identifier":"allow-get-immich-albums","description":"Enables the get_immich_albums command without any pre-configured scope.","commands":{"allow":["get_immich_albums"],"deny":[]}},"allow-get-immich-assets":{"identifier":"allow-get-immich-assets","description":"Enables the get_immich_assets command without any pre-configured scope.","commands":{"allow":["get_immich_assets"],"deny":[]}},"allow-get-immich-connection":{"identifier":"allow-get-immich-connection","description":"Enables the get_immich_connection command without any pre-configured scope.","commands":{"allow":["get_immich_connection"],"deny":[]}},"allow-get-state":{"identifier":"allow-get-state","description":"Enables the get_state command without any pre-configured scope.","commands":{"allow":["get_state"],"deny":[]}},"allow-import-immich-assets":{"identifier":"allow-import-immich-assets","description":"Enables the import_immich_assets command without any pre-configured scope.","commands":{"allow":["import_immich_assets"],"deny":[]}},"allow-next-wallpaper":{"identifier":"allow-next-wallpaper","description":"Enables the next_wallpaper command without any pre-configured scope.","commands":{"allow":["next_wallpaper"],"deny":[]}},"allow-select-images":{"identifier":"allow-select-images","description":"Enables the select_images command without any pre-configured scope.","commands":{"allow":["select_images"],"deny":[]}},"allow-set-image-crop":{"identifier":"allow-set-image-crop","description":"Enables the set_image_crop command without any pre-configured scope.","commands":{"allow":["set_image_crop"],"deny":[]}},"allow-set-interval":{"identifier":"allow-set-interval","description":"Enables the set_interval command without any pre-configured scope.","commands":{"allow":["set_interval"],"deny":[]}},"allow-set-setting":{"identifier":"allow-set-setting","description":"Enables the set_setting command without any pre-configured scope.","commands":{"allow":["set_setting"],"deny":[]}},"deny-connect-immich":{"identifier":"deny-connect-immich","description":"Denies the connect_immich command without any pre-configured scope.","commands":{"allow":[],"deny":["connect_immich"]}},"deny-delete-image":{"identifier":"deny-delete-image","description":"Denies the delete_image command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_image"]}},"deny-delete-images":{"identifier":"deny-delete-images","description":"Denies the delete_images command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_images"]}},"deny-disconnect-immich":{"identifier":"deny-disconnect-immich","description":"Denies the disconnect_immich command without any pre-configured scope.","commands":{"allow":[],"deny":["disconnect_immich"]}},"deny-get-gallery":{"identifier":"deny-get-gallery","description":"Denies the get_gallery command without any pre-configured scope.","commands":{"allow":[],"deny":["get_gallery"]}},"deny-get-image-ids":{"identifier":"deny-get-image-ids","description":"Denies the get_image_ids command without any pre-configured scope.","commands":{"allow":[],"deny":["get_image_ids"]}},"deny-get-immich-albums":{"identifier":"deny-get-immich-albums","description":"Denies the get_immich_albums command without any pre-configured scope.","commands":{"allow":[],"deny":["get_immich_albums"]}},"deny-get-immich-assets":{"identifier":"deny-get-immich-assets","description":"Denies the get_immich_assets command without any pre-configured scope.","commands":{"allow":[],"deny":["get_immich_assets"]}},"deny-get-immich-connection":{"identifier":"deny-get-immich-connection","description":"Denies the get_immich_connection command without any pre-configured scope.","commands":{"allow":[],"deny":["get_immich_connection"]}},"deny-get-state":{"identifier":"deny-get-state","description":"Denies the get_state command without any pre-configured scope.","commands":{"allow":[],"deny":["get_state"]}},"deny-import-immich-assets":{"identifier":"deny-import-immich-assets","description":"Denies the import_immich_assets command without any pre-configured scope.","commands":{"allow":[],"deny":["import_immich_assets"]}},"deny-next-wallpaper":{"identifier":"deny-next-wallpaper","description":"Denies the next_wallpaper command without any pre-configured scope.","commands":{"allow":[],"deny":["next_wallpaper"]}},"deny-select-images":{"identifier":"deny-select-images","description":"Denies the select_images command without any pre-configured scope.","commands":{"allow":[],"deny":["select_images"]}},"deny-set-image-crop":{"identifier":"deny-set-image-crop","description":"Denies the set_image_crop command without any pre-configured scope.","commands":{"allow":[],"deny":["set_image_crop"]}},"deny-set-interval":{"identifier":"deny-set-interval","description":"Denies the set_interval command without any pre-configured scope.","commands":{"allow":[],"deny":["set_interval"]}},"deny-set-setting":{"identifier":"deny-set-setting","description":"Denies the set_setting command without any pre-configured scope.","commands":{"allow":[],"deny":["set_setting"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file diff --git a/src-tauri/gen/schemas/android-schema.json b/src-tauri/gen/schemas/android-schema.json index a47e904..53bad8b 100644 --- a/src-tauri/gen/schemas/android-schema.json +++ b/src-tauri/gen/schemas/android-schema.json @@ -2193,10 +2193,16 @@ "markdownDescription": "Denies the unminimize command without any pre-configured scope." }, { - "description": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`", + "description": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`\n- `allow-get-immich-connection`\n- `allow-connect-immich`\n- `allow-disconnect-immich`\n- `allow-get-immich-albums`\n- `allow-get-immich-assets`\n- `allow-import-immich-assets`", "type": "string", "const": "wallpaper:default", - "markdownDescription": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`" + "markdownDescription": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`\n- `allow-get-immich-connection`\n- `allow-connect-immich`\n- `allow-disconnect-immich`\n- `allow-get-immich-albums`\n- `allow-get-immich-assets`\n- `allow-import-immich-assets`" + }, + { + "description": "Enables the connect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-connect-immich", + "markdownDescription": "Enables the connect_immich command without any pre-configured scope." }, { "description": "Enables the delete_image command without any pre-configured scope.", @@ -2210,6 +2216,12 @@ "const": "wallpaper:allow-delete-images", "markdownDescription": "Enables the delete_images command without any pre-configured scope." }, + { + "description": "Enables the disconnect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-disconnect-immich", + "markdownDescription": "Enables the disconnect_immich command without any pre-configured scope." + }, { "description": "Enables the get_gallery command without any pre-configured scope.", "type": "string", @@ -2222,12 +2234,36 @@ "const": "wallpaper:allow-get-image-ids", "markdownDescription": "Enables the get_image_ids command without any pre-configured scope." }, + { + "description": "Enables the get_immich_albums command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-get-immich-albums", + "markdownDescription": "Enables the get_immich_albums command without any pre-configured scope." + }, + { + "description": "Enables the get_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-get-immich-assets", + "markdownDescription": "Enables the get_immich_assets command without any pre-configured scope." + }, + { + "description": "Enables the get_immich_connection command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-get-immich-connection", + "markdownDescription": "Enables the get_immich_connection command without any pre-configured scope." + }, { "description": "Enables the get_state command without any pre-configured scope.", "type": "string", "const": "wallpaper:allow-get-state", "markdownDescription": "Enables the get_state command without any pre-configured scope." }, + { + "description": "Enables the import_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-import-immich-assets", + "markdownDescription": "Enables the import_immich_assets command without any pre-configured scope." + }, { "description": "Enables the next_wallpaper command without any pre-configured scope.", "type": "string", @@ -2258,6 +2294,12 @@ "const": "wallpaper:allow-set-setting", "markdownDescription": "Enables the set_setting command without any pre-configured scope." }, + { + "description": "Denies the connect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-connect-immich", + "markdownDescription": "Denies the connect_immich command without any pre-configured scope." + }, { "description": "Denies the delete_image command without any pre-configured scope.", "type": "string", @@ -2270,6 +2312,12 @@ "const": "wallpaper:deny-delete-images", "markdownDescription": "Denies the delete_images command without any pre-configured scope." }, + { + "description": "Denies the disconnect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-disconnect-immich", + "markdownDescription": "Denies the disconnect_immich command without any pre-configured scope." + }, { "description": "Denies the get_gallery command without any pre-configured scope.", "type": "string", @@ -2282,12 +2330,36 @@ "const": "wallpaper:deny-get-image-ids", "markdownDescription": "Denies the get_image_ids command without any pre-configured scope." }, + { + "description": "Denies the get_immich_albums command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-get-immich-albums", + "markdownDescription": "Denies the get_immich_albums command without any pre-configured scope." + }, + { + "description": "Denies the get_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-get-immich-assets", + "markdownDescription": "Denies the get_immich_assets command without any pre-configured scope." + }, + { + "description": "Denies the get_immich_connection command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-get-immich-connection", + "markdownDescription": "Denies the get_immich_connection command without any pre-configured scope." + }, { "description": "Denies the get_state command without any pre-configured scope.", "type": "string", "const": "wallpaper:deny-get-state", "markdownDescription": "Denies the get_state command without any pre-configured scope." }, + { + "description": "Denies the import_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-import-immich-assets", + "markdownDescription": "Denies the import_immich_assets command without any pre-configured scope." + }, { "description": "Denies the next_wallpaper command without any pre-configured scope.", "type": "string", diff --git a/src-tauri/gen/schemas/desktop-schema.json b/src-tauri/gen/schemas/desktop-schema.json index a47e904..53bad8b 100644 --- a/src-tauri/gen/schemas/desktop-schema.json +++ b/src-tauri/gen/schemas/desktop-schema.json @@ -2193,10 +2193,16 @@ "markdownDescription": "Denies the unminimize command without any pre-configured scope." }, { - "description": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`", + "description": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`\n- `allow-get-immich-connection`\n- `allow-connect-immich`\n- `allow-disconnect-immich`\n- `allow-get-immich-albums`\n- `allow-get-immich-assets`\n- `allow-import-immich-assets`", "type": "string", "const": "wallpaper:default", - "markdownDescription": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`" + "markdownDescription": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`\n- `allow-get-immich-connection`\n- `allow-connect-immich`\n- `allow-disconnect-immich`\n- `allow-get-immich-albums`\n- `allow-get-immich-assets`\n- `allow-import-immich-assets`" + }, + { + "description": "Enables the connect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-connect-immich", + "markdownDescription": "Enables the connect_immich command without any pre-configured scope." }, { "description": "Enables the delete_image command without any pre-configured scope.", @@ -2210,6 +2216,12 @@ "const": "wallpaper:allow-delete-images", "markdownDescription": "Enables the delete_images command without any pre-configured scope." }, + { + "description": "Enables the disconnect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-disconnect-immich", + "markdownDescription": "Enables the disconnect_immich command without any pre-configured scope." + }, { "description": "Enables the get_gallery command without any pre-configured scope.", "type": "string", @@ -2222,12 +2234,36 @@ "const": "wallpaper:allow-get-image-ids", "markdownDescription": "Enables the get_image_ids command without any pre-configured scope." }, + { + "description": "Enables the get_immich_albums command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-get-immich-albums", + "markdownDescription": "Enables the get_immich_albums command without any pre-configured scope." + }, + { + "description": "Enables the get_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-get-immich-assets", + "markdownDescription": "Enables the get_immich_assets command without any pre-configured scope." + }, + { + "description": "Enables the get_immich_connection command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-get-immich-connection", + "markdownDescription": "Enables the get_immich_connection command without any pre-configured scope." + }, { "description": "Enables the get_state command without any pre-configured scope.", "type": "string", "const": "wallpaper:allow-get-state", "markdownDescription": "Enables the get_state command without any pre-configured scope." }, + { + "description": "Enables the import_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-import-immich-assets", + "markdownDescription": "Enables the import_immich_assets command without any pre-configured scope." + }, { "description": "Enables the next_wallpaper command without any pre-configured scope.", "type": "string", @@ -2258,6 +2294,12 @@ "const": "wallpaper:allow-set-setting", "markdownDescription": "Enables the set_setting command without any pre-configured scope." }, + { + "description": "Denies the connect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-connect-immich", + "markdownDescription": "Denies the connect_immich command without any pre-configured scope." + }, { "description": "Denies the delete_image command without any pre-configured scope.", "type": "string", @@ -2270,6 +2312,12 @@ "const": "wallpaper:deny-delete-images", "markdownDescription": "Denies the delete_images command without any pre-configured scope." }, + { + "description": "Denies the disconnect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-disconnect-immich", + "markdownDescription": "Denies the disconnect_immich command without any pre-configured scope." + }, { "description": "Denies the get_gallery command without any pre-configured scope.", "type": "string", @@ -2282,12 +2330,36 @@ "const": "wallpaper:deny-get-image-ids", "markdownDescription": "Denies the get_image_ids command without any pre-configured scope." }, + { + "description": "Denies the get_immich_albums command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-get-immich-albums", + "markdownDescription": "Denies the get_immich_albums command without any pre-configured scope." + }, + { + "description": "Denies the get_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-get-immich-assets", + "markdownDescription": "Denies the get_immich_assets command without any pre-configured scope." + }, + { + "description": "Denies the get_immich_connection command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-get-immich-connection", + "markdownDescription": "Denies the get_immich_connection command without any pre-configured scope." + }, { "description": "Denies the get_state command without any pre-configured scope.", "type": "string", "const": "wallpaper:deny-get-state", "markdownDescription": "Denies the get_state command without any pre-configured scope." }, + { + "description": "Denies the import_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-import-immich-assets", + "markdownDescription": "Denies the import_immich_assets command without any pre-configured scope." + }, { "description": "Denies the next_wallpaper command without any pre-configured scope.", "type": "string", diff --git a/src-tauri/gen/schemas/linux-schema.json b/src-tauri/gen/schemas/linux-schema.json index a47e904..53bad8b 100644 --- a/src-tauri/gen/schemas/linux-schema.json +++ b/src-tauri/gen/schemas/linux-schema.json @@ -2193,10 +2193,16 @@ "markdownDescription": "Denies the unminimize command without any pre-configured scope." }, { - "description": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`", + "description": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`\n- `allow-get-immich-connection`\n- `allow-connect-immich`\n- `allow-disconnect-immich`\n- `allow-get-immich-albums`\n- `allow-get-immich-assets`\n- `allow-import-immich-assets`", "type": "string", "const": "wallpaper:default", - "markdownDescription": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`" + "markdownDescription": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`\n- `allow-get-immich-connection`\n- `allow-connect-immich`\n- `allow-disconnect-immich`\n- `allow-get-immich-albums`\n- `allow-get-immich-assets`\n- `allow-import-immich-assets`" + }, + { + "description": "Enables the connect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-connect-immich", + "markdownDescription": "Enables the connect_immich command without any pre-configured scope." }, { "description": "Enables the delete_image command without any pre-configured scope.", @@ -2210,6 +2216,12 @@ "const": "wallpaper:allow-delete-images", "markdownDescription": "Enables the delete_images command without any pre-configured scope." }, + { + "description": "Enables the disconnect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-disconnect-immich", + "markdownDescription": "Enables the disconnect_immich command without any pre-configured scope." + }, { "description": "Enables the get_gallery command without any pre-configured scope.", "type": "string", @@ -2222,12 +2234,36 @@ "const": "wallpaper:allow-get-image-ids", "markdownDescription": "Enables the get_image_ids command without any pre-configured scope." }, + { + "description": "Enables the get_immich_albums command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-get-immich-albums", + "markdownDescription": "Enables the get_immich_albums command without any pre-configured scope." + }, + { + "description": "Enables the get_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-get-immich-assets", + "markdownDescription": "Enables the get_immich_assets command without any pre-configured scope." + }, + { + "description": "Enables the get_immich_connection command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-get-immich-connection", + "markdownDescription": "Enables the get_immich_connection command without any pre-configured scope." + }, { "description": "Enables the get_state command without any pre-configured scope.", "type": "string", "const": "wallpaper:allow-get-state", "markdownDescription": "Enables the get_state command without any pre-configured scope." }, + { + "description": "Enables the import_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-import-immich-assets", + "markdownDescription": "Enables the import_immich_assets command without any pre-configured scope." + }, { "description": "Enables the next_wallpaper command without any pre-configured scope.", "type": "string", @@ -2258,6 +2294,12 @@ "const": "wallpaper:allow-set-setting", "markdownDescription": "Enables the set_setting command without any pre-configured scope." }, + { + "description": "Denies the connect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-connect-immich", + "markdownDescription": "Denies the connect_immich command without any pre-configured scope." + }, { "description": "Denies the delete_image command without any pre-configured scope.", "type": "string", @@ -2270,6 +2312,12 @@ "const": "wallpaper:deny-delete-images", "markdownDescription": "Denies the delete_images command without any pre-configured scope." }, + { + "description": "Denies the disconnect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-disconnect-immich", + "markdownDescription": "Denies the disconnect_immich command without any pre-configured scope." + }, { "description": "Denies the get_gallery command without any pre-configured scope.", "type": "string", @@ -2282,12 +2330,36 @@ "const": "wallpaper:deny-get-image-ids", "markdownDescription": "Denies the get_image_ids command without any pre-configured scope." }, + { + "description": "Denies the get_immich_albums command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-get-immich-albums", + "markdownDescription": "Denies the get_immich_albums command without any pre-configured scope." + }, + { + "description": "Denies the get_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-get-immich-assets", + "markdownDescription": "Denies the get_immich_assets command without any pre-configured scope." + }, + { + "description": "Denies the get_immich_connection command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-get-immich-connection", + "markdownDescription": "Denies the get_immich_connection command without any pre-configured scope." + }, { "description": "Denies the get_state command without any pre-configured scope.", "type": "string", "const": "wallpaper:deny-get-state", "markdownDescription": "Denies the get_state command without any pre-configured scope." }, + { + "description": "Denies the import_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-import-immich-assets", + "markdownDescription": "Denies the import_immich_assets command without any pre-configured scope." + }, { "description": "Denies the next_wallpaper command without any pre-configured scope.", "type": "string", diff --git a/src-tauri/gen/schemas/mobile-schema.json b/src-tauri/gen/schemas/mobile-schema.json index a47e904..53bad8b 100644 --- a/src-tauri/gen/schemas/mobile-schema.json +++ b/src-tauri/gen/schemas/mobile-schema.json @@ -2193,10 +2193,16 @@ "markdownDescription": "Denies the unminimize command without any pre-configured scope." }, { - "description": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`", + "description": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`\n- `allow-get-immich-connection`\n- `allow-connect-immich`\n- `allow-disconnect-immich`\n- `allow-get-immich-albums`\n- `allow-get-immich-assets`\n- `allow-import-immich-assets`", "type": "string", "const": "wallpaper:default", - "markdownDescription": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`" + "markdownDescription": "Allow the LockScreenWallpaper app to manage its wallpaper collection\n#### This default permission set includes:\n\n- `allow-get-state`\n- `allow-get-gallery`\n- `allow-select-images`\n- `allow-delete-image`\n- `allow-get-image-ids`\n- `allow-delete-images`\n- `allow-set-image-crop`\n- `allow-set-setting`\n- `allow-set-interval`\n- `allow-next-wallpaper`\n- `allow-get-immich-connection`\n- `allow-connect-immich`\n- `allow-disconnect-immich`\n- `allow-get-immich-albums`\n- `allow-get-immich-assets`\n- `allow-import-immich-assets`" + }, + { + "description": "Enables the connect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-connect-immich", + "markdownDescription": "Enables the connect_immich command without any pre-configured scope." }, { "description": "Enables the delete_image command without any pre-configured scope.", @@ -2210,6 +2216,12 @@ "const": "wallpaper:allow-delete-images", "markdownDescription": "Enables the delete_images command without any pre-configured scope." }, + { + "description": "Enables the disconnect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-disconnect-immich", + "markdownDescription": "Enables the disconnect_immich command without any pre-configured scope." + }, { "description": "Enables the get_gallery command without any pre-configured scope.", "type": "string", @@ -2222,12 +2234,36 @@ "const": "wallpaper:allow-get-image-ids", "markdownDescription": "Enables the get_image_ids command without any pre-configured scope." }, + { + "description": "Enables the get_immich_albums command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-get-immich-albums", + "markdownDescription": "Enables the get_immich_albums command without any pre-configured scope." + }, + { + "description": "Enables the get_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-get-immich-assets", + "markdownDescription": "Enables the get_immich_assets command without any pre-configured scope." + }, + { + "description": "Enables the get_immich_connection command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-get-immich-connection", + "markdownDescription": "Enables the get_immich_connection command without any pre-configured scope." + }, { "description": "Enables the get_state command without any pre-configured scope.", "type": "string", "const": "wallpaper:allow-get-state", "markdownDescription": "Enables the get_state command without any pre-configured scope." }, + { + "description": "Enables the import_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:allow-import-immich-assets", + "markdownDescription": "Enables the import_immich_assets command without any pre-configured scope." + }, { "description": "Enables the next_wallpaper command without any pre-configured scope.", "type": "string", @@ -2258,6 +2294,12 @@ "const": "wallpaper:allow-set-setting", "markdownDescription": "Enables the set_setting command without any pre-configured scope." }, + { + "description": "Denies the connect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-connect-immich", + "markdownDescription": "Denies the connect_immich command without any pre-configured scope." + }, { "description": "Denies the delete_image command without any pre-configured scope.", "type": "string", @@ -2270,6 +2312,12 @@ "const": "wallpaper:deny-delete-images", "markdownDescription": "Denies the delete_images command without any pre-configured scope." }, + { + "description": "Denies the disconnect_immich command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-disconnect-immich", + "markdownDescription": "Denies the disconnect_immich command without any pre-configured scope." + }, { "description": "Denies the get_gallery command without any pre-configured scope.", "type": "string", @@ -2282,12 +2330,36 @@ "const": "wallpaper:deny-get-image-ids", "markdownDescription": "Denies the get_image_ids command without any pre-configured scope." }, + { + "description": "Denies the get_immich_albums command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-get-immich-albums", + "markdownDescription": "Denies the get_immich_albums command without any pre-configured scope." + }, + { + "description": "Denies the get_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-get-immich-assets", + "markdownDescription": "Denies the get_immich_assets command without any pre-configured scope." + }, + { + "description": "Denies the get_immich_connection command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-get-immich-connection", + "markdownDescription": "Denies the get_immich_connection command without any pre-configured scope." + }, { "description": "Denies the get_state command without any pre-configured scope.", "type": "string", "const": "wallpaper:deny-get-state", "markdownDescription": "Denies the get_state command without any pre-configured scope." }, + { + "description": "Denies the import_immich_assets command without any pre-configured scope.", + "type": "string", + "const": "wallpaper:deny-import-immich-assets", + "markdownDescription": "Denies the import_immich_assets command without any pre-configured scope." + }, { "description": "Denies the next_wallpaper command without any pre-configured scope.", "type": "string", diff --git a/src/App.tsx b/src/App.tsx index d74ff40..edaad80 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,8 @@ import { useEffect, useLayoutEffect, useMemo, useRef, useState } from "react"; -import { ArrowLeft, Check, ChevronRight, Crop, Home, Images, Languages, LockKeyhole, Plus, RotateCcw, Save, Settings, Shuffle, Smartphone, Sparkles, Trash2 } from "lucide-react"; -import { deleteImages, getGallery, getImageIds, getState, nextWallpaper, selectImages, setImageCrop, setIntervalMinutes, setSetting, type GalleryImage, type WallpaperState } from "./native"; +import { ArrowLeft, Check, ChevronRight, Cloud, CloudDownload, Crop, Home, Images, Languages, Link2Off, LockKeyhole, Plus, RotateCcw, Save, Server, Settings, Shuffle, Smartphone, Sparkles, Trash2 } from "lucide-react"; +import { connectImmich, deleteImages, disconnectImmich, getGallery, getImageIds, getImmichAlbums, getImmichAssets, getImmichConnection, getState, importImmichAssets, nextWallpaper, selectImages, setImageCrop, setIntervalMinutes, setSetting, type GalleryImage, type ImmichAlbum, type ImmichAsset, type ImmichConnection, type WallpaperState } from "./native"; import { initialLanguage, languageNames, languages, translations, type Language } from "./i18n-local"; +import { immichTranslations } from "./immich-i18n"; const initial: WallpaperState = { imageCount: 0, enabled: false, intervalMinutes: 0, shuffle: true, lockScreenOnly: true, currentIndex: 0, imageUrls: [] }; @@ -22,7 +23,7 @@ function IntervalRow({ value, onChange, label, paused, everyMinutes }: { value: export default function App() { const [state, setState] = useState(initial); - const [tab, setTab] = useState<"home" | "settings" | "gallery" | "editor">("home"); + const [tab, setTab] = useState<"home" | "settings" | "gallery" | "editor" | "immich">("home"); const [busy, setBusy] = useState(false); const [notice, setNotice] = useState(""); const [language, setLanguage] = useState(initialLanguage); @@ -31,6 +32,16 @@ export default function App() { const [galleryLoading, setGalleryLoading] = useState(false); const [selectedIds, setSelectedIds] = useState>(() => new Set()); const [editing, setEditing] = useState(null); + const [immichConnection, setImmichConnection] = useState({ configured: false, serverUrl: "", userName: "" }); + const [immichUrl, setImmichUrl] = useState(""); + const [immichApiKey, setImmichApiKey] = useState(""); + const [immichAlbums, setImmichAlbums] = useState([]); + const [immichAlbumId, setImmichAlbumId] = useState(""); + const [immichAssets, setImmichAssets] = useState([]); + const [immichSelected, setImmichSelected] = useState>(() => new Set()); + const [immichPage, setImmichPage] = useState(1); + const [immichHasMore, setImmichHasMore] = useState(false); + const [immichLoading, setImmichLoading] = useState(false); const phonePreviewRef = useRef(null); const phoneImageRef = useRef(null); const previewPointers = useRef(new Map()); @@ -39,6 +50,12 @@ export default function App() { const restoreGalleryScroll = useRef(false); useEffect(() => { getState().then(setState).catch(() => setState(initial)); }, []); + useEffect(() => { + getImmichConnection().then(connection => { + setImmichConnection(connection); + setImmichUrl(connection.serverUrl); + }).catch(() => undefined); + }, []); useEffect(() => { if (!notice) return; const timeout = window.setTimeout(() => setNotice(""), 3000); @@ -59,6 +76,7 @@ export default function App() { return () => { window.cancelAnimationFrame(frame); window.clearTimeout(settled); }; }, [tab]); const t = translations[language]; + const it = immichTranslations[language]; const previewDate = useMemo(() => new Intl.DateTimeFormat(language, { weekday: "long", day: "numeric", month: "long" }).format(new Date()), [language]); const current = state.imageUrls[state.currentIndex] ?? "/wallpapers/alpine.png"; const photos = useMemo(() => state.imageUrls, [state.imageUrls]); @@ -148,6 +166,78 @@ export default function App() { void loadGallery(); } + async function saveImmichConnection() { + setBusy(true); + try { + const connection = await connectImmich(immichUrl, immichApiKey); + setImmichConnection(connection); + setImmichUrl(connection.serverUrl); + setImmichApiKey(""); + setNotice(it.connectionSuccess); + } catch (error) { setNotice(String(error).replace(/^Error:\s*/, "") || it.connectionFailed); } + finally { setBusy(false); } + } + + async function removeImmichConnection() { + setBusy(true); + try { + setImmichConnection(await disconnectImmich()); + setImmichUrl(""); + setImmichApiKey(""); + setImmichAssets([]); + setImmichAlbums([]); + setImmichSelected(new Set()); + setNotice(it.disconnected); + } catch { setNotice(it.connectionFailed); } + finally { setBusy(false); } + } + + async function loadImmichPhotos(albumId: string, page = 1, append = false) { + setImmichLoading(true); + try { + const result = await getImmichAssets(albumId || null, page, 30); + setImmichAssets(previous => append ? [...previous, ...result.items] : result.items); + setImmichPage(result.page); + setImmichHasMore(result.hasMore); + } catch (error) { setNotice(String(error).replace(/^Error:\s*/, "") || it.immichLoadFailed); } + finally { setImmichLoading(false); } + } + + async function openImmich() { + setTab("immich"); + setImmichSelected(new Set()); + setImmichLoading(true); + try { + const albums = await getImmichAlbums(); + setImmichAlbums(albums); + await loadImmichPhotos(immichAlbumId); + } catch (error) { + setNotice(String(error).replace(/^Error:\s*/, "") || it.immichLoadFailed); + setImmichLoading(false); + } + } + + function toggleImmichAsset(id: string) { + setImmichSelected(previous => { + const next = new Set(previous); + if (next.has(id)) next.delete(id); else next.add(id); + return next; + }); + } + + async function importFromImmich() { + if (!immichSelected.size) return; + setBusy(true); + setNotice(it.importing); + try { + setState(await importImmichAssets([...immichSelected])); + setImmichSelected(new Set()); + setNotice(it.importSuccess); + setTab("home"); + } catch (error) { setNotice(String(error).replace(/^Error:\s*/, "") || it.immichLoadFailed); } + finally { setBusy(false); } + } + async function saveCrop() { if (!editing) return; setBusy(true); @@ -251,6 +341,7 @@ export default function App() { return
{tab === "gallery" ?

{selectedIds.size ? `${selectedIds.size} ${t.selected}` : t.collection}

{galleryTotal} {galleryTotal === 1 ? t.image : t.images}

{selectedIds.size ? : }
: tab === "editor" ?

{t.editImage}

{t.savedForImage}

: + tab === "immich" ?

{it.immich}

{immichSelected.size ? `${immichSelected.size} ${t.selected}` : it.selectImmichPhotos}

{immichSelected.size > 0 && }
:

WallpaperFlow

{state.enabled ? t.automaticActive : t.automaticPaused}

}
@@ -272,7 +363,34 @@ export default function App() {
} label={t.shuffle} value={state.shuffle} onChange={v => update("shuffle", v)} />} label={t.lockScreenOnly} value={state.lockScreenOnly} onChange={v => update("lockScreenOnly", v)} />
- : tab === "settings" ?

{t.settings}

{t.settingsIntro}

} label={t.shuffle} value={state.shuffle} onChange={v => update("shuffle", v)} />} label={t.lockScreenOnly} value={state.lockScreenOnly} onChange={v => update("lockScreenOnly", v)} />

{t.noImageLimit}

{t.privacyInfo}

: tab === "gallery" ? + : tab === "settings" ?
+

{t.settings}

{t.settingsIntro}

+ +
} label={t.shuffle} value={state.shuffle} onChange={v => update("shuffle", v)} />} label={t.lockScreenOnly} value={state.lockScreenOnly} onChange={v => update("lockScreenOnly", v)} />
+
+

{it.immich}

{it.immichIntro}

+ {immichConnection.configured ? <> +
{it.connectedAs} {immichConnection.userName}{immichConnection.serverUrl}
+ + + : <> + + {immichUrl.trim().toLowerCase().startsWith("http://") &&

{it.httpWarning}

} + +

{it.apiKeyHelp}

+ + } +
+

{t.noImageLimit}

{t.privacyInfo}

+
: tab === "immich" ? +
+ + {!!immichAssets.length &&
{immichSelected.size ? `${immichSelected.size} ${t.selected}` : it.selectImmichPhotos}
} + {immichAssets.length ?
{immichAssets.map((asset, index) =>
)}
: !immichLoading &&

{it.noImmichPhotos}

} + {immichLoading &&

{t.galleryLoading}

} + {!immichLoading && immichHasMore && } + {!!immichSelected.size && } +
: tab === "gallery" ?
{!!galleryTotal &&
{selectedIds.size ? `${selectedIds.size} ${t.selected}` : t.selectImagesToDelete}
} {gallery.length ?
{gallery.map((image, index) =>
{image.selected && {t.current}}
)}
: !galleryLoading &&

{t.emptyCollection}

{t.emptyCollectionText}

} @@ -295,6 +413,6 @@ export default function App() {
{notice && } - {tab !== "gallery" && tab !== "editor" && } + {tab !== "gallery" && tab !== "editor" && tab !== "immich" && }
; } diff --git a/src/immich-i18n.ts b/src/immich-i18n.ts new file mode 100644 index 0000000..ec97640 --- /dev/null +++ b/src/immich-i18n.ts @@ -0,0 +1,141 @@ +import type { Language } from "./i18n-local"; + +export type ImmichText = { + immich: string; + immichIntro: string; + serverUrl: string; + apiKey: string; + apiKeyPlaceholder: string; + apiKeyHelp: string; + connect: string; + connectedAs: string; + disconnect: string; + openImmich: string; + connectionSuccess: string; + connectionFailed: string; + disconnected: string; + httpWarning: string; + allPhotos: string; + selectImmichPhotos: string; + importSelected: string; + importing: string; + importSuccess: string; + immichLoadFailed: string; + noImmichPhotos: string; +}; + +export const immichTranslations: Record = { + de: { + immich: "Immich", + immichIntro: "Importiere Bilder aus deinem eigenen Immich-Server.", + serverUrl: "Server-URL", + apiKey: "API-Key", + apiKeyPlaceholder: "Nur beim Verbinden erforderlich", + apiKeyHelp: "Benötigt: user.read, album.read, asset.read, asset.view und asset.download.", + connect: "Verbinden und testen", + connectedAs: "Verbunden als", + disconnect: "Verbindung trennen", + openImmich: "Immich-Bilder öffnen", + connectionSuccess: "Immich wurde verbunden", + connectionFailed: "Immich-Verbindung fehlgeschlagen", + disconnected: "Immich-Verbindung wurde getrennt", + httpWarning: "HTTP ist unverschlüsselt. Verwende außerhalb deines Heimnetzes HTTPS.", + allPhotos: "Alle Fotos", + selectImmichPhotos: "Wähle Bilder zum Importieren aus", + importSelected: "Auswahl importieren", + importing: "Bilder werden importiert…", + importSuccess: "Immich-Bilder wurden importiert", + immichLoadFailed: "Immich-Bilder konnten nicht geladen werden", + noImmichPhotos: "Keine Bilder gefunden", + }, + en: { + immich: "Immich", immichIntro: "Import images from your own Immich server.", serverUrl: "Server URL", apiKey: "API key", + apiKeyPlaceholder: "Required only when connecting", apiKeyHelp: "Required: user.read, album.read, asset.read, asset.view and asset.download.", + connect: "Connect and test", connectedAs: "Connected as", disconnect: "Disconnect", openImmich: "Open Immich photos", + connectionSuccess: "Immich connected", connectionFailed: "Immich connection failed", disconnected: "Immich disconnected", + httpWarning: "HTTP is unencrypted. Use HTTPS outside your home network.", allPhotos: "All photos", + selectImmichPhotos: "Select images to import", importSelected: "Import selection", importing: "Importing images…", + importSuccess: "Immich images imported", immichLoadFailed: "Could not load Immich images", noImmichPhotos: "No images found", + }, + fr: { + immich: "Immich", immichIntro: "Importez des images depuis votre propre serveur Immich.", serverUrl: "URL du serveur", apiKey: "Clé API", + apiKeyPlaceholder: "Requise uniquement à la connexion", apiKeyHelp: "Requis : user.read, album.read, asset.read, asset.view et asset.download.", + connect: "Connecter et tester", connectedAs: "Connecté en tant que", disconnect: "Déconnecter", openImmich: "Ouvrir les photos Immich", + connectionSuccess: "Immich est connecté", connectionFailed: "Échec de la connexion Immich", disconnected: "Immich est déconnecté", + httpWarning: "HTTP n’est pas chiffré. Utilisez HTTPS hors de votre réseau domestique.", allPhotos: "Toutes les photos", + selectImmichPhotos: "Sélectionnez les images à importer", importSelected: "Importer la sélection", importing: "Importation des images…", + importSuccess: "Images Immich importées", immichLoadFailed: "Impossible de charger les images Immich", noImmichPhotos: "Aucune image trouvée", + }, + es: { + immich: "Immich", immichIntro: "Importa imágenes desde tu propio servidor Immich.", serverUrl: "URL del servidor", apiKey: "Clave API", + apiKeyPlaceholder: "Solo se necesita al conectar", apiKeyHelp: "Necesita: user.read, album.read, asset.read, asset.view y asset.download.", + connect: "Conectar y probar", connectedAs: "Conectado como", disconnect: "Desconectar", openImmich: "Abrir fotos de Immich", + connectionSuccess: "Immich conectado", connectionFailed: "Error de conexión con Immich", disconnected: "Immich desconectado", + httpWarning: "HTTP no está cifrado. Usa HTTPS fuera de tu red doméstica.", allPhotos: "Todas las fotos", + selectImmichPhotos: "Selecciona imágenes para importar", importSelected: "Importar selección", importing: "Importando imágenes…", + importSuccess: "Imágenes de Immich importadas", immichLoadFailed: "No se pudieron cargar las imágenes de Immich", noImmichPhotos: "No se encontraron imágenes", + }, + it: { + immich: "Immich", immichIntro: "Importa immagini dal tuo server Immich.", serverUrl: "URL del server", apiKey: "Chiave API", + apiKeyPlaceholder: "Necessaria solo durante la connessione", apiKeyHelp: "Richiede: user.read, album.read, asset.read, asset.view e asset.download.", + connect: "Connetti e verifica", connectedAs: "Connesso come", disconnect: "Disconnetti", openImmich: "Apri foto Immich", + connectionSuccess: "Immich connesso", connectionFailed: "Connessione a Immich non riuscita", disconnected: "Immich disconnesso", + httpWarning: "HTTP non è crittografato. Usa HTTPS fuori dalla rete domestica.", allPhotos: "Tutte le foto", + selectImmichPhotos: "Seleziona le immagini da importare", importSelected: "Importa selezione", importing: "Importazione immagini…", + importSuccess: "Immagini Immich importate", immichLoadFailed: "Impossibile caricare le immagini Immich", noImmichPhotos: "Nessuna immagine trovata", + }, + nl: { + immich: "Immich", immichIntro: "Importeer afbeeldingen van je eigen Immich-server.", serverUrl: "Server-URL", apiKey: "API-sleutel", + apiKeyPlaceholder: "Alleen nodig bij verbinden", apiKeyHelp: "Vereist: user.read, album.read, asset.read, asset.view en asset.download.", + connect: "Verbinden en testen", connectedAs: "Verbonden als", disconnect: "Verbinding verbreken", openImmich: "Immich-foto’s openen", + connectionSuccess: "Immich is verbonden", connectionFailed: "Immich-verbinding mislukt", disconnected: "Immich is losgekoppeld", + httpWarning: "HTTP is niet versleuteld. Gebruik HTTPS buiten je thuisnetwerk.", allPhotos: "Alle foto’s", + selectImmichPhotos: "Selecteer afbeeldingen om te importeren", importSelected: "Selectie importeren", importing: "Afbeeldingen importeren…", + importSuccess: "Immich-afbeeldingen geïmporteerd", immichLoadFailed: "Immich-afbeeldingen konden niet worden geladen", noImmichPhotos: "Geen afbeeldingen gevonden", + }, + pl: { + immich: "Immich", immichIntro: "Importuj obrazy z własnego serwera Immich.", serverUrl: "Adres serwera", apiKey: "Klucz API", + apiKeyPlaceholder: "Wymagany tylko podczas łączenia", apiKeyHelp: "Wymaga: user.read, album.read, asset.read, asset.view i asset.download.", + connect: "Połącz i sprawdź", connectedAs: "Połączono jako", disconnect: "Rozłącz", openImmich: "Otwórz zdjęcia Immich", + connectionSuccess: "Połączono z Immich", connectionFailed: "Nie udało się połączyć z Immich", disconnected: "Rozłączono Immich", + httpWarning: "HTTP nie jest szyfrowany. Poza siecią domową używaj HTTPS.", allPhotos: "Wszystkie zdjęcia", + selectImmichPhotos: "Wybierz obrazy do importu", importSelected: "Importuj wybrane", importing: "Importowanie obrazów…", + importSuccess: "Zaimportowano obrazy Immich", immichLoadFailed: "Nie udało się wczytać obrazów Immich", noImmichPhotos: "Nie znaleziono obrazów", + }, + pt: { + immich: "Immich", immichIntro: "Importe imagens do seu próprio servidor Immich.", serverUrl: "URL do servidor", apiKey: "Chave de API", + apiKeyPlaceholder: "Necessária apenas ao ligar", apiKeyHelp: "Requer: user.read, album.read, asset.read, asset.view e asset.download.", + connect: "Ligar e testar", connectedAs: "Ligado como", disconnect: "Desligar", openImmich: "Abrir fotos do Immich", + connectionSuccess: "Immich ligado", connectionFailed: "Falha na ligação ao Immich", disconnected: "Immich desligado", + httpWarning: "HTTP não é encriptado. Use HTTPS fora da sua rede doméstica.", allPhotos: "Todas as fotos", + selectImmichPhotos: "Selecione imagens para importar", importSelected: "Importar seleção", importing: "A importar imagens…", + importSuccess: "Imagens do Immich importadas", immichLoadFailed: "Não foi possível carregar imagens do Immich", noImmichPhotos: "Nenhuma imagem encontrada", + }, + ja: { + immich: "Immich", immichIntro: "自分の Immich サーバーから画像を取り込みます。", serverUrl: "サーバー URL", apiKey: "API キー", + apiKeyPlaceholder: "接続時のみ必要", apiKeyHelp: "必要権限: user.read、album.read、asset.read、asset.view、asset.download。", + connect: "接続してテスト", connectedAs: "接続ユーザー", disconnect: "接続を解除", openImmich: "Immich の写真を開く", + connectionSuccess: "Immich に接続しました", connectionFailed: "Immich に接続できません", disconnected: "Immich の接続を解除しました", + httpWarning: "HTTP は暗号化されません。自宅ネットワーク外では HTTPS を使用してください。", allPhotos: "すべての写真", + selectImmichPhotos: "取り込む画像を選択", importSelected: "選択項目を取り込む", importing: "画像を取り込み中…", + importSuccess: "Immich の画像を取り込みました", immichLoadFailed: "Immich の画像を読み込めません", noImmichPhotos: "画像が見つかりません", + }, + ko: { + immich: "Immich", immichIntro: "내 Immich 서버에서 이미지를 가져옵니다.", serverUrl: "서버 URL", apiKey: "API 키", + apiKeyPlaceholder: "연결할 때만 필요", apiKeyHelp: "필요 권한: user.read, album.read, asset.read, asset.view, asset.download.", + connect: "연결 및 테스트", connectedAs: "연결된 사용자", disconnect: "연결 해제", openImmich: "Immich 사진 열기", + connectionSuccess: "Immich에 연결했습니다", connectionFailed: "Immich 연결에 실패했습니다", disconnected: "Immich 연결을 해제했습니다", + httpWarning: "HTTP는 암호화되지 않습니다. 홈 네트워크 밖에서는 HTTPS를 사용하세요.", allPhotos: "모든 사진", + selectImmichPhotos: "가져올 이미지를 선택하세요", importSelected: "선택 항목 가져오기", importing: "이미지 가져오는 중…", + importSuccess: "Immich 이미지를 가져왔습니다", immichLoadFailed: "Immich 이미지를 불러올 수 없습니다", noImmichPhotos: "이미지를 찾을 수 없습니다", + }, + "zh-CN": { + immich: "Immich", immichIntro: "从你自己的 Immich 服务器导入图片。", serverUrl: "服务器 URL", apiKey: "API 密钥", + apiKeyPlaceholder: "仅连接时需要", apiKeyHelp: "需要权限:user.read、album.read、asset.read、asset.view 和 asset.download。", + connect: "连接并测试", connectedAs: "连接用户", disconnect: "断开连接", openImmich: "打开 Immich 照片", + connectionSuccess: "已连接 Immich", connectionFailed: "Immich 连接失败", disconnected: "已断开 Immich 连接", + httpWarning: "HTTP 未加密。在家庭网络之外请使用 HTTPS。", allPhotos: "所有照片", + selectImmichPhotos: "选择要导入的图片", importSelected: "导入所选图片", importing: "正在导入图片…", + importSuccess: "已导入 Immich 图片", immichLoadFailed: "无法加载 Immich 图片", noImmichPhotos: "未找到图片", + }, +}; diff --git a/src/native.ts b/src/native.ts index 6500052..d468cb7 100644 --- a/src/native.ts +++ b/src/native.ts @@ -25,6 +25,32 @@ export type GalleryPage = { items: GalleryImage[]; }; +export type ImmichConnection = { + configured: boolean; + serverUrl: string; + userName: string; +}; + +export type ImmichAlbum = { + id: string; + name: string; + assetCount: number; + thumbnailUrl: string; +}; + +export type ImmichAsset = { + id: string; + fileName: string; + thumbnailUrl: string; + takenAt: string; +}; + +export type ImmichAssetsPage = { + items: ImmichAsset[]; + page: number; + hasMore: boolean; +}; + const demoState: WallpaperState = { imageCount: 3, enabled: true, @@ -38,6 +64,7 @@ const demoState: WallpaperState = { const inTauri = () => "__TAURI_INTERNALS__" in window; const demoCrops = new Map>(); const defaultCrop = { cropMode: "cover" as const, cropZoom: 1, cropPositionX: 0.5, cropPositionY: 0.5 }; +let demoImmichConnection: ImmichConnection = { configured: false, serverUrl: "", userName: "" }; export async function getState(): Promise { return inTauri() ? invoke("plugin:wallpaper|get_state") : demoState; @@ -123,3 +150,44 @@ export async function nextWallpaper(): Promise { } return invoke("plugin:wallpaper|next_wallpaper"); } + +export async function getImmichConnection(): Promise { + return inTauri() ? invoke("plugin:wallpaper|get_immich_connection") : demoImmichConnection; +} + +export async function connectImmich(serverUrl: string, apiKey: string): Promise { + if (inTauri()) return invoke("plugin:wallpaper|connect_immich", { serverUrl, apiKey }); + if (!serverUrl.trim() || !apiKey.trim()) throw new Error("Missing Immich credentials"); + demoImmichConnection = { configured: true, serverUrl: serverUrl.trim(), userName: "Demo User" }; + return demoImmichConnection; +} + +export async function disconnectImmich(): Promise { + if (inTauri()) return invoke("plugin:wallpaper|disconnect_immich"); + demoImmichConnection = { configured: false, serverUrl: "", userName: "" }; + return demoImmichConnection; +} + +export async function getImmichAlbums(): Promise { + if (inTauri()) return (await invoke<{ albums: ImmichAlbum[] }>("plugin:wallpaper|get_immich_albums")).albums; + return [{ id: "demo-album", name: "Nature", assetCount: 3, thumbnailUrl: "/wallpapers/alpine.png" }]; +} + +export async function getImmichAssets(albumId: string | null, page = 1, size = 30): Promise { + if (inTauri()) return invoke("plugin:wallpaper|get_immich_assets", { albumId, page, size }); + return { + items: demoState.imageUrls.map((thumbnailUrl, index) => ({ + id: `00000000-0000-4000-8000-00000000000${index}`, + fileName: `wallpaper-${index + 1}.jpg`, + thumbnailUrl, + takenAt: "2026-08-21T12:00:00Z", + })), + page, + hasMore: false, + }; +} + +export async function importImmichAssets(ids: string[]): Promise { + if (inTauri()) return invoke("plugin:wallpaper|import_immich_assets", { ids }); + return { ...demoState, imageUrls: [...demoState.imageUrls] }; +} diff --git a/src/styles.css b/src/styles.css index cfb652a..02d5ddd 100644 --- a/src/styles.css +++ b/src/styles.css @@ -77,6 +77,39 @@ h2 { margin: 0; font-size: 21px; letter-spacing: -.6px; } .info { margin-top: 28px; padding: 20px; background: #eaf2e8; border-radius: 20px; } .info h3 { color: var(--green); margin: 0 0 6px; font-size: 16px; } .info p { margin: 0; font-size: 13px; line-height: 1.55; color: #526158; } +.immich-settings { margin-top: 24px; padding: 18px; border: 1px solid #d5dfd5; border-radius: 20px; background: white; box-shadow: 0 8px 24px rgba(24,56,35,.06); } +.immich-title { display: flex; gap: 12px; align-items: center; margin-bottom: 16px; } +.immich-title > span { width: 42px; height: 42px; flex: 0 0 auto; display: grid; place-items: center; border-radius: 13px; color: white; background: var(--green); } +.immich-title svg { width: 22px; } +.immich-title h3 { margin: 0 0 3px; font-size: 18px; } +.immich-title p { margin: 0; color: #69736c; font-size: 12px; line-height: 1.4; } +.immich-field { display: block; margin-top: 13px; } +.immich-field > span { display: block; margin-bottom: 6px; color: #526158; font-size: 11px; font-weight: 750; } +.immich-field > div { position: relative; } +.immich-field svg { position: absolute; left: 12px; top: 50%; width: 17px; color: #63806b; transform: translateY(-50%); } +.immich-field input { width: 100%; height: 46px; padding: 0 12px; border: 1px solid #c7d4c9; border-radius: 12px; color: #18201b; background: #fbfcfa; font-size: 13px; } +.immich-field div input { padding-left: 38px; } +.immich-field input:focus { outline: 2px solid rgba(20,93,50,.18); border-color: var(--green); } +.immich-help, .immich-warning { margin: 7px 2px 0; color: #748078; font-size: 10px; line-height: 1.4; } +.immich-warning { padding: 8px 10px; border-radius: 9px; color: #795518; background: #fff4d7; } +.immich-connect, .immich-open { width: 100%; height: 48px; margin-top: 15px; border: 0; border-radius: 13px; display: flex; align-items: center; justify-content: center; gap: 8px; color: white; background: var(--green); font-size: 13px; font-weight: 800; } +.immich-connect:disabled, .immich-open:disabled, .immich-disconnect:disabled { opacity: .55; } +.immich-connect svg, .immich-open svg, .immich-disconnect svg { width: 18px; } +.immich-open svg:last-child { margin-left: auto; } +.immich-open { padding: 0 14px; } +.immich-connected { padding: 12px; border-radius: 12px; background: var(--sage); display: flex; flex-direction: column; gap: 3px; } +.immich-connected strong { color: var(--green); font-size: 12px; } +.immich-connected span { overflow: hidden; color: #647069; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } +.immich-disconnect { width: 100%; height: 40px; margin-top: 8px; border: 0; border-radius: 11px; color: #7a3434; background: #f5eaea; display: flex; align-items: center; justify-content: center; gap: 7px; font-size: 11px; font-weight: 750; } +.immich-header .import-selection { color: white; background: var(--green); } +.immich-browser { padding-bottom: max(24px, env(safe-area-inset-bottom)); } +.immich-album-filter { display: block; margin-bottom: 10px; } +.immich-album-filter > span { display: block; margin: 0 0 6px 2px; color: #6a756d; font-size: 10px; font-weight: 750; text-transform: uppercase; letter-spacing: .8px; } +.immich-album-filter select { width: 100%; height: 45px; padding: 0 38px 0 12px; border: 1px solid #c8d5ca; border-radius: 13px; color: var(--green); background: white; font-size: 13px; font-weight: 750; } +.immich-grid article { aspect-ratio: 1; } +.immich-placeholder { width: 100%; height: 100%; display: grid; place-items: center; color: #78907d; background: var(--sage); } +.immich-placeholder svg { width: 28px; } +.immich-import { position: sticky; z-index: 4; bottom: max(16px, env(safe-area-inset-bottom)); margin-bottom: 0; box-shadow: 0 10px 30px rgba(20,93,50,.3); } nav { position: fixed; z-index: 10; bottom: 0; left: 50%; transform: translateX(-50%); width: min(100%, 480px); height: calc(76px + env(safe-area-inset-bottom)); padding: 8px 34px env(safe-area-inset-bottom); background: rgba(248,250,247,.96); backdrop-filter: blur(16px); border-top: 1px solid var(--line); display: grid; grid-template-columns: 1fr 1fr; gap: 20px; } nav button { border: 0; color: #657068; background: transparent; border-radius: 18px; display: flex; flex-direction: column; justify-content: center; align-items: center; gap: 3px; font-size: 11px; font-weight: 650; } nav button.active { color: var(--green); background: var(--sage); }