diff --git a/httui-core/src/block_examples.rs b/httui-core/src/block_examples.rs index 5d8b34bb..9d63db24 100644 --- a/httui-core/src/block_examples.rs +++ b/httui-core/src/block_examples.rs @@ -1,4 +1,4 @@ -//! Pinned response examples per HTTP block — Onda 3. +//! Pinned response examples per HTTP block. //! //! Examples are user-curated snapshots ("happy path 200", "422 invalid //! email"). Unlike the cache (`block_results`) they survive cache diff --git a/httui-core/src/block_history/mod.rs b/httui-core/src/block_history/mod.rs index 3b909372..2b04b22d 100644 --- a/httui-core/src/block_history/mod.rs +++ b/httui-core/src/block_history/mod.rs @@ -21,9 +21,7 @@ const DEFAULT_HISTORY_CAP: i64 = 10; const RETENTION_KEY: &str = "history_retention"; /// Read the user-configured history retention from `app_config`, falling -/// back to the default. Values <= 0 are treated as the default — to fully -/// disable history the per-block `history_disabled` flag is the right -/// switch (Onda 1). +/// back to the default. Values <= 0 are treated as the default. async fn get_retention(pool: &SqlitePool) -> i64 { let row: Option = sqlx::query_scalar("SELECT value FROM app_config WHERE key = ?") .bind(RETENTION_KEY) @@ -64,7 +62,6 @@ pub async fn insert_history_entry( .execute(pool) .await?; - // Trim to the retention cap (user-configurable via app_config; default 10). let cap = get_retention(pool).await; sqlx::query( "DELETE FROM block_run_history @@ -242,7 +239,6 @@ mod tests { .connect("sqlite::memory:") .await .unwrap(); - // Apply the migration manually for tests. sqlx::query( "CREATE TABLE block_run_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, @@ -522,7 +518,6 @@ mod tests { #[tokio::test] async fn list_history_for_file_aggregates_across_aliases() { let pool = setup().await; - // Insert 2 entries for alpha + 1 for beta in the same file. let mut a = entry("GET", 200); a.block_alias = "alpha".into(); insert_history_entry(&pool, a.clone()).await.unwrap(); @@ -530,7 +525,6 @@ mod tests { let mut b = entry("POST", 201); b.block_alias = "beta".into(); insert_history_entry(&pool, b).await.unwrap(); - // A row in a different file shouldn't surface. let mut other = entry("GET", 200); other.file_path = "/other.md".into(); other.block_alias = "alpha".into(); @@ -566,7 +560,6 @@ mod tests { .await .unwrap(); } - // limit <= 0 → effective fallback of 50; 3 inserted rows fit easily. let rows = list_history_for_file(&pool, "/notes/test.md", 0) .await .unwrap(); @@ -603,7 +596,6 @@ mod tests { .await .unwrap(); } - // 2 rows fits the default cap (10) with room to spare. let rows = list_history(&pool, "/notes/test.md", "req1").await.unwrap(); assert_eq!(rows.len(), 2); @@ -620,7 +612,6 @@ mod tests { .unwrap(); } let rows = list_history(&pool, "/notes/test.md", "req1").await.unwrap(); - // 4 inserted total, default cap is 10 — all 4 visible. assert_eq!(rows.len(), 4); } } diff --git a/httui-core/src/block_results.rs b/httui-core/src/block_results.rs index f21e3cab..14992d3b 100644 --- a/httui-core/src/block_results.rs +++ b/httui-core/src/block_results.rs @@ -4,8 +4,6 @@ use sqlx::sqlite::SqlitePool; use sqlx::Row; /// Compute a block hash that includes content + environment + connection context. -/// This ensures cache invalidation when environment or connection changes (T31), -/// and moves hash computation server-side so frontend cannot spoof it (T35). pub fn compute_block_hash( content: &str, environment_id: Option<&str>, @@ -87,8 +85,9 @@ pub async fn save_block_result( Ok(()) } -/// T38: Try to acquire an execution lock for a block. -/// Returns true if lock was acquired (caller should execute), false if another execution is in progress. +/// Try to acquire an execution lock for a block. Returns `true` if +/// acquired (caller should execute), `false` if another execution is +/// already in progress. pub async fn try_acquire_execution_lock( pool: &SqlitePool, file_path: &str, @@ -107,7 +106,7 @@ pub async fn try_acquire_execution_lock( Ok(result.rows_affected() > 0) } -/// T38: Release an execution lock after block execution completes. +/// Release an execution lock after block execution completes. pub async fn release_execution_lock( pool: &SqlitePool, file_path: &str, @@ -121,7 +120,7 @@ pub async fn release_execution_lock( Ok(()) } -/// T38: Clean up stale execution locks (older than 60 seconds — execution timed out or crashed). +/// Clean up stale execution locks older than 60 seconds (timed out or crashed). pub async fn cleanup_stale_locks(pool: &SqlitePool) -> Result<(), sqlx::Error> { sqlx::query( "DELETE FROM block_execution_locks WHERE locked_at < datetime('now', '-60 seconds')", diff --git a/httui-core/src/block_settings.rs b/httui-core/src/block_settings.rs index 7291b054..ec9d2efb 100644 --- a/httui-core/src/block_settings.rs +++ b/httui-core/src/block_settings.rs @@ -1,4 +1,4 @@ -//! Per-block settings — Onda 1 of the HTTP block redesign. +//! Per-block settings for HTTP blocks. //! //! Stores transport/UX flags that the user toggles in the block drawer, //! keyed by `(file_path, block_alias)`. Stored separately from the fence diff --git a/httui-core/src/blocks/db_export.rs b/httui-core/src/blocks/db_export.rs index 505c9a45..7f2b3a5f 100644 --- a/httui-core/src/blocks/db_export.rs +++ b/httui-core/src/blocks/db_export.rs @@ -18,8 +18,6 @@ use crate::db::connections::ColumnInfo; use serde_json::Value; -// ─── CSV ──────────────────────────────────────────────────────────── - /// RFC 4180-ish CSV. Quotes any field containing CR, LF, comma, or /// double-quote; doubles internal quotes. `null` values become empty /// fields (NOT the literal string "null") so spreadsheets see a real @@ -66,8 +64,6 @@ fn format_cell_csv(value: Option<&Value>) -> String { } } -// ─── JSON ─────────────────────────────────────────────────────────── - /// Pretty-printed JSON array of row objects. Trailing newline included /// so writing the result to a file leaves a POSIX-friendly final byte. pub fn to_json(rows: &[Value]) -> String { @@ -76,8 +72,6 @@ pub fn to_json(rows: &[Value]) -> String { s } -// ─── Markdown table ───────────────────────────────────────────────── - /// GitHub-flavored Markdown table. Pipes and backslashes inside cells /// are escaped so the table stays syntactically valid; embedded /// newlines become spaces so each cell stays on one row. @@ -125,8 +119,6 @@ fn format_cell_md(value: Option<&Value>) -> String { } } -// ─── INSERT statements ───────────────────────────────────────────── - /// Emit one `INSERT INTO (cols) VALUES (...)` per row. Strings /// get SQL-quoted with single quotes (escaping internal `'` by /// doubling). Objects/arrays are serialized as JSON and stored inside @@ -201,8 +193,6 @@ fn sql_literal(value: Option<&Value>) -> String { } } -// ─── Table-name inference ───────────────────────────────────────── - /// Best-effort pull of a table name from a SQL query: first identifier /// after the first `FROM` keyword (case-insensitive). Used as the /// default for INSERT export. Returns `None` when no `FROM` clause is @@ -282,8 +272,6 @@ fn strip_sql_comments(sql: &str) -> String { out } -// ─── Convenience ───────────────────────────────────────────────── - /// `true` when there's at least one column AND one row to serialize. /// Callers gate the export menu on this so an empty result set /// doesn't produce a header-only CSV / empty markdown table. @@ -307,8 +295,6 @@ mod tests { names.iter().map(|n| col(n)).collect() } - // ─── CSV ───── - #[test] fn csv_emits_header_then_rows() { let c = cols(&["id", "name"]); @@ -353,8 +339,6 @@ mod tests { assert!(csv.contains("\"{\"\"a\"\":1}\""), "got: {csv}"); } - // ─── JSON ───── - #[test] fn json_pretty_array_with_trailing_newline() { let rows = vec![json!({"id": 1})]; @@ -364,8 +348,6 @@ mod tests { assert!(s.contains("\"id\": 1")); } - // ─── Markdown ───── - #[test] fn markdown_emits_header_separator_and_rows() { let c = cols(&["id", "name"]); @@ -394,8 +376,6 @@ mod tests { assert!(!md.contains("line1\nline2")); } - // ─── INSERT ───── - #[test] fn inserts_basic_row() { let c = cols(&["id", "name"]); @@ -466,8 +446,6 @@ mod tests { assert!(sql.contains("(\"weird name\")")); } - // ─── infer_table_name ───── - #[test] fn infer_simple_select() { assert_eq!( @@ -525,8 +503,6 @@ mod tests { assert_eq!(infer_table_name(sql), Some("foods".into())); } - // ─── has_exportable_rows ───── - #[test] fn empty_result_not_exportable() { assert!(!has_exportable_rows(&[], &[])); diff --git a/httui-core/src/blocks/http_codegen.rs b/httui-core/src/blocks/http_codegen.rs index 8dd38855..3113c9ef 100644 --- a/httui-core/src/blocks/http_codegen.rs +++ b/httui-core/src/blocks/http_codegen.rs @@ -101,8 +101,6 @@ fn read_body(params: &Value) -> String { .to_string() } -// ─── shell single-quoting ─────────────────────────────────────────── - /// Wrap a value in POSIX-shell single quotes, escaping any internal /// single quotes by closing the quoted run, emitting an escaped quote, /// and reopening — the standard `'…'\''…'` trick. @@ -110,8 +108,6 @@ fn shell_single_quote(s: &str) -> String { format!("'{}'", s.replace('\'', "'\\''")) } -// ─── cURL ─────────────────────────────────────────────────────────── - pub fn to_curl(params: &Value) -> String { let method = read_method(params); let url = build_url_with_query(params); @@ -127,8 +123,6 @@ pub fn to_curl(params: &Value) -> String { lines.join(" \\\n") } -// ─── fetch (JavaScript) ───────────────────────────────────────────── - fn js_string(s: &str) -> String { let mut out = String::with_capacity(s.len() + 2); out.push('\''); @@ -167,8 +161,6 @@ pub fn to_fetch(params: &Value) -> String { lines.join("\n") } -// ─── Python requests ──────────────────────────────────────────────── - fn py_string(s: &str) -> String { // Identical escape rules to `js_string` for the chars we care // about (\, ', \n). Python's single-quoted literal rules match. @@ -213,8 +205,6 @@ pub fn to_python(params: &Value) -> String { lines.join("\n") } -// ─── HTTPie ───────────────────────────────────────────────────────── - pub fn to_httpie(params: &Value) -> String { let method = read_method(params); let url = params @@ -244,12 +234,9 @@ pub fn to_httpie(params: &Value) -> String { tokens.join(" ") } -// ─── .http file ───────────────────────────────────────────────────── - /// Emit the canonical HTTP-message body the user can paste into a /// `.http` / `.rest` file (REST Client extension, JetBrains HTTP -/// Client, etc). One request per file — multi-request files separated -/// by `###` are out of scope for V1. +/// Client, etc). One request per file. pub fn to_http_file(params: &Value) -> String { let method = read_method(params); let url = params @@ -308,8 +295,6 @@ mod tests { }) } - // ─── cURL ───── - #[test] fn curl_emits_method_url_headers_body() { let curl = to_curl(&fixture()); @@ -348,8 +333,6 @@ mod tests { assert!(s.contains("'it'\\''s'"), "got: {s}"); } - // ─── fetch ───── - #[test] fn fetch_emits_method_headers_body() { let s = to_fetch(&fixture()); @@ -360,8 +343,6 @@ mod tests { assert!(s.contains("body: '{\\'name\\':\\'alice\\'}',") || s.contains("body: ")); } - // ─── Python ───── - #[test] fn python_emits_imports_and_call() { let s = to_python(&fixture()); @@ -390,8 +371,6 @@ mod tests { assert!(!s.contains("data=")); } - // ─── HTTPie ───── - #[test] fn httpie_emits_request_items() { let s = to_httpie(&fixture()); @@ -404,8 +383,6 @@ mod tests { assert!(s.contains("--raw=")); } - // ─── .http file ───── - #[test] fn http_file_emits_request_line_headers_body() { let s = to_http_file(&fixture()); @@ -432,8 +409,6 @@ mod tests { assert_eq!(s, "GET https://x\nX: 1\n"); } - // ─── encoding sanity ───── - #[test] fn query_encoding_percent_encodes_spaces_and_specials() { let v = json!({ diff --git a/httui-core/src/blocks/http_normalize.rs b/httui-core/src/blocks/http_normalize.rs index b230aa01..3bd0e7c4 100644 --- a/httui-core/src/blocks/http_normalize.rs +++ b/httui-core/src/blocks/http_normalize.rs @@ -55,8 +55,6 @@ pub fn normalize_http_blocks(markdown: &str) -> String { continue; } - // Opening fence — emit it and consume body lines up to the next - // closing fence (or EOF). out.push(line.to_string()); i += 1; @@ -70,22 +68,17 @@ pub fn normalize_http_blocks(markdown: &str) -> String { match try_normalize_legacy(&body) { Some(canonical) => { - // Re-emit canonical body line-by-line; preserves the - // join-on-newline contract. for nl in canonical.split('\n') { out.push(nl.to_string()); } } None => { - // Not legacy → preserve original bytes. (split+push is a - // no-op on the body's internal newlines.) for nl in &lines[body_start..body_end] { out.push((*nl).to_string()); } } } - // Emit closing fence (if found) and advance past it. if i < lines.len() { out.push(lines[i].to_string()); i += 1; @@ -284,8 +277,6 @@ mod tests { #[test] fn rewrites_real_world_block_from_bug_report() { - // Mirrors the exact body shape from the user's screenshot — escapes the - // newline in `body` and uses `{{...}}` placeholders. let md = concat!( "```http alias=testd\n", "{\"body\":\"asdf=asdf\\nasdffdsa=asdf\",\"headers\":[{\"key\":\"Teste\",\"value\":\"{{BASE_URL}}\"},{\"key\":\"Content-Type\",\"value\":\"multipart/form-data\"}],\"method\":\"POST\",\"params\":[{\"key\":\"page\",\"value\":\"{{BASE_URL}}\"}],\"url\":\"https://httpbin.org/post\"}\n", diff --git a/httui-core/src/blocks/parser.rs b/httui-core/src/blocks/parser.rs index ca3d21c4..196f60c4 100644 --- a/httui-core/src/blocks/parser.rs +++ b/httui-core/src/blocks/parser.rs @@ -36,14 +36,12 @@ pub fn parse_blocks(markdown: &str) -> Vec { let line = lines[i]; let trimmed = line.trim(); - // Detect opening fence (``` with info string) if let Some(info) = strip_fence_open(trimmed) { let (block_type, attrs) = parse_info_string(info); if EXECUTABLE_TYPES.contains(&block_type.as_str()) { let line_start = i; - // Collect body lines until closing fence let mut body_lines = Vec::new(); i += 1; while i < lines.len() { @@ -615,8 +613,6 @@ not valid json assert!(blocks.is_empty()); } - // ───── New DB fence format (raw SQL body) ───── - #[test] fn test_parse_db_new_format_raw_sql() { let md = r#"```db-postgres alias=db1 connection=prod limit=100 timeout=30000 display=split @@ -682,8 +678,6 @@ WHERE id > 10 assert!(blocks[0].params.get("timeout_ms").is_none()); } - // ───── Legacy JSON body format — must keep working ───── - #[test] fn test_parse_db_legacy_format_still_works() { let md = r#"```db-postgres alias=users displayMode=split @@ -714,8 +708,6 @@ WHERE id > 10 assert_eq!(blocks[0].params["fetch_size"], 50); } - // ───── Heuristic edge cases ───── - #[test] fn test_parse_db_json_without_query_field_is_treated_as_sql() { // Body is JSON-looking but has no `query` string → treated as raw SQL. @@ -749,8 +741,6 @@ WHERE id > 10 assert_eq!(blocks[0].params["query"], "SELECT 1"); } - // ───── Non-db blocks must not be affected ───── - #[test] fn test_http_block_body_still_parsed_as_json() { let md = r#"```http alias=x @@ -772,8 +762,6 @@ WHERE id > 10 assert_eq!(blocks[0].params["url"], ""); } - // ───── New HTTP fence format (HTTP message body) ───── - #[test] fn test_parse_http_new_format_get_simple() { let md = "```http alias=req1\nGET https://api.example.com/users\n```\n"; @@ -906,8 +894,6 @@ Authorization: Bearer x assert_eq!(blocks[0].params["url"], ""); } - // ───── Legacy HTTP JSON body — must keep working ───── - #[test] fn test_parse_http_legacy_format_still_works() { let md = r#"```http alias=login displayMode=split diff --git a/httui-core/src/blocks/serializer.rs b/httui-core/src/blocks/serializer.rs index 1ad88963..59e630f6 100644 --- a/httui-core/src/blocks/serializer.rs +++ b/httui-core/src/blocks/serializer.rs @@ -76,7 +76,6 @@ fn serialize_http_block(block: &ParsedBlock) -> String { .and_then(|v| v.as_str()) .unwrap_or(""); - // Build the request line: METHOD URL?key=value&key=value. let mut request_line = String::new(); request_line.push_str(&method); request_line.push(' '); @@ -90,7 +89,6 @@ fn serialize_http_block(block: &ParsedBlock) -> String { request_line.push_str(&query_string); } - // Headers: one per line, in insertion order. let mut header_lines = String::new(); for h in headers { let key = h.get("key").and_then(|v| v.as_str()).unwrap_or(""); @@ -107,10 +105,6 @@ fn serialize_http_block(block: &ParsedBlock) -> String { let mut body_block = String::new(); let trimmed_body = body.trim_end_matches('\n'); if !trimmed_body.is_empty() { - // Blank separator before the body, mirroring the HTTP wire - // format. The body itself preserves whatever the user wrote - // — JSON, form-data, multipart, plain text — without - // re-encoding. body_block.push_str("\n\n"); body_block.push_str(trimmed_body); } @@ -233,8 +227,6 @@ mod tests { assert_eq!(s1, s2, "serialization must be idempotent"); } - // ─── Roundtrip across all 3 block types ─── - #[test] fn roundtrip_http_simple() { let md = "```http alias=login\n{\"method\":\"POST\",\"url\":\"https://api.test.com/login\",\"params\":[],\"headers\":[],\"body\":\"\"}\n```\n"; @@ -277,8 +269,6 @@ mod tests { assert_idempotent(md); } - // ─── DB info-string canonical order ─── - #[test] fn db_info_string_emits_canonical_order() { let parsed = parse_blocks( @@ -314,8 +304,6 @@ mod tests { ); } - // ─── HTTP canonical form (HTTP-message body) ─── - #[test] fn http_emits_request_line_with_method_and_url() { let parsed = parse_blocks("```http alias=h\nGET https://example.com/users\n```\n"); @@ -382,8 +370,6 @@ mod tests { assert_eq!(reparsed.len(), 1); } - // ─── Forward-compat for unknown types ─── - #[test] fn unknown_block_type_serializes_as_json() { // Future block types (e.g. graphql) without a dedicated serializer diff --git a/httui-core/src/connection_uses.rs b/httui-core/src/connection_uses.rs index 5e8e45ea..1598277e 100644 --- a/httui-core/src/connection_uses.rs +++ b/httui-core/src/connection_uses.rs @@ -1,4 +1,4 @@ -//! Vault-wide grep for "which runbook uses connection X" (V4. +//! Vault-wide grep for "which runbook uses connection X". //! //! Walks `.md` files in the vault, scans for db-block fenced-code //! info strings, and records every fence whose `connection=` @@ -95,8 +95,7 @@ fn rel_to_posix(rel: &Path) -> String { /// True iff `line` is a db-block fence opener whose info-string /// carries `connection=` as a whitespace-delimited -/// token. Matches at the start of the line only (markdown fence -/// openers begin column 0 in the V1 vault format) and does prefix +/// token. Matches at the start of the line only and does prefix /// matching on `db-` so all dialects (`db`, `db-postgres`, /// `db-mysql`, `db-sqlite`) are covered. fn line_matches_connection(line: &str, connection_name: &str) -> bool { diff --git a/httui-core/src/db/chat.rs b/httui-core/src/db/chat.rs index bf8b1f1f..23e154be 100644 --- a/httui-core/src/db/chat.rs +++ b/httui-core/src/db/chat.rs @@ -2,8 +2,6 @@ use serde::{Deserialize, Serialize}; use sqlx::sqlite::SqlitePool; use sqlx::Row; -// ── Types ──────────────────────────────────────────────────────────── - #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Session { pub id: i64, @@ -40,8 +38,6 @@ pub struct ToolCall { pub created_at: i64, } -// ── Row mappers ────────────────────────────────────────────────────── - fn row_to_session(row: &sqlx::sqlite::SqliteRow) -> Session { Session { id: row.get("id"), @@ -81,8 +77,6 @@ fn row_to_tool_call(row: &sqlx::sqlite::SqliteRow) -> ToolCall { } } -// ── Session CRUD ───────────────────────────────────────────────────── - pub async fn create_session(pool: &SqlitePool, cwd: Option) -> Result { let row = sqlx::query("INSERT INTO sessions (cwd) VALUES (?) RETURNING *") .bind(&cwd) @@ -159,8 +153,6 @@ pub async fn update_session_title( Ok(()) } -// ── Message CRUD ───────────────────────────────────────────────────── - pub async fn insert_message( pool: &SqlitePool, session_id: i64, @@ -170,7 +162,6 @@ pub async fn insert_message( tokens_out: Option, is_partial: bool, ) -> Result { - // Get next turn_index for this session let max_turn: Option = sqlx::query_scalar("SELECT MAX(turn_index) FROM messages WHERE session_id = ?") .bind(session_id) @@ -194,7 +185,6 @@ pub async fn insert_message( .await .map_err(|e| format!("Failed to insert message: {e}"))?; - // Touch session updated_at let _ = sqlx::query("UPDATE sessions SET updated_at = unixepoch() WHERE id = ?") .bind(session_id) .execute(pool) @@ -217,7 +207,6 @@ pub async fn list_messages(pool: &SqlitePool, session_id: i64) -> Result Result> = std::collections::HashMap::new(); for row in &tc_rows { @@ -260,8 +248,6 @@ pub async fn list_messages(pool: &SqlitePool, session_id: i64) -> Result Re Ok(()) } -// ── Usage stats ───────────────────────────────────────────────────── - #[derive(Debug, Clone, Serialize, Deserialize)] pub struct DailyUsage { pub date: String, @@ -492,8 +474,6 @@ pub async fn get_usage_by_date_range( .collect()) } -// ── Tests ──────────────────────────────────────────────────────────── - #[cfg(test)] mod tests { use super::*; @@ -684,7 +664,6 @@ mod tests { .await .unwrap(); - // Delete session directly sqlx::query("DELETE FROM sessions WHERE id = ?") .bind(session.id) .execute(&pool) diff --git a/httui-core/src/db/connections.rs b/httui-core/src/db/connections.rs index 94f07024..e40ca081 100644 --- a/httui-core/src/db/connections.rs +++ b/httui-core/src/db/connections.rs @@ -3,22 +3,13 @@ use sqlx::sqlite::SqlitePool; use sqlx::Row; use uuid::Uuid; -// Pool lifecycle + status emission moved to `db::pool_manager` -// Re-exported here so the existing -// `use httui_core::db::connections::{PoolManager, StatusEmitter}` -// callers keep compiling without a sweeping import rewrite. pub use super::pool_manager::{HostPortOverride, PoolManager, StatusEmitter}; -// `DatabasePool` enum + lifecycle helpers (`create_pool`, builders, -// validators, sanitizer) moved to `db::pool`. Re-exported here so -// existing imports compile. #[cfg(test)] use super::pool::validate_bind_values; use super::pool::validate_sqlite_path; pub use super::pool::DatabasePool; -// --- Connection model --- - #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Connection { pub id: String, @@ -125,16 +116,11 @@ pub struct UpdateConnection { pub is_readonly: Option, } -// Query error sanitization + location extraction moved to -// `db::query_error`. Re-exports -// keep existing imports compiling. pub(crate) use super::query_error::sanitize_query_error; pub use super::query_error::{ enrich_error_with_query, sanitize_query_error_rich, QueryErrorInfo, QueryErrorLocation, }; -// --- Row mapping --- - fn row_to_connection(row: &sqlx::sqlite::SqliteRow) -> Connection { Connection { id: row.get("id"), @@ -161,8 +147,6 @@ fn row_to_connection(row: &sqlx::sqlite::SqliteRow) -> Connection { } } -// --- CRUD functions --- - pub async fn list_connections(pool: &SqlitePool) -> Result, String> { let rows = sqlx::query( r#"SELECT @@ -355,8 +339,6 @@ pub async fn delete_connection(pool: &SqlitePool, id: &str) -> Result<(), String Ok(()) } -// --- Validation --- - fn validate_connection_fields( driver: &str, host: &Option, @@ -385,21 +367,12 @@ fn validate_connection_fields( Ok(()) } -// Query execution dispatcher + DTOs + bind validation moved to -// `db::pool`. Re-exports keep -// `httui_core::db::connections::{QueryResult, ColumnInfo, JsonRow}` -// working for downstream consumers (executor/db, blocks/db_export). pub use super::pool::{ColumnInfo, JsonRow, QueryResult}; pub(crate) use super::pool_exec_sqlite::sqlite_row_to_json; -// SQL scanner + statement splitter + placeholder helpers moved to -// `db::sql_scanner`. Re-exports -// keep existing imports compiling. pub(crate) use super::sql_scanner::contains_multiple_statements; pub use super::sql_scanner::{count_placeholders, normalize_placeholders_to_pg, split_statements}; -// --- Tests --- - #[cfg(test)] mod tests { use super::*; @@ -568,11 +541,6 @@ mod tests { assert!(result.unwrap_err().contains("database_name")); } - // build_pg_connect_options / validate_sqlite_path / - // validate_mysql_database_name / normalize_placeholders tests - // moved alongside the implementations (`db::pool` and - // `db::sql_scanner`). - #[tokio::test] async fn test_execute_select_sqlite() { let pool = SqlitePool::connect("sqlite::memory:").await.unwrap(); @@ -687,15 +655,6 @@ mod tests { assert_eq!(result.rows[0][1], serde_json::json!("charlie")); } - // Pool config validation tests moved to `db::pool::tests`. - - // SQL-scanner / split_statements / contains_multiple_statements - // tests moved to `db::sql_scanner::tests` along with the - // implementations. - - // QueryErrorLocation / position_to_line_col / mysql_line_from_message - // tests moved to `db::query_error::tests` along with the functions. - #[tokio::test] async fn test_explain_analyze_delete_rejected() { let pool = SqlitePool::connect("sqlite::memory:").await.unwrap(); @@ -782,9 +741,6 @@ mod tests { } } - // normalize_placeholders / count_placeholders unit tests moved - // to `db::sql_scanner::tests` along with the implementations. - #[tokio::test] async fn test_multi_statement_rejected_in_execute() { let pool = SqlitePool::connect("sqlite::memory:").await.unwrap(); @@ -800,8 +756,6 @@ mod tests { assert!(result.unwrap_err().contains("Multi-statement")); } - // --- Phase 4: Bind parameter safety tests --- - #[test] fn test_validate_bind_rejects_array() { let vals = vec![serde_json::json!(1), serde_json::json!([2, 3])]; diff --git a/httui-core/src/db/driver.rs b/httui-core/src/db/driver.rs index ed29c0b0..0a5bb837 100644 --- a/httui-core/src/db/driver.rs +++ b/httui-core/src/db/driver.rs @@ -18,8 +18,6 @@ //! `Connection` enum but don't go through the SQL pool, so they //! aren't represented here. `DbDriver::from_str` returns an `Err` //! for them. -//! -//! Added to address `tech-debt.md` code-smell #1. use std::fmt; use std::str::FromStr; diff --git a/httui-core/src/db/environments.rs b/httui-core/src/db/environments.rs index 67f4c64b..478e40d2 100644 --- a/httui-core/src/db/environments.rs +++ b/httui-core/src/db/environments.rs @@ -143,7 +143,6 @@ pub async fn duplicate_environment( return Err("Environment name is required".to_string()); } - // Verify source exists let source = sqlx::query("SELECT * FROM environments WHERE id = ?") .bind(source_id) .fetch_optional(pool) @@ -152,7 +151,6 @@ pub async fn duplicate_environment( .ok_or("Source environment not found")?; let _ = row_to_environment(&source); - // Create new environment let new_env = create_environment(pool, new_name).await?; // Copy variables — read raw rows to avoid resolving secrets to plaintext @@ -178,7 +176,6 @@ pub async fn duplicate_environment( .ok_or_else(|| format!("Secret not found in keychain for {key}"))?; keychain::store_secret(&dest_key, &secret) .map_err(|e| format!("Failed to copy secret for {key}: {e}"))?; - // Insert with sentinel directly let var_id = uuid::Uuid::new_v4().to_string(); sqlx::query( "INSERT INTO env_variables (id, environment_id, key, value, is_secret) VALUES (?, ?, ?, ?, ?)", @@ -200,13 +197,11 @@ pub async fn duplicate_environment( } pub async fn set_active_environment(pool: &SqlitePool, id: Option<&str>) -> Result<(), String> { - // Deactivate all sqlx::query("UPDATE environments SET is_active = 0") .execute(pool) .await .map_err(|e| format!("Failed to deactivate environments: {e}"))?; - // Activate selected (if any) if let Some(id) = id { let result = sqlx::query("UPDATE environments SET is_active = 1 WHERE id = ?") .bind(id) @@ -386,13 +381,11 @@ mod tests { assert!(envs.iter().find(|e| e.id == env1.id).unwrap().is_active); assert!(!envs.iter().find(|e| e.id == env2.id).unwrap().is_active); - // Switch to env2 set_active_environment(&pool, Some(&env2.id)).await.unwrap(); let envs = list_environments(&pool).await.unwrap(); assert!(!envs.iter().find(|e| e.id == env1.id).unwrap().is_active); assert!(envs.iter().find(|e| e.id == env2.id).unwrap().is_active); - // Deactivate all set_active_environment(&pool, None).await.unwrap(); let envs = list_environments(&pool).await.unwrap(); assert!(envs.iter().all(|e| !e.is_active)); @@ -406,7 +399,6 @@ mod tests { .await .unwrap(); - // Create let var = set_env_variable( &pool, &env.id, @@ -419,7 +411,6 @@ mod tests { assert_eq!(var.key, "BASE_URL"); assert_eq!(var.value, "http://localhost:3000"); - // List let vars = list_env_variables(&pool, &env.id).await.unwrap(); assert_eq!(vars.len(), 1); @@ -439,7 +430,6 @@ mod tests { let vars = list_env_variables(&pool, &env.id).await.unwrap(); assert_eq!(vars.len(), 1); // still 1, not 2 - // Delete delete_env_variable(&pool, &var.id).await.unwrap(); let vars = list_env_variables(&pool, &env.id).await.unwrap(); assert!(vars.is_empty()); diff --git a/httui-core/src/db/mod.rs b/httui-core/src/db/mod.rs index f6cacfa9..0afecdbc 100644 --- a/httui-core/src/db/mod.rs +++ b/httui-core/src/db/mod.rs @@ -55,7 +55,7 @@ pub async fn init_db(app_data_dir: &Path) -> Result { run_migrations(&pool).await?; - // T33: Restrict file permissions on Unix (owner-only read/write) + // Restrict file permissions on Unix (owner-only read/write). #[cfg(unix)] { use std::os::unix::fs::PermissionsExt; @@ -67,8 +67,7 @@ pub async fn init_db(app_data_dir: &Path) -> Result { Ok(pool) } -// --- Internal DB query (read-only, for audit/settings UI) --- - +// Internal DB query — read-only, for audit/settings UI. const MAX_INTERNAL_FETCH_SIZE: u32 = 500; const MAX_INTERNAL_OFFSET: u32 = 100_000; @@ -90,7 +89,6 @@ pub async fn query_internal_db( let trimmed = sql.trim_start(); let upper = trimmed.to_uppercase(); - // Enforce read-only let allowed = upper.starts_with("SELECT") || upper.starts_with("WITH") || upper.starts_with("EXPLAIN") @@ -144,7 +142,6 @@ pub async fn query_internal_db( } async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::Error> { - // Split migration file by statements and execute each for statement in MIGRATION_SQL.split(';') { let trimmed = statement.trim(); if !trimmed.is_empty() { @@ -161,7 +158,6 @@ async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::Error> { } } - // Chat tables (CREATE IF NOT EXISTS — idempotent) for statement in MIGRATION_003_SQL.split(';') { let trimmed = statement.trim(); if !trimmed.is_empty() { @@ -169,7 +165,6 @@ async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::Error> { } } - // Permission rules + messages.cache_read_tokens (idempotent: CREATE IF NOT EXISTS + ALTER may fail) for statement in MIGRATION_004_SQL.split(';') { let trimmed = statement.trim(); if !trimmed.is_empty() { @@ -177,7 +172,6 @@ async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::Error> { } } - // T30: Query audit log (CREATE IF NOT EXISTS — idempotent) for statement in MIGRATION_005_SQL.split(';') { let trimmed = statement.trim(); if !trimmed.is_empty() { @@ -185,7 +179,6 @@ async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::Error> { } } - // Stage 7: schema_cache.schema_name (ALTER may fail if column exists — ok) for statement in MIGRATION_006_SQL.split(';') { let trimmed = statement.trim(); if !trimmed.is_empty() { @@ -193,7 +186,6 @@ async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::Error> { } } - // Stage 8: connections.is_readonly (ALTER may fail if column exists — ok) for statement in MIGRATION_007_SQL.split(';') { let trimmed = statement.trim(); if !trimmed.is_empty() { @@ -201,7 +193,6 @@ async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::Error> { } } - // Stage 8: heal SQLite connections that had port coerced to 0 (idempotent) for statement in MIGRATION_008_SQL.split(';') { let trimmed = statement.trim(); if !trimmed.is_empty() { @@ -209,7 +200,6 @@ async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::Error> { } } - // block run history (CREATE IF NOT EXISTS — idempotent) for statement in MIGRATION_009_SQL.split(';') { let trimmed = statement.trim(); if !trimmed.is_empty() { @@ -217,7 +207,6 @@ async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::Error> { } } - // Onda 1: per-block settings (CREATE IF NOT EXISTS — idempotent) for statement in MIGRATION_010_SQL.split(';') { let trimmed = statement.trim(); if !trimmed.is_empty() { @@ -225,7 +214,6 @@ async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::Error> { } } - // Onda 3: per-block pinned response examples (CREATE IF NOT EXISTS) for statement in MIGRATION_011_SQL.split(';') { let trimmed = statement.trim(); if !trimmed.is_empty() { @@ -233,9 +221,7 @@ async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::Error> { } } - // block_run_history.plan (ALTER may fail - // when the column already exists — same idempotent pattern - // as 002 / 006 / 007 / 008). + // ALTER may fail when column already exists — same idempotent pattern as other ALTER migrations. for statement in MIGRATION_012_SQL.split(';') { let trimmed = statement.trim(); if !trimmed.is_empty() { @@ -243,12 +229,10 @@ async fn run_migrations(pool: &SqlitePool) -> Result<(), sqlx::Error> { } } - // V4 fix: schema_cache.connection_id FK still pointed at the - // legacy SQLite `connections` table (now empty after). - // Migration recreates the table without the FK. Not idempotent - // at the SQL layer (DROP + RENAME), so guard at the Rust layer - // by inspecting pragma_foreign_key_list — only re-run while the - // FK is still present. + // Migration 013 recreates schema_cache without the connection_id FK. + // Not idempotent at the SQL layer (DROP + RENAME), so guard at the Rust + // layer by inspecting pragma_foreign_key_list — only re-run while the FK + // is still present. let fk_count: i64 = sqlx::query_scalar("SELECT COUNT(*) FROM pragma_foreign_key_list('schema_cache')") .fetch_one(pool) @@ -276,7 +260,6 @@ mod tests { let tmp = TempDir::new().unwrap(); let pool = init_db(tmp.path()).await.unwrap(); - // Verify tables exist by querying them let result = sqlx::query("SELECT COUNT(*) as count FROM app_config") .fetch_one(&pool) .await; @@ -309,7 +292,6 @@ mod tests { async fn test_init_db_is_idempotent() { let tmp = TempDir::new().unwrap(); - // Run twice — should not fail let pool1 = init_db(tmp.path()).await.unwrap(); pool1.close().await; diff --git a/httui-core/src/db/pool.rs b/httui-core/src/db/pool.rs index 269d8708..43878e87 100644 --- a/httui-core/src/db/pool.rs +++ b/httui-core/src/db/pool.rs @@ -1,17 +1,10 @@ //! `DatabasePool` enum + per-driver pool construction (Postgres / //! MySQL / SQLite). //! -//! Extracted from `db::connections`. Owns the lifecycle pieces -//! — enum definition, ping -//! (`test`), `create_pool` factory, driver-specific -//! `build_*_connect_options` helpers, path/name validation, pool -//! config validation, and connection-error sanitization. -//! -//! The query-execution surface (`execute_query` / `execute_select` / -//! `execute_mutation` dispatchers and the per-driver implementations) -//! still lives in `db::connections` and will move out in a follow-up -//! split (per-driver `pool_exec_*.rs`) — tracked in -//! `tech-debt.md`. +//! Owns the lifecycle pieces — enum definition, ping (`test`), +//! `create_pool` factory, driver-specific `build_*_connect_options` +//! helpers, path/name validation, pool config validation, and +//! connection-error sanitization. use std::time::Duration; @@ -27,8 +20,6 @@ use super::pool_exec_sqlite::{execute_mutation_sqlite, execute_select_sqlite}; use super::query_error::{QueryErrorInfo, QueryErrorLocation}; use super::sql_scanner::{contains_multiple_statements, count_placeholders}; -// --- DTOs -------------------------------------------------------------------- - /// Row data as JSON-compatible values. pub type JsonRow = Vec; @@ -88,17 +79,14 @@ impl DatabasePool { location: QueryErrorLocation::default(), }; - // T08: Reject multi-statement queries if contains_multiple_statements(sql) { return Err(plain_err( "Multi-statement queries are not allowed".to_string(), )); } - // T23/T13: Reject non-primitive or out-of-range bind values validate_bind_values(bind_values).map_err(plain_err)?; - // T22: Validate bind count matches placeholder count let expected = count_placeholders(sql); if bind_values.len() != expected { return Err(plain_err(format!( @@ -109,7 +97,6 @@ impl DatabasePool { let trimmed = sql.trim_start().to_uppercase(); - // T09: Restrict EXPLAIN ANALYZE with mutation keywords if trimmed.starts_with("EXPLAIN") && (trimmed.contains("ANALYZE") || trimmed.contains("ANALYSE")) { @@ -206,8 +193,6 @@ impl DatabasePool { } } -// --- Pool creation --- - fn build_pg_connect_options(conn: &Connection) -> Result { use super::keychain::{conn_password_key, resolve_value, KEYCHAIN_SENTINEL}; use sqlx::postgres::{PgConnectOptions, PgSslMode}; @@ -240,8 +225,6 @@ fn build_pg_connect_options(conn: &Connection) -> Result Result<(), String> { for (i, val) in bind_values.iter().enumerate() { match val { @@ -276,8 +259,6 @@ pub(super) fn is_subqueryable_select(sql: &str) -> bool { trimmed.starts_with("SELECT") || trimmed.starts_with("WITH") } -// --- SQLite path validation (T03) --- - pub(super) fn validate_sqlite_path(path: &str) -> Result<(), String> { if path == ":memory:" || path.starts_with(":memory:") { return Ok(()); @@ -292,8 +273,6 @@ pub(super) fn validate_sqlite_path(path: &str) -> Result<(), String> { Ok(()) } -// --- MySQL database name validation (T02) --- - pub(super) fn validate_mysql_database_name(name: &str) -> Result<(), String> { if name.contains('`') || name.contains(';') || name.contains('\0') || name.contains('\\') { return Err( diff --git a/httui-core/src/db/pool_exec_sqlite.rs b/httui-core/src/db/pool_exec_sqlite.rs index b9280bc3..594b9378 100644 --- a/httui-core/src/db/pool_exec_sqlite.rs +++ b/httui-core/src/db/pool_exec_sqlite.rs @@ -1,7 +1,6 @@ //! SQLite-specific execute helpers used by the `DatabasePool::execute_*` //! dispatchers. //! -//! Extracted from `db::connections`. //! Owns SQLite SELECT pagination, mutation, value binding, and row → //! JSON conversion. @@ -18,7 +17,6 @@ pub(super) async fn execute_select_sqlite( offset: u32, fetch_size: u32, ) -> Result { - // Fetch one extra row to detect has_more let limit = (fetch_size + 1) as i64; let off = offset as i64; // EXPLAIN / PRAGMA / SHOW / DESCRIBE can't be subqueried, so run them @@ -48,7 +46,7 @@ pub(super) async fn execute_select_sqlite( // output and never have "more". let has_more = paginated && rows.len() > fetch_size as usize; if has_more { - rows.pop(); // Remove the extra probe row + rows.pop(); } let columns: Vec = if let Some(first) = rows.first() { diff --git a/httui-core/src/db/pool_manager.rs b/httui-core/src/db/pool_manager.rs index efaef823..2f8e6211 100644 --- a/httui-core/src/db/pool_manager.rs +++ b/httui-core/src/db/pool_manager.rs @@ -1,11 +1,8 @@ //! Pool lifecycle, TTL eviction, status emission. //! -//! Extracted from `db::connections`. -//! `connections.rs` was 2894 L mixing 7 concerns; this file owns the -//! pool-management one. Holds an `Arc` (file- -//! backed in production via `vault_config::ConnectionsStore`, -//! `SqliteLookup` in legacy tests) — no direct SQLite coupling for -//! connection records. +//! Holds an `Arc` (file-backed in production via +//! `vault_config::ConnectionsStore`, `SqliteLookup` in legacy tests) — +//! no direct SQLite coupling for connection records. use std::collections::HashMap; use std::sync::Arc; @@ -140,7 +137,7 @@ impl PoolManager { connection_id: &str, ov: Option<&HostPortOverride>, ) -> Result, String> { - // Check cache — write lock to update last_used on hit + // Write lock on cache hit to update last_used. { let mut pools = self.pools.write().await; if let Some(entry) = pools.get_mut(cache_key) { @@ -149,7 +146,6 @@ impl PoolManager { } } - // Not cached — resolve connection and create pool let mut conn = self .lookup .lookup(connection_id) @@ -257,12 +253,9 @@ impl PoolManager { let pool = create_pool(&conn).await?; pool.test().await?; - // The legacy `UPDATE connections SET last_tested_at` write is - // dropped: the file-backed schema doesn't carry that field, and - // the live status emitter (`emit_connection_status`) is the - // user-facing signal anyway. Reintroduce as a per-machine cache - // (e.g. `~/.config/httui/connection_status.toml`) if a UI need - // emerges — out of scope for v1 (audit-015 Phase 3 decision). + // The legacy `UPDATE connections SET last_tested_at` write was dropped: + // the file-backed schema doesn't carry that field and the live status + // emitter (`emit_connection_status`) is the user-facing signal. Ok(()) } @@ -362,7 +355,6 @@ mod tests { async fn app_pool_returns_borrow_of_inner_pool() { let app = memory_app_pool().await; let mgr = PoolManager::new_standalone(Arc::new(NoopLookup), app); - // Use it to run a query — proves we got a working pool back. let row: (i32,) = sqlx::query_as("SELECT 1") .fetch_one(mgr.app_pool()) .await @@ -519,8 +511,6 @@ mod tests { assert_eq!(count, 5, "old rows should be deleted, recent ones kept"); } - // ───── host:port session override ──────────────────── - #[test] fn host_port_override_is_empty_only_when_both_none() { assert!(HostPortOverride::default().is_empty()); diff --git a/httui-core/src/db/schema_cache.rs b/httui-core/src/db/schema_cache.rs index d2ae360f..f3d87f94 100644 --- a/httui-core/src/db/schema_cache.rs +++ b/httui-core/src/db/schema_cache.rs @@ -5,7 +5,7 @@ use sqlx::Row; use super::connections::{DatabasePool, PoolManager}; use super::schema_cache_remote::{introspect_mysql, introspect_postgres}; -// --- SQL queries (constants so tests can assert their shape) --------------- +// SQL query constants — kept here so unit tests can assert their shape. /// Postgres / Aurora-Postgres / Redshift compatible introspection. /// Walks `information_schema.columns` and excludes catalog schemas diff --git a/httui-core/src/dotenv.rs b/httui-core/src/dotenv.rs index 87619ab8..c3b04d7e 100644 --- a/httui-core/src/dotenv.rs +++ b/httui-core/src/dotenv.rs @@ -1,8 +1,7 @@ //! `.env` auto-discovery: parse + classify + scan. //! //! Pure-string parsing + classification + a vault-root scanner that -//! looks for `.env`-style files at the root and one level deep. The -//! Tauri command, banner UI, and import flow ship in Stories 02-04 of. +//! looks for `.env`-style files at the root and one level deep. use once_cell::sync::Lazy; use regex::Regex; diff --git a/httui-core/src/executor/db/mod.rs b/httui-core/src/executor/db/mod.rs index f9cf6d57..d809e68f 100644 --- a/httui-core/src/executor/db/mod.rs +++ b/httui-core/src/executor/db/mod.rs @@ -216,7 +216,6 @@ impl DbExecutor { let duration_ms = start.elapsed().as_millis() as u64; - // T30: Audit log — log both success and failure let truncated_query: String = p.query.chars().take(500).collect(); let status = if results.is_ok() { "success" } else { "error" }; let _ = sqlx::query( @@ -338,8 +337,6 @@ impl Executor for DbExecutor { } async fn execute(&self, params: serde_json::Value) -> Result { - // Fresh token that never fires — preserves pre-stage-3 behavior for - // callers that don't care about cancellation. let response = self .execute_with_cancel(params, CancellationToken::new()) .await?; @@ -650,7 +647,7 @@ mod tests { ); } - // ───── Stage 3: cancel-aware execution ───── + #[tokio::test] async fn test_execute_with_cancel_completes_when_not_cancelled() { @@ -775,7 +772,7 @@ mod tests { } } - // ───── Stage 6: multi-statement execution ───── + #[tokio::test] async fn test_multi_statement_returns_multiple_results() { @@ -932,7 +929,7 @@ mod tests { assert_eq!(resp.results.len(), 1); } - // ───── session host:port override ──────────────────── + #[tokio::test] async fn test_session_override_runs_against_override_keyed_pool() { @@ -961,7 +958,7 @@ mod tests { } } - // ───── explain wiring ─────────────────────── + #[tokio::test] async fn test_explain_on_sqlite_returns_unsupported_error() { @@ -1048,7 +1045,7 @@ mod tests { assert!(resp.plan.is_none()); } - // ───── Pure-helper tests for `extract_plan_from_results` ───── + #[test] fn extract_plan_from_postgres_shape_returns_parsed_value() { @@ -1166,7 +1163,7 @@ mod tests { assert!(extract_plan_from_results(&results).is_none()); } - // ───── compute_plan gate ───── + #[test] fn compute_plan_short_circuits_when_explain_false() { diff --git a/httui-core/src/executor/db/types.rs b/httui-core/src/executor/db/types.rs index 7e3da78a..945453dd 100644 --- a/httui-core/src/executor/db/types.rs +++ b/httui-core/src/executor/db/types.rs @@ -1,15 +1,8 @@ //! Response shape for the `db-*` block type. //! -//! This shape is prepared for multi-statement / multi-result-set queries -//! (see `docs/db-block-redesign.md`, stage 2+). Today the executor always -//! emits `results` of length 1 so consumers can migrate their access -//! patterns without waiting for the executor rewrite. -//! -//! Stability guarantees for this stage: -//! - Shape is final for `results[]`, `messages[]`, `stats`. -//! - `plan` is reserved for the EXPLAIN feature and stays `None` for now. -//! - Ref-resolution shim keeps pre-redesign `{{alias.response.col}}` refs -//! working against `results[0].rows[0]`. +//! Supports multi-statement / multi-result-set queries. The executor emits +//! `results` with one entry per statement; consumers index via `results[i]`. +//! Ref-resolution keeps `{{alias.response.col}}` working against `results[0].rows[0]`. use serde::{Deserialize, Serialize}; @@ -76,11 +69,6 @@ pub struct DbStats { } /// Streaming chunk emitted to a `tauri::Channel` during execution. -/// -/// Stage 3 ships the minimal set of variants needed for cancel-aware -/// execution. Richer variants (Rows, Stats, Message) land with B6 -/// (row streaming) once the executor consumes `fetch_size` incrementally -/// instead of buffering. #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "kind", rename_all = "snake_case")] pub enum DbChunk { diff --git a/httui-core/src/executor/http/mod.rs b/httui-core/src/executor/http/mod.rs index 06d0468b..8b9802e1 100644 --- a/httui-core/src/executor/http/mod.rs +++ b/httui-core/src/executor/http/mod.rs @@ -702,8 +702,6 @@ impl Executor for HttpExecutor { } async fn execute(&self, params: serde_json::Value) -> Result { - // Backward-compatible path: call the cancel-aware impl with a never- - // cancelled token and convert the typed shape to BlockResult. let response = self .execute_with_cancel(params, CancellationToken::new()) .await?; @@ -917,8 +915,6 @@ mod tests { assert_eq!(result.data["status_code"], 200); } - // ───── Cancel-aware path ───── - #[tokio::test] async fn test_execute_with_cancel_returns_typed_response() { let server = MockServer::start().await; @@ -1061,8 +1057,6 @@ mod tests { assert_eq!(result.data["body"]["received"], "yes"); } - // ─────────── Onda 1 — per-block flags (HttpParams extras) ─────────── - #[tokio::test] async fn http_params_accepts_new_flags() { // Just exercise the deserialization — the executor reads these via @@ -1200,8 +1194,6 @@ mod tests { assert!(result.is_ok(), "expected query to pass through verbatim"); } - // ─────────── Onda 2 — interpret_body + multipart + binary ─────────── - #[test] fn interpret_body_text_for_json() { let out = interpret_body("application/json", r#"{"a":1}"#); @@ -1415,8 +1407,6 @@ mod tests { assert!(err.contains("Read body file"), "got: {err}"); } - // ─────────── Onda 4 — streaming + ttfb + body cap ─────────── - /// Capture all chunks emitted on the callback. Returned `Arc>` /// is shared with the closure passed to `execute_streamed`. fn capture_chunks() -> ( @@ -1685,6 +1675,6 @@ mod tests { assert_eq!(response.status_code, 201); assert_eq!(response.body["ok"], true); assert_eq!(response.timing.total_ms, response.elapsed_ms); - assert!(response.timing.ttfb_ms.is_some(), "Onda 4 fills ttfb"); + assert!(response.timing.ttfb_ms.is_some()); } } diff --git a/httui-core/src/executor/http/types.rs b/httui-core/src/executor/http/types.rs index 6b44df6b..639b9247 100644 --- a/httui-core/src/executor/http/types.rs +++ b/httui-core/src/executor/http/types.rs @@ -1,33 +1,14 @@ //! Response shape for the `http` block type. -//! -//! Stage 2 of the HTTP block redesign (see `docs/http-block-redesign.md`). -//! This shape is prepared for the streamed/cancel-aware execution path — -//! today the executor still buffers the body in memory and emits a single -//! `HttpChunk::Complete` on the channel, mirroring the DB block's stage 3 -//! plumbing. Body chunking and a richer timing breakdown land in a later -//! stage; the JSON shape is forward-compatible. -//! -//! Stability: -//! - `HttpResponse` field set is final for V1. -//! - `cookies` is captured from `Set-Cookie` response headers; the persistent -//! cookie jar (V2 in the spec) is not implemented here. -//! - `timing` ships with `total_ms` only for now. Sub-fields (`dns_ms`, -//! `connect_ms`, `tls_ms`, `ttfb_ms`) are reserved and may appear in -//! later runs without breaking existing consumers (all are `Option`). use serde::{Deserialize, Serialize}; /// Per-execution timing breakdown. /// -/// V1 ships `total_ms` + `ttfb_ms` (split before/after `req.send()` returns -/// headers). Sub-fields `dns_ms`/`connect_ms`/`tls_ms` stay `None` — they -/// require swapping `reqwest` for `isahc`/libcurl, deferred to V2 (see +/// Ships `total_ms` + `ttfb_ms`. Sub-fields `dns_ms`/`connect_ms`/`tls_ms` +/// stay `None` — they require swapping `reqwest` for `isahc`/libcurl (see /// `docs/http-timing-isahc-future.md`). Consumers should treat missing -/// fields as "unknown", not "zero". -/// -/// `connection_reused` is always `false` in V1 — without a custom connector -/// we can't tell pool-hits apart from cold connects with confidence. Lands -/// in V2 alongside the isahc swap. +/// fields as "unknown", not "zero". `connection_reused` is always `false` +/// without a custom connector that can observe pool-hits. #[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct TimingBreakdown { pub total_ms: u64, diff --git a/httui-core/src/explain/mod.rs b/httui-core/src/explain/mod.rs index bace7f07..0aa02964 100644 --- a/httui-core/src/explain/mod.rs +++ b/httui-core/src/explain/mod.rs @@ -1,12 +1,7 @@ //! Unified `PlanNode` tree for `EXPLAIN ANALYZE` output across -//! drivers. ships the Postgres parser first -//! (most complete; canvas mock targets it). MySQL and MongoDB -//! parsers carry to follow-up slices. -//! -//! The tree is the surface the React `` component -//! consumes; the per-driver parsers are responsible for translating -//! each driver's JSON shape into the same `PlanNode` shape so the -//! UI doesn't fan out per backend. +//! drivers. The per-driver parsers translate each driver's JSON +//! shape into the same `PlanNode` shape so the UI doesn't fan out +//! per backend. pub mod mongo; pub mod mysql; diff --git a/httui-core/src/explain/mysql.rs b/httui-core/src/explain/mysql.rs index fa3276e1..6b156340 100644 --- a/httui-core/src/explain/mysql.rs +++ b/httui-core/src/explain/mysql.rs @@ -396,6 +396,7 @@ mod tests { }"#; let n = parse(json).unwrap(); // read_cost..total + // read_cost..total format: 1.234 → 1.23, 1.234+0.567 → 1.80 assert_eq!(n.children[0].cost, "1.23..1.80"); } diff --git a/httui-core/src/explain/postgres.rs b/httui-core/src/explain/postgres.rs index 6d763131..9d025d23 100644 --- a/httui-core/src/explain/postgres.rs +++ b/httui-core/src/explain/postgres.rs @@ -97,8 +97,6 @@ fn parse_node(plan: &Value, root_total_cost: f64, is_root: bool) -> PlanNode { } fn derive_target(plan: &Value) -> String { - // Try a series of fields in order of usefulness. The first one - // that's a non-empty string wins. let candidates = [ "Sort Key", "Index Cond", diff --git a/httui-core/src/fs/mod.rs b/httui-core/src/fs/mod.rs index bd334452..4ec040c7 100644 --- a/httui-core/src/fs/mod.rs +++ b/httui-core/src/fs/mod.rs @@ -51,7 +51,6 @@ fn list_dir_recursive(dir: &Path, root: &Path) -> Result, String> let path = entry.path(); let name = entry.file_name().to_string_lossy().to_string(); - // Skip hidden files/dirs and known heavy directories if name.starts_with('.') || IGNORED_DIRS.contains(&name.as_str()) { continue; } @@ -162,7 +161,6 @@ mod tests { let tmp = TempDir::new().unwrap(); let root = tmp.path(); - // Create test structure std::fs::write(root.join("README.md"), "# Hello").unwrap(); std::fs::write(root.join("notes.md"), "Some notes").unwrap(); std::fs::create_dir_all(root.join("subfolder")).unwrap(); @@ -179,8 +177,6 @@ mod tests { let vault = tmp.path().to_str().unwrap(); let entries = list_workspace(vault).unwrap(); - // Should have: subfolder (dir), README.md, notes.md - // .hidden should be excluded, not-markdown.txt should be excluded assert_eq!(entries.len(), 3); assert!(entries[0].is_dir); // subfolder first assert_eq!(entries[0].name, "subfolder"); diff --git a/httui-core/src/git/log.rs b/httui-core/src/git/log.rs index 30613f42..845cf20e 100644 --- a/httui-core/src/git/log.rs +++ b/httui-core/src/git/log.rs @@ -46,8 +46,7 @@ pub fn git_log( /// Return the commit that first added `path` to the repo, following /// renames. `None` when the path doesn't appear in any commit (a new -/// untracked file or a path the caller invented). Powers the -/// DocHeader meta strip's "author initials" chip. +/// untracked file or a path the caller invented). /// /// Implementation detail: `git log --follow --diff-filter=A -- ` /// returns every commit that *added* the path — usually one entry, @@ -236,8 +235,6 @@ mod tests { write(dir.path(), "x", "1"); commit_all(dir.path(), "add x"); - // The path was never committed — git log --diff-filter=A -- y - // produces an empty stdout, parse_log returns [] → None. let info = git_first_commit_author(dir.path(), "y").unwrap(); assert!(info.is_none()); } diff --git a/httui-core/src/git/mod.rs b/httui-core/src/git/mod.rs index 358a3fcd..0c0ee4f3 100644 --- a/httui-core/src/git/mod.rs +++ b/httui-core/src/git/mod.rs @@ -8,10 +8,6 @@ //! become structured `Err(stderr)` values rather than panics, so the //! UI can surface them. //! -//! Network ops (`pull` / `push`) are deliberately omitted from this -//! foundation commit — they need progress reporting + auth flows -//! that will land alongside the panel UI. - pub mod checkout; pub mod clone; pub mod conflict; @@ -35,24 +31,13 @@ pub use sync::{git_fetch, git_pull, git_push}; use std::path::Path; use std::process::{Command, Output}; -/// Run `git -C ` and capture stdout. Errors carry -/// stderr verbatim so the UI can show what `git` actually said. +/// Returns `true` when `git check-ignore --quiet -- ` reports +/// the path is ignored (exit 0). Returns `false` for every other +/// outcome: path not ignored (exit 1), path outside a git repo +/// (exit 128), `git` not installed, IO failure, etc. /// -/// Defensively clears the per-invocation `GIT_*` env vars that a -/// parent `git` process (e.g. when this binary runs inside a git -/// hook) injects to point children at the parent's index/work-tree -/// — those would override `-C` and silently target the wrong repo. -/// True when `git check-ignore --quiet -- ` reports the path -/// is ignored (exit 0). Returns `false` for every other outcome: -/// path not ignored (exit 1), path outside a git repo (exit 128), -/// `git` not installed, IO failure, etc. Powers -/// task 2 — the auto-discovery scanner uses this to skip e.g. -/// `node_modules//.env` without baking the noisy-dir list -/// any deeper. -/// -/// Best-effort: never returns `Err`. The caller should treat the -/// `false` return as "we couldn't confirm it's ignored", not "it's -/// definitely tracked". +/// Best-effort: never returns `Err`. The caller should treat +/// `false` as "couldn't confirm it's ignored", not "definitely tracked". pub fn is_path_gitignored>(vault: P, path: &str) -> bool { let mut cmd = Command::new("git"); cmd.arg("-C") @@ -62,6 +47,11 @@ pub fn is_path_gitignored>(vault: P, path: &str) -> bool { matches!(cmd.status(), Ok(s) if s.code() == Some(0)) } +/// Run `git -C ` and capture stdout. Errors carry +/// stderr verbatim so the UI can show what `git` actually said. +/// Defensively clears per-invocation `GIT_*` env vars that a parent +/// `git` process (e.g. inside a hook) injects — those would override +/// `-C` and silently target the wrong repo. pub(crate) fn run_git>(vault: P, args: &[&str]) -> Result { let mut cmd = Command::new("git"); cmd.arg("-C").arg(vault.as_ref()).args(args); diff --git a/httui-core/src/git/remote.rs b/httui-core/src/git/remote.rs index 59cc938f..72672b22 100644 --- a/httui-core/src/git/remote.rs +++ b/httui-core/src/git/remote.rs @@ -36,7 +36,6 @@ fn parse_remote_list(raw: &str) -> Vec { if name.is_empty() || rest.is_empty() { continue; } - // Strip the trailing "(fetch)" / "(push)" suffix. let url = rest .rsplit_once(' ') .map(|(u, _suffix)| u.trim().to_string()) diff --git a/httui-core/src/git/remote_host.rs b/httui-core/src/git/remote_host.rs index 02ad3d5d..68990692 100644 --- a/httui-core/src/git/remote_host.rs +++ b/httui-core/src/git/remote_host.rs @@ -1,8 +1,8 @@ //! Detect which forge a `git remote` URL points at. //! -//! Used by the stories 02 + 03 to compose forge-specific URLs -//! (`/blob//` for GitHub, `/-/blob/...` -//! for GitLab) and the compare/PR URL. Pure parsing; no network. +//! Used to compose forge-specific URLs (`/blob//` +//! for GitHub, `/-/blob/...` for GitLab) and compare/PR URLs. +//! Pure parsing; no network. //! //! Accepts both SSH (`git@github.com:owner/repo.git`) and HTTPS //! (`https://github.com/owner/repo.git`) shapes, with or without @@ -13,7 +13,7 @@ //! a URL whose host is unknown but whose path starts with at least //! two segments (`/owner/repo`) is treated as a self-hosted forge. //! Without out-of-band configuration we can't reliably know if a -//! given private host is GitLab vs Gitea — Stories 02/03 fall back +//! given private host is GitLab vs Gitea — the consumer falls back //! to "Manual: open " in that case. use serde::Serialize; @@ -64,9 +64,7 @@ pub fn parse_remote_url(url: &str) -> Option { { // ://[user@]host[:port]/owner/repo[.git] let (h, p) = stripped.split_once('/')?; - // Strip any `user@` prefix on the host. let h = h.split('@').next_back().unwrap_or(h); - // Strip `:port` if present. let h = h.split(':').next().unwrap_or(h); (h.to_string(), p.to_string()) } else { diff --git a/httui-core/src/git/status.rs b/httui-core/src/git/status.rs index ad0b21df..bc2a5ca1 100644 --- a/httui-core/src/git/status.rs +++ b/httui-core/src/git/status.rs @@ -64,7 +64,6 @@ fn parse_status(raw: &str) -> Result { } } } else if let Some(rest) = line.strip_prefix("? ") { - // Untracked file. out.changed.push(FileChange { path: rest.to_string(), status: "??".to_string(), @@ -106,10 +105,9 @@ fn parse_status(raw: &str) -> Result { } else if let Some(rest) = line.strip_prefix("u ") { // Unmerged (conflict) entry: // `

` - // XY is e.g. `UU`/`AA`/`DD`/`AU`/`UD`. Without this arm a - // conflicted vault reads as "clean" and the V10 conflict - // banner never shows. Not staged + not untracked so the - // frontend's `labelFileStatus` maps it to "conflicted". + // XY is e.g. `UU`/`AA`/`DD`/`AU`/`UD`. Not staged + not + // untracked so the frontend's `labelFileStatus` maps it to + // "conflicted". let mut fields = rest.splitn(10, ' '); let xy = fields.next().unwrap_or(".."); let path = fields.nth(8).unwrap_or("").to_string(); diff --git a/httui-core/src/preflight/mod.rs b/httui-core/src/preflight/mod.rs index 9ad287ba..e87ec574 100644 --- a/httui-core/src/preflight/mod.rs +++ b/httui-core/src/preflight/mod.rs @@ -1,16 +1,10 @@ //! Pre-flight checklist parsing + evaluation. //! -//! Canvas §4 mocks a row of pills above the runbook body — one per -//! item from the YAML frontmatter `preflight:` block-list. Each -//! item declares one of six check kinds (connection / env_var / -//! branch / keychain / file_exists / command); evaluates -//! them against vault context. -//! -//! (this slice) ships only the parser. The parser reads -//! the raw frontmatter region produced by `crate::frontmatter` — -//! the slice-1 YAML parser keeps block-list children verbatim in -//! `raw_yaml`, so this module owns the typed extraction for the -//! `preflight:` section without touching the generic YAML parser. +//! Each item in the YAML frontmatter `preflight:` block-list declares +//! one of six check kinds (connection / env_var / branch / keychain / +//! file_exists / command) evaluated against vault context. The parser +//! reads the raw frontmatter region produced by `crate::frontmatter` +//! and owns the typed extraction for the `preflight:` section. pub mod evaluator; pub mod io_evaluator; diff --git a/httui-core/src/preflight/parser.rs b/httui-core/src/preflight/parser.rs index 03a80ae8..56fd510d 100644 --- a/httui-core/src/preflight/parser.rs +++ b/httui-core/src/preflight/parser.rs @@ -42,7 +42,6 @@ pub fn parse_preflight(raw_yaml: &str) -> Vec { if !line_is_preflight_header(line) { continue; } - // Collect the indented children that follow. while let Some(&next) = lines.peek() { // Stop at the next un-indented top-level key or blank // line (block-list ends). @@ -73,7 +72,6 @@ fn line_is_preflight_header(line: &str) -> bool { } fn parse_item(line: &str) -> Option { - // Strip leading whitespace + the `- ` marker. let trimmed = line.trim_start(); let body = trimmed.strip_prefix("- ")?; let colon_idx = body.find(':')?; diff --git a/httui-core/src/references.rs b/httui-core/src/references.rs index 04ff8b8d..640531a0 100644 --- a/httui-core/src/references.rs +++ b/httui-core/src/references.rs @@ -98,7 +98,6 @@ pub fn resolve_block_ref( let rest = &placeholder[alias.len()..].trim_start_matches('.'); let result = results.get(alias)?; - // Navigate the path within the block result's data let value = if rest.is_empty() { result.clone() } else { @@ -157,10 +156,8 @@ fn resolve_string( for placeholder in placeholders { let replacement = if is_block_reference(&placeholder) { - // Block reference: alias.response.path resolve_block_ref(&placeholder, block_results) } else { - // Environment variable: KEY env_vars.get(&placeholder).cloned() }; @@ -312,8 +309,6 @@ mod tests { assert_eq!(resolved["url"], "{{UNKNOWN}}/api"); } - // ─────── L166: prototype pollution defense ─────────────── - #[test] fn navigate_json_blocks_prototype_pollution_keys() { // Even if the response payload literally contains a key called diff --git a/httui-core/src/runner.rs b/httui-core/src/runner.rs index 6f4b2e15..240bb058 100644 --- a/httui-core/src/runner.rs +++ b/httui-core/src/runner.rs @@ -112,7 +112,6 @@ impl BlockRunner { Box> + Send + 'a>, > { Box::pin(async move { - // T36: Depth limit to prevent stack overflow from deep chains if depth > MAX_DEPENDENCY_DEPTH { return Err(RunnerError::DependencyFailed(format!( "Dependency chain exceeds maximum depth of {MAX_DEPENDENCY_DEPTH}" @@ -352,8 +351,6 @@ mod tests { assert_eq!(result.data["body"]["ok"], true); } - // ─────── L166: deep dependency chain DoS ─────────────── - #[tokio::test] async fn deep_dependency_chain_rejects_above_max_depth() { // Vault that authors a long chain of blocks each referencing the diff --git a/httui-core/src/secrets/mod.rs b/httui-core/src/secrets/mod.rs index 7a6b7ea0..62cd5a3a 100644 --- a/httui-core/src/secrets/mod.rs +++ b/httui-core/src/secrets/mod.rs @@ -1,42 +1,18 @@ //! Secret backends — abstraction layer over the OS keychain and -//! upcoming alternatives (Touch ID, Stronghold, 1Password CLI, pass). +//! alternatives (Touch ID, 1Password CLI, pass). //! -//! The MVP path lives in [`crate::db::keychain`] and uses the OS -//! keychain via the `keyring` crate. introduces this module -//! as the boundary against which Epics 14–16 add new backends. For -//! v1 every backend is local — there is no remote secret backend -//! shipped with the desktop app. +//! The primary path lives in [`crate::db::keychain`] and uses the OS +//! keychain via the `keyring` crate. This module is the dispatch +//! boundary: the resolver holds a `dyn SecretBackend` rather than +//! importing each backend's module directly, allowing new backends to +//! be added without touching callers. //! -//! ## Why a trait instead of just calling functions -//! -//! The old shape — free `store_secret`, `get_secret`, `delete_secret` -//! in `db::keychain` — couples every caller to "the OS keychain is -//! the answer". Once we add Touch ID, Windows Hello -//! and 1Password, the resolver needs to dispatch -//! by reference type (`{{keychain:...}}` vs `{{1password:...}}` vs -//! `{{pass:...}}`). The trait gives us a single object the resolver -//! can hold without import-tangling each backend's module. -//! -//! ## What ships in this commit -//! -//! - [`SecretBackend`] trait — minimal `store/get/delete` surface. -//! - [`Keychain`] — concrete impl that delegates to the existing -//! `db::keychain` free functions. The body of those functions is -//! not moved; this file is just the entry point that other -//! subsystems (and the future resolver) target. -//! - [`parser`] submodule — pure ref-syntax parsing -//! (`{{backend:address}}`). Existing free helpers in -//! `db::keychain::resolve_secret_ref` and -//! `vault_config::validate::is_secret_ref` keep working as thin -//! wrappers. +//! [`parser`] handles the ref-syntax (`{{backend:address}}`). pub mod parser; -/// Errors a backend can return. Kept as a plain `String` for now — -/// matches the existing `db::keychain` error type and keeps the -/// boundary low-friction. Will tighten in the prompt-fix -/// follow-up commit if we need to distinguish "user denied" from -/// "system error". +/// Errors a backend can return. Plain `String` — matches the existing +/// `db::keychain` error type and keeps the boundary low-friction. pub type SecretError = String; pub type SecretResult = Result; diff --git a/httui-core/src/secrets/parser.rs b/httui-core/src/secrets/parser.rs index 2e370e35..cdd3544e 100644 --- a/httui-core/src/secrets/parser.rs +++ b/httui-core/src/secrets/parser.rs @@ -7,14 +7,7 @@ //! - [`parse_secret_ref`] — split into `(backend, address)` if the //! reference is well-formed, otherwise an `Err` describing why //! -//! The legacy entry points -//! ([`crate::db::keychain::resolve_secret_ref`] and -//! [`crate::vault_config::validate::is_secret_ref`]) stay as thin -//! wrappers so existing callers don't break — they delegate here in a -//! follow-up commit (or earlier opportunistic work). - -/// Backends recognised by the parser. New backends are added when their -/// epic lands (introduces `1password`, etc.). +/// Backends recognised by the parser. const KNOWN_BACKENDS: &[&str] = &["keychain", "1password", "pass", "env"]; /// Returns `true` when `s` is a structurally valid `{{backend:address}}` diff --git a/httui-core/src/vault_config/atomic.rs b/httui-core/src/vault_config/atomic.rs index 1cb1e5c0..1a66157a 100644 --- a/httui-core/src/vault_config/atomic.rs +++ b/httui-core/src/vault_config/atomic.rs @@ -107,7 +107,6 @@ fn unique_suffix() -> String { format!("{nanos:x}-{pid:x}-{count:x}") } -// Convenience: read a TOML file and deserialize into T. pub fn read_toml(path: &Path) -> io::Result where T: for<'de> serde::Deserialize<'de>, @@ -116,7 +115,6 @@ where toml::from_str::(&content).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e)) } -// Convenience: serialize T and atomically write to path. pub fn write_toml(path: &Path, value: &T) -> io::Result<()> where T: serde::Serialize, @@ -126,8 +124,6 @@ where write_atomic(path, &content) } -// Quick existence check, useful before write to decide whether to -// preserve mode. pub fn file_exists(path: &Path) -> bool { File::open(path).is_ok() } diff --git a/httui-core/src/vault_config/connection_traits.rs b/httui-core/src/vault_config/connection_traits.rs index 2b1b7959..db3e45c4 100644 --- a/httui-core/src/vault_config/connection_traits.rs +++ b/httui-core/src/vault_config/connection_traits.rs @@ -12,8 +12,6 @@ //! //! Existing `match` arms across the codebase don't need touching — //! they all collapse to `connection.as_dyn().method()` calls. -//! -//! Extracted (OCP fix per `tech-debt.md`). use super::connections::{ BigqueryConfig, CommonFields, Connection, GraphqlConfig, GrpcConfig, HttpConfig, MongoConfig, @@ -75,8 +73,6 @@ pub trait DbConnection { fn validate_fields(&self, _connection_name: &str, _report: &mut Report) {} } -// --- impl per variant ---------------------------------------------------- - impl DbConnection for PostgresConfig { fn driver(&self) -> &'static str { "postgres" @@ -264,8 +260,6 @@ impl DbConnection for ShellConfig { } } -// --- enum dispatch ------------------------------------------------------- - impl Connection { /// Single-match dispatch from the enum into the trait. Replaces N /// scattered match arms — adding a new variant edits this one diff --git a/httui-core/src/vault_config/connection_views.rs b/httui-core/src/vault_config/connection_views.rs index a3fdc0d4..741524c9 100644 --- a/httui-core/src/vault_config/connection_views.rs +++ b/httui-core/src/vault_config/connection_views.rs @@ -2,13 +2,6 @@ //! into the public DTO (`ConnectionPublic`) and into the legacy //! `db::connections::Connection` struct that the pool manager still //! consumes. -//! -//! Extracted from `connections_store.rs`. The pure variant -//! accessors (`driver_string_for`, `host_of`, …) live -//! here too — they're shared between the public view and the legacy -//! adapter, and they're the OCP target replaces with `trait -//! DbConnection`. Keeping them in one module makes the trait -//! migration a one-file refactor. use serde::Serialize; @@ -34,8 +27,6 @@ pub struct ConnectionPublic { pub description: Option, } -// --- variant accessors (delegate to DbConnection trait) ------------------ - pub(super) fn driver_string_for(c: &Connection) -> &'static str { c.as_dyn().driver() } @@ -95,8 +86,6 @@ fn password_present(c: &Connection) -> bool { } } -// --- conversions --------------------------------------------------------- - /// Convert a vault `Connection` into the public DTO that fronts the /// UI. No secrets — `has_password` replaces the actual reference. pub(super) fn to_public(name: &str, c: &Connection) -> ConnectionPublic { diff --git a/httui-core/src/vault_config/connections.rs b/httui-core/src/vault_config/connections.rs index aaced4a5..e0430145 100644 --- a/httui-core/src/vault_config/connections.rs +++ b/httui-core/src/vault_config/connections.rs @@ -1,8 +1,8 @@ //! `connections.toml` schema. //! //! See ADR 0001 for the full contract. Any string field MAY be a -//! `{{...}}` reference (ADR 0002); the validator (epic-06 story-02) -//! warns when sensitive-named fields hold literal values. +//! `{{...}}` reference (ADR 0002); the validator warns when +//! sensitive-named fields hold literal values. use std::collections::BTreeMap; diff --git a/httui-core/src/vault_config/connections_store.rs b/httui-core/src/vault_config/connections_store.rs index 1f5e50df..1425372d 100644 --- a/httui-core/src/vault_config/connections_store.rs +++ b/httui-core/src/vault_config/connections_store.rs @@ -34,8 +34,6 @@ use super::secret_resolver::ensure_keychain_ref; use super::validate::validate_connections_file; use super::Version; -// --- input DTOs ----------------------------------------------------------- - #[derive(Debug, Clone)] pub struct CreateConnectionInput { pub name: String, @@ -66,8 +64,6 @@ pub struct UpdateConnectionInput { pub description: Option, } -// --- store --------------------------------------------------------------- - /// Cached parse + the on-disk mtimes (base and `.local` override) /// that produced it. Per ADR 0004, either side changing invalidates. #[derive(Debug, Clone)] @@ -164,8 +160,7 @@ impl ConnectionsStore { Ok(()) } - /// Force the next read to hit disk. Called after external file - /// changes (epic 11 file watcher). + /// Force the next read to hit disk after external file changes. pub async fn invalidate_cache(&self) { let mut cache = self.cache.write().await; *cache = None; @@ -173,7 +168,7 @@ impl ConnectionsStore { /// Read **just** the base file (no `.local` merge). Mutating /// paths use this so writes don't promote local overrides into - /// the committed base. See audit-003. + /// the committed base. async fn load_base_only(&self) -> Result { let path = self.path(); if !path.exists() { @@ -232,8 +227,6 @@ impl ConnectionsStore { input.description.as_deref(), )?; - // Mutate the base only (audit-003) so the local override - // doesn't get promoted on write. let mut base = self.load_base_only().await?; base.connections.insert(input.name.clone(), conn.clone()); self.persist(base).await?; @@ -245,7 +238,6 @@ impl ConnectionsStore { name: &str, input: UpdateConnectionInput, ) -> Result { - // Mutate the base only (audit-003). let mut file = self.load_base_only().await?; let existing = file .connections @@ -295,7 +287,6 @@ impl ConnectionsStore { } pub async fn delete(&self, name: &str) -> Result<(), String> { - // Mutate the base only (audit-003). let mut file = self.load_base_only().await?; if file.connections.remove(name).is_none() { return Err(format!("connection '{name}' not found")); @@ -306,8 +297,6 @@ impl ConnectionsStore { } } -// --- input → Connection construction -------------------------------------- - /// Build a `Connection` from input. If `password` is provided AND it /// isn't already a `{{...}}` reference, it gets stored in the keychain /// and the variant ends up with the matching reference string. diff --git a/httui-core/src/vault_config/environments_store.rs b/httui-core/src/vault_config/environments_store.rs index 15b43901..07bcfd49 100644 --- a/httui-core/src/vault_config/environments_store.rs +++ b/httui-core/src/vault_config/environments_store.rs @@ -24,8 +24,6 @@ use super::user::UserFile; use super::validate::{validate_env_file, Severity}; use super::Version; -// --- DTOs -------------------------------------------------------------------- - #[derive(Debug, Clone, Serialize)] pub struct EnvironmentPublic { pub name: String, @@ -62,8 +60,6 @@ pub struct SetVarInput { pub is_secret: bool, } -// --- Cache ------------------------------------------------------------------- - /// Cache entry for one env file. Tracks both base and `.local` /// override mtimes per ADR 0004. #[derive(Debug, Clone)] @@ -172,8 +168,8 @@ impl EnvironmentsStore { /// Read a single env's base file (no `.local` merge). Mutating /// paths use this so writes don't promote local overrides into - /// the committed base. See audit-003. Returns `None` when the - /// base file doesn't exist, even if a sibling `.local` does. + /// the committed base. Returns `None` when the base file doesn't + /// exist, even if a sibling `.local` does. async fn load_env_base_only(&self, name: &str) -> Result, String> { let path = self.env_file_path(name); if !path.exists() { @@ -184,8 +180,6 @@ impl EnvironmentsStore { .map_err(|e| format!("read {}: {e}", path.display())) } - // --- env-level CRUD ------------------------------------------------- - pub async fn list_envs(&self) -> Result, String> { let dir = self.envs_dir(); if !dir.exists() { @@ -335,8 +329,6 @@ impl EnvironmentsStore { Ok(()) } - // --- variable-level CRUD -------------------------------------------- - pub async fn list_vars(&self, env_name: &str) -> Result, String> { let Some(file) = self.load_env(env_name).await? else { return Err(format!("environment '{env_name}' not found")); @@ -386,9 +378,9 @@ impl EnvironmentsStore { if key.is_empty() { return Err("variable key is required".to_string()); } - // Mutate base only (audit-003). Existence check uses the - // merged view above (load_env) implicitly: a local-only env - // has no base file, so the load_env_base_only error fires. + // Existence check uses the merged view above (load_env) + // implicitly: a local-only env has no base file, so the + // load_env_base_only error fires. let mut file = self .load_env_base_only(&env_name) .await? @@ -419,7 +411,6 @@ impl EnvironmentsStore { } pub async fn delete_var(&self, env_name: &str, key: &str) -> Result<(), String> { - // Mutate base only (audit-003). let mut file = self .load_env_base_only(env_name) .await? @@ -438,8 +429,6 @@ impl EnvironmentsStore { Ok(()) } - // --- active-env tracking (per-machine) ------------------------------ - fn read_user_file(&self) -> Result { if !self.user_config_path.exists() { return Ok(UserFile::default()); @@ -630,7 +619,6 @@ mod tests { let env_name = unique_name("switch"); store.create_env(&env_name).await.unwrap(); - // Start as plain var store .set_var(SetVarInput { env_name: env_name.clone(), diff --git a/httui-core/src/vault_config/migration.rs b/httui-core/src/vault_config/migration.rs index 931eaf35..b0c9d989 100644 --- a/httui-core/src/vault_config/migration.rs +++ b/httui-core/src/vault_config/migration.rs @@ -8,7 +8,7 @@ //! `editor_font_size`, `default_fetch_size`, `history_retention`, //! `vim_enabled`, `sidebar_open`). Session-state keys (`vaults`, //! `active_vault`, `pane_layout`, `active_pane_id`, `active_file`, -//! `scroll_positions`) **stay in SQLite** per audit-001. +//! `scroll_positions`) stay in SQLite. //! //! The migration is **idempotent**: rerunning on an already-populated //! vault is safe — duplicate-name failures from the underlying stores @@ -160,18 +160,13 @@ pub async fn run_migration( } /// Migrate the seven UI prefs keys from `app_config` into the -/// per-machine `user.toml [ui]` section. See audit-005 for the -/// scope decision and the original audit -/// for the per-key -/// classification. +/// per-machine `user.toml [ui]` section. async fn migrate_prefs( pool: &SqlitePool, user_config_path: &Path, dry_run: bool, report: &mut MigrationReport, ) -> Result<(), String> { - // Read each app_config row; missing rows just leave the - // corresponding UiPrefs field at its default. let mut prefs = UiPrefs::default(); let mut count: usize = 0; @@ -231,11 +226,8 @@ async fn get_pref(pool: &SqlitePool, key: &str) -> Result, String .map_err(|e| format!("read app_config[{key}]: {e}")) } -/// MVP frontend serialised theme as a JSON object -/// `{ mode, accent, ... }` per `stores/settings.ts`. We only -/// migrate `mode` into the `theme` string; accent/etc. are -/// per-machine UI niceties that the new `[ui]` section doesn't -/// have room for yet — + will expand the schema if needed. +/// Parse the MVP frontend theme value (JSON object `{ mode, accent, ... }` +/// or bare string) and write `mode` into `out.theme`. /// Returns `true` when at least the `mode` field was extracted. fn apply_theme_json(raw: &str, out: &mut UiPrefs) -> bool { let Ok(value) = serde_json::from_str::(raw) else { @@ -359,8 +351,6 @@ mod tests { use crate::db::init_db; use tempfile::TempDir; - // --- Detection tests ------------------------------------------------- - #[test] fn detect_returns_neither_for_empty_vault() { let tmp = TempDir::new().unwrap(); @@ -440,8 +430,6 @@ mod tests { assert_eq!(LEGACY_DB_FILE, "notes.db"); } - // --- Existing migration tests below ---------------------------------- - /// Setup helper: fresh SQLite + populated with one connection, /// one environment, two vars (one secret). async fn populated_db(tmp: &TempDir) -> (SqlitePool, String) { @@ -621,8 +609,6 @@ mod tests { assert!(input.port.is_none()); } - // --- prefs migration ----------------------------------------------- - #[tokio::test] async fn migrate_prefs_round_trip() { let tmp = TempDir::new().unwrap(); diff --git a/httui-core/src/vault_config/mod.rs b/httui-core/src/vault_config/mod.rs index 23870d58..86494041 100644 --- a/httui-core/src/vault_config/mod.rs +++ b/httui-core/src/vault_config/mod.rs @@ -7,8 +7,7 @@ //! - `.httui/workspace.toml` — workspace defaults //! - `~/.config/httui/user.toml` — per-machine user prefs //! -//! Plus `*.local.toml` overrides, handled by the merge layer (ADR 0004, -//! built in a later epic). +//! Plus `*.local.toml` overrides, handled by the merge layer (ADR 0004). pub mod atomic; pub mod connection_traits; diff --git a/httui-core/src/vault_config/scaffold.rs b/httui-core/src/vault_config/scaffold.rs index 43f78f7e..0eb0dbd9 100644 --- a/httui-core/src/vault_config/scaffold.rs +++ b/httui-core/src/vault_config/scaffold.rs @@ -134,8 +134,6 @@ mod tests { use super::*; use tempfile::TempDir; - // --- is_vault ---------------------------------------------------------- - #[test] fn empty_folder_is_not_a_vault() { let dir = TempDir::new().unwrap(); @@ -192,8 +190,6 @@ mod tests { assert!(!is_vault(dir.path())); } - // --- scaffold_new_vault ------------------------------------------------ - #[test] fn scaffold_creates_full_structure() { let dir = TempDir::new().unwrap(); diff --git a/httui-core/src/vault_config/secret_resolver.rs b/httui-core/src/vault_config/secret_resolver.rs index f7f269fa..f0a3a480 100644 --- a/httui-core/src/vault_config/secret_resolver.rs +++ b/httui-core/src/vault_config/secret_resolver.rs @@ -6,11 +6,6 @@ //! resolve a reference to a raw value at execution time. This module //! owns that bridge so neither store repeats the parsing or keychain //! plumbing inline. -//! -//! Extracted from `connections_store.rs` (where -//! it lived as `ensure_password_ref` / `parse_keychain_ref` / -//! `resolve_password_ref` / `format_password_ref`). The same module is -//! reused by `environments_store.rs` for env-var secrets. use super::validate::is_secret_ref; use crate::db::keychain::{get_secret, resolve_secret_ref, store_secret}; diff --git a/httui-core/src/vault_config/user_store.rs b/httui-core/src/vault_config/user_store.rs index f4e5fc14..d250fef8 100644 --- a/httui-core/src/vault_config/user_store.rs +++ b/httui-core/src/vault_config/user_store.rs @@ -113,8 +113,6 @@ impl UserStore { *cache = None; } - // --- typed section accessors ---------------------------------------- - pub async fn ui(&self) -> Result { Ok(self.load().await?.ui) } @@ -312,7 +310,6 @@ mod tests { let dir = TempDir::new().unwrap(); let s = store_in(&dir); s.ensure_exists().await.unwrap(); - // load once to populate cache let _ = s.load().await.unwrap(); std::fs::write( s.path(), @@ -334,8 +331,6 @@ mod tests { assert!(err.contains("read"), "got {err}"); } - // --- path resolution ------------------------------------------------ - fn with_env(key: &str, value: Option<&str>, f: F) { // SAFETY: tests using std::env::set_var must not run in parallel // with other env-mutating tests. `cargo test` runs tests in the diff --git a/httui-core/src/vault_config/validate.rs b/httui-core/src/vault_config/validate.rs index 6bee6e47..265fe812 100644 --- a/httui-core/src/vault_config/validate.rs +++ b/httui-core/src/vault_config/validate.rs @@ -20,8 +20,6 @@ use regex::Regex; use super::connections::ConnectionsFile; use super::envs::EnvFile; -// ---- secret reference shape ------------------------------------------------ - /// True when `s` is a `{{backend:address}}` secret reference (ADR 0002). pub fn is_secret_ref(s: &str) -> bool { let trimmed = s.trim(); @@ -38,8 +36,6 @@ pub fn is_secret_ref(s: &str) -> bool { matches!(backend, "keychain" | "1password" | "pass" | "env") } -// ---- field-name heuristics ------------------------------------------------- - /// Field names that nudge the validator toward "this should probably be /// a `{{...}}` reference, not a literal." The list intentionally errs on /// the side of false positives — the `# httui:allow-cleartext` escape @@ -67,8 +63,6 @@ fn is_sensitive_field_name(name: &str) -> bool { SENSITIVE_FIELD_NAMES.iter().any(|s| lower == *s) } -// ---- anti-cleartext regex -------------------------------------------------- - /// High-confidence patterns matching well-known credential formats. /// A literal value matching any of these (in any field) raises a /// warning even if the field name doesn't look sensitive. @@ -101,8 +95,6 @@ fn matches_known_secret(value: &str) -> Option<&'static str> { .map(|(name, _)| *name) } -// ---- issue model ----------------------------------------------------------- - /// A validation finding. Errors must be fixed; warnings nudge. #[derive(Debug, Clone, PartialEq, Eq)] pub struct Issue { @@ -159,8 +151,6 @@ impl Report { } } -// ---- value-level checks ---------------------------------------------------- - pub(super) fn check_field(report: &mut Report, path: &str, name: &str, value: &str) { if is_secret_ref(value) { return; @@ -186,8 +176,6 @@ pub(super) fn check_field(report: &mut Report, path: &str, name: &str, value: &s } } -// ---- schema-level validators ---------------------------------------------- - /// Validate an `envs/{name}.toml` post-deserialization. /// /// - `[secrets]` entries MUST be references (hard error). @@ -241,16 +229,12 @@ pub fn validate_connections_file(file: &ConnectionsFile) -> Report { report } -// ---- tests ---------------------------------------------------------------- - #[cfg(test)] mod tests { use super::*; use crate::vault_config::connections::ConnectionsFile; use crate::vault_config::envs::EnvFile; - // --- is_secret_ref -------------------------------------------------- - #[test] fn detects_known_backends() { assert!(is_secret_ref("{{keychain:ns:key}}")); @@ -269,8 +253,6 @@ mod tests { assert!(!is_secret_ref("{{req1.response.body.id}}")); } - // --- env validation ------------------------------------------------- - #[test] fn env_with_only_refs_in_secrets_is_clean() { let raw = r#" @@ -359,8 +341,6 @@ TOKEN = "{{keychain:env:staging:TOKEN}}" .any(|i| i.path.contains("[vars]/[secrets].TOKEN"))); } - // --- connections validation ----------------------------------------- - #[test] fn connections_with_refs_are_clean() { let raw = r#" diff --git a/httui-core/src/vault_config/workspace_store.rs b/httui-core/src/vault_config/workspace_store.rs index dabff7ab..b55c45ff 100644 --- a/httui-core/src/vault_config/workspace_store.rs +++ b/httui-core/src/vault_config/workspace_store.rs @@ -106,7 +106,7 @@ impl WorkspaceStore { /// Read **just** the base file (no `.local` merge). Used by /// mutating paths so writes don't promote local overrides into - /// the committed file. See audit-003 for the rationale. + /// the committed file. async fn load_base_only(&self) -> Result { let path = self.path(); if !path.exists() { @@ -115,8 +115,8 @@ impl WorkspaceStore { read_toml::(&path).map_err(|e| format!("read {}: {e}", path.display())) } - /// Force the next read to hit disk. Hooks into the file watcher - /// (epic 11) so external edits don't get masked by the cache. + /// Force the next read to hit disk so external edits don't get + /// masked by the cache. pub async fn invalidate_cache(&self) { let mut cache = self.cache.write().await; *cache = None; @@ -163,7 +163,6 @@ impl WorkspaceStore { normalize(&mut defaults.git_remote); normalize(&mut defaults.git_branch); normalize(&mut defaults.display_name); - // Mutate the base file, not the merged view (audit-003). let mut file = self.load_base_only().await?; file.defaults = defaults; self.persist(file).await @@ -179,7 +178,7 @@ impl WorkspaceStore { } /// Set the `auto_capture` flag for `file_path`. Mutates the **base** - /// file (audit-003) so local overrides survive the round-trip. + /// file so local overrides survive the round-trip. /// When the resulting `FileSettings` matches the default, the entry /// is removed from the map so workspace.toml stays minimal. pub async fn set_file_auto_capture( @@ -203,8 +202,7 @@ impl WorkspaceStore { /// Set the `docheader_compact` flag for `file_path`. Same prune /// semantics as `set_file_auto_capture` — defaulted entries are - /// removed so workspace.toml stays minimal. Powers - /// the compact-mode persistence. + /// removed so workspace.toml stays minimal. pub async fn set_file_docheader_compact( &self, file_path: &str, @@ -231,7 +229,7 @@ impl WorkspaceStore { return Ok(()); } // Don't write the merged view to disk — the `.local` side - // would leak into the committed base (audit-003). + // would leak into the committed base. let file = self.load_base_only().await?; self.persist(file).await } diff --git a/httui-desktop/src-tauri/gen/schemas/acl-manifests.json b/httui-desktop/src-tauri/gen/schemas/acl-manifests.json index d4169798..7360ad10 100644 --- a/httui-desktop/src-tauri/gen/schemas/acl-manifests.json +++ b/httui-desktop/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"]},"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-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-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-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-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-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-internal-toggle-maximize"]},"permissions":{"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-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-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-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},"dialog":{"default_permission":{"identifier":"default","description":"This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n","permissions":["allow-message","allow-save","allow-open"]},"permissions":{"allow-ask":{"identifier":"allow-ask","description":"Enables the ask command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `allow-message` and will be removed in v3)","commands":{"allow":["message"],"deny":[]}},"allow-confirm":{"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `allow-message` and will be removed in v3)","commands":{"allow":["message"],"deny":[]}},"allow-message":{"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"deny-ask":{"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `deny-message` and will be removed in v3)","commands":{"allow":[],"deny":["message"]}},"deny-confirm":{"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `deny-message` and will be removed in v3)","commands":{"allow":[],"deny":["message"]}},"deny-message":{"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}}},"permission_sets":{},"global_scope_schema":null},"fs":{"default_permission":{"identifier":"default","description":"This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n","permissions":["create-app-specific-dirs","read-app-specific-dirs-recursive","deny-default"]},"permissions":{"allow-copy-file":{"identifier":"allow-copy-file","description":"Enables the copy_file command without any pre-configured scope.","commands":{"allow":["copy_file"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-exists":{"identifier":"allow-exists","description":"Enables the exists command without any pre-configured scope.","commands":{"allow":["exists"],"deny":[]}},"allow-fstat":{"identifier":"allow-fstat","description":"Enables the fstat command without any pre-configured scope.","commands":{"allow":["fstat"],"deny":[]}},"allow-ftruncate":{"identifier":"allow-ftruncate","description":"Enables the ftruncate command without any pre-configured scope.","commands":{"allow":["ftruncate"],"deny":[]}},"allow-lstat":{"identifier":"allow-lstat","description":"Enables the lstat command without any pre-configured scope.","commands":{"allow":["lstat"],"deny":[]}},"allow-mkdir":{"identifier":"allow-mkdir","description":"Enables the mkdir command without any pre-configured scope.","commands":{"allow":["mkdir"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-read":{"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]}},"allow-read-dir":{"identifier":"allow-read-dir","description":"Enables the read_dir command without any pre-configured scope.","commands":{"allow":["read_dir"],"deny":[]}},"allow-read-file":{"identifier":"allow-read-file","description":"Enables the read_file command without any pre-configured scope.","commands":{"allow":["read_file"],"deny":[]}},"allow-read-text-file":{"identifier":"allow-read-text-file","description":"Enables the read_text_file command without any pre-configured scope.","commands":{"allow":["read_text_file"],"deny":[]}},"allow-read-text-file-lines":{"identifier":"allow-read-text-file-lines","description":"Enables the read_text_file_lines command without any pre-configured scope.","commands":{"allow":["read_text_file_lines","read_text_file_lines_next"],"deny":[]}},"allow-read-text-file-lines-next":{"identifier":"allow-read-text-file-lines-next","description":"Enables the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":["read_text_file_lines_next"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-rename":{"identifier":"allow-rename","description":"Enables the rename command without any pre-configured scope.","commands":{"allow":["rename"],"deny":[]}},"allow-seek":{"identifier":"allow-seek","description":"Enables the seek command without any pre-configured scope.","commands":{"allow":["seek"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"allow-start-accessing-security-scoped-resource":{"identifier":"allow-start-accessing-security-scoped-resource","description":"Enables the start_accessing_security_scoped_resource command without any pre-configured scope.","commands":{"allow":["start_accessing_security_scoped_resource"],"deny":[]}},"allow-stat":{"identifier":"allow-stat","description":"Enables the stat command without any pre-configured scope.","commands":{"allow":["stat"],"deny":[]}},"allow-stop-accessing-security-scoped-resource":{"identifier":"allow-stop-accessing-security-scoped-resource","description":"Enables the stop_accessing_security_scoped_resource command without any pre-configured scope.","commands":{"allow":["stop_accessing_security_scoped_resource"],"deny":[]}},"allow-truncate":{"identifier":"allow-truncate","description":"Enables the truncate command without any pre-configured scope.","commands":{"allow":["truncate"],"deny":[]}},"allow-unwatch":{"identifier":"allow-unwatch","description":"Enables the unwatch command without any pre-configured scope.","commands":{"allow":["unwatch"],"deny":[]}},"allow-watch":{"identifier":"allow-watch","description":"Enables the watch command without any pre-configured scope.","commands":{"allow":["watch"],"deny":[]}},"allow-write":{"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]}},"allow-write-file":{"identifier":"allow-write-file","description":"Enables the write_file command without any pre-configured scope.","commands":{"allow":["write_file","open","write"],"deny":[]}},"allow-write-text-file":{"identifier":"allow-write-text-file","description":"Enables the write_text_file command without any pre-configured scope.","commands":{"allow":["write_text_file"],"deny":[]}},"create-app-specific-dirs":{"identifier":"create-app-specific-dirs","description":"This permissions allows to create the application specific directories.\n","commands":{"allow":["mkdir","scope-app-index"],"deny":[]}},"deny-copy-file":{"identifier":"deny-copy-file","description":"Denies the copy_file command without any pre-configured scope.","commands":{"allow":[],"deny":["copy_file"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-exists":{"identifier":"deny-exists","description":"Denies the exists command without any pre-configured scope.","commands":{"allow":[],"deny":["exists"]}},"deny-fstat":{"identifier":"deny-fstat","description":"Denies the fstat command without any pre-configured scope.","commands":{"allow":[],"deny":["fstat"]}},"deny-ftruncate":{"identifier":"deny-ftruncate","description":"Denies the ftruncate command without any pre-configured scope.","commands":{"allow":[],"deny":["ftruncate"]}},"deny-lstat":{"identifier":"deny-lstat","description":"Denies the lstat command without any pre-configured scope.","commands":{"allow":[],"deny":["lstat"]}},"deny-mkdir":{"identifier":"deny-mkdir","description":"Denies the mkdir command without any pre-configured scope.","commands":{"allow":[],"deny":["mkdir"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-read":{"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]}},"deny-read-dir":{"identifier":"deny-read-dir","description":"Denies the read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["read_dir"]}},"deny-read-file":{"identifier":"deny-read-file","description":"Denies the read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file"]}},"deny-read-text-file":{"identifier":"deny-read-text-file","description":"Denies the read_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file"]}},"deny-read-text-file-lines":{"identifier":"deny-read-text-file-lines","description":"Denies the read_text_file_lines command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines"]}},"deny-read-text-file-lines-next":{"identifier":"deny-read-text-file-lines-next","description":"Denies the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines_next"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-rename":{"identifier":"deny-rename","description":"Denies the rename command without any pre-configured scope.","commands":{"allow":[],"deny":["rename"]}},"deny-seek":{"identifier":"deny-seek","description":"Denies the seek command without any pre-configured scope.","commands":{"allow":[],"deny":["seek"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}},"deny-start-accessing-security-scoped-resource":{"identifier":"deny-start-accessing-security-scoped-resource","description":"Denies the start_accessing_security_scoped_resource command without any pre-configured scope.","commands":{"allow":[],"deny":["start_accessing_security_scoped_resource"]}},"deny-stat":{"identifier":"deny-stat","description":"Denies the stat command without any pre-configured scope.","commands":{"allow":[],"deny":["stat"]}},"deny-stop-accessing-security-scoped-resource":{"identifier":"deny-stop-accessing-security-scoped-resource","description":"Denies the stop_accessing_security_scoped_resource command without any pre-configured scope.","commands":{"allow":[],"deny":["stop_accessing_security_scoped_resource"]}},"deny-truncate":{"identifier":"deny-truncate","description":"Denies the truncate command without any pre-configured scope.","commands":{"allow":[],"deny":["truncate"]}},"deny-unwatch":{"identifier":"deny-unwatch","description":"Denies the unwatch command without any pre-configured scope.","commands":{"allow":[],"deny":["unwatch"]}},"deny-watch":{"identifier":"deny-watch","description":"Denies the watch command without any pre-configured scope.","commands":{"allow":[],"deny":["watch"]}},"deny-webview-data-linux":{"identifier":"deny-webview-data-linux","description":"This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-webview-data-windows":{"identifier":"deny-webview-data-windows","description":"This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-write":{"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]}},"deny-write-file":{"identifier":"deny-write-file","description":"Denies the write_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_file"]}},"deny-write-text-file":{"identifier":"deny-write-text-file","description":"Denies the write_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text_file"]}},"read-all":{"identifier":"read-all","description":"This enables all read related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists","watch","unwatch"],"deny":[]}},"read-app-specific-dirs-recursive":{"identifier":"read-app-specific-dirs-recursive","description":"This permission allows recursive read functionality on the application\nspecific base directories. \n","commands":{"allow":["read_dir","read_file","read_text_file","read_text_file_lines","read_text_file_lines_next","exists","scope-app-recursive"],"deny":[]}},"read-dirs":{"identifier":"read-dirs","description":"This enables directory read and file metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"read-files":{"identifier":"read-files","description":"This enables file read related commands without any pre-configured accessible paths.","commands":{"allow":["read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists"],"deny":[]}},"read-meta":{"identifier":"read-meta","description":"This enables all index or metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists","size"],"deny":[]}},"scope":{"identifier":"scope","description":"An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n","commands":{"allow":[],"deny":[]}},"scope-app":{"identifier":"scope-app","description":"This scope permits access to all files and list content of top level directories in the application folders.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"},{"path":"$APPDATA"},{"path":"$APPDATA/*"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"},{"path":"$APPCACHE"},{"path":"$APPCACHE/*"},{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-app-index":{"identifier":"scope-app-index","description":"This scope permits to list all files and folders in the application directories.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPDATA"},{"path":"$APPLOCALDATA"},{"path":"$APPCACHE"},{"path":"$APPLOG"}]}},"scope-app-recursive":{"identifier":"scope-app-recursive","description":"This scope permits recursive access to the complete application folders, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"},{"path":"$APPDATA"},{"path":"$APPDATA/**"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"},{"path":"$APPCACHE"},{"path":"$APPCACHE/**"},{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-appcache":{"identifier":"scope-appcache","description":"This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/*"}]}},"scope-appcache-index":{"identifier":"scope-appcache-index","description":"This scope permits to list all files and folders in the `$APPCACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"}]}},"scope-appcache-recursive":{"identifier":"scope-appcache-recursive","description":"This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/**"}]}},"scope-appconfig":{"identifier":"scope-appconfig","description":"This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"}]}},"scope-appconfig-index":{"identifier":"scope-appconfig-index","description":"This scope permits to list all files and folders in the `$APPCONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"}]}},"scope-appconfig-recursive":{"identifier":"scope-appconfig-recursive","description":"This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"}]}},"scope-appdata":{"identifier":"scope-appdata","description":"This scope permits access to all files and list content of top level directories in the `$APPDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/*"}]}},"scope-appdata-index":{"identifier":"scope-appdata-index","description":"This scope permits to list all files and folders in the `$APPDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"}]}},"scope-appdata-recursive":{"identifier":"scope-appdata-recursive","description":"This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/**"}]}},"scope-applocaldata":{"identifier":"scope-applocaldata","description":"This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"}]}},"scope-applocaldata-index":{"identifier":"scope-applocaldata-index","description":"This scope permits to list all files and folders in the `$APPLOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"}]}},"scope-applocaldata-recursive":{"identifier":"scope-applocaldata-recursive","description":"This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"}]}},"scope-applog":{"identifier":"scope-applog","description":"This scope permits access to all files and list content of top level directories in the `$APPLOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-applog-index":{"identifier":"scope-applog-index","description":"This scope permits to list all files and folders in the `$APPLOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"}]}},"scope-applog-recursive":{"identifier":"scope-applog-recursive","description":"This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-audio":{"identifier":"scope-audio","description":"This scope permits access to all files and list content of top level directories in the `$AUDIO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/*"}]}},"scope-audio-index":{"identifier":"scope-audio-index","description":"This scope permits to list all files and folders in the `$AUDIO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"}]}},"scope-audio-recursive":{"identifier":"scope-audio-recursive","description":"This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/**"}]}},"scope-cache":{"identifier":"scope-cache","description":"This scope permits access to all files and list content of top level directories in the `$CACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/*"}]}},"scope-cache-index":{"identifier":"scope-cache-index","description":"This scope permits to list all files and folders in the `$CACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"}]}},"scope-cache-recursive":{"identifier":"scope-cache-recursive","description":"This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/**"}]}},"scope-config":{"identifier":"scope-config","description":"This scope permits access to all files and list content of top level directories in the `$CONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/*"}]}},"scope-config-index":{"identifier":"scope-config-index","description":"This scope permits to list all files and folders in the `$CONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"}]}},"scope-config-recursive":{"identifier":"scope-config-recursive","description":"This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/**"}]}},"scope-data":{"identifier":"scope-data","description":"This scope permits access to all files and list content of top level directories in the `$DATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/*"}]}},"scope-data-index":{"identifier":"scope-data-index","description":"This scope permits to list all files and folders in the `$DATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"}]}},"scope-data-recursive":{"identifier":"scope-data-recursive","description":"This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/**"}]}},"scope-desktop":{"identifier":"scope-desktop","description":"This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/*"}]}},"scope-desktop-index":{"identifier":"scope-desktop-index","description":"This scope permits to list all files and folders in the `$DESKTOP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"}]}},"scope-desktop-recursive":{"identifier":"scope-desktop-recursive","description":"This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/**"}]}},"scope-document":{"identifier":"scope-document","description":"This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/*"}]}},"scope-document-index":{"identifier":"scope-document-index","description":"This scope permits to list all files and folders in the `$DOCUMENT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"}]}},"scope-document-recursive":{"identifier":"scope-document-recursive","description":"This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/**"}]}},"scope-download":{"identifier":"scope-download","description":"This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/*"}]}},"scope-download-index":{"identifier":"scope-download-index","description":"This scope permits to list all files and folders in the `$DOWNLOAD`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"}]}},"scope-download-recursive":{"identifier":"scope-download-recursive","description":"This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/**"}]}},"scope-exe":{"identifier":"scope-exe","description":"This scope permits access to all files and list content of top level directories in the `$EXE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/*"}]}},"scope-exe-index":{"identifier":"scope-exe-index","description":"This scope permits to list all files and folders in the `$EXE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"}]}},"scope-exe-recursive":{"identifier":"scope-exe-recursive","description":"This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/**"}]}},"scope-font":{"identifier":"scope-font","description":"This scope permits access to all files and list content of top level directories in the `$FONT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/*"}]}},"scope-font-index":{"identifier":"scope-font-index","description":"This scope permits to list all files and folders in the `$FONT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"}]}},"scope-font-recursive":{"identifier":"scope-font-recursive","description":"This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/**"}]}},"scope-home":{"identifier":"scope-home","description":"This scope permits access to all files and list content of top level directories in the `$HOME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/*"}]}},"scope-home-index":{"identifier":"scope-home-index","description":"This scope permits to list all files and folders in the `$HOME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"}]}},"scope-home-recursive":{"identifier":"scope-home-recursive","description":"This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/**"}]}},"scope-localdata":{"identifier":"scope-localdata","description":"This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/*"}]}},"scope-localdata-index":{"identifier":"scope-localdata-index","description":"This scope permits to list all files and folders in the `$LOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"}]}},"scope-localdata-recursive":{"identifier":"scope-localdata-recursive","description":"This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/**"}]}},"scope-log":{"identifier":"scope-log","description":"This scope permits access to all files and list content of top level directories in the `$LOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/*"}]}},"scope-log-index":{"identifier":"scope-log-index","description":"This scope permits to list all files and folders in the `$LOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"}]}},"scope-log-recursive":{"identifier":"scope-log-recursive","description":"This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/**"}]}},"scope-picture":{"identifier":"scope-picture","description":"This scope permits access to all files and list content of top level directories in the `$PICTURE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/*"}]}},"scope-picture-index":{"identifier":"scope-picture-index","description":"This scope permits to list all files and folders in the `$PICTURE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"}]}},"scope-picture-recursive":{"identifier":"scope-picture-recursive","description":"This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/**"}]}},"scope-public":{"identifier":"scope-public","description":"This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/*"}]}},"scope-public-index":{"identifier":"scope-public-index","description":"This scope permits to list all files and folders in the `$PUBLIC`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"}]}},"scope-public-recursive":{"identifier":"scope-public-recursive","description":"This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/**"}]}},"scope-resource":{"identifier":"scope-resource","description":"This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/*"}]}},"scope-resource-index":{"identifier":"scope-resource-index","description":"This scope permits to list all files and folders in the `$RESOURCE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"}]}},"scope-resource-recursive":{"identifier":"scope-resource-recursive","description":"This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/**"}]}},"scope-runtime":{"identifier":"scope-runtime","description":"This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/*"}]}},"scope-runtime-index":{"identifier":"scope-runtime-index","description":"This scope permits to list all files and folders in the `$RUNTIME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"}]}},"scope-runtime-recursive":{"identifier":"scope-runtime-recursive","description":"This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/**"}]}},"scope-temp":{"identifier":"scope-temp","description":"This scope permits access to all files and list content of top level directories in the `$TEMP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/*"}]}},"scope-temp-index":{"identifier":"scope-temp-index","description":"This scope permits to list all files and folders in the `$TEMP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"}]}},"scope-temp-recursive":{"identifier":"scope-temp-recursive","description":"This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/**"}]}},"scope-template":{"identifier":"scope-template","description":"This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/*"}]}},"scope-template-index":{"identifier":"scope-template-index","description":"This scope permits to list all files and folders in the `$TEMPLATE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"}]}},"scope-template-recursive":{"identifier":"scope-template-recursive","description":"This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/**"}]}},"scope-video":{"identifier":"scope-video","description":"This scope permits access to all files and list content of top level directories in the `$VIDEO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/*"}]}},"scope-video-index":{"identifier":"scope-video-index","description":"This scope permits to list all files and folders in the `$VIDEO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"}]}},"scope-video-recursive":{"identifier":"scope-video-recursive","description":"This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/**"}]}},"write-all":{"identifier":"write-all","description":"This enables all write related commands without any pre-configured accessible paths.","commands":{"allow":["mkdir","create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}},"write-files":{"identifier":"write-files","description":"This enables all file write related commands without any pre-configured accessible paths.","commands":{"allow":["create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}}},"permission_sets":{"allow-app-meta":{"identifier":"allow-app-meta","description":"This allows non-recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-index"]},"allow-app-meta-recursive":{"identifier":"allow-app-meta-recursive","description":"This allows full recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-recursive"]},"allow-app-read":{"identifier":"allow-app-read","description":"This allows non-recursive read access to the application folders.","permissions":["read-all","scope-app"]},"allow-app-read-recursive":{"identifier":"allow-app-read-recursive","description":"This allows full recursive read access to the complete application folders, files and subdirectories.","permissions":["read-all","scope-app-recursive"]},"allow-app-write":{"identifier":"allow-app-write","description":"This allows non-recursive write access to the application folders.","permissions":["write-all","scope-app"]},"allow-app-write-recursive":{"identifier":"allow-app-write-recursive","description":"This allows full recursive write access to the complete application folders, files and subdirectories.","permissions":["write-all","scope-app-recursive"]},"allow-appcache-meta":{"identifier":"allow-appcache-meta","description":"This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-index"]},"allow-appcache-meta-recursive":{"identifier":"allow-appcache-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-recursive"]},"allow-appcache-read":{"identifier":"allow-appcache-read","description":"This allows non-recursive read access to the `$APPCACHE` folder.","permissions":["read-all","scope-appcache"]},"allow-appcache-read-recursive":{"identifier":"allow-appcache-read-recursive","description":"This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["read-all","scope-appcache-recursive"]},"allow-appcache-write":{"identifier":"allow-appcache-write","description":"This allows non-recursive write access to the `$APPCACHE` folder.","permissions":["write-all","scope-appcache"]},"allow-appcache-write-recursive":{"identifier":"allow-appcache-write-recursive","description":"This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["write-all","scope-appcache-recursive"]},"allow-appconfig-meta":{"identifier":"allow-appconfig-meta","description":"This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-index"]},"allow-appconfig-meta-recursive":{"identifier":"allow-appconfig-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-recursive"]},"allow-appconfig-read":{"identifier":"allow-appconfig-read","description":"This allows non-recursive read access to the `$APPCONFIG` folder.","permissions":["read-all","scope-appconfig"]},"allow-appconfig-read-recursive":{"identifier":"allow-appconfig-read-recursive","description":"This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["read-all","scope-appconfig-recursive"]},"allow-appconfig-write":{"identifier":"allow-appconfig-write","description":"This allows non-recursive write access to the `$APPCONFIG` folder.","permissions":["write-all","scope-appconfig"]},"allow-appconfig-write-recursive":{"identifier":"allow-appconfig-write-recursive","description":"This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["write-all","scope-appconfig-recursive"]},"allow-appdata-meta":{"identifier":"allow-appdata-meta","description":"This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-index"]},"allow-appdata-meta-recursive":{"identifier":"allow-appdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-recursive"]},"allow-appdata-read":{"identifier":"allow-appdata-read","description":"This allows non-recursive read access to the `$APPDATA` folder.","permissions":["read-all","scope-appdata"]},"allow-appdata-read-recursive":{"identifier":"allow-appdata-read-recursive","description":"This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["read-all","scope-appdata-recursive"]},"allow-appdata-write":{"identifier":"allow-appdata-write","description":"This allows non-recursive write access to the `$APPDATA` folder.","permissions":["write-all","scope-appdata"]},"allow-appdata-write-recursive":{"identifier":"allow-appdata-write-recursive","description":"This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["write-all","scope-appdata-recursive"]},"allow-applocaldata-meta":{"identifier":"allow-applocaldata-meta","description":"This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-index"]},"allow-applocaldata-meta-recursive":{"identifier":"allow-applocaldata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-recursive"]},"allow-applocaldata-read":{"identifier":"allow-applocaldata-read","description":"This allows non-recursive read access to the `$APPLOCALDATA` folder.","permissions":["read-all","scope-applocaldata"]},"allow-applocaldata-read-recursive":{"identifier":"allow-applocaldata-read-recursive","description":"This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-applocaldata-recursive"]},"allow-applocaldata-write":{"identifier":"allow-applocaldata-write","description":"This allows non-recursive write access to the `$APPLOCALDATA` folder.","permissions":["write-all","scope-applocaldata"]},"allow-applocaldata-write-recursive":{"identifier":"allow-applocaldata-write-recursive","description":"This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-applocaldata-recursive"]},"allow-applog-meta":{"identifier":"allow-applog-meta","description":"This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-index"]},"allow-applog-meta-recursive":{"identifier":"allow-applog-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-recursive"]},"allow-applog-read":{"identifier":"allow-applog-read","description":"This allows non-recursive read access to the `$APPLOG` folder.","permissions":["read-all","scope-applog"]},"allow-applog-read-recursive":{"identifier":"allow-applog-read-recursive","description":"This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["read-all","scope-applog-recursive"]},"allow-applog-write":{"identifier":"allow-applog-write","description":"This allows non-recursive write access to the `$APPLOG` folder.","permissions":["write-all","scope-applog"]},"allow-applog-write-recursive":{"identifier":"allow-applog-write-recursive","description":"This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["write-all","scope-applog-recursive"]},"allow-audio-meta":{"identifier":"allow-audio-meta","description":"This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-index"]},"allow-audio-meta-recursive":{"identifier":"allow-audio-meta-recursive","description":"This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-recursive"]},"allow-audio-read":{"identifier":"allow-audio-read","description":"This allows non-recursive read access to the `$AUDIO` folder.","permissions":["read-all","scope-audio"]},"allow-audio-read-recursive":{"identifier":"allow-audio-read-recursive","description":"This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["read-all","scope-audio-recursive"]},"allow-audio-write":{"identifier":"allow-audio-write","description":"This allows non-recursive write access to the `$AUDIO` folder.","permissions":["write-all","scope-audio"]},"allow-audio-write-recursive":{"identifier":"allow-audio-write-recursive","description":"This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["write-all","scope-audio-recursive"]},"allow-cache-meta":{"identifier":"allow-cache-meta","description":"This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-index"]},"allow-cache-meta-recursive":{"identifier":"allow-cache-meta-recursive","description":"This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-recursive"]},"allow-cache-read":{"identifier":"allow-cache-read","description":"This allows non-recursive read access to the `$CACHE` folder.","permissions":["read-all","scope-cache"]},"allow-cache-read-recursive":{"identifier":"allow-cache-read-recursive","description":"This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.","permissions":["read-all","scope-cache-recursive"]},"allow-cache-write":{"identifier":"allow-cache-write","description":"This allows non-recursive write access to the `$CACHE` folder.","permissions":["write-all","scope-cache"]},"allow-cache-write-recursive":{"identifier":"allow-cache-write-recursive","description":"This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.","permissions":["write-all","scope-cache-recursive"]},"allow-config-meta":{"identifier":"allow-config-meta","description":"This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-index"]},"allow-config-meta-recursive":{"identifier":"allow-config-meta-recursive","description":"This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-recursive"]},"allow-config-read":{"identifier":"allow-config-read","description":"This allows non-recursive read access to the `$CONFIG` folder.","permissions":["read-all","scope-config"]},"allow-config-read-recursive":{"identifier":"allow-config-read-recursive","description":"This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["read-all","scope-config-recursive"]},"allow-config-write":{"identifier":"allow-config-write","description":"This allows non-recursive write access to the `$CONFIG` folder.","permissions":["write-all","scope-config"]},"allow-config-write-recursive":{"identifier":"allow-config-write-recursive","description":"This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["write-all","scope-config-recursive"]},"allow-data-meta":{"identifier":"allow-data-meta","description":"This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-index"]},"allow-data-meta-recursive":{"identifier":"allow-data-meta-recursive","description":"This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-recursive"]},"allow-data-read":{"identifier":"allow-data-read","description":"This allows non-recursive read access to the `$DATA` folder.","permissions":["read-all","scope-data"]},"allow-data-read-recursive":{"identifier":"allow-data-read-recursive","description":"This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.","permissions":["read-all","scope-data-recursive"]},"allow-data-write":{"identifier":"allow-data-write","description":"This allows non-recursive write access to the `$DATA` folder.","permissions":["write-all","scope-data"]},"allow-data-write-recursive":{"identifier":"allow-data-write-recursive","description":"This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.","permissions":["write-all","scope-data-recursive"]},"allow-desktop-meta":{"identifier":"allow-desktop-meta","description":"This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-index"]},"allow-desktop-meta-recursive":{"identifier":"allow-desktop-meta-recursive","description":"This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-recursive"]},"allow-desktop-read":{"identifier":"allow-desktop-read","description":"This allows non-recursive read access to the `$DESKTOP` folder.","permissions":["read-all","scope-desktop"]},"allow-desktop-read-recursive":{"identifier":"allow-desktop-read-recursive","description":"This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["read-all","scope-desktop-recursive"]},"allow-desktop-write":{"identifier":"allow-desktop-write","description":"This allows non-recursive write access to the `$DESKTOP` folder.","permissions":["write-all","scope-desktop"]},"allow-desktop-write-recursive":{"identifier":"allow-desktop-write-recursive","description":"This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["write-all","scope-desktop-recursive"]},"allow-document-meta":{"identifier":"allow-document-meta","description":"This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-index"]},"allow-document-meta-recursive":{"identifier":"allow-document-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-recursive"]},"allow-document-read":{"identifier":"allow-document-read","description":"This allows non-recursive read access to the `$DOCUMENT` folder.","permissions":["read-all","scope-document"]},"allow-document-read-recursive":{"identifier":"allow-document-read-recursive","description":"This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["read-all","scope-document-recursive"]},"allow-document-write":{"identifier":"allow-document-write","description":"This allows non-recursive write access to the `$DOCUMENT` folder.","permissions":["write-all","scope-document"]},"allow-document-write-recursive":{"identifier":"allow-document-write-recursive","description":"This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["write-all","scope-document-recursive"]},"allow-download-meta":{"identifier":"allow-download-meta","description":"This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-index"]},"allow-download-meta-recursive":{"identifier":"allow-download-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-recursive"]},"allow-download-read":{"identifier":"allow-download-read","description":"This allows non-recursive read access to the `$DOWNLOAD` folder.","permissions":["read-all","scope-download"]},"allow-download-read-recursive":{"identifier":"allow-download-read-recursive","description":"This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["read-all","scope-download-recursive"]},"allow-download-write":{"identifier":"allow-download-write","description":"This allows non-recursive write access to the `$DOWNLOAD` folder.","permissions":["write-all","scope-download"]},"allow-download-write-recursive":{"identifier":"allow-download-write-recursive","description":"This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["write-all","scope-download-recursive"]},"allow-exe-meta":{"identifier":"allow-exe-meta","description":"This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-index"]},"allow-exe-meta-recursive":{"identifier":"allow-exe-meta-recursive","description":"This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-recursive"]},"allow-exe-read":{"identifier":"allow-exe-read","description":"This allows non-recursive read access to the `$EXE` folder.","permissions":["read-all","scope-exe"]},"allow-exe-read-recursive":{"identifier":"allow-exe-read-recursive","description":"This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.","permissions":["read-all","scope-exe-recursive"]},"allow-exe-write":{"identifier":"allow-exe-write","description":"This allows non-recursive write access to the `$EXE` folder.","permissions":["write-all","scope-exe"]},"allow-exe-write-recursive":{"identifier":"allow-exe-write-recursive","description":"This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.","permissions":["write-all","scope-exe-recursive"]},"allow-font-meta":{"identifier":"allow-font-meta","description":"This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-index"]},"allow-font-meta-recursive":{"identifier":"allow-font-meta-recursive","description":"This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-recursive"]},"allow-font-read":{"identifier":"allow-font-read","description":"This allows non-recursive read access to the `$FONT` folder.","permissions":["read-all","scope-font"]},"allow-font-read-recursive":{"identifier":"allow-font-read-recursive","description":"This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.","permissions":["read-all","scope-font-recursive"]},"allow-font-write":{"identifier":"allow-font-write","description":"This allows non-recursive write access to the `$FONT` folder.","permissions":["write-all","scope-font"]},"allow-font-write-recursive":{"identifier":"allow-font-write-recursive","description":"This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.","permissions":["write-all","scope-font-recursive"]},"allow-home-meta":{"identifier":"allow-home-meta","description":"This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-index"]},"allow-home-meta-recursive":{"identifier":"allow-home-meta-recursive","description":"This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-recursive"]},"allow-home-read":{"identifier":"allow-home-read","description":"This allows non-recursive read access to the `$HOME` folder.","permissions":["read-all","scope-home"]},"allow-home-read-recursive":{"identifier":"allow-home-read-recursive","description":"This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.","permissions":["read-all","scope-home-recursive"]},"allow-home-write":{"identifier":"allow-home-write","description":"This allows non-recursive write access to the `$HOME` folder.","permissions":["write-all","scope-home"]},"allow-home-write-recursive":{"identifier":"allow-home-write-recursive","description":"This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.","permissions":["write-all","scope-home-recursive"]},"allow-localdata-meta":{"identifier":"allow-localdata-meta","description":"This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-index"]},"allow-localdata-meta-recursive":{"identifier":"allow-localdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-recursive"]},"allow-localdata-read":{"identifier":"allow-localdata-read","description":"This allows non-recursive read access to the `$LOCALDATA` folder.","permissions":["read-all","scope-localdata"]},"allow-localdata-read-recursive":{"identifier":"allow-localdata-read-recursive","description":"This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-localdata-recursive"]},"allow-localdata-write":{"identifier":"allow-localdata-write","description":"This allows non-recursive write access to the `$LOCALDATA` folder.","permissions":["write-all","scope-localdata"]},"allow-localdata-write-recursive":{"identifier":"allow-localdata-write-recursive","description":"This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-localdata-recursive"]},"allow-log-meta":{"identifier":"allow-log-meta","description":"This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-index"]},"allow-log-meta-recursive":{"identifier":"allow-log-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-recursive"]},"allow-log-read":{"identifier":"allow-log-read","description":"This allows non-recursive read access to the `$LOG` folder.","permissions":["read-all","scope-log"]},"allow-log-read-recursive":{"identifier":"allow-log-read-recursive","description":"This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.","permissions":["read-all","scope-log-recursive"]},"allow-log-write":{"identifier":"allow-log-write","description":"This allows non-recursive write access to the `$LOG` folder.","permissions":["write-all","scope-log"]},"allow-log-write-recursive":{"identifier":"allow-log-write-recursive","description":"This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.","permissions":["write-all","scope-log-recursive"]},"allow-picture-meta":{"identifier":"allow-picture-meta","description":"This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-index"]},"allow-picture-meta-recursive":{"identifier":"allow-picture-meta-recursive","description":"This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-recursive"]},"allow-picture-read":{"identifier":"allow-picture-read","description":"This allows non-recursive read access to the `$PICTURE` folder.","permissions":["read-all","scope-picture"]},"allow-picture-read-recursive":{"identifier":"allow-picture-read-recursive","description":"This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["read-all","scope-picture-recursive"]},"allow-picture-write":{"identifier":"allow-picture-write","description":"This allows non-recursive write access to the `$PICTURE` folder.","permissions":["write-all","scope-picture"]},"allow-picture-write-recursive":{"identifier":"allow-picture-write-recursive","description":"This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["write-all","scope-picture-recursive"]},"allow-public-meta":{"identifier":"allow-public-meta","description":"This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-index"]},"allow-public-meta-recursive":{"identifier":"allow-public-meta-recursive","description":"This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-recursive"]},"allow-public-read":{"identifier":"allow-public-read","description":"This allows non-recursive read access to the `$PUBLIC` folder.","permissions":["read-all","scope-public"]},"allow-public-read-recursive":{"identifier":"allow-public-read-recursive","description":"This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["read-all","scope-public-recursive"]},"allow-public-write":{"identifier":"allow-public-write","description":"This allows non-recursive write access to the `$PUBLIC` folder.","permissions":["write-all","scope-public"]},"allow-public-write-recursive":{"identifier":"allow-public-write-recursive","description":"This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["write-all","scope-public-recursive"]},"allow-resource-meta":{"identifier":"allow-resource-meta","description":"This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-index"]},"allow-resource-meta-recursive":{"identifier":"allow-resource-meta-recursive","description":"This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-recursive"]},"allow-resource-read":{"identifier":"allow-resource-read","description":"This allows non-recursive read access to the `$RESOURCE` folder.","permissions":["read-all","scope-resource"]},"allow-resource-read-recursive":{"identifier":"allow-resource-read-recursive","description":"This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["read-all","scope-resource-recursive"]},"allow-resource-write":{"identifier":"allow-resource-write","description":"This allows non-recursive write access to the `$RESOURCE` folder.","permissions":["write-all","scope-resource"]},"allow-resource-write-recursive":{"identifier":"allow-resource-write-recursive","description":"This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["write-all","scope-resource-recursive"]},"allow-runtime-meta":{"identifier":"allow-runtime-meta","description":"This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-index"]},"allow-runtime-meta-recursive":{"identifier":"allow-runtime-meta-recursive","description":"This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-recursive"]},"allow-runtime-read":{"identifier":"allow-runtime-read","description":"This allows non-recursive read access to the `$RUNTIME` folder.","permissions":["read-all","scope-runtime"]},"allow-runtime-read-recursive":{"identifier":"allow-runtime-read-recursive","description":"This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["read-all","scope-runtime-recursive"]},"allow-runtime-write":{"identifier":"allow-runtime-write","description":"This allows non-recursive write access to the `$RUNTIME` folder.","permissions":["write-all","scope-runtime"]},"allow-runtime-write-recursive":{"identifier":"allow-runtime-write-recursive","description":"This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["write-all","scope-runtime-recursive"]},"allow-temp-meta":{"identifier":"allow-temp-meta","description":"This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-index"]},"allow-temp-meta-recursive":{"identifier":"allow-temp-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-recursive"]},"allow-temp-read":{"identifier":"allow-temp-read","description":"This allows non-recursive read access to the `$TEMP` folder.","permissions":["read-all","scope-temp"]},"allow-temp-read-recursive":{"identifier":"allow-temp-read-recursive","description":"This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.","permissions":["read-all","scope-temp-recursive"]},"allow-temp-write":{"identifier":"allow-temp-write","description":"This allows non-recursive write access to the `$TEMP` folder.","permissions":["write-all","scope-temp"]},"allow-temp-write-recursive":{"identifier":"allow-temp-write-recursive","description":"This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.","permissions":["write-all","scope-temp-recursive"]},"allow-template-meta":{"identifier":"allow-template-meta","description":"This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-index"]},"allow-template-meta-recursive":{"identifier":"allow-template-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-recursive"]},"allow-template-read":{"identifier":"allow-template-read","description":"This allows non-recursive read access to the `$TEMPLATE` folder.","permissions":["read-all","scope-template"]},"allow-template-read-recursive":{"identifier":"allow-template-read-recursive","description":"This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["read-all","scope-template-recursive"]},"allow-template-write":{"identifier":"allow-template-write","description":"This allows non-recursive write access to the `$TEMPLATE` folder.","permissions":["write-all","scope-template"]},"allow-template-write-recursive":{"identifier":"allow-template-write-recursive","description":"This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["write-all","scope-template-recursive"]},"allow-video-meta":{"identifier":"allow-video-meta","description":"This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-index"]},"allow-video-meta-recursive":{"identifier":"allow-video-meta-recursive","description":"This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-recursive"]},"allow-video-read":{"identifier":"allow-video-read","description":"This allows non-recursive read access to the `$VIDEO` folder.","permissions":["read-all","scope-video"]},"allow-video-read-recursive":{"identifier":"allow-video-read-recursive","description":"This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["read-all","scope-video-recursive"]},"allow-video-write":{"identifier":"allow-video-write","description":"This allows non-recursive write access to the `$VIDEO` folder.","permissions":["write-all","scope-video"]},"allow-video-write-recursive":{"identifier":"allow-video-write-recursive","description":"This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["write-all","scope-video-recursive"]},"deny-default":{"identifier":"deny-default","description":"This denies access to dangerous Tauri relevant files and folders by default.","permissions":["deny-webview-data-linux","deny-webview-data-windows"]}},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"A path that can be accessed by the webview when using the fs APIs. FS scope path pattern.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},{"properties":{"path":{"description":"A path that can be accessed by the webview when using the fs APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"}},"required":["path"],"type":"object"}],"description":"FS scope entry.","title":"FsScopeEntry"}},"notification":{"default_permission":{"identifier":"default","description":"This permission set configures which\nnotification features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all notification related features.\n\n","permissions":["allow-is-permission-granted","allow-request-permission","allow-notify","allow-register-action-types","allow-register-listener","allow-cancel","allow-get-pending","allow-remove-active","allow-get-active","allow-check-permissions","allow-show","allow-batch","allow-list-channels","allow-delete-channel","allow-create-channel","allow-permission-state"]},"permissions":{"allow-batch":{"identifier":"allow-batch","description":"Enables the batch command without any pre-configured scope.","commands":{"allow":["batch"],"deny":[]}},"allow-cancel":{"identifier":"allow-cancel","description":"Enables the cancel command without any pre-configured scope.","commands":{"allow":["cancel"],"deny":[]}},"allow-check-permissions":{"identifier":"allow-check-permissions","description":"Enables the check_permissions command without any pre-configured scope.","commands":{"allow":["check_permissions"],"deny":[]}},"allow-create-channel":{"identifier":"allow-create-channel","description":"Enables the create_channel command without any pre-configured scope.","commands":{"allow":["create_channel"],"deny":[]}},"allow-delete-channel":{"identifier":"allow-delete-channel","description":"Enables the delete_channel command without any pre-configured scope.","commands":{"allow":["delete_channel"],"deny":[]}},"allow-get-active":{"identifier":"allow-get-active","description":"Enables the get_active command without any pre-configured scope.","commands":{"allow":["get_active"],"deny":[]}},"allow-get-pending":{"identifier":"allow-get-pending","description":"Enables the get_pending command without any pre-configured scope.","commands":{"allow":["get_pending"],"deny":[]}},"allow-is-permission-granted":{"identifier":"allow-is-permission-granted","description":"Enables the is_permission_granted command without any pre-configured scope.","commands":{"allow":["is_permission_granted"],"deny":[]}},"allow-list-channels":{"identifier":"allow-list-channels","description":"Enables the list_channels command without any pre-configured scope.","commands":{"allow":["list_channels"],"deny":[]}},"allow-notify":{"identifier":"allow-notify","description":"Enables the notify command without any pre-configured scope.","commands":{"allow":["notify"],"deny":[]}},"allow-permission-state":{"identifier":"allow-permission-state","description":"Enables the permission_state command without any pre-configured scope.","commands":{"allow":["permission_state"],"deny":[]}},"allow-register-action-types":{"identifier":"allow-register-action-types","description":"Enables the register_action_types command without any pre-configured scope.","commands":{"allow":["register_action_types"],"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-active":{"identifier":"allow-remove-active","description":"Enables the remove_active command without any pre-configured scope.","commands":{"allow":["remove_active"],"deny":[]}},"allow-request-permission":{"identifier":"allow-request-permission","description":"Enables the request_permission command without any pre-configured scope.","commands":{"allow":["request_permission"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"deny-batch":{"identifier":"deny-batch","description":"Denies the batch command without any pre-configured scope.","commands":{"allow":[],"deny":["batch"]}},"deny-cancel":{"identifier":"deny-cancel","description":"Denies the cancel command without any pre-configured scope.","commands":{"allow":[],"deny":["cancel"]}},"deny-check-permissions":{"identifier":"deny-check-permissions","description":"Denies the check_permissions command without any pre-configured scope.","commands":{"allow":[],"deny":["check_permissions"]}},"deny-create-channel":{"identifier":"deny-create-channel","description":"Denies the create_channel command without any pre-configured scope.","commands":{"allow":[],"deny":["create_channel"]}},"deny-delete-channel":{"identifier":"deny-delete-channel","description":"Denies the delete_channel command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_channel"]}},"deny-get-active":{"identifier":"deny-get-active","description":"Denies the get_active command without any pre-configured scope.","commands":{"allow":[],"deny":["get_active"]}},"deny-get-pending":{"identifier":"deny-get-pending","description":"Denies the get_pending command without any pre-configured scope.","commands":{"allow":[],"deny":["get_pending"]}},"deny-is-permission-granted":{"identifier":"deny-is-permission-granted","description":"Denies the is_permission_granted command without any pre-configured scope.","commands":{"allow":[],"deny":["is_permission_granted"]}},"deny-list-channels":{"identifier":"deny-list-channels","description":"Denies the list_channels command without any pre-configured scope.","commands":{"allow":[],"deny":["list_channels"]}},"deny-notify":{"identifier":"deny-notify","description":"Denies the notify command without any pre-configured scope.","commands":{"allow":[],"deny":["notify"]}},"deny-permission-state":{"identifier":"deny-permission-state","description":"Denies the permission_state command without any pre-configured scope.","commands":{"allow":[],"deny":["permission_state"]}},"deny-register-action-types":{"identifier":"deny-register-action-types","description":"Denies the register_action_types command without any pre-configured scope.","commands":{"allow":[],"deny":["register_action_types"]}},"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-active":{"identifier":"deny-remove-active","description":"Denies the remove_active command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_active"]}},"deny-request-permission":{"identifier":"deny-request-permission","description":"Denies the request_permission command without any pre-configured scope.","commands":{"allow":[],"deny":["request_permission"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}}},"permission_sets":{},"global_scope_schema":null},"process":{"default_permission":{"identifier":"default","description":"This permission set configures which\nprocess features are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n","permissions":["allow-exit","allow-restart"]},"permissions":{"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-restart":{"identifier":"allow-restart","description":"Enables the restart command without any pre-configured scope.","commands":{"allow":["restart"],"deny":[]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-restart":{"identifier":"deny-restart","description":"Denies the restart command without any pre-configured scope.","commands":{"allow":[],"deny":["restart"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"}},"required":["cmd","name"],"type":"object"},{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["name","sidecar"],"type":"object"}],"definitions":{"ShellScopeEntryAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ","type":"string"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellScopeEntryAllowedArgs":{"anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.","items":{"$ref":"#/definitions/ShellScopeEntryAllowedArg"},"type":"array"}],"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration."}},"description":"Shell scope entry.","title":"ShellScopeEntry"}},"sql":{"default_permission":{"identifier":"default","description":"### Default Permissions\n\nThis permission set configures what kind of\ndatabase operations are available from the sql plugin.\n\n### Granted Permissions\n\nAll reading related operations are enabled.\nAlso allows to load or close a connection.\n\n","permissions":["allow-close","allow-load","allow-select"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-load":{"identifier":"allow-load","description":"Enables the load command without any pre-configured scope.","commands":{"allow":["load"],"deny":[]}},"allow-select":{"identifier":"allow-select","description":"Enables the select command without any pre-configured scope.","commands":{"allow":["select"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-load":{"identifier":"deny-load","description":"Denies the load command without any pre-configured scope.","commands":{"allow":[],"deny":["load"]}},"deny-select":{"identifier":"deny-select","description":"Denies the select command without any pre-configured scope.","commands":{"allow":[],"deny":["select"]}}},"permission_sets":{},"global_scope_schema":null},"updater":{"default_permission":{"identifier":"default","description":"This permission set configures which kind of\nupdater functions are exposed to the frontend.\n\n#### Granted Permissions\n\nThe full workflow from checking for updates to installing them\nis enabled.\n\n","permissions":["allow-check","allow-download","allow-install","allow-download-and-install"]},"permissions":{"allow-check":{"identifier":"allow-check","description":"Enables the check command without any pre-configured scope.","commands":{"allow":["check"],"deny":[]}},"allow-download":{"identifier":"allow-download","description":"Enables the download command without any pre-configured scope.","commands":{"allow":["download"],"deny":[]}},"allow-download-and-install":{"identifier":"allow-download-and-install","description":"Enables the download_and_install command without any pre-configured scope.","commands":{"allow":["download_and_install"],"deny":[]}},"allow-install":{"identifier":"allow-install","description":"Enables the install command without any pre-configured scope.","commands":{"allow":["install"],"deny":[]}},"deny-check":{"identifier":"deny-check","description":"Denies the check command without any pre-configured scope.","commands":{"allow":[],"deny":["check"]}},"deny-download":{"identifier":"deny-download","description":"Denies the download command without any pre-configured scope.","commands":{"allow":[],"deny":["download"]}},"deny-download-and-install":{"identifier":"deny-download-and-install","description":"Denies the download_and_install command without any pre-configured scope.","commands":{"allow":[],"deny":["download_and_install"]}},"deny-install":{"identifier":"deny-install","description":"Denies the install command without any pre-configured scope.","commands":{"allow":[],"deny":["install"]}}},"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},"dialog":{"default_permission":{"identifier":"default","description":"This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n","permissions":["allow-message","allow-save","allow-open"]},"permissions":{"allow-ask":{"identifier":"allow-ask","description":"Enables the ask command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `allow-message` and will be removed in v3)","commands":{"allow":["message"],"deny":[]}},"allow-confirm":{"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `allow-message` and will be removed in v3)","commands":{"allow":["message"],"deny":[]}},"allow-message":{"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"deny-ask":{"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `deny-message` and will be removed in v3)","commands":{"allow":[],"deny":["message"]}},"deny-confirm":{"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope. (**DEPRECATED**: This is now an alias to `deny-message` and will be removed in v3)","commands":{"allow":[],"deny":["message"]}},"deny-message":{"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}}},"permission_sets":{},"global_scope_schema":null},"fs":{"default_permission":{"identifier":"default","description":"This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n","permissions":["create-app-specific-dirs","read-app-specific-dirs-recursive","deny-default"]},"permissions":{"allow-copy-file":{"identifier":"allow-copy-file","description":"Enables the copy_file command without any pre-configured scope.","commands":{"allow":["copy_file"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-exists":{"identifier":"allow-exists","description":"Enables the exists command without any pre-configured scope.","commands":{"allow":["exists"],"deny":[]}},"allow-fstat":{"identifier":"allow-fstat","description":"Enables the fstat command without any pre-configured scope.","commands":{"allow":["fstat"],"deny":[]}},"allow-ftruncate":{"identifier":"allow-ftruncate","description":"Enables the ftruncate command without any pre-configured scope.","commands":{"allow":["ftruncate"],"deny":[]}},"allow-lstat":{"identifier":"allow-lstat","description":"Enables the lstat command without any pre-configured scope.","commands":{"allow":["lstat"],"deny":[]}},"allow-mkdir":{"identifier":"allow-mkdir","description":"Enables the mkdir command without any pre-configured scope.","commands":{"allow":["mkdir"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-read":{"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]}},"allow-read-dir":{"identifier":"allow-read-dir","description":"Enables the read_dir command without any pre-configured scope.","commands":{"allow":["read_dir"],"deny":[]}},"allow-read-file":{"identifier":"allow-read-file","description":"Enables the read_file command without any pre-configured scope.","commands":{"allow":["read_file"],"deny":[]}},"allow-read-text-file":{"identifier":"allow-read-text-file","description":"Enables the read_text_file command without any pre-configured scope.","commands":{"allow":["read_text_file"],"deny":[]}},"allow-read-text-file-lines":{"identifier":"allow-read-text-file-lines","description":"Enables the read_text_file_lines command without any pre-configured scope.","commands":{"allow":["read_text_file_lines","read_text_file_lines_next"],"deny":[]}},"allow-read-text-file-lines-next":{"identifier":"allow-read-text-file-lines-next","description":"Enables the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":["read_text_file_lines_next"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-rename":{"identifier":"allow-rename","description":"Enables the rename command without any pre-configured scope.","commands":{"allow":["rename"],"deny":[]}},"allow-seek":{"identifier":"allow-seek","description":"Enables the seek command without any pre-configured scope.","commands":{"allow":["seek"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"allow-start-accessing-security-scoped-resource":{"identifier":"allow-start-accessing-security-scoped-resource","description":"Enables the start_accessing_security_scoped_resource command without any pre-configured scope.","commands":{"allow":["start_accessing_security_scoped_resource"],"deny":[]}},"allow-stat":{"identifier":"allow-stat","description":"Enables the stat command without any pre-configured scope.","commands":{"allow":["stat"],"deny":[]}},"allow-stop-accessing-security-scoped-resource":{"identifier":"allow-stop-accessing-security-scoped-resource","description":"Enables the stop_accessing_security_scoped_resource command without any pre-configured scope.","commands":{"allow":["stop_accessing_security_scoped_resource"],"deny":[]}},"allow-truncate":{"identifier":"allow-truncate","description":"Enables the truncate command without any pre-configured scope.","commands":{"allow":["truncate"],"deny":[]}},"allow-unwatch":{"identifier":"allow-unwatch","description":"Enables the unwatch command without any pre-configured scope.","commands":{"allow":["unwatch"],"deny":[]}},"allow-watch":{"identifier":"allow-watch","description":"Enables the watch command without any pre-configured scope.","commands":{"allow":["watch"],"deny":[]}},"allow-write":{"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]}},"allow-write-file":{"identifier":"allow-write-file","description":"Enables the write_file command without any pre-configured scope.","commands":{"allow":["write_file","open","write"],"deny":[]}},"allow-write-text-file":{"identifier":"allow-write-text-file","description":"Enables the write_text_file command without any pre-configured scope.","commands":{"allow":["write_text_file"],"deny":[]}},"create-app-specific-dirs":{"identifier":"create-app-specific-dirs","description":"This permissions allows to create the application specific directories.\n","commands":{"allow":["mkdir","scope-app-index"],"deny":[]}},"deny-copy-file":{"identifier":"deny-copy-file","description":"Denies the copy_file command without any pre-configured scope.","commands":{"allow":[],"deny":["copy_file"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-exists":{"identifier":"deny-exists","description":"Denies the exists command without any pre-configured scope.","commands":{"allow":[],"deny":["exists"]}},"deny-fstat":{"identifier":"deny-fstat","description":"Denies the fstat command without any pre-configured scope.","commands":{"allow":[],"deny":["fstat"]}},"deny-ftruncate":{"identifier":"deny-ftruncate","description":"Denies the ftruncate command without any pre-configured scope.","commands":{"allow":[],"deny":["ftruncate"]}},"deny-lstat":{"identifier":"deny-lstat","description":"Denies the lstat command without any pre-configured scope.","commands":{"allow":[],"deny":["lstat"]}},"deny-mkdir":{"identifier":"deny-mkdir","description":"Denies the mkdir command without any pre-configured scope.","commands":{"allow":[],"deny":["mkdir"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-read":{"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]}},"deny-read-dir":{"identifier":"deny-read-dir","description":"Denies the read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["read_dir"]}},"deny-read-file":{"identifier":"deny-read-file","description":"Denies the read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file"]}},"deny-read-text-file":{"identifier":"deny-read-text-file","description":"Denies the read_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file"]}},"deny-read-text-file-lines":{"identifier":"deny-read-text-file-lines","description":"Denies the read_text_file_lines command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines"]}},"deny-read-text-file-lines-next":{"identifier":"deny-read-text-file-lines-next","description":"Denies the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines_next"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-rename":{"identifier":"deny-rename","description":"Denies the rename command without any pre-configured scope.","commands":{"allow":[],"deny":["rename"]}},"deny-seek":{"identifier":"deny-seek","description":"Denies the seek command without any pre-configured scope.","commands":{"allow":[],"deny":["seek"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}},"deny-start-accessing-security-scoped-resource":{"identifier":"deny-start-accessing-security-scoped-resource","description":"Denies the start_accessing_security_scoped_resource command without any pre-configured scope.","commands":{"allow":[],"deny":["start_accessing_security_scoped_resource"]}},"deny-stat":{"identifier":"deny-stat","description":"Denies the stat command without any pre-configured scope.","commands":{"allow":[],"deny":["stat"]}},"deny-stop-accessing-security-scoped-resource":{"identifier":"deny-stop-accessing-security-scoped-resource","description":"Denies the stop_accessing_security_scoped_resource command without any pre-configured scope.","commands":{"allow":[],"deny":["stop_accessing_security_scoped_resource"]}},"deny-truncate":{"identifier":"deny-truncate","description":"Denies the truncate command without any pre-configured scope.","commands":{"allow":[],"deny":["truncate"]}},"deny-unwatch":{"identifier":"deny-unwatch","description":"Denies the unwatch command without any pre-configured scope.","commands":{"allow":[],"deny":["unwatch"]}},"deny-watch":{"identifier":"deny-watch","description":"Denies the watch command without any pre-configured scope.","commands":{"allow":[],"deny":["watch"]}},"deny-webview-data-linux":{"identifier":"deny-webview-data-linux","description":"This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-webview-data-windows":{"identifier":"deny-webview-data-windows","description":"This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-write":{"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]}},"deny-write-file":{"identifier":"deny-write-file","description":"Denies the write_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_file"]}},"deny-write-text-file":{"identifier":"deny-write-text-file","description":"Denies the write_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text_file"]}},"read-all":{"identifier":"read-all","description":"This enables all read related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists","watch","unwatch"],"deny":[]}},"read-app-specific-dirs-recursive":{"identifier":"read-app-specific-dirs-recursive","description":"This permission allows recursive read functionality on the application\nspecific base directories. \n","commands":{"allow":["read_dir","read_file","read_text_file","read_text_file_lines","read_text_file_lines_next","exists","scope-app-recursive"],"deny":[]}},"read-dirs":{"identifier":"read-dirs","description":"This enables directory read and file metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"read-files":{"identifier":"read-files","description":"This enables file read related commands without any pre-configured accessible paths.","commands":{"allow":["read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists"],"deny":[]}},"read-meta":{"identifier":"read-meta","description":"This enables all index or metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists","size"],"deny":[]}},"scope":{"identifier":"scope","description":"An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n","commands":{"allow":[],"deny":[]}},"scope-app":{"identifier":"scope-app","description":"This scope permits access to all files and list content of top level directories in the application folders.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"},{"path":"$APPDATA"},{"path":"$APPDATA/*"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"},{"path":"$APPCACHE"},{"path":"$APPCACHE/*"},{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-app-index":{"identifier":"scope-app-index","description":"This scope permits to list all files and folders in the application directories.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPDATA"},{"path":"$APPLOCALDATA"},{"path":"$APPCACHE"},{"path":"$APPLOG"}]}},"scope-app-recursive":{"identifier":"scope-app-recursive","description":"This scope permits recursive access to the complete application folders, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"},{"path":"$APPDATA"},{"path":"$APPDATA/**"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"},{"path":"$APPCACHE"},{"path":"$APPCACHE/**"},{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-appcache":{"identifier":"scope-appcache","description":"This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/*"}]}},"scope-appcache-index":{"identifier":"scope-appcache-index","description":"This scope permits to list all files and folders in the `$APPCACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"}]}},"scope-appcache-recursive":{"identifier":"scope-appcache-recursive","description":"This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/**"}]}},"scope-appconfig":{"identifier":"scope-appconfig","description":"This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"}]}},"scope-appconfig-index":{"identifier":"scope-appconfig-index","description":"This scope permits to list all files and folders in the `$APPCONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"}]}},"scope-appconfig-recursive":{"identifier":"scope-appconfig-recursive","description":"This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"}]}},"scope-appdata":{"identifier":"scope-appdata","description":"This scope permits access to all files and list content of top level directories in the `$APPDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/*"}]}},"scope-appdata-index":{"identifier":"scope-appdata-index","description":"This scope permits to list all files and folders in the `$APPDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"}]}},"scope-appdata-recursive":{"identifier":"scope-appdata-recursive","description":"This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/**"}]}},"scope-applocaldata":{"identifier":"scope-applocaldata","description":"This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"}]}},"scope-applocaldata-index":{"identifier":"scope-applocaldata-index","description":"This scope permits to list all files and folders in the `$APPLOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"}]}},"scope-applocaldata-recursive":{"identifier":"scope-applocaldata-recursive","description":"This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"}]}},"scope-applog":{"identifier":"scope-applog","description":"This scope permits access to all files and list content of top level directories in the `$APPLOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-applog-index":{"identifier":"scope-applog-index","description":"This scope permits to list all files and folders in the `$APPLOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"}]}},"scope-applog-recursive":{"identifier":"scope-applog-recursive","description":"This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-audio":{"identifier":"scope-audio","description":"This scope permits access to all files and list content of top level directories in the `$AUDIO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/*"}]}},"scope-audio-index":{"identifier":"scope-audio-index","description":"This scope permits to list all files and folders in the `$AUDIO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"}]}},"scope-audio-recursive":{"identifier":"scope-audio-recursive","description":"This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/**"}]}},"scope-cache":{"identifier":"scope-cache","description":"This scope permits access to all files and list content of top level directories in the `$CACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/*"}]}},"scope-cache-index":{"identifier":"scope-cache-index","description":"This scope permits to list all files and folders in the `$CACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"}]}},"scope-cache-recursive":{"identifier":"scope-cache-recursive","description":"This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/**"}]}},"scope-config":{"identifier":"scope-config","description":"This scope permits access to all files and list content of top level directories in the `$CONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/*"}]}},"scope-config-index":{"identifier":"scope-config-index","description":"This scope permits to list all files and folders in the `$CONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"}]}},"scope-config-recursive":{"identifier":"scope-config-recursive","description":"This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/**"}]}},"scope-data":{"identifier":"scope-data","description":"This scope permits access to all files and list content of top level directories in the `$DATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/*"}]}},"scope-data-index":{"identifier":"scope-data-index","description":"This scope permits to list all files and folders in the `$DATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"}]}},"scope-data-recursive":{"identifier":"scope-data-recursive","description":"This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/**"}]}},"scope-desktop":{"identifier":"scope-desktop","description":"This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/*"}]}},"scope-desktop-index":{"identifier":"scope-desktop-index","description":"This scope permits to list all files and folders in the `$DESKTOP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"}]}},"scope-desktop-recursive":{"identifier":"scope-desktop-recursive","description":"This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/**"}]}},"scope-document":{"identifier":"scope-document","description":"This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/*"}]}},"scope-document-index":{"identifier":"scope-document-index","description":"This scope permits to list all files and folders in the `$DOCUMENT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"}]}},"scope-document-recursive":{"identifier":"scope-document-recursive","description":"This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/**"}]}},"scope-download":{"identifier":"scope-download","description":"This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/*"}]}},"scope-download-index":{"identifier":"scope-download-index","description":"This scope permits to list all files and folders in the `$DOWNLOAD`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"}]}},"scope-download-recursive":{"identifier":"scope-download-recursive","description":"This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/**"}]}},"scope-exe":{"identifier":"scope-exe","description":"This scope permits access to all files and list content of top level directories in the `$EXE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/*"}]}},"scope-exe-index":{"identifier":"scope-exe-index","description":"This scope permits to list all files and folders in the `$EXE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"}]}},"scope-exe-recursive":{"identifier":"scope-exe-recursive","description":"This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/**"}]}},"scope-font":{"identifier":"scope-font","description":"This scope permits access to all files and list content of top level directories in the `$FONT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/*"}]}},"scope-font-index":{"identifier":"scope-font-index","description":"This scope permits to list all files and folders in the `$FONT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"}]}},"scope-font-recursive":{"identifier":"scope-font-recursive","description":"This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/**"}]}},"scope-home":{"identifier":"scope-home","description":"This scope permits access to all files and list content of top level directories in the `$HOME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/*"}]}},"scope-home-index":{"identifier":"scope-home-index","description":"This scope permits to list all files and folders in the `$HOME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"}]}},"scope-home-recursive":{"identifier":"scope-home-recursive","description":"This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/**"}]}},"scope-localdata":{"identifier":"scope-localdata","description":"This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/*"}]}},"scope-localdata-index":{"identifier":"scope-localdata-index","description":"This scope permits to list all files and folders in the `$LOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"}]}},"scope-localdata-recursive":{"identifier":"scope-localdata-recursive","description":"This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/**"}]}},"scope-log":{"identifier":"scope-log","description":"This scope permits access to all files and list content of top level directories in the `$LOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/*"}]}},"scope-log-index":{"identifier":"scope-log-index","description":"This scope permits to list all files and folders in the `$LOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"}]}},"scope-log-recursive":{"identifier":"scope-log-recursive","description":"This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/**"}]}},"scope-picture":{"identifier":"scope-picture","description":"This scope permits access to all files and list content of top level directories in the `$PICTURE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/*"}]}},"scope-picture-index":{"identifier":"scope-picture-index","description":"This scope permits to list all files and folders in the `$PICTURE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"}]}},"scope-picture-recursive":{"identifier":"scope-picture-recursive","description":"This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/**"}]}},"scope-public":{"identifier":"scope-public","description":"This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/*"}]}},"scope-public-index":{"identifier":"scope-public-index","description":"This scope permits to list all files and folders in the `$PUBLIC`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"}]}},"scope-public-recursive":{"identifier":"scope-public-recursive","description":"This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/**"}]}},"scope-resource":{"identifier":"scope-resource","description":"This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/*"}]}},"scope-resource-index":{"identifier":"scope-resource-index","description":"This scope permits to list all files and folders in the `$RESOURCE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"}]}},"scope-resource-recursive":{"identifier":"scope-resource-recursive","description":"This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/**"}]}},"scope-runtime":{"identifier":"scope-runtime","description":"This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/*"}]}},"scope-runtime-index":{"identifier":"scope-runtime-index","description":"This scope permits to list all files and folders in the `$RUNTIME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"}]}},"scope-runtime-recursive":{"identifier":"scope-runtime-recursive","description":"This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/**"}]}},"scope-temp":{"identifier":"scope-temp","description":"This scope permits access to all files and list content of top level directories in the `$TEMP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/*"}]}},"scope-temp-index":{"identifier":"scope-temp-index","description":"This scope permits to list all files and folders in the `$TEMP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"}]}},"scope-temp-recursive":{"identifier":"scope-temp-recursive","description":"This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/**"}]}},"scope-template":{"identifier":"scope-template","description":"This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/*"}]}},"scope-template-index":{"identifier":"scope-template-index","description":"This scope permits to list all files and folders in the `$TEMPLATE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"}]}},"scope-template-recursive":{"identifier":"scope-template-recursive","description":"This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/**"}]}},"scope-video":{"identifier":"scope-video","description":"This scope permits access to all files and list content of top level directories in the `$VIDEO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/*"}]}},"scope-video-index":{"identifier":"scope-video-index","description":"This scope permits to list all files and folders in the `$VIDEO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"}]}},"scope-video-recursive":{"identifier":"scope-video-recursive","description":"This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/**"}]}},"write-all":{"identifier":"write-all","description":"This enables all write related commands without any pre-configured accessible paths.","commands":{"allow":["mkdir","create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}},"write-files":{"identifier":"write-files","description":"This enables all file write related commands without any pre-configured accessible paths.","commands":{"allow":["create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}}},"permission_sets":{"allow-app-meta":{"identifier":"allow-app-meta","description":"This allows non-recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-index"]},"allow-app-meta-recursive":{"identifier":"allow-app-meta-recursive","description":"This allows full recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-recursive"]},"allow-app-read":{"identifier":"allow-app-read","description":"This allows non-recursive read access to the application folders.","permissions":["read-all","scope-app"]},"allow-app-read-recursive":{"identifier":"allow-app-read-recursive","description":"This allows full recursive read access to the complete application folders, files and subdirectories.","permissions":["read-all","scope-app-recursive"]},"allow-app-write":{"identifier":"allow-app-write","description":"This allows non-recursive write access to the application folders.","permissions":["write-all","scope-app"]},"allow-app-write-recursive":{"identifier":"allow-app-write-recursive","description":"This allows full recursive write access to the complete application folders, files and subdirectories.","permissions":["write-all","scope-app-recursive"]},"allow-appcache-meta":{"identifier":"allow-appcache-meta","description":"This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-index"]},"allow-appcache-meta-recursive":{"identifier":"allow-appcache-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-recursive"]},"allow-appcache-read":{"identifier":"allow-appcache-read","description":"This allows non-recursive read access to the `$APPCACHE` folder.","permissions":["read-all","scope-appcache"]},"allow-appcache-read-recursive":{"identifier":"allow-appcache-read-recursive","description":"This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["read-all","scope-appcache-recursive"]},"allow-appcache-write":{"identifier":"allow-appcache-write","description":"This allows non-recursive write access to the `$APPCACHE` folder.","permissions":["write-all","scope-appcache"]},"allow-appcache-write-recursive":{"identifier":"allow-appcache-write-recursive","description":"This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["write-all","scope-appcache-recursive"]},"allow-appconfig-meta":{"identifier":"allow-appconfig-meta","description":"This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-index"]},"allow-appconfig-meta-recursive":{"identifier":"allow-appconfig-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-recursive"]},"allow-appconfig-read":{"identifier":"allow-appconfig-read","description":"This allows non-recursive read access to the `$APPCONFIG` folder.","permissions":["read-all","scope-appconfig"]},"allow-appconfig-read-recursive":{"identifier":"allow-appconfig-read-recursive","description":"This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["read-all","scope-appconfig-recursive"]},"allow-appconfig-write":{"identifier":"allow-appconfig-write","description":"This allows non-recursive write access to the `$APPCONFIG` folder.","permissions":["write-all","scope-appconfig"]},"allow-appconfig-write-recursive":{"identifier":"allow-appconfig-write-recursive","description":"This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["write-all","scope-appconfig-recursive"]},"allow-appdata-meta":{"identifier":"allow-appdata-meta","description":"This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-index"]},"allow-appdata-meta-recursive":{"identifier":"allow-appdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-recursive"]},"allow-appdata-read":{"identifier":"allow-appdata-read","description":"This allows non-recursive read access to the `$APPDATA` folder.","permissions":["read-all","scope-appdata"]},"allow-appdata-read-recursive":{"identifier":"allow-appdata-read-recursive","description":"This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["read-all","scope-appdata-recursive"]},"allow-appdata-write":{"identifier":"allow-appdata-write","description":"This allows non-recursive write access to the `$APPDATA` folder.","permissions":["write-all","scope-appdata"]},"allow-appdata-write-recursive":{"identifier":"allow-appdata-write-recursive","description":"This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["write-all","scope-appdata-recursive"]},"allow-applocaldata-meta":{"identifier":"allow-applocaldata-meta","description":"This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-index"]},"allow-applocaldata-meta-recursive":{"identifier":"allow-applocaldata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-recursive"]},"allow-applocaldata-read":{"identifier":"allow-applocaldata-read","description":"This allows non-recursive read access to the `$APPLOCALDATA` folder.","permissions":["read-all","scope-applocaldata"]},"allow-applocaldata-read-recursive":{"identifier":"allow-applocaldata-read-recursive","description":"This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-applocaldata-recursive"]},"allow-applocaldata-write":{"identifier":"allow-applocaldata-write","description":"This allows non-recursive write access to the `$APPLOCALDATA` folder.","permissions":["write-all","scope-applocaldata"]},"allow-applocaldata-write-recursive":{"identifier":"allow-applocaldata-write-recursive","description":"This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-applocaldata-recursive"]},"allow-applog-meta":{"identifier":"allow-applog-meta","description":"This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-index"]},"allow-applog-meta-recursive":{"identifier":"allow-applog-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-recursive"]},"allow-applog-read":{"identifier":"allow-applog-read","description":"This allows non-recursive read access to the `$APPLOG` folder.","permissions":["read-all","scope-applog"]},"allow-applog-read-recursive":{"identifier":"allow-applog-read-recursive","description":"This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["read-all","scope-applog-recursive"]},"allow-applog-write":{"identifier":"allow-applog-write","description":"This allows non-recursive write access to the `$APPLOG` folder.","permissions":["write-all","scope-applog"]},"allow-applog-write-recursive":{"identifier":"allow-applog-write-recursive","description":"This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["write-all","scope-applog-recursive"]},"allow-audio-meta":{"identifier":"allow-audio-meta","description":"This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-index"]},"allow-audio-meta-recursive":{"identifier":"allow-audio-meta-recursive","description":"This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-recursive"]},"allow-audio-read":{"identifier":"allow-audio-read","description":"This allows non-recursive read access to the `$AUDIO` folder.","permissions":["read-all","scope-audio"]},"allow-audio-read-recursive":{"identifier":"allow-audio-read-recursive","description":"This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["read-all","scope-audio-recursive"]},"allow-audio-write":{"identifier":"allow-audio-write","description":"This allows non-recursive write access to the `$AUDIO` folder.","permissions":["write-all","scope-audio"]},"allow-audio-write-recursive":{"identifier":"allow-audio-write-recursive","description":"This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["write-all","scope-audio-recursive"]},"allow-cache-meta":{"identifier":"allow-cache-meta","description":"This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-index"]},"allow-cache-meta-recursive":{"identifier":"allow-cache-meta-recursive","description":"This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-recursive"]},"allow-cache-read":{"identifier":"allow-cache-read","description":"This allows non-recursive read access to the `$CACHE` folder.","permissions":["read-all","scope-cache"]},"allow-cache-read-recursive":{"identifier":"allow-cache-read-recursive","description":"This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.","permissions":["read-all","scope-cache-recursive"]},"allow-cache-write":{"identifier":"allow-cache-write","description":"This allows non-recursive write access to the `$CACHE` folder.","permissions":["write-all","scope-cache"]},"allow-cache-write-recursive":{"identifier":"allow-cache-write-recursive","description":"This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.","permissions":["write-all","scope-cache-recursive"]},"allow-config-meta":{"identifier":"allow-config-meta","description":"This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-index"]},"allow-config-meta-recursive":{"identifier":"allow-config-meta-recursive","description":"This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-recursive"]},"allow-config-read":{"identifier":"allow-config-read","description":"This allows non-recursive read access to the `$CONFIG` folder.","permissions":["read-all","scope-config"]},"allow-config-read-recursive":{"identifier":"allow-config-read-recursive","description":"This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["read-all","scope-config-recursive"]},"allow-config-write":{"identifier":"allow-config-write","description":"This allows non-recursive write access to the `$CONFIG` folder.","permissions":["write-all","scope-config"]},"allow-config-write-recursive":{"identifier":"allow-config-write-recursive","description":"This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["write-all","scope-config-recursive"]},"allow-data-meta":{"identifier":"allow-data-meta","description":"This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-index"]},"allow-data-meta-recursive":{"identifier":"allow-data-meta-recursive","description":"This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-recursive"]},"allow-data-read":{"identifier":"allow-data-read","description":"This allows non-recursive read access to the `$DATA` folder.","permissions":["read-all","scope-data"]},"allow-data-read-recursive":{"identifier":"allow-data-read-recursive","description":"This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.","permissions":["read-all","scope-data-recursive"]},"allow-data-write":{"identifier":"allow-data-write","description":"This allows non-recursive write access to the `$DATA` folder.","permissions":["write-all","scope-data"]},"allow-data-write-recursive":{"identifier":"allow-data-write-recursive","description":"This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.","permissions":["write-all","scope-data-recursive"]},"allow-desktop-meta":{"identifier":"allow-desktop-meta","description":"This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-index"]},"allow-desktop-meta-recursive":{"identifier":"allow-desktop-meta-recursive","description":"This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-recursive"]},"allow-desktop-read":{"identifier":"allow-desktop-read","description":"This allows non-recursive read access to the `$DESKTOP` folder.","permissions":["read-all","scope-desktop"]},"allow-desktop-read-recursive":{"identifier":"allow-desktop-read-recursive","description":"This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["read-all","scope-desktop-recursive"]},"allow-desktop-write":{"identifier":"allow-desktop-write","description":"This allows non-recursive write access to the `$DESKTOP` folder.","permissions":["write-all","scope-desktop"]},"allow-desktop-write-recursive":{"identifier":"allow-desktop-write-recursive","description":"This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["write-all","scope-desktop-recursive"]},"allow-document-meta":{"identifier":"allow-document-meta","description":"This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-index"]},"allow-document-meta-recursive":{"identifier":"allow-document-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-recursive"]},"allow-document-read":{"identifier":"allow-document-read","description":"This allows non-recursive read access to the `$DOCUMENT` folder.","permissions":["read-all","scope-document"]},"allow-document-read-recursive":{"identifier":"allow-document-read-recursive","description":"This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["read-all","scope-document-recursive"]},"allow-document-write":{"identifier":"allow-document-write","description":"This allows non-recursive write access to the `$DOCUMENT` folder.","permissions":["write-all","scope-document"]},"allow-document-write-recursive":{"identifier":"allow-document-write-recursive","description":"This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["write-all","scope-document-recursive"]},"allow-download-meta":{"identifier":"allow-download-meta","description":"This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-index"]},"allow-download-meta-recursive":{"identifier":"allow-download-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-recursive"]},"allow-download-read":{"identifier":"allow-download-read","description":"This allows non-recursive read access to the `$DOWNLOAD` folder.","permissions":["read-all","scope-download"]},"allow-download-read-recursive":{"identifier":"allow-download-read-recursive","description":"This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["read-all","scope-download-recursive"]},"allow-download-write":{"identifier":"allow-download-write","description":"This allows non-recursive write access to the `$DOWNLOAD` folder.","permissions":["write-all","scope-download"]},"allow-download-write-recursive":{"identifier":"allow-download-write-recursive","description":"This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["write-all","scope-download-recursive"]},"allow-exe-meta":{"identifier":"allow-exe-meta","description":"This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-index"]},"allow-exe-meta-recursive":{"identifier":"allow-exe-meta-recursive","description":"This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-recursive"]},"allow-exe-read":{"identifier":"allow-exe-read","description":"This allows non-recursive read access to the `$EXE` folder.","permissions":["read-all","scope-exe"]},"allow-exe-read-recursive":{"identifier":"allow-exe-read-recursive","description":"This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.","permissions":["read-all","scope-exe-recursive"]},"allow-exe-write":{"identifier":"allow-exe-write","description":"This allows non-recursive write access to the `$EXE` folder.","permissions":["write-all","scope-exe"]},"allow-exe-write-recursive":{"identifier":"allow-exe-write-recursive","description":"This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.","permissions":["write-all","scope-exe-recursive"]},"allow-font-meta":{"identifier":"allow-font-meta","description":"This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-index"]},"allow-font-meta-recursive":{"identifier":"allow-font-meta-recursive","description":"This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-recursive"]},"allow-font-read":{"identifier":"allow-font-read","description":"This allows non-recursive read access to the `$FONT` folder.","permissions":["read-all","scope-font"]},"allow-font-read-recursive":{"identifier":"allow-font-read-recursive","description":"This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.","permissions":["read-all","scope-font-recursive"]},"allow-font-write":{"identifier":"allow-font-write","description":"This allows non-recursive write access to the `$FONT` folder.","permissions":["write-all","scope-font"]},"allow-font-write-recursive":{"identifier":"allow-font-write-recursive","description":"This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.","permissions":["write-all","scope-font-recursive"]},"allow-home-meta":{"identifier":"allow-home-meta","description":"This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-index"]},"allow-home-meta-recursive":{"identifier":"allow-home-meta-recursive","description":"This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-recursive"]},"allow-home-read":{"identifier":"allow-home-read","description":"This allows non-recursive read access to the `$HOME` folder.","permissions":["read-all","scope-home"]},"allow-home-read-recursive":{"identifier":"allow-home-read-recursive","description":"This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.","permissions":["read-all","scope-home-recursive"]},"allow-home-write":{"identifier":"allow-home-write","description":"This allows non-recursive write access to the `$HOME` folder.","permissions":["write-all","scope-home"]},"allow-home-write-recursive":{"identifier":"allow-home-write-recursive","description":"This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.","permissions":["write-all","scope-home-recursive"]},"allow-localdata-meta":{"identifier":"allow-localdata-meta","description":"This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-index"]},"allow-localdata-meta-recursive":{"identifier":"allow-localdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-recursive"]},"allow-localdata-read":{"identifier":"allow-localdata-read","description":"This allows non-recursive read access to the `$LOCALDATA` folder.","permissions":["read-all","scope-localdata"]},"allow-localdata-read-recursive":{"identifier":"allow-localdata-read-recursive","description":"This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-localdata-recursive"]},"allow-localdata-write":{"identifier":"allow-localdata-write","description":"This allows non-recursive write access to the `$LOCALDATA` folder.","permissions":["write-all","scope-localdata"]},"allow-localdata-write-recursive":{"identifier":"allow-localdata-write-recursive","description":"This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-localdata-recursive"]},"allow-log-meta":{"identifier":"allow-log-meta","description":"This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-index"]},"allow-log-meta-recursive":{"identifier":"allow-log-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-recursive"]},"allow-log-read":{"identifier":"allow-log-read","description":"This allows non-recursive read access to the `$LOG` folder.","permissions":["read-all","scope-log"]},"allow-log-read-recursive":{"identifier":"allow-log-read-recursive","description":"This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.","permissions":["read-all","scope-log-recursive"]},"allow-log-write":{"identifier":"allow-log-write","description":"This allows non-recursive write access to the `$LOG` folder.","permissions":["write-all","scope-log"]},"allow-log-write-recursive":{"identifier":"allow-log-write-recursive","description":"This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.","permissions":["write-all","scope-log-recursive"]},"allow-picture-meta":{"identifier":"allow-picture-meta","description":"This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-index"]},"allow-picture-meta-recursive":{"identifier":"allow-picture-meta-recursive","description":"This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-recursive"]},"allow-picture-read":{"identifier":"allow-picture-read","description":"This allows non-recursive read access to the `$PICTURE` folder.","permissions":["read-all","scope-picture"]},"allow-picture-read-recursive":{"identifier":"allow-picture-read-recursive","description":"This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["read-all","scope-picture-recursive"]},"allow-picture-write":{"identifier":"allow-picture-write","description":"This allows non-recursive write access to the `$PICTURE` folder.","permissions":["write-all","scope-picture"]},"allow-picture-write-recursive":{"identifier":"allow-picture-write-recursive","description":"This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["write-all","scope-picture-recursive"]},"allow-public-meta":{"identifier":"allow-public-meta","description":"This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-index"]},"allow-public-meta-recursive":{"identifier":"allow-public-meta-recursive","description":"This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-recursive"]},"allow-public-read":{"identifier":"allow-public-read","description":"This allows non-recursive read access to the `$PUBLIC` folder.","permissions":["read-all","scope-public"]},"allow-public-read-recursive":{"identifier":"allow-public-read-recursive","description":"This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["read-all","scope-public-recursive"]},"allow-public-write":{"identifier":"allow-public-write","description":"This allows non-recursive write access to the `$PUBLIC` folder.","permissions":["write-all","scope-public"]},"allow-public-write-recursive":{"identifier":"allow-public-write-recursive","description":"This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["write-all","scope-public-recursive"]},"allow-resource-meta":{"identifier":"allow-resource-meta","description":"This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-index"]},"allow-resource-meta-recursive":{"identifier":"allow-resource-meta-recursive","description":"This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-recursive"]},"allow-resource-read":{"identifier":"allow-resource-read","description":"This allows non-recursive read access to the `$RESOURCE` folder.","permissions":["read-all","scope-resource"]},"allow-resource-read-recursive":{"identifier":"allow-resource-read-recursive","description":"This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["read-all","scope-resource-recursive"]},"allow-resource-write":{"identifier":"allow-resource-write","description":"This allows non-recursive write access to the `$RESOURCE` folder.","permissions":["write-all","scope-resource"]},"allow-resource-write-recursive":{"identifier":"allow-resource-write-recursive","description":"This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["write-all","scope-resource-recursive"]},"allow-runtime-meta":{"identifier":"allow-runtime-meta","description":"This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-index"]},"allow-runtime-meta-recursive":{"identifier":"allow-runtime-meta-recursive","description":"This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-recursive"]},"allow-runtime-read":{"identifier":"allow-runtime-read","description":"This allows non-recursive read access to the `$RUNTIME` folder.","permissions":["read-all","scope-runtime"]},"allow-runtime-read-recursive":{"identifier":"allow-runtime-read-recursive","description":"This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["read-all","scope-runtime-recursive"]},"allow-runtime-write":{"identifier":"allow-runtime-write","description":"This allows non-recursive write access to the `$RUNTIME` folder.","permissions":["write-all","scope-runtime"]},"allow-runtime-write-recursive":{"identifier":"allow-runtime-write-recursive","description":"This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["write-all","scope-runtime-recursive"]},"allow-temp-meta":{"identifier":"allow-temp-meta","description":"This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-index"]},"allow-temp-meta-recursive":{"identifier":"allow-temp-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-recursive"]},"allow-temp-read":{"identifier":"allow-temp-read","description":"This allows non-recursive read access to the `$TEMP` folder.","permissions":["read-all","scope-temp"]},"allow-temp-read-recursive":{"identifier":"allow-temp-read-recursive","description":"This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.","permissions":["read-all","scope-temp-recursive"]},"allow-temp-write":{"identifier":"allow-temp-write","description":"This allows non-recursive write access to the `$TEMP` folder.","permissions":["write-all","scope-temp"]},"allow-temp-write-recursive":{"identifier":"allow-temp-write-recursive","description":"This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.","permissions":["write-all","scope-temp-recursive"]},"allow-template-meta":{"identifier":"allow-template-meta","description":"This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-index"]},"allow-template-meta-recursive":{"identifier":"allow-template-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-recursive"]},"allow-template-read":{"identifier":"allow-template-read","description":"This allows non-recursive read access to the `$TEMPLATE` folder.","permissions":["read-all","scope-template"]},"allow-template-read-recursive":{"identifier":"allow-template-read-recursive","description":"This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["read-all","scope-template-recursive"]},"allow-template-write":{"identifier":"allow-template-write","description":"This allows non-recursive write access to the `$TEMPLATE` folder.","permissions":["write-all","scope-template"]},"allow-template-write-recursive":{"identifier":"allow-template-write-recursive","description":"This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["write-all","scope-template-recursive"]},"allow-video-meta":{"identifier":"allow-video-meta","description":"This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-index"]},"allow-video-meta-recursive":{"identifier":"allow-video-meta-recursive","description":"This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-recursive"]},"allow-video-read":{"identifier":"allow-video-read","description":"This allows non-recursive read access to the `$VIDEO` folder.","permissions":["read-all","scope-video"]},"allow-video-read-recursive":{"identifier":"allow-video-read-recursive","description":"This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["read-all","scope-video-recursive"]},"allow-video-write":{"identifier":"allow-video-write","description":"This allows non-recursive write access to the `$VIDEO` folder.","permissions":["write-all","scope-video"]},"allow-video-write-recursive":{"identifier":"allow-video-write-recursive","description":"This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["write-all","scope-video-recursive"]},"deny-default":{"identifier":"deny-default","description":"This denies access to dangerous Tauri relevant files and folders by default.","permissions":["deny-webview-data-linux","deny-webview-data-windows"]}},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","title":"FsScopeEntry","description":"FS scope entry.","anyOf":[{"description":"A path that can be accessed by the webview when using the fs APIs. FS scope path pattern.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},{"type":"object","required":["path"],"properties":{"path":{"description":"A path that can be accessed by the webview when using the fs APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"}}}]}},"notification":{"default_permission":{"identifier":"default","description":"This permission set configures which\nnotification features are by default exposed.\n\n#### Granted Permissions\n\nIt allows all notification related features.\n\n","permissions":["allow-is-permission-granted","allow-request-permission","allow-notify","allow-register-action-types","allow-register-listener","allow-cancel","allow-get-pending","allow-remove-active","allow-get-active","allow-check-permissions","allow-show","allow-batch","allow-list-channels","allow-delete-channel","allow-create-channel","allow-permission-state"]},"permissions":{"allow-batch":{"identifier":"allow-batch","description":"Enables the batch command without any pre-configured scope.","commands":{"allow":["batch"],"deny":[]}},"allow-cancel":{"identifier":"allow-cancel","description":"Enables the cancel command without any pre-configured scope.","commands":{"allow":["cancel"],"deny":[]}},"allow-check-permissions":{"identifier":"allow-check-permissions","description":"Enables the check_permissions command without any pre-configured scope.","commands":{"allow":["check_permissions"],"deny":[]}},"allow-create-channel":{"identifier":"allow-create-channel","description":"Enables the create_channel command without any pre-configured scope.","commands":{"allow":["create_channel"],"deny":[]}},"allow-delete-channel":{"identifier":"allow-delete-channel","description":"Enables the delete_channel command without any pre-configured scope.","commands":{"allow":["delete_channel"],"deny":[]}},"allow-get-active":{"identifier":"allow-get-active","description":"Enables the get_active command without any pre-configured scope.","commands":{"allow":["get_active"],"deny":[]}},"allow-get-pending":{"identifier":"allow-get-pending","description":"Enables the get_pending command without any pre-configured scope.","commands":{"allow":["get_pending"],"deny":[]}},"allow-is-permission-granted":{"identifier":"allow-is-permission-granted","description":"Enables the is_permission_granted command without any pre-configured scope.","commands":{"allow":["is_permission_granted"],"deny":[]}},"allow-list-channels":{"identifier":"allow-list-channels","description":"Enables the list_channels command without any pre-configured scope.","commands":{"allow":["list_channels"],"deny":[]}},"allow-notify":{"identifier":"allow-notify","description":"Enables the notify command without any pre-configured scope.","commands":{"allow":["notify"],"deny":[]}},"allow-permission-state":{"identifier":"allow-permission-state","description":"Enables the permission_state command without any pre-configured scope.","commands":{"allow":["permission_state"],"deny":[]}},"allow-register-action-types":{"identifier":"allow-register-action-types","description":"Enables the register_action_types command without any pre-configured scope.","commands":{"allow":["register_action_types"],"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-active":{"identifier":"allow-remove-active","description":"Enables the remove_active command without any pre-configured scope.","commands":{"allow":["remove_active"],"deny":[]}},"allow-request-permission":{"identifier":"allow-request-permission","description":"Enables the request_permission command without any pre-configured scope.","commands":{"allow":["request_permission"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"deny-batch":{"identifier":"deny-batch","description":"Denies the batch command without any pre-configured scope.","commands":{"allow":[],"deny":["batch"]}},"deny-cancel":{"identifier":"deny-cancel","description":"Denies the cancel command without any pre-configured scope.","commands":{"allow":[],"deny":["cancel"]}},"deny-check-permissions":{"identifier":"deny-check-permissions","description":"Denies the check_permissions command without any pre-configured scope.","commands":{"allow":[],"deny":["check_permissions"]}},"deny-create-channel":{"identifier":"deny-create-channel","description":"Denies the create_channel command without any pre-configured scope.","commands":{"allow":[],"deny":["create_channel"]}},"deny-delete-channel":{"identifier":"deny-delete-channel","description":"Denies the delete_channel command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_channel"]}},"deny-get-active":{"identifier":"deny-get-active","description":"Denies the get_active command without any pre-configured scope.","commands":{"allow":[],"deny":["get_active"]}},"deny-get-pending":{"identifier":"deny-get-pending","description":"Denies the get_pending command without any pre-configured scope.","commands":{"allow":[],"deny":["get_pending"]}},"deny-is-permission-granted":{"identifier":"deny-is-permission-granted","description":"Denies the is_permission_granted command without any pre-configured scope.","commands":{"allow":[],"deny":["is_permission_granted"]}},"deny-list-channels":{"identifier":"deny-list-channels","description":"Denies the list_channels command without any pre-configured scope.","commands":{"allow":[],"deny":["list_channels"]}},"deny-notify":{"identifier":"deny-notify","description":"Denies the notify command without any pre-configured scope.","commands":{"allow":[],"deny":["notify"]}},"deny-permission-state":{"identifier":"deny-permission-state","description":"Denies the permission_state command without any pre-configured scope.","commands":{"allow":[],"deny":["permission_state"]}},"deny-register-action-types":{"identifier":"deny-register-action-types","description":"Denies the register_action_types command without any pre-configured scope.","commands":{"allow":[],"deny":["register_action_types"]}},"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-active":{"identifier":"deny-remove-active","description":"Denies the remove_active command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_active"]}},"deny-request-permission":{"identifier":"deny-request-permission","description":"Denies the request_permission command without any pre-configured scope.","commands":{"allow":[],"deny":["request_permission"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}}},"permission_sets":{},"global_scope_schema":null},"process":{"default_permission":{"identifier":"default","description":"This permission set configures which\nprocess features are by default exposed.\n\n#### Granted Permissions\n\nThis enables to quit via `allow-exit` and restart via `allow-restart`\nthe application.\n","permissions":["allow-exit","allow-restart"]},"permissions":{"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-restart":{"identifier":"allow-restart","description":"Enables the restart command without any pre-configured scope.","commands":{"allow":["restart"],"deny":[]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-restart":{"identifier":"deny-restart","description":"Denies the restart command without any pre-configured scope.","commands":{"allow":[],"deny":["restart"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","title":"ShellScopeEntry","description":"Shell scope entry.","anyOf":[{"type":"object","required":["cmd","name"],"properties":{"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"cmd":{"description":"The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"args":{"description":"The allowed arguments for the command execution.","allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}]}},"additionalProperties":false},{"type":"object","required":["name","sidecar"],"properties":{"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"args":{"description":"The allowed arguments for the command execution.","allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}]},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"additionalProperties":false}],"definitions":{"ShellScopeEntryAllowedArgs":{"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.","anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.","type":"array","items":{"$ref":"#/definitions/ShellScopeEntryAllowedArg"}}]},"ShellScopeEntryAllowedArg":{"description":"A command argument allowed to be executed by the webview API.","anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"description":"A variable that is set while calling the command from the webview API.","type":"object","required":["validator"],"properties":{"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ","type":"string"},"raw":{"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","default":false,"type":"boolean"}},"additionalProperties":false}]}}}},"sql":{"default_permission":{"identifier":"default","description":"### Default Permissions\n\nThis permission set configures what kind of\ndatabase operations are available from the sql plugin.\n\n### Granted Permissions\n\nAll reading related operations are enabled.\nAlso allows to load or close a connection.\n\n","permissions":["allow-close","allow-load","allow-select"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-load":{"identifier":"allow-load","description":"Enables the load command without any pre-configured scope.","commands":{"allow":["load"],"deny":[]}},"allow-select":{"identifier":"allow-select","description":"Enables the select command without any pre-configured scope.","commands":{"allow":["select"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-load":{"identifier":"deny-load","description":"Denies the load command without any pre-configured scope.","commands":{"allow":[],"deny":["load"]}},"deny-select":{"identifier":"deny-select","description":"Denies the select command without any pre-configured scope.","commands":{"allow":[],"deny":["select"]}}},"permission_sets":{},"global_scope_schema":null},"updater":{"default_permission":{"identifier":"default","description":"This permission set configures which kind of\nupdater functions are exposed to the frontend.\n\n#### Granted Permissions\n\nThe full workflow from checking for updates to installing them\nis enabled.\n\n","permissions":["allow-check","allow-download","allow-install","allow-download-and-install"]},"permissions":{"allow-check":{"identifier":"allow-check","description":"Enables the check command without any pre-configured scope.","commands":{"allow":["check"],"deny":[]}},"allow-download":{"identifier":"allow-download","description":"Enables the download command without any pre-configured scope.","commands":{"allow":["download"],"deny":[]}},"allow-download-and-install":{"identifier":"allow-download-and-install","description":"Enables the download_and_install command without any pre-configured scope.","commands":{"allow":["download_and_install"],"deny":[]}},"allow-install":{"identifier":"allow-install","description":"Enables the install command without any pre-configured scope.","commands":{"allow":["install"],"deny":[]}},"deny-check":{"identifier":"deny-check","description":"Denies the check command without any pre-configured scope.","commands":{"allow":[],"deny":["check"]}},"deny-download":{"identifier":"deny-download","description":"Denies the download command without any pre-configured scope.","commands":{"allow":[],"deny":["download"]}},"deny-download-and-install":{"identifier":"deny-download-and-install","description":"Denies the download_and_install command without any pre-configured scope.","commands":{"allow":[],"deny":["download_and_install"]}},"deny-install":{"identifier":"deny-install","description":"Denies the install command without any pre-configured scope.","commands":{"allow":[],"deny":["install"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file diff --git a/httui-desktop/src-tauri/gen/schemas/desktop-schema.json b/httui-desktop/src-tauri/gen/schemas/desktop-schema.json index 80bfb7e4..878cffba 100644 --- a/httui-desktop/src-tauri/gen/schemas/desktop-schema.json +++ b/httui-desktop/src-tauri/gen/schemas/desktop-schema.json @@ -2047,6 +2047,14 @@ "name" ], "properties": { + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, "args": { "description": "The allowed arguments for the command execution.", "allOf": [ @@ -2054,14 +2062,6 @@ "$ref": "#/definitions/ShellScopeEntryAllowedArgs" } ] - }, - "cmd": { - "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", - "type": "string" - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" } }, "additionalProperties": false @@ -2073,6 +2073,10 @@ "sidecar" ], "properties": { + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, "args": { "description": "The allowed arguments for the command execution.", "allOf": [ @@ -2081,10 +2085,6 @@ } ] }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - }, "sidecar": { "description": "If this command is a sidecar command.", "type": "boolean" @@ -2107,6 +2107,14 @@ "name" ], "properties": { + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, "args": { "description": "The allowed arguments for the command execution.", "allOf": [ @@ -2114,14 +2122,6 @@ "$ref": "#/definitions/ShellScopeEntryAllowedArgs" } ] - }, - "cmd": { - "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", - "type": "string" - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" } }, "additionalProperties": false @@ -2133,6 +2133,10 @@ "sidecar" ], "properties": { + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, "args": { "description": "The allowed arguments for the command execution.", "allOf": [ @@ -2141,10 +2145,6 @@ } ] }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - }, "sidecar": { "description": "If this command is a sidecar command.", "type": "boolean" @@ -2217,10 +2217,10 @@ "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`" }, { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`", + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`", "type": "string", "const": "core:app:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`" + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`" }, { "description": "Enables the app_hide command without any pre-configured scope.", @@ -2294,6 +2294,12 @@ "const": "core:app:allow-set-dock-visibility", "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." }, + { + "description": "Enables the supports_multiple_windows command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-supports-multiple-windows", + "markdownDescription": "Enables the supports_multiple_windows command without any pre-configured scope." + }, { "description": "Enables the tauri_version command without any pre-configured scope.", "type": "string", @@ -2378,6 +2384,12 @@ "const": "core:app:deny-set-dock-visibility", "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." }, + { + "description": "Denies the supports_multiple_windows command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-supports-multiple-windows", + "markdownDescription": "Denies the supports_multiple_windows command without any pre-configured scope." + }, { "description": "Denies the tauri_version command without any pre-configured scope.", "type": "string", @@ -2901,10 +2913,10 @@ "markdownDescription": "Denies the close command without any pre-configured scope." }, { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`", + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`", "type": "string", "const": "core:tray:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`" + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`" }, { "description": "Enables the get_by_id command without any pre-configured scope.", @@ -2936,6 +2948,12 @@ "const": "core:tray:allow-set-icon-as-template", "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." }, + { + "description": "Enables the set_icon_with_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-with-as-template", + "markdownDescription": "Enables the set_icon_with_as_template command without any pre-configured scope." + }, { "description": "Enables the set_menu command without any pre-configured scope.", "type": "string", @@ -3002,6 +3020,12 @@ "const": "core:tray:deny-set-icon-as-template", "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." }, + { + "description": "Denies the set_icon_with_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-with-as-template", + "markdownDescription": "Denies the set_icon_with_as_template command without any pre-configured scope." + }, { "description": "Denies the set_menu command without any pre-configured scope.", "type": "string", @@ -3261,10 +3285,16 @@ "markdownDescription": "Denies the webview_size command without any pre-configured scope." }, { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`", + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`", "type": "string", "const": "core:window:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`" + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`" + }, + { + "description": "Enables the activity_name command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-activity-name", + "markdownDescription": "Enables the activity_name command without any pre-configured scope." }, { "description": "Enables the available_monitors command without any pre-configured scope.", @@ -3458,6 +3488,12 @@ "const": "core:window:allow-scale-factor", "markdownDescription": "Enables the scale_factor command without any pre-configured scope." }, + { + "description": "Enables the scene_identifier command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scene-identifier", + "markdownDescription": "Enables the scene_identifier command without any pre-configured scope." + }, { "description": "Enables the set_always_on_bottom command without any pre-configured scope.", "type": "string", @@ -3722,6 +3758,12 @@ "const": "core:window:allow-unminimize", "markdownDescription": "Enables the unminimize command without any pre-configured scope." }, + { + "description": "Denies the activity_name command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-activity-name", + "markdownDescription": "Denies the activity_name command without any pre-configured scope." + }, { "description": "Denies the available_monitors command without any pre-configured scope.", "type": "string", @@ -3914,6 +3956,12 @@ "const": "core:window:deny-scale-factor", "markdownDescription": "Denies the scale_factor command without any pre-configured scope." }, + { + "description": "Denies the scene_identifier command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scene-identifier", + "markdownDescription": "Denies the scene_identifier command without any pre-configured scope." + }, { "description": "Denies the set_always_on_bottom command without any pre-configured scope.", "type": "string", @@ -6494,6 +6542,22 @@ } ] }, + "ShellScopeEntryAllowedArgs": { + "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.", + "anyOf": [ + { + "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.", + "type": "boolean" + }, + { + "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", + "type": "array", + "items": { + "$ref": "#/definitions/ShellScopeEntryAllowedArg" + } + } + ] + }, "ShellScopeEntryAllowedArg": { "description": "A command argument allowed to be executed by the webview API.", "anyOf": [ @@ -6508,35 +6572,19 @@ "validator" ], "properties": { + "validator": { + "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ", + "type": "string" + }, "raw": { "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.", "default": false, "type": "boolean" - }, - "validator": { - "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ", - "type": "string" } }, "additionalProperties": false } ] - }, - "ShellScopeEntryAllowedArgs": { - "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.", - "anyOf": [ - { - "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.", - "type": "boolean" - }, - { - "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", - "type": "array", - "items": { - "$ref": "#/definitions/ShellScopeEntryAllowedArg" - } - } - ] } } } \ No newline at end of file diff --git a/httui-desktop/src-tauri/gen/schemas/macOS-schema.json b/httui-desktop/src-tauri/gen/schemas/macOS-schema.json index 80bfb7e4..878cffba 100644 --- a/httui-desktop/src-tauri/gen/schemas/macOS-schema.json +++ b/httui-desktop/src-tauri/gen/schemas/macOS-schema.json @@ -2047,6 +2047,14 @@ "name" ], "properties": { + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, "args": { "description": "The allowed arguments for the command execution.", "allOf": [ @@ -2054,14 +2062,6 @@ "$ref": "#/definitions/ShellScopeEntryAllowedArgs" } ] - }, - "cmd": { - "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", - "type": "string" - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" } }, "additionalProperties": false @@ -2073,6 +2073,10 @@ "sidecar" ], "properties": { + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, "args": { "description": "The allowed arguments for the command execution.", "allOf": [ @@ -2081,10 +2085,6 @@ } ] }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - }, "sidecar": { "description": "If this command is a sidecar command.", "type": "boolean" @@ -2107,6 +2107,14 @@ "name" ], "properties": { + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, + "cmd": { + "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", + "type": "string" + }, "args": { "description": "The allowed arguments for the command execution.", "allOf": [ @@ -2114,14 +2122,6 @@ "$ref": "#/definitions/ShellScopeEntryAllowedArgs" } ] - }, - "cmd": { - "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", - "type": "string" - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" } }, "additionalProperties": false @@ -2133,6 +2133,10 @@ "sidecar" ], "properties": { + "name": { + "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", + "type": "string" + }, "args": { "description": "The allowed arguments for the command execution.", "allOf": [ @@ -2141,10 +2145,6 @@ } ] }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - }, "sidecar": { "description": "If this command is a sidecar command.", "type": "boolean" @@ -2217,10 +2217,10 @@ "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`" }, { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`", + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`", "type": "string", "const": "core:app:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`" + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`" }, { "description": "Enables the app_hide command without any pre-configured scope.", @@ -2294,6 +2294,12 @@ "const": "core:app:allow-set-dock-visibility", "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." }, + { + "description": "Enables the supports_multiple_windows command without any pre-configured scope.", + "type": "string", + "const": "core:app:allow-supports-multiple-windows", + "markdownDescription": "Enables the supports_multiple_windows command without any pre-configured scope." + }, { "description": "Enables the tauri_version command without any pre-configured scope.", "type": "string", @@ -2378,6 +2384,12 @@ "const": "core:app:deny-set-dock-visibility", "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." }, + { + "description": "Denies the supports_multiple_windows command without any pre-configured scope.", + "type": "string", + "const": "core:app:deny-supports-multiple-windows", + "markdownDescription": "Denies the supports_multiple_windows command without any pre-configured scope." + }, { "description": "Denies the tauri_version command without any pre-configured scope.", "type": "string", @@ -2901,10 +2913,10 @@ "markdownDescription": "Denies the close command without any pre-configured scope." }, { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`", + "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`", "type": "string", "const": "core:tray:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`" + "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`" }, { "description": "Enables the get_by_id command without any pre-configured scope.", @@ -2936,6 +2948,12 @@ "const": "core:tray:allow-set-icon-as-template", "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." }, + { + "description": "Enables the set_icon_with_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:allow-set-icon-with-as-template", + "markdownDescription": "Enables the set_icon_with_as_template command without any pre-configured scope." + }, { "description": "Enables the set_menu command without any pre-configured scope.", "type": "string", @@ -3002,6 +3020,12 @@ "const": "core:tray:deny-set-icon-as-template", "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." }, + { + "description": "Denies the set_icon_with_as_template command without any pre-configured scope.", + "type": "string", + "const": "core:tray:deny-set-icon-with-as-template", + "markdownDescription": "Denies the set_icon_with_as_template command without any pre-configured scope." + }, { "description": "Denies the set_menu command without any pre-configured scope.", "type": "string", @@ -3261,10 +3285,16 @@ "markdownDescription": "Denies the webview_size command without any pre-configured scope." }, { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`", + "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`", "type": "string", "const": "core:window:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`" + "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`" + }, + { + "description": "Enables the activity_name command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-activity-name", + "markdownDescription": "Enables the activity_name command without any pre-configured scope." }, { "description": "Enables the available_monitors command without any pre-configured scope.", @@ -3458,6 +3488,12 @@ "const": "core:window:allow-scale-factor", "markdownDescription": "Enables the scale_factor command without any pre-configured scope." }, + { + "description": "Enables the scene_identifier command without any pre-configured scope.", + "type": "string", + "const": "core:window:allow-scene-identifier", + "markdownDescription": "Enables the scene_identifier command without any pre-configured scope." + }, { "description": "Enables the set_always_on_bottom command without any pre-configured scope.", "type": "string", @@ -3722,6 +3758,12 @@ "const": "core:window:allow-unminimize", "markdownDescription": "Enables the unminimize command without any pre-configured scope." }, + { + "description": "Denies the activity_name command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-activity-name", + "markdownDescription": "Denies the activity_name command without any pre-configured scope." + }, { "description": "Denies the available_monitors command without any pre-configured scope.", "type": "string", @@ -3914,6 +3956,12 @@ "const": "core:window:deny-scale-factor", "markdownDescription": "Denies the scale_factor command without any pre-configured scope." }, + { + "description": "Denies the scene_identifier command without any pre-configured scope.", + "type": "string", + "const": "core:window:deny-scene-identifier", + "markdownDescription": "Denies the scene_identifier command without any pre-configured scope." + }, { "description": "Denies the set_always_on_bottom command without any pre-configured scope.", "type": "string", @@ -6494,6 +6542,22 @@ } ] }, + "ShellScopeEntryAllowedArgs": { + "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.", + "anyOf": [ + { + "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.", + "type": "boolean" + }, + { + "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", + "type": "array", + "items": { + "$ref": "#/definitions/ShellScopeEntryAllowedArg" + } + } + ] + }, "ShellScopeEntryAllowedArg": { "description": "A command argument allowed to be executed by the webview API.", "anyOf": [ @@ -6508,35 +6572,19 @@ "validator" ], "properties": { + "validator": { + "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ", + "type": "string" + }, "raw": { "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.", "default": false, "type": "boolean" - }, - "validator": { - "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ", - "type": "string" } }, "additionalProperties": false } ] - }, - "ShellScopeEntryAllowedArgs": { - "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.", - "anyOf": [ - { - "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.", - "type": "boolean" - }, - { - "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", - "type": "array", - "items": { - "$ref": "#/definitions/ShellScopeEntryAllowedArg" - } - } - ] } } } \ No newline at end of file diff --git a/httui-desktop/src-tauri/src/captures_commands.rs b/httui-desktop/src-tauri/src/captures_commands.rs index 6ac47016..516c888a 100644 --- a/httui-desktop/src-tauri/src/captures_commands.rs +++ b/httui-desktop/src-tauri/src/captures_commands.rs @@ -1,9 +1,4 @@ -//! Tauri commands wrapping `httui_core::captures_cache`. Powers -//! when auto-capture is ON, the consumer -//! filters secrets out of `useCaptureStore`'s payload and calls -//! `write_captures_cache_cmd`; on app start `read_captures_cache_cmd` -//! restores last-run values; `delete_captures_cache_cmd` runs when -//! the user toggles auto-capture OFF. +//! Tauri commands wrapping `httui_core::captures_cache`. use httui_core::captures_cache::{delete_captures_file, read_captures_file, write_captures_file}; use std::path::PathBuf; diff --git a/httui-desktop/src-tauri/src/chat/commands.rs b/httui-desktop/src-tauri/src/chat/commands.rs index ea879611..1d81b9bf 100644 --- a/httui-desktop/src-tauri/src/chat/commands.rs +++ b/httui-desktop/src-tauri/src/chat/commands.rs @@ -82,8 +82,6 @@ pub async fn send_chat_message( text: String, attachments: Vec, ) -> Result { - // 1. Persist user message - // 2. Build content blocks for DB (paths) and sidecar (base64) separately let mut db_blocks: Vec = vec![serde_json::json!({"type": "text", "text": text})]; let mut sidecar_blocks: Vec = @@ -94,19 +92,16 @@ pub async fn send_chat_message( .await .map_err(|e| format!("Failed to read attachment {}: {e}", att.path))?; - // Normalize: resize if > 2048px, re-encode as JPEG Q85 let (normalized, norm_media_type) = normalize_image(&bytes, &att.media_type) .unwrap_or_else(|_| (bytes.clone(), att.media_type.clone())); let b64 = base64_encode(&normalized); - // DB stores path (for UI display) db_blocks.push(serde_json::json!({ "type": "image", "path": att.path, "media_type": att.media_type, })); - // Sidecar gets normalized base64 (for API) sidecar_blocks.push(serde_json::json!({ "type": "image", "source": { @@ -122,7 +117,6 @@ pub async fn send_chat_message( chat::insert_message(&pool, session_id, "user", &content_json, None, None, false).await?; - // Auto-title: if session still has default title, set it from the first user message let session_for_title = chat::get_session(&pool, session_id).await?; if session_for_title.title == "Nova conversa" { let title: String = text.chars().take(50).collect(); @@ -138,14 +132,12 @@ pub async fn send_chat_message( } } - // 3. Get session for claude_session_id + resolve cwd let session = chat::get_session(&pool, session_id).await?; // Use session cwd, or fall back to active vault path let effective_cwd = if session.cwd.is_some() { session.cwd.clone() } else { - // Read active vault from app_config let row: Option<(String,)> = sqlx::query_as("SELECT value FROM app_config WHERE key = 'active_vault'") .fetch_optional(pool.inner()) @@ -155,7 +147,6 @@ pub async fn send_chat_message( row.map(|r| r.0) }; - // Resolve [[wikilinks]] in the user text and inject note content for the sidecar if let Some(ref cwd) = effective_cwd { let wikilink_re = regex::Regex::new(r"\[\[([^\]]+)\]\]").expect("static wikilink regex compiles"); @@ -170,7 +161,6 @@ pub async fn send_chat_message( } } - // 4. Send to sidecar (lazy spawn on first use) let effective_cwd_for_broker = effective_cwd.clone(); let request_id = Uuid::new_v4().to_string(); { @@ -207,7 +197,6 @@ pub async fn send_chat_message( rx }; // sidecar_guard dropped here - // 5. Spawn task to process incoming events let pool_clone = pool.inner().clone(); let request_id_clone = request_id.clone(); let sidecar_clone = sidecar.inner().clone(); @@ -230,7 +219,6 @@ pub async fn send_chat_message( .await; } IncomingMessage::TextDelta { text, .. } => { - // If we were accumulating tools, flush the tool group first if !current_tool_ids.is_empty() { segments.push(serde_json::json!({"type": "tool_group", "tool_use_ids": current_tool_ids})); current_tool_ids = Vec::new(); @@ -244,14 +232,12 @@ pub async fn send_chat_message( input, .. } => { - // Flush accumulated text as a segment before tools if !current_text.is_empty() { segments.push(serde_json::json!({"type": "text", "text": current_text})); current_text = String::new(); } current_tool_ids.push(tool_use_id.clone()); - // Persist partial assistant message if not yet created if assistant_msg_id.is_none() { let content = serde_json::json!(&segments); if let Ok(msg) = chat::insert_message( @@ -268,7 +254,6 @@ pub async fn send_chat_message( assistant_msg_id = Some(msg.id); } } - // Persist tool call if let Some(msg_id) = assistant_msg_id { let input_str = serde_json::to_string(&input).unwrap_or_default(); let _ = chat::insert_tool_call( @@ -296,7 +281,6 @@ pub async fn send_chat_message( is_error, .. } => { - // Persist tool result let result_str = serde_json::to_string(&content).unwrap_or_default(); let _ = chat::update_tool_call_result( &pool_clone, @@ -321,7 +305,6 @@ pub async fn send_chat_message( tool_input, .. } => { - // Check broker before prompting the user let verdict = broker_clone .check( &tool_name, @@ -333,7 +316,6 @@ pub async fn send_chat_message( match verdict { PermissionVerdict::Allow => { - // Auto-respond allow to sidecar if let Some(mgr) = sidecar_clone.lock().await.as_ref() { let _ = mgr .send(OutgoingMessage::PermissionResponse { @@ -347,7 +329,6 @@ pub async fn send_chat_message( } } PermissionVerdict::Deny(reason) => { - // Auto-respond deny to sidecar if let Some(mgr) = sidecar_clone.lock().await.as_ref() { let _ = mgr .send(OutgoingMessage::PermissionResponse { @@ -361,7 +342,6 @@ pub async fn send_chat_message( } } PermissionVerdict::AskUser => { - // Emit to frontend for user decision let _ = app.emit( "chat:permission_request", ChatPermissionRequestEvent { @@ -377,21 +357,18 @@ pub async fn send_chat_message( IncomingMessage::Done { usage, stop_reason, .. } => { - // Flush remaining segments if !current_tool_ids.is_empty() { segments.push(serde_json::json!({"type": "tool_group", "tool_use_ids": current_tool_ids})); } if !current_text.is_empty() { segments.push(serde_json::json!({"type": "text", "text": current_text})); } - // Persist or update assistant message let content = serde_json::json!(&segments); let tokens_in = usage.as_ref().map(|u| u.input_tokens as i64); let tokens_out = usage.as_ref().map(|u| u.output_tokens as i64); let cache_read = usage.as_ref().map(|u| u.cache_read_tokens as i64); if let Some(msg_id) = assistant_msg_id { - // Update partial message to final (including cache_read_tokens) let _ = sqlx::query( "UPDATE messages SET content_json = ?, tokens_in = ?, tokens_out = ?, cache_read_tokens = ?, is_partial = 0 WHERE id = ?" ) @@ -415,7 +392,6 @@ pub async fn send_chat_message( .await; } - // Aggregate usage stats if let Some(ref u) = usage { let _ = chat::upsert_usage( &pool_clone, @@ -440,14 +416,12 @@ pub async fn send_chat_message( IncomingMessage::Error { category, message, .. } => { - // Flush remaining segments for partial persistence if !current_tool_ids.is_empty() { segments.push(serde_json::json!({"type": "tool_group", "tool_use_ids": current_tool_ids})); } if !current_text.is_empty() { segments.push(serde_json::json!({"type": "text", "text": current_text})); } - // Persist partial message if we have segments if !segments.is_empty() { let content = serde_json::json!(&segments); let _ = chat::insert_message( @@ -476,7 +450,6 @@ pub async fn send_chat_message( } } - // Cleanup if let Some(mgr) = sidecar_clone.lock().await.as_ref() { mgr.unregister_request(&request_id_clone).await; } @@ -517,7 +490,6 @@ pub async fn respond_chat_permission( _ => return Err(format!("Invalid behavior: {behavior}")), }; - // Persist rule if scope is "session" or "always" and we have a tool_name let scope_str = scope.as_deref().unwrap_or("once"); if let (true, Some(tn)) = ( scope_str == "session" || scope_str == "always", @@ -713,7 +685,6 @@ fn normalize_image(bytes: &[u8], media_type: &str) -> Result<(Vec, String), let needs_resize = w > MAX_IMAGE_DIMENSION || h > MAX_IMAGE_DIMENSION; let is_jpeg = media_type == "image/jpeg"; - // Skip if already small enough and JPEG if !needs_resize && is_jpeg { return Ok((bytes.to_vec(), media_type.to_string())); } diff --git a/httui-desktop/src-tauri/src/chat/permissions.rs b/httui-desktop/src-tauri/src/chat/permissions.rs index f5d4b756..248b242e 100644 --- a/httui-desktop/src-tauri/src/chat/permissions.rs +++ b/httui-desktop/src-tauri/src/chat/permissions.rs @@ -44,7 +44,7 @@ impl PermissionBroker { return PermissionVerdict::AskUser; } - // T06: Block execution (DB/HTTP/E2E) always requires user confirmation via sidecar + // execute_block (DB/HTTP) always requires user confirmation if tool_name == "execute_block" { return PermissionVerdict::AskUser; } diff --git a/httui-desktop/src-tauri/src/chat/protocol.rs b/httui-desktop/src-tauri/src/chat/protocol.rs index 14b88e7a..a87d9575 100644 --- a/httui-desktop/src-tauri/src/chat/protocol.rs +++ b/httui-desktop/src-tauri/src/chat/protocol.rs @@ -18,7 +18,7 @@ fn hex_to_bytes(hex: &str) -> Option> { .collect() } -/// T25: Compute HMAC-SHA256 of a message payload. +/// Compute HMAC-SHA256 of a message payload. pub fn compute_hmac(secret: &str, payload: &str) -> String { let mut mac = HmacSha256::new_from_slice(secret.as_bytes()).expect("HMAC accepts any key length"); @@ -26,7 +26,7 @@ pub fn compute_hmac(secret: &str, payload: &str) -> String { bytes_to_hex(&mac.finalize().into_bytes()) } -/// T25: Verify HMAC-SHA256 of a message payload (constant-time comparison). +/// Verify HMAC-SHA256 of a message payload (constant-time comparison). pub fn verify_hmac(secret: &str, payload: &str, expected_hmac: &str) -> bool { let mut mac = HmacSha256::new_from_slice(secret.as_bytes()).expect("HMAC accepts any key length"); @@ -35,8 +35,6 @@ pub fn verify_hmac(secret: &str, payload: &str, expected_hmac: &str) -> bool { mac.verify_slice(&expected_bytes).is_ok() } -// ── Rust → Sidecar (outgoing) ──────────────────────────────────────── - #[derive(Debug, Clone, Serialize)] #[serde(tag = "type", rename_all = "snake_case")] pub enum OutgoingMessage { @@ -73,8 +71,6 @@ pub enum PermissionBehavior { Deny, } -// ── Sidecar → Rust (incoming) ──────────────────────────────────────── - #[derive(Debug, Clone, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] pub enum IncomingMessage { @@ -127,8 +123,6 @@ pub struct UsageInfo { pub cache_read_tokens: u64, } -// ── Tauri events emitted to frontend ───────────────────────────────── - #[derive(Debug, Clone, Serialize)] pub struct ChatDeltaEvent { pub session_id: i64, @@ -173,8 +167,6 @@ pub struct ChatErrorEvent { pub message: String, } -// ── Serialization helpers ──────────────────────────────────────────── - impl OutgoingMessage { /// Serialize to a single NDJSON line (no trailing newline). pub fn to_ndjson(&self) -> Result { diff --git a/httui-desktop/src-tauri/src/chat/sidecar.rs b/httui-desktop/src-tauri/src/chat/sidecar.rs index c301e4c2..94a10b7c 100644 --- a/httui-desktop/src-tauri/src/chat/sidecar.rs +++ b/httui-desktop/src-tauri/src/chat/sidecar.rs @@ -112,11 +112,11 @@ const BACKOFF_DELAYS: &[Duration] = &[ /// Manages the sidecar process lifecycle, message multiplexing, and supervision. pub struct SidecarManager { child: Arc>>, - /// Maps request_id → sender for incoming messages from sidecar + /// Maps request_id → sender for incoming messages from sidecar. requests: Arc>>>, - /// Flag to stop background tasks on shutdown + /// Flag to stop background tasks on shutdown. shutdown: Arc, - /// T25: Shared secret for HMAC message signing with sidecar + /// Shared secret for HMAC message signing with the sidecar. hmac_secret: String, } @@ -128,7 +128,6 @@ impl SidecarManager { let child = Arc::new(Mutex::new(None::)); let pong_notify = Arc::new(Notify::new()); let shutdown = Arc::new(AtomicBool::new(false)); - // T25: Generate HMAC secret for sidecar protocol signing let hmac_secret = uuid::Uuid::new_v4().to_string(); let manager = Self { @@ -138,10 +137,9 @@ impl SidecarManager { hmac_secret: hmac_secret.clone(), }; - // Initial spawn Self::spawn_process(app, &child, &requests, &pong_notify, &hmac_secret).await?; - // Supervisor task: respawn on termination with backoff + // Supervisor: respawn on termination with backoff. let app_respawn = app.clone(); let child_respawn = child.clone(); let requests_respawn = requests.clone(); @@ -151,14 +149,13 @@ impl SidecarManager { tauri::async_runtime::spawn(async move { let mut attempt = 0usize; loop { - // Wait for sidecar to die loop { tokio::time::sleep(Duration::from_secs(1)).await; if shutdown_respawn.load(Ordering::Relaxed) { return; } if child_respawn.lock().await.is_none() { - break; // Process died, attempt respawn + break; } } @@ -196,7 +193,6 @@ impl SidecarManager { } }); - // Health check task let child_health = child.clone(); let pong_health = pong_notify.clone(); let shutdown_health = shutdown.clone(); @@ -215,9 +211,7 @@ impl SidecarManager { continue; } } - drop(guard); // Release lock before waiting - - // Wait for pong with timeout + drop(guard); // release lock before waiting for pong let pong_result = tokio::time::timeout(HEALTH_CHECK_TIMEOUT, pong_health.notified()).await; @@ -227,7 +221,6 @@ impl SidecarManager { if let Some(dead_child) = guard.take() { let _ = dead_child.kill(); } - // Supervisor task will handle respawn } } } @@ -255,7 +248,6 @@ impl SidecarManager { let node_path = find_node().ok_or("Node.js not found. Install Node.js to use the chat feature.")?; - // Resolve claude CLI path — same bin directory as node, or via which let claude_path = find_claude(&node_path).unwrap_or_default(); eprintln!( "[sidecar] node={}, claude={}, script={}", @@ -293,7 +285,6 @@ impl SidecarManager { *child.lock().await = Some(new_child); - // Spawn reader task let requests_clone = requests.clone(); let app_clone = app.clone(); let child_clone = child.clone(); @@ -314,13 +305,13 @@ impl SidecarManager { Ok(()) } - /// Send a message to the sidecar process via stdin (T25: HMAC signed). + /// Send a message to the sidecar process via stdin (HMAC signed). pub async fn send(&self, msg: OutgoingMessage) -> Result<(), String> { let payload = msg .to_ndjson() .map_err(|e| format!("Serialization error: {e}"))?; - // T25: Sign message with HMAC — transmit payload as a JSON string value - // to avoid re-serialization mismatch between serde_json and JS JSON.stringify + // Payload is a JSON string value to avoid re-serialization mismatch + // between serde_json and JS JSON.stringify. let hmac = super::protocol::compute_hmac(&self.hmac_secret, &payload); let signed = serde_json::json!({"hmac": hmac, "payload": payload}).to_string(); let mut guard = self.child.lock().await; @@ -395,9 +386,6 @@ impl SidecarManager { continue; } - // T25: Verify HMAC on incoming messages from sidecar - // Payload is transmitted as a JSON string value to avoid - // re-serialization mismatch between serde_json and JS JSON.stringify let parsed_line = if let Ok(envelope) = serde_json::from_str::(line) { @@ -405,7 +393,7 @@ impl SidecarManager { envelope.get("hmac").and_then(|v| v.as_str()), envelope.get("payload"), ) { - // payload can be a string (new protocol) or object (legacy) + // Payload may be a string (new) or object (legacy). let payload_str = if let Some(s) = payload.as_str() { s.to_string() } else { @@ -417,7 +405,7 @@ impl SidecarManager { } payload_str } else { - // No HMAC envelope — use raw line (backward compat during transition) + // No HMAC envelope — raw line (backward compat). line.to_string() } } else { @@ -448,10 +436,8 @@ impl SidecarManager { CommandEvent::Terminated(status) => { eprintln!("[sidecar] Process terminated: {status:?}"); - // Mark child as dead so supervisor can respawn *child.lock().await = None; - // Notify all pending requests of failure let guard = requests.lock().await; for (_, tx) in guard.iter() { let _ = tx.send(IncomingMessage::Error { diff --git a/httui-desktop/src-tauri/src/commands/blocks.rs b/httui-desktop/src-tauri/src/commands/blocks.rs index e7a90647..0c5ab414 100644 --- a/httui-desktop/src-tauri/src/commands/blocks.rs +++ b/httui-desktop/src-tauri/src/commands/blocks.rs @@ -1,19 +1,8 @@ -// coverage:exclude file — Tauri command shells delegating to -// `httui_core::block_results`, `block_history`, `block_settings`, -// `block_examples`, and `executor::*`. Same shape and rationale as -// `commands/{connections,environments,files,schema,settings}.rs` -// (audit-016 / 018). Substantive logic lives in those crate modules -// at >80% coverage; the shells thread Tauri state and call through. - -//! Block-related Tauri commands — generic dispatch -//! (`execute_block`), result cache, run history, per-block settings, -//! pinned response examples, and the server-side block-hash -//! computation. -//! -//! The streamed/cancel-aware HTTP and DB execution paths live in -//! `executions.rs` — this module is for the legacy non-streamed -//! `execute_block` shell plus the persistence side (history / -//! settings / examples) that the UI hits via Tauri IPC. +// coverage:exclude file — Tauri command shells delegating to httui_core block modules; no extractable logic. + +//! Block-related Tauri commands — generic dispatch (`execute_block`), result cache, run history, +//! per-block settings, pinned examples, and block-hash computation. +//! Streamed/cancel-aware HTTP and DB paths live in `executions.rs`. use std::sync::Arc; @@ -31,11 +20,7 @@ use httui_core::executor::{ self, BlockRequest, BlockResult, Executor, ExecutorError, ExecutorRegistry, }; -// --- Executor wrapper newtypes ------------------------------------------ - -/// Newtype wrapper letting the registry hold `DbExecutor` via `Arc` so -/// the same instance can also back the streamed/cancel-aware Tauri -/// command in `executions.rs`. +/// Newtype letting the registry hold `DbExecutor` via `Arc`, shared with the streamed command in `executions.rs`. pub struct SharedDbExecutor(pub Arc); #[async_trait::async_trait] @@ -53,10 +38,7 @@ impl Executor for SharedDbExecutor { } } -/// Same pattern as `SharedDbExecutor` for the HTTP executor. The -/// streamed command pulls the `Arc` from Tauri state; -/// the legacy `execute_block` path continues through the registry via -/// this wrapper. +/// Same pattern as `SharedDbExecutor` for the HTTP executor. pub struct SharedHttpExecutor(pub Arc); #[async_trait::async_trait] @@ -74,11 +56,7 @@ impl Executor for SharedHttpExecutor { } } -// --- Generic dispatch ---------------------------------------------------- - -/// Generic dispatch: route a `BlockRequest` to the executor registered -/// under `block_type`. Used by the legacy non-streamed path; streamed -/// HTTP/DB execution lives in `executions.rs`. +/// Route a `BlockRequest` to the executor registered under `block_type`. Streamed paths live in `executions.rs`. #[tauri::command] pub async fn execute_block( registry: State<'_, ExecutorRegistry>, @@ -89,7 +67,6 @@ pub async fn execute_block( registry.execute(req).await.map_err(|e| e.to_string()) } -// --- Block result cache -------------------------------------------------- /// Look up a previously cached `BlockResult` by `(file_path, block_hash)`. /// Returns `None` if no cached row matches. @@ -129,7 +106,6 @@ pub async fn save_block_result( .map_err(|e| e.to_string()) } -// --- Block run history -------------------------------------------------- /// Return the trim-capped run history (metadata only — no bodies) /// for `(file_path, block_alias)`. @@ -198,7 +174,6 @@ pub async fn purge_block_history( .map_err(|e| e.to_string()) } -// --- Per-block settings (Onda 1) ---------------------------------------- /// Fetch persistent per-block settings (limit/timeout overrides) for /// `(file_path, block_alias)`. Returns defaults if no row exists. @@ -239,7 +214,6 @@ pub async fn purge_block_settings( .map_err(|e| e.to_string()) } -// --- Pinned response examples (Onda 3) ---------------------------------- /// Pin a named response snapshot for a block so the user can revisit /// it later without re-running. @@ -288,10 +262,7 @@ pub async fn purge_block_examples( .map_err(|e| e.to_string()) } -// --- Block hash ---------------------------------------------------------- - -/// T31/T35: Server-side hash computation including environment + -/// connection context. +/// Server-side hash computation including environment + connection context. #[tauri::command] pub async fn compute_block_hash( pool: State<'_, SqlitePool>, diff --git a/httui-desktop/src-tauri/src/commands/connections.rs b/httui-desktop/src-tauri/src/commands/connections.rs index f0e801cf..4792fcfa 100644 --- a/httui-desktop/src-tauri/src/commands/connections.rs +++ b/httui-desktop/src-tauri/src/commands/connections.rs @@ -1,26 +1,10 @@ -// coverage:exclude file — Tauri command shells take `tauri::State<'_, T>` -// and aren't unit-testable in isolation. The pure helpers -// (DTO conversion) are tested below; substantive logic -// (file-backed CRUD, atomic write, secret resolution) lives in -// `httui_core::vault_config::connections_store` at >80% coverage. -// Same rationale as `commands/environments.rs` and -// `vault_config_commands.rs`. Retires when the per-domain -// command harness lands. +// coverage:exclude file — Tauri command shells with no testable logic without a Tauri runtime. -//! Connection Tauri commands — file-backed cutover. +//! Connection Tauri commands — file-backed, wire-compat with the legacy `db::connections::ConnectionPublic` shape. //! -//! Wire-compat with the legacy `db::connections::ConnectionPublic` -//! shape so the React frontend doesn't need changes: -//! -//! - `Connection.id == name` (file-backed natural key promoted) -//! - `created_at` / `updated_at` returned as empty strings (file -//! metadata could surface them via FS mtime; deferred — UI doesn't -//! render either field today) -//! - `last_tested_at` returned as `None` for now; the legacy -//! `last_tested_at` write was dropped in Phase 3 (PoolManager no -//! longer touches the legacy SQLite `connections` table). A -//! per-machine status cache is a v1.x follow-up if a UI need -//! emerges. +//! - `Connection.id == name` (file-backed natural key) +//! - `created_at` / `updated_at` returned as empty strings +//! - `last_tested_at` always `None` (PoolManager no longer writes it) use std::sync::Arc; @@ -37,8 +21,7 @@ use httui_core::vault_config::connections_store::{CreateConnectionInput, UpdateC use super::vault_stores::VaultStoreRegistry; -/// Wire-compat: matches the legacy `db::connections::ConnectionPublic` -/// shape. `id` carries the connection name post-cutover. +/// Wire-compat with `db::connections::ConnectionPublic`. `id` == connection name. #[derive(Debug, Clone, Serialize)] pub struct ConnectionPublic { pub id: String, @@ -60,9 +43,7 @@ pub struct ConnectionPublic { pub updated_at: String, } -/// Frontend payload for `create_connection`. Mirrors the legacy -/// `db::connections::CreateConnection` fields so the React form -/// doesn't change. +/// Frontend payload for `create_connection`. #[derive(Debug, Deserialize)] pub struct CreateConnection { pub name: String, @@ -80,8 +61,7 @@ pub struct CreateConnection { pub is_readonly: Option, } -/// Frontend payload for `update_connection`. All fields optional — -/// only the provided ones are written. +/// Frontend payload for `update_connection`. All fields optional — only provided ones are written. #[derive(Debug, Deserialize)] pub struct UpdateConnection { pub name: Option, @@ -99,11 +79,7 @@ pub struct UpdateConnection { pub is_readonly: Option, } -// Defaults mirror `vault_config::connections_store::to_legacy` — -// the file-backed format doesn't yet carry these advanced fields, -// and the canvas connection form doesn't expose them -// either. When per-connection overrides become user-facing, the -// file format grows a `[.advanced]` section. +// File-backed format doesn't carry advanced timeout/pool fields; form doesn't expose them either. const DEFAULT_TIMEOUT_MS: i64 = 10_000; const DEFAULT_QUERY_TIMEOUT_MS: i64 = 30_000; const DEFAULT_TTL_SECONDS: i64 = 300; @@ -175,12 +151,6 @@ pub async fn create_connection( description: None, }) .await?; - // Advanced fields (`timeout_ms`, `query_timeout_ms`, `ttl_seconds`, - // `max_pool_size`) on the wire are accepted but currently ignored — - // the file format doesn't carry them. Defaults from - // `vault_config::connections_store::to_legacy` apply at pool-build - // time. A future `[.advanced]` TOML section adds per-conn - // overrides; tracked in `tech-debt.md` as a v1.x follow-up. Ok(to_wire(created)) } @@ -192,9 +162,7 @@ pub async fn update_connection( id: String, input: UpdateConnection, ) -> Result { - // Rename is not supported in the file-backed store (the connection - // name is the natural key). If frontend passes a new name, fail - // explicitly so the form can route through delete+create instead. + // Rename is not supported; the connection name is the natural key. if let Some(new_name) = &input.name { if new_name != &id { return Err(format!( @@ -246,9 +214,7 @@ pub async fn test_connection( } /// Vault-wide grep for db-block fences referencing `connection=`. -/// Powers the "Used in runbooks" panel in ConnectionsPage. Wraps -/// `httui_core::connection_uses::find_connection_uses` -/// substantive logic + tests live there. +/// Powers the "Used in runbooks" panel. Logic lives in `httui_core::connection_uses`. #[tauri::command] pub async fn find_connection_uses_cmd( vault_path: String, @@ -303,9 +269,6 @@ mod tests { #[test] fn to_wire_emits_default_advanced_fields() { - // The file format doesn't carry advanced timeout/pool fields - // yet (form doesn't expose them either). Defaults - // mirror `vault_config::connections_store::to_legacy`. let wire = to_wire(sample_file_public("z")); assert_eq!(wire.timeout_ms, DEFAULT_TIMEOUT_MS); assert_eq!(wire.query_timeout_ms, DEFAULT_QUERY_TIMEOUT_MS); diff --git a/httui-desktop/src-tauri/src/commands/environments.rs b/httui-desktop/src-tauri/src/commands/environments.rs index 2edf6a78..df1e1ce2 100644 --- a/httui-desktop/src-tauri/src/commands/environments.rs +++ b/httui-desktop/src-tauri/src/commands/environments.rs @@ -1,28 +1,11 @@ -// coverage:exclude file — Tauri command shells take `tauri::State<'_, T>` -// and aren't unit-testable in isolation. The pure helpers -// (make_var_id / parse_var_id) are tested below; the substantive -// logic (file-backed CRUD, mtime cache, atomic write, secret -// resolution) lives in `httui_core::vault_config::environments_store` -// at >80% coverage. Same rationale as `vault_config_commands.rs` -// Re-evaluated when the per-domain -// command split adds an integration harness with a fake Tauri runtime. -// Opt-out justified in audit-016. +// coverage:exclude file — Tauri command shells with no testable logic without a Tauri runtime. -//! Environment Tauri commands — file-backed cutover. +//! Environment Tauri commands — file-backed, wire-compat with `db::environments`. //! -//! Wire-compat with the legacy `db::environments` shape so the React -//! frontend doesn't need changes: -//! -//! - `Environment.id == name` (file-backed natural key promoted) -//! - `Environment.created_at` returned as empty string (file-backed -//! stores have no creation timestamp; field unused by current UI) -//! - `EnvVariable.id == "::"` (synthesized; the -//! `delete_env_variable` command splits on `::` to recover both -//! parts) -//! - For secret variables: `value` is returned empty (the real value -//! lives in keychain; legacy returned `__KEYCHAIN__` sentinel — -//! we choose empty since the frontend already gates display on -//! `is_secret`) +//! - `Environment.id == name` (file-backed natural key) +//! - `created_at` returned as empty string +//! - `EnvVariable.id == "::"` (synthesized composite) +//! - Secret `value` returned empty; real value lives in keychain use std::sync::Arc; @@ -34,11 +17,7 @@ use httui_core::vault_config::environments_store::SetVarInput; use super::vault_stores::VaultStoreRegistry; -/// Wire-compat: matches the legacy `db::environments::Environment` shape, -/// plus canvas §6 metadata `description`, `temporary`, -/// `connections_used`. Older frontend code that destructures only the -/// legacy fields keeps working; the Environments page reads the new -/// fields directly. +/// Wire-compat with `db::environments::Environment`, plus `description`, `temporary`, `connections_used`. #[derive(Debug, Clone, Serialize)] pub struct Environment { pub id: String, @@ -53,7 +32,7 @@ pub struct Environment { pub connections_used: Vec, } -/// Wire-compat: matches the legacy `db::environments::EnvVariable`. +/// Wire-compat with `db::environments::EnvVariable`. #[derive(Debug, Clone, Serialize)] pub struct EnvVariable { pub id: String, @@ -140,11 +119,9 @@ pub async fn duplicate_environment( new_name: String, ) -> Result { let stores = registry.for_active_vault(&pool).await?; - // 1. Read source vars (without resolving secrets — those stay refs) let source_vars = stores.environments.list_vars(&source_id).await?; - // 2. Create the new env let new_env = stores.environments.create_env(&new_name).await?; - // 3. Copy each plain var (secrets need re-entry on the target machine) + // Secrets are not copied — they need re-entry on the target machine. for v in source_vars { if !v.is_secret { stores @@ -294,8 +271,7 @@ async fn resolve_vars_for_env( let mut out = std::collections::HashMap::with_capacity(public.len()); for v in public { let value = if v.is_secret { - // Skip silently if a secret can't be resolved — better to - // emit empty than to crash the caller. + // Skip silently if a secret can't be resolved. stores .environments .resolve_var(env_name, &v.key) @@ -339,15 +315,6 @@ pub async fn resolve_active_env_variables( #[cfg(test)] mod tests { - //! These tests exercise the synthesized id parsing + DTO mapping. - //! Round-trip with the file-backed store is covered by - //! `httui_core::vault_config::environments_store::tests`. - //! - //! Tauri command bodies that delegate to the store are thin - //! wrappers and not unit-testable in isolation (they take - //! `tauri::State<'_, T>`); integration coverage lives in the - //! existing E2E suite. - use super::*; #[test] @@ -374,10 +341,7 @@ mod tests { #[test] fn parse_var_id_handles_keys_with_double_colon() { - // `split_once` returns the first match — so a key like - // `ns::sub` becomes part of the env name. We accept this - // limitation: file-backed env keys are TOML keys (no `::` - // by convention); document in the module-level comment. + // `split_once` returns the first match — keys with `::` split at the first occurrence. let id = make_var_id("staging", "key"); let (env, key) = parse_var_id(&id).unwrap(); assert_eq!(env, "staging"); diff --git a/httui-desktop/src-tauri/src/commands/files.rs b/httui-desktop/src-tauri/src/commands/files.rs index 45259c64..bcd301c4 100644 --- a/httui-desktop/src-tauri/src/commands/files.rs +++ b/httui-desktop/src-tauri/src/commands/files.rs @@ -1,18 +1,7 @@ -// coverage:exclude file — Tauri command shells with no testable -// logic without spinning up the Tauri runtime. Substantive code is -// in `crate::fs::*` (covered there). Same shape as -// `commands/connections.rs` and `commands/environments.rs` -// (audit-016). Justified in `audit-018-files-commands-coverage-exclude.md`. -// Retires when the integration harness lands, mirroring the -// retirement schedule for the other two opt-outs. +// coverage:exclude file — Tauri command shells with no testable logic without a Tauri runtime. -//! Vault file Tauri commands — list / read / write / create / rename / -//! delete notes and folders. -//! -//! Extracted from `main.rs` The substantive -//! logic lives in `crate::fs`; these wrappers just thread Tauri -//! state (the file-watcher ignore list, the SQLite pool for cascading -//! per-block cache cleanup) into the call. +//! Vault file Tauri commands — list / read / write / create / rename / delete notes and folders. +//! Substantive logic lives in `crate::fs`. use std::sync::{Arc, Mutex}; @@ -41,7 +30,6 @@ pub fn write_note( content: String, ignore_paths: State<'_, Arc>>>, ) -> Result<(), String> { - // Add to ignore list so file watcher skips this event { let mut ignored = ignore_paths.lock().unwrap(); if !ignored.contains(&file_path) { @@ -51,7 +39,6 @@ pub fn write_note( let result = crate::fs::write_note(&vault_path, &file_path, &content); - // Remove from ignore list after a short delay let ignore = ignore_paths.inner().clone(); let fp = file_path.clone(); std::thread::spawn(move || { @@ -77,13 +64,9 @@ pub async fn delete_note( file_path: String, pool: State<'_, SqlitePool>, ) -> Result<(), String> { - // Move the file to trash first; only purge SQLite state if the FS - // operation succeeded so we don't drop history/examples for a file - // that's still on disk. crate::fs::delete_note(&vault_path, &file_path)?; - // Cascade purge across every per-block table (Onda 1-3). Each call is - // best-effort — a failure here doesn't undo the trash operation. + // Cascade purge across per-block tables; best-effort — failure doesn't undo the trash. let absolute = format!("{vault_path}/{file_path}"); for path_variant in [&file_path, &absolute] { let _ = crate::block_history::purge_history_for_file(&pool, path_variant).await; @@ -108,15 +91,8 @@ pub fn create_folder(vault_path: String, folder_path: String) -> Result<(), Stri crate::fs::create_folder(&vault_path, &folder_path) } -/// Last modification timestamp for a vault note, in **epoch -/// milliseconds**. Returns `None` if the file is absent or its mtime -/// can't be read. Wraps the existing `httui_core::vault_config::merge -/// ::mtime_or_none` helper so the same source of truth backs both -/// vault-config cache invalidation and the editor toolbar timestamp. -/// -/// Carry-over from feeds the `useFileMtime` hook -/// that drives "edited Xm ago" in the toolbar. Polled on focus / save -/// rather than continuously. +/// Last modification timestamp for a vault note, in epoch milliseconds. +/// Returns `None` if the file is absent or its mtime can't be read. #[tauri::command] pub fn get_file_mtime(vault_path: String, file_path: String) -> Option { let absolute = std::path::Path::new(&vault_path).join(&file_path); diff --git a/httui-desktop/src-tauri/src/commands/mod.rs b/httui-desktop/src-tauri/src/commands/mod.rs index 419f3301..d2ce686b 100644 --- a/httui-desktop/src-tauri/src/commands/mod.rs +++ b/httui-desktop/src-tauri/src/commands/mod.rs @@ -1,6 +1,4 @@ -//! Tauri command modules. The per-domain split is incremental — -//! `vault_stores` is the first module; environments and connections -//! command modules follow in a later cutover. +//! Per-domain Tauri command modules. pub mod blocks; pub mod connections; diff --git a/httui-desktop/src-tauri/src/commands/schema.rs b/httui-desktop/src-tauri/src/commands/schema.rs index f0e867fe..6ae7e967 100644 --- a/httui-desktop/src-tauri/src/commands/schema.rs +++ b/httui-desktop/src-tauri/src/commands/schema.rs @@ -1,14 +1,7 @@ -// coverage:exclude file — Tauri command shells delegating to -// `httui_core::db::schema_cache`. Same shape and rationale as -// `commands/{connections,environments,files}.rs` (audit-016 / 018). -// Substantive logic + pure cache-eviction tests live in -// `httui_core::db::schema_cache`. +// coverage:exclude file — Tauri command shells with no testable logic without a Tauri runtime. -//! Schema introspection Tauri commands — wrap the cached -//! introspection helpers from `httui_core::db::schema_cache`. The -//! `introspect_schema` command also keeps a 5-second freshness -//! guard so the UI can call it idempotently without hammering the -//! target database (T24). +//! Schema introspection Tauri commands. `introspect_schema` has a 5-second freshness guard +//! so the UI can call it idempotently without hammering the target database. use std::sync::Arc; @@ -24,8 +17,6 @@ pub async fn introspect_schema( conn_manager: State<'_, Arc>, connection_id: String, ) -> Result, String> { - // T24: Debounce — return cached schema if fresh (< 5s) to - // prevent hammering target DB on rapid UI calls. if let Ok(Some(cached)) = schema_cache::get_cached_schema(&pool, &connection_id, 5).await { return Ok(cached); } diff --git a/httui-desktop/src-tauri/src/commands/settings.rs b/httui-desktop/src-tauri/src/commands/settings.rs index c791821c..248e9eb0 100644 --- a/httui-desktop/src-tauri/src/commands/settings.rs +++ b/httui-desktop/src-tauri/src/commands/settings.rs @@ -1,13 +1,6 @@ -// coverage:exclude file — Tauri command shells delegating to -// `httui_core::config`. Same shape and rationale as -// `commands/{connections,environments,files,schema}.rs` -// (audit-016 / 018). Substantive logic lives in `httui_core::config`. +// coverage:exclude file — Tauri command shells with no testable logic without a Tauri runtime. -//! App-config Tauri commands — get / set on the `app_config` SQLite -//! table. The full settings split (per-machine `user.toml` vs -//! workspace `workspace.toml`) is the job; these commands stay -//! pointed at the legacy SQLite-backed `app_config` for v1 boot -//! compatibility. +//! App-config Tauri commands — get / set on the `app_config` SQLite table. use sqlx::sqlite::SqlitePool; use tauri::State; diff --git a/httui-desktop/src-tauri/src/commands/vault_stores.rs b/httui-desktop/src-tauri/src/commands/vault_stores.rs index b0fdfab4..b8c8498f 100644 --- a/httui-desktop/src-tauri/src/commands/vault_stores.rs +++ b/httui-desktop/src-tauri/src/commands/vault_stores.rs @@ -1,14 +1,5 @@ //! Per-vault registry for `ConnectionsStore` and `EnvironmentsStore`. -//! -//! The desktop app supports vault switching at runtime; the file-backed -//! stores are vault-scoped (each holds an mtime cache rooted at one -//! `vault_root`). This registry caches a single set of stores per vault -//! path so cache hits survive across Tauri command calls without -//! re-reading TOML files. -//! -//! Lookup is keyed by the active-vault path resolved from -//! `app_config.active_vault` (SQLite). When the user switches vaults, -//! the next command call resolves to a different (or new) cache entry. +//! Caches one store pair per vault path; keyed by `app_config.active_vault`. use std::collections::HashMap; use std::path::PathBuf; @@ -25,16 +16,14 @@ use httui_core::vault_config::{ }; use sqlx::sqlite::SqlitePool; -/// Pair of stores held together — they're always instantiated for the -/// same vault, and most callers want one or the other (rarely both). +/// Pair of stores for the same vault root. #[derive(Clone)] pub struct VaultStores { pub connections: Arc, pub environments: Arc, } -/// Registry of per-vault store pairs. Single instance lives in Tauri -/// state. +/// Registry of per-vault store pairs. Single instance lives in Tauri state. pub struct VaultStoreRegistry { cache: RwLock>, } @@ -46,12 +35,8 @@ impl VaultStoreRegistry { }) } - /// Resolve stores for the currently-active vault. - /// - /// Active vault is read from `app_config.active_vault` (the - /// existing SQLite-backed key). Returns an error if no active - /// vault is set — callers should surface this as "open a vault - /// first". + /// Resolve stores for the currently-active vault (`app_config.active_vault`). + /// Returns an error if no active vault is set. pub async fn for_active_vault(&self, pool: &SqlitePool) -> Result { let vault_path = get_config(pool, "active_vault") .await @@ -63,7 +48,6 @@ impl VaultStoreRegistry { /// Get-or-create cached stores for a specific vault path. pub async fn for_vault(&self, vault_root: PathBuf) -> Result { - // Fast path: already cached. { let cache = self.cache.read().await; if let Some(stores) = cache.get(&vault_root) { @@ -71,7 +55,6 @@ impl VaultStoreRegistry { } } - // Slow path: instantiate once. let user_config = default_user_config_path()?; let stores = VaultStores { connections: ConnectionsStore::new(vault_root.clone()), @@ -80,25 +63,20 @@ impl VaultStoreRegistry { { let mut cache = self.cache.write().await; - // Double-check in case another thread inserted between locks. cache.entry(vault_root).or_insert_with(|| stores.clone()); } Ok(stores) } - /// Drop cached stores for a vault — invoked when the user closes - /// or switches away from a vault. Safe to call even if not cached. + /// Drop cached stores for a vault. Safe to call even if not cached. pub async fn invalidate_vault(&self, vault_root: &std::path::Path) { let mut cache = self.cache.write().await; cache.remove(vault_root); } } -/// `ConnectionLookup` adapter that resolves the active vault on each -/// call via `VaultStoreRegistry`. Production-only: feeds the -/// `PoolManager` so pool builds use the file-backed connection -/// records. +/// `ConnectionLookup` adapter that resolves the active vault via `VaultStoreRegistry`. pub struct VaultRegistryLookup { pool: SqlitePool, registry: Arc, diff --git a/httui-desktop/src-tauri/src/executions.rs b/httui-desktop/src-tauri/src/executions.rs index cd6a865e..82cc85e1 100644 --- a/httui-desktop/src-tauri/src/executions.rs +++ b/httui-desktop/src-tauri/src/executions.rs @@ -25,9 +25,7 @@ use tauri::ipc::Channel; use tokio_util::sync::CancellationToken; /// Registry of in-flight cancellable executions keyed by `execution_id`. -/// -/// Cloneable (via internal `Arc`) so it can be shared between the -/// Tauri state and spawned tasks. +/// Cloneable via internal `Arc`. #[derive(Clone, Default)] pub struct ExecutionRegistry { inner: Arc>>, @@ -38,9 +36,7 @@ impl ExecutionRegistry { Self::default() } - /// Register a fresh token under `id`. If `id` was already registered, - /// the old token is overwritten (the previous execution keeps its own - /// token via move semantics, so cancel would already be inert). + /// Register a fresh token under `id`. Overwrites any existing entry (old token stays valid via move semantics). pub fn register(&self, id: impl Into) -> CancellationToken { let token = CancellationToken::new(); let mut map = self.inner.lock().expect("execution registry poisoned"); @@ -48,8 +44,7 @@ impl ExecutionRegistry { token } - /// Remove an id from the registry. Called at the end of an execution - /// to avoid leaking tokens. + /// Remove an id from the registry. pub fn unregister(&self, id: &str) { let mut map = self.inner.lock().expect("execution registry poisoned"); map.remove(id); @@ -83,14 +78,8 @@ impl ExecutionRegistry { } } -/// Run a DB query and emit its terminal chunk on the provided channel. -/// -/// On success emits `DbChunk::Complete(response)`. On cancel emits -/// `DbChunk::Cancelled`. On other errors emits `DbChunk::Error`. -/// -/// The awaited return value of the Tauri command is `Ok(())` in every -/// non-panicking case — errors are delivered in-band via the channel so -/// the frontend has a single path for progress + terminal states. +/// Run a DB query and emit its terminal chunk on the channel. +/// Errors are delivered in-band (`DbChunk::Error` / `DbChunk::Cancelled`); the command always returns `Ok(())`. #[tauri::command] pub async fn execute_db_streamed( db_executor: tauri::State<'_, Arc>, @@ -120,30 +109,16 @@ pub async fn execute_db_streamed( } }; - // Channel send can only fail if the frontend dropped the receiver, - // which is expected behavior (e.g., component unmounted). Swallow. let _ = on_chunk.send(chunk); Ok(()) } -/// Run an HTTP request and stream its chunks on the provided channel. +/// Run an HTTP request and stream its chunks on the channel. /// -/// Wire order on success: `Headers { ttfb_ms, ... }` → `BodyChunk { ... }` × N -/// → `Complete(HttpResponse)`. Headers + per-chunk body are emitted as the -/// HTTP body streams from `reqwest::Response::bytes_stream()` — frontend -/// can update the statusbar TTFB and a "downloading X kb…" counter without -/// waiting for the body to finish. -/// -/// On cancel emits `HttpChunk::Cancelled` (the executor returns -/// `Err("Request cancelled")` and we translate here — the executor itself -/// stops emitting once the cancel fires, so partial bytes are discarded). -/// Transport / encoding failures map to `HttpChunk::Error`. HTTP-level -/// errors (4xx/5xx) are still "successful executions" and arrive inside -/// `Complete`. -/// -/// Note: the executor itself emits the terminal `Complete` chunk via the -/// callback — we only emit a terminal chunk here on the error/cancel paths. +/// Wire order: `Headers` → `BodyChunk`× N → `Complete`. On cancel emits `HttpChunk::Cancelled`; +/// transport failures emit `HttpChunk::Error`. The executor emits `Complete` on success — +/// this command only emits a terminal chunk on the error/cancel paths. #[tauri::command] pub async fn execute_http_streamed( http_executor: tauri::State<'_, Arc>, @@ -161,8 +136,6 @@ pub async fn execute_http_streamed( let on_chunk_for_executor = on_chunk.clone(); let result = http_executor .execute_streamed(params, token.clone(), move |chunk| { - // Channel send only fails if the frontend dropped the receiver; - // that's expected (component unmount mid-stream). Swallow. let _ = on_chunk_for_executor.send(chunk); }) .await; @@ -177,8 +150,6 @@ pub async fn execute_http_streamed( }; let _ = on_chunk.send(chunk); } - // On Ok, the executor already emitted Complete via the callback. - Ok(()) } diff --git a/httui-desktop/src-tauri/src/fs/watcher.rs b/httui-desktop/src-tauri/src/fs/watcher.rs index 3d2bf999..c9a71dc4 100644 --- a/httui-desktop/src-tauri/src/fs/watcher.rs +++ b/httui-desktop/src-tauri/src/fs/watcher.rs @@ -1,10 +1,4 @@ -// coverage:exclude file — Thread-driven OS-level FS watcher. -// Substantive logic (path classification + env-name extraction) lives -// in `httui_core::vault_config::watch_paths` and is fully unit-tested -// at 100%. The remaining code here is the notify-crate event loop + -// Tauri emitters, which require an integration harness to exercise -// (real filesystem, real Tauri AppHandle). Documented in -// tech-debt.md and audit-004. +// coverage:exclude file — notify event loop + Tauri emitters require a real filesystem and AppHandle. use httui_core::vault_config::watch_paths::{classify, env_name_from_path, WatchCategory}; use notify::{Event, EventKind, RecommendedWatcher, RecursiveMode, Watcher}; @@ -31,11 +25,7 @@ pub struct FileReloaded { pub markdown: String, } -/// Emitted when a watched config TOML file changes (ADR 0003). -/// The frontend re-fetches the relevant store on receipt — backend -/// stores are constructed per Tauri call (epic 09 design), so there's -/// nothing to invalidate process-side until epic 19 introduces -/// long-lived store instances. +/// Emitted when a watched config TOML file changes. The frontend re-fetches the relevant store on receipt. #[derive(Debug, Clone, Serialize)] pub struct ConfigChanged { pub category: WatchCategory, @@ -74,16 +64,11 @@ pub fn watch_vault( let vault_for_thread = vault.clone(); std::thread::spawn(move || { let md_debounce = Duration::from_millis(500); - // ADR 0003: TOML changes use a 250ms trailing debounce — git - // pull / editor save bursts coalesce in that window. + // TOML: 250ms trailing debounce so git-pull/editor-save bursts coalesce. let toml_debounce = Duration::from_millis(250); - // Per-file debounce tracking let mut last_emit_per_file: HashMap = HashMap::new(); for event in rx { - // Map raw paths to vault-relative strings + classify each - // into one of three buckets: markdown, watched config TOML, - // or ignore. #[derive(Clone)] enum Kind { Md, @@ -101,16 +86,10 @@ pub fn watch_vault( .trim_start_matches('/') .to_string(); - // Markdown — keep the legacy filter that rejects - // dotfiles in note paths (avoids `.git/...` noise). if s.ends_with(".md") && !s.contains("/.") && !s.contains("\\.") { return Some((rel, Kind::Md)); } - // Config TOML — let the classifier decide. It - // already restricts to our exact paths (vault root - // connections.toml, .httui/workspace.toml, envs/*.toml) - // so we don't need the dotfile reject here. if s.ends_with(".toml") { if let Some(cat) = classify(&rel) { return Some((rel, Kind::Config(cat))); @@ -124,7 +103,6 @@ pub fn watch_vault( continue; } - // Check if path is in ignore list (self-triggered saves) { let ignored = ignore_paths.lock().unwrap(); if entries.iter().any(|(p, _)| ignored.contains(p)) { @@ -168,7 +146,7 @@ fn emit_md_event(handle: &AppHandle, vault: &str, kind: &EventKind, path: &str) ); } Err(_) => { - // File might be mid-write, fall back to a plain event. + // File may be mid-write; fall back to a plain event. let _ = handle.emit( "fs-event", FileEvent::Modified { diff --git a/httui-desktop/src-tauri/src/lib.rs b/httui-desktop/src-tauri/src/lib.rs index c6a9b153..d512f87d 100644 --- a/httui-desktop/src-tauri/src/lib.rs +++ b/httui-desktop/src-tauri/src/lib.rs @@ -1,4 +1,3 @@ -// Re-export shared core modules pub use httui_core::block_examples; pub use httui_core::block_history; pub use httui_core::block_results; @@ -9,43 +8,20 @@ pub use httui_core::executor; pub use httui_core::search; pub use httui_core::var_uses; -// fs re-exports core + local watcher pub mod fs { pub use httui_core::fs::*; pub mod watcher; } -// Chat sidecar integration pub mod chat; - -// Cancel-aware DB execution plumbing (stage 3 of db block redesign) pub mod executions; - -// Git panel. pub mod git_commands; - -// Vault-wide tag index. pub mod tag_commands; - -// Pre-flight evaluator for the DocHeader pill row. pub mod preflight_commands; - -// Run-body filesystem cache. pub mod run_body_commands; - -// Captures persistence. pub mod captures_commands; - -// Template registry. pub mod templates_commands; - -// File-backed config (epic 09 foundation; cutover in epic 19). pub mod vault_config_commands; - -// Per-domain Tauri command split (lands the full split; this -// `commands/` tree starts with the helpers -// introduced in audit-015). pub mod commands; -// Re-export the schemas frontend code needs at the IPC boundary. pub use httui_core::vault_config; diff --git a/httui-desktop/src-tauri/src/main.rs b/httui-desktop/src-tauri/src/main.rs index 52c6ac37..78f9c984 100644 --- a/httui-desktop/src-tauri/src/main.rs +++ b/httui-desktop/src-tauri/src/main.rs @@ -1,10 +1,4 @@ -// coverage:exclude file — Tauri command orchestrator + state wiring + -// setup hooks. No extractable logic remains after; -// the substantive code lives in `httui-core` and per-domain -// `commands/*.rs` modules, each tested independently. The -// size:exclude opt-out came off in commit XXX -// main.rs is now 547 prod lines, under the 600 gate. -// +// coverage:exclude file — Tauri command orchestrator + state wiring; no extractable logic. // Prevents additional console window on Windows in release, DO NOT REMOVE!! #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] @@ -16,7 +10,6 @@ use tauri::{AppHandle, Emitter, Manager}; use httui_notes::chat::commands::*; use httui_notes::db::connections::{PoolManager, StatusEmitter}; -// --- Tauri StatusEmitter implementation --- #[derive(Clone, serde::Serialize)] struct ConnectionStatusEvent { @@ -42,14 +35,6 @@ impl StatusEmitter for TauriStatusEmitter { } } -// Block-related commands (execute_block, result cache, history, -// settings, examples, hash computation) and the SharedDbExecutor / -// SharedHttpExecutor registry wrappers moved to `commands::blocks`. - -// Schema commands moved to `commands::schema`. -// Config commands moved to `commands::settings`. - -// Vault file commands moved to `commands::files`. /// Re-read a file from disk and emit `file-reloaded` so the editor /// replaces its in-memory copy. Used after MCP writes to defeat the @@ -158,7 +143,6 @@ fn stop_watching( // (Connection.id == name; Environment.id == name; // EnvVariable.id == "::"). -// --- Internal DB query (audit/settings) --- /// Run a SELECT against the app's own SQLite (audit/settings panel). /// Multi-statements and writes are rejected; pagination via @@ -173,7 +157,6 @@ async fn query_internal_db( httui_notes::db::query_internal_db(&pool, &query, offset, fetch_size).await } -// --- Session restore (single IPC call for startup) --- #[derive(serde::Serialize)] struct SessionTabContent { @@ -196,7 +179,6 @@ struct SessionState { tab_contents: Vec, } -// Extracts tab file paths from pane layout JSON fn extract_tabs_from_layout(value: &serde_json::Value) -> Vec<(String, String)> { let mut tabs = Vec::new(); if let Some(typ) = value.get("type").and_then(|t| t.as_str()) { @@ -227,7 +209,6 @@ fn extract_tabs_from_layout(value: &serde_json::Value) -> Vec<(String, String)> /// Replaces ~10 chatty calls so the editor renders without flicker. #[tauri::command] async fn restore_session(pool: tauri::State<'_, SqlitePool>) -> Result { - // Batch all config reads concurrently let ( vaults_raw, vim_raw, @@ -262,7 +243,6 @@ async fn restore_session(pool: tauri::State<'_, SqlitePool>) -> Result = if let Some(ref layout_json) = pane_layout { serde_json::from_str::(layout_json) .map(|v| extract_tabs_from_layout(&v)) @@ -273,7 +253,6 @@ async fn restore_session(pool: tauri::State<'_, SqlitePool>) -> Result= 30 { log_cleanup_counter = 0; @@ -391,15 +362,10 @@ fn main() { } }); - // Executor registry. DbExecutor is held as Arc<…> so the - // cancel-aware streamed command (see src/executions.rs) can - // share a single instance with the legacy `execute_block`. let db_executor = Arc::new(httui_notes::executor::db::DbExecutor::new(conn_manager)); app.manage(db_executor.clone()); app.manage(httui_notes::executions::ExecutionRegistry::new()); - // HTTP executor is held as Arc<…> so the cancel-aware streamed - // command can share a single instance with the legacy `execute_block`. let http_executor = Arc::new(httui_notes::executor::http::HttpExecutor::new()); app.manage(http_executor.clone()); @@ -412,23 +378,19 @@ fn main() { ))); app.manage(executor_registry); - // Chat sidecar (lazy — spawned on first use, not at startup) app.manage(std::sync::Arc::new(tokio::sync::Mutex::new( None::, ))); - // Permission broker let pool_for_broker: SqlitePool = app.state::().inner().clone(); app.manage(Arc::new( httui_notes::chat::permissions::PermissionBroker::new(pool_for_broker), )); - app.manage(Arc::new(Mutex::new(Vec::::new()))); // ignore_paths + app.manage(Arc::new(Mutex::new(Vec::::new()))); + app.manage(Mutex::new(None::)); - // Per-vault file-backed store registry Resolves - // ConnectionsStore + EnvironmentsStore - // for the active vault on demand, caches per vault path. app.manage(store_registry); Ok(()) @@ -455,8 +417,6 @@ fn main() { httui_notes::commands::blocks::compute_block_hash, httui_notes::commands::settings::get_config, httui_notes::commands::settings::set_config, - // foundation — file-backed workspace + user config. - // Frontend cutover lands in epic 19 (settings split). httui_notes::vault_config_commands::get_workspace_config, httui_notes::vault_config_commands::get_workspace_config_with_sources, httui_notes::vault_config_commands::set_workspace_config, @@ -465,22 +425,14 @@ fn main() { httui_notes::vault_config_commands::set_file_docheader_compact, httui_notes::vault_config_commands::get_user_config, httui_notes::vault_config_commands::set_user_config, - // local override gitignore scaffolding. httui_notes::vault_config_commands::ensure_vault_gitignore, - // vault migration script. httui_notes::vault_config_commands::migrate_vault_to_v1, - // empty-state migration banner detection. httui_notes::vault_config_commands::detect_vault_migration, - // vault scaffold + validate. httui_notes::vault_config_commands::check_is_vault, httui_notes::vault_config_commands::scaffold_vault, - // first-run missing-secrets scan. httui_notes::vault_config_commands::list_missing_secrets, - // create vault (mkdir + git init + scaffold). httui_notes::vault_config_commands::create_vault_cmd, - // first-run secrets modal save. httui_notes::vault_config_commands::save_secret_cmd, - // git panel. httui_notes::git_commands::git_status_cmd, httui_notes::git_commands::git_log_cmd, httui_notes::git_commands::git_diff_cmd, @@ -497,21 +449,15 @@ fn main() { httui_notes::git_commands::git_pull_cmd, httui_notes::git_commands::git_push_cmd, httui_notes::git_commands::git_conflict_versions_cmd, - // clone vault. httui_notes::git_commands::clone_vault_cmd, - // vault-wide tag index. httui_notes::tag_commands::scan_vault_tags_cmd, - // pre-flight evaluator (DocHeader pill row). httui_notes::preflight_commands::evaluate_preflight_cmd, - // run-body filesystem cache. httui_notes::run_body_commands::write_run_body_cmd, httui_notes::run_body_commands::read_run_body_cmd, httui_notes::run_body_commands::list_run_bodies_cmd, httui_notes::run_body_commands::trim_run_bodies_cmd, httui_notes::run_body_commands::rename_alias_runs_cmd, - // template registry. httui_notes::templates_commands::list_templates_cmd, - // captures persistence. httui_notes::captures_commands::read_captures_cache_cmd, httui_notes::captures_commands::write_captures_cache_cmd, httui_notes::captures_commands::delete_captures_cache_cmd, @@ -550,7 +496,6 @@ fn main() { httui_notes::commands::environments::delete_env_variable, httui_notes::commands::environments::resolve_active_env_variables, httui_notes::commands::environments::resolve_env_variables, - // Chat create_chat_session, list_chat_sessions, get_chat_session, diff --git a/httui-desktop/src-tauri/src/preflight_commands.rs b/httui-desktop/src-tauri/src/preflight_commands.rs index a0eab07f..b2c3cde9 100644 --- a/httui-desktop/src-tauri/src/preflight_commands.rs +++ b/httui-desktop/src-tauri/src/preflight_commands.rs @@ -1,20 +1,11 @@ -//! Tauri command wrapping `httui_core::preflight`. Powers -//! — the inline DocHeader's pill row reads from this command on file -//! open and after each save. +//! Tauri command wrapping `httui_core::preflight`. //! -//! Evaluator context wiring: -//! - `connection` — vault's declared connection names (from -//! `ConnectionsStore`). -//! - `env_var` — keys of the active environment (from -//! `EnvironmentsStore`; empty if no active env). -//! - `branch` — current git branch of the vault (`git rev-parse -//! --abbrev-ref HEAD`; `None` for detached HEAD / non-repo). -//! - `file_exists` / `command` — resolved against FS + PATH inside -//! `evaluate_preflight_with_io`. +//! Context wiring: `connection` from `ConnectionsStore`, `env_var` keys from +//! `EnvironmentsStore`, `branch` from `git rev-parse`, `file_exists`/`command` +//! resolved against FS + PATH. //! -//! `keychain` was retired from the typed set. Legacy -//! YAML that still uses it falls through to `PreflightItem::Unknown` -//! and renders as a skip pill — non-breaking. +//! `keychain` was retired — legacy YAML falls through to `PreflightItem::Unknown` +//! and renders as a skip pill (non-breaking). use std::collections::HashSet; use std::fs; diff --git a/httui-desktop/src-tauri/src/run_body_commands.rs b/httui-desktop/src-tauri/src/run_body_commands.rs index 2655f1ee..8cb234b9 100644 --- a/httui-desktop/src-tauri/src/run_body_commands.rs +++ b/httui-desktop/src-tauri/src/run_body_commands.rs @@ -1,8 +1,4 @@ -//! Tauri commands wrapping `httui_core::run_bodies`. Powers -//! the consumer (HTTP/DB streamed-execution path) calls -//! `write_run_body_cmd` after a successful run + `trim_run_bodies_cmd` -//! to keep the cache bounded; the run-diff viewer (04) reads via -//! `read_run_body_cmd` / `list_run_bodies_cmd`. +//! Tauri commands wrapping `httui_core::run_bodies`. use httui_core::run_bodies::{ list_run_bodies, read_run_body, rename_alias_runs, trim_run_bodies, write_run_body, @@ -68,11 +64,8 @@ pub async fn trim_run_bodies_cmd( trim_run_bodies(&PathBuf::from(vault_path), &file_path, &alias, keep_n) } -/// Move every cached run body for `(file_path, old_alias)` to -/// `(file_path, new_alias)`. Powers the alias-rename -/// flow. Best-effort: -/// - `Ok(false)` when the source dir doesn't exist -/// - `Err` when the destination dir already has cached runs +/// Move every cached run body for `(file_path, old_alias)` to `(file_path, new_alias)`. +/// Returns `Ok(false)` when the source dir doesn't exist; `Err` when the destination already has runs. #[tauri::command] pub async fn rename_alias_runs_cmd( vault_path: String, diff --git a/httui-desktop/src-tauri/src/tag_commands.rs b/httui-desktop/src-tauri/src/tag_commands.rs index dc335ef8..2935fc88 100644 --- a/httui-desktop/src-tauri/src/tag_commands.rs +++ b/httui-desktop/src-tauri/src/tag_commands.rs @@ -1,6 +1,4 @@ -//! Tauri command wrapping `httui_core::tag_index`. Powers -//! the frontend `useTagIndexStore` calls this on vault-open -//! and after file-watcher save events. +//! Tauri command wrapping `httui_core::tag_index`. use httui_core::tag_index::{scan_vault_tags, TagEntry}; use std::path::PathBuf; diff --git a/httui-desktop/src-tauri/src/templates_commands.rs b/httui-desktop/src-tauri/src/templates_commands.rs index b6e35e7d..45505b75 100644 --- a/httui-desktop/src-tauri/src/templates_commands.rs +++ b/httui-desktop/src-tauri/src/templates_commands.rs @@ -1,16 +1,9 @@ -//! Tauri commands wrapping `httui_core::templates`. Powers the -//! Templates card — the picker calls -//! `list_templates_cmd` to surface the union of built-in + vault- -//! local templates and uses the returned `body` field directly when -//! the user picks one. +//! Tauri commands wrapping `httui_core::templates`. use httui_core::templates::{list_builtin_templates, list_vault_templates, Template}; use std::path::PathBuf; -/// Combined `list_builtin_templates() + list_vault_templates(vault)` -/// with built-ins first, vault-local sorted by id (already sorted by -/// the listing fn). Built-ins return an empty `Vec` until the -/// embedded-templates content slice ships. +/// Built-ins first, then vault-local templates sorted by id. #[tauri::command] pub async fn list_templates_cmd(vault_path: String) -> Result, String> { let mut out = list_builtin_templates(); diff --git a/httui-desktop/src-tauri/src/vault_config_commands.rs b/httui-desktop/src-tauri/src/vault_config_commands.rs index 6ef4365f..931c65ab 100644 --- a/httui-desktop/src-tauri/src/vault_config_commands.rs +++ b/httui-desktop/src-tauri/src/vault_config_commands.rs @@ -1,16 +1,8 @@ //! Tauri commands for the file-backed vault config stores. //! -//! ships these as **foundation only** — the desktop frontend -//! still reads/writes through the legacy `app_config` SQLite path -//! until epic 19 (settings split) cuts over. Wiring the commands now -//! lets epic 19 swap the frontend in a single, low-risk PR. -//! -//! Stores are constructed per call: `WorkspaceStore::new(vault_path)` -//! for the vault-anchored workspace file, `UserStore::from_default_path()` -//! for the per-machine user file. The mtime cache inside each store -//! buys nothing across one-shot calls, but the surface stays simple -//! and correct; the long-lived `Arc` cache pattern arrives with -//! the cutover in epic 19. +//! Stores are constructed per call: `WorkspaceStore::new(vault_path)` for the +//! vault-anchored workspace file, `UserStore::from_default_path()` for the +//! per-machine user file. use httui_core::secrets::{Keychain, SecretBackend}; use httui_core::vault_config::create::{create_new_vault, CreateOutcome}; @@ -58,9 +50,7 @@ pub async fn get_workspace_config_with_sources( } /// Read the per-file settings entry for `file_path` (vault-relative). -/// Returns `FileSettings::default()` when no entry exists. Carry-over -/// from feeds the editor toolbar's auto-capture -/// toggle. +/// Returns `FileSettings::default()` when no entry exists. #[tauri::command] pub async fn get_file_settings( vault_path: String, @@ -83,8 +73,7 @@ pub async fn set_file_auto_capture( store.set_file_auto_capture(&file_path, auto_capture).await } -/// Toggle `docheader_compact` for `file_path`. Same prune semantics -/// as auto_capture. Powers. +/// Toggle `docheader_compact` for `file_path`. Same prune semantics as `set_file_auto_capture`. #[tauri::command] pub async fn set_file_docheader_compact( vault_path: String, @@ -108,10 +97,7 @@ pub async fn set_user_config(file: UserFile) -> Result<(), String> { } /// Ensure the vault's `.gitignore` carries the canonical block of -/// `*.local.toml` patterns (ADR 0004). Idempotent. Used by the -/// "Open / Clone / Create vault" flow (epic 17) and surfaced as a -/// "fix it" button in the UI when an already-cloned vault is detected -/// without our entries. +/// `*.local.toml` patterns. Idempotent. #[tauri::command] pub async fn ensure_vault_gitignore(vault_path: String) -> Result { let path = PathBuf::from(vault_path); @@ -144,11 +130,8 @@ pub async fn list_missing_secrets(vault_path: String) -> Result, scan_missing_secrets(&path, &Keychain) } -/// Persist a secret value under `keychain_key` in the OS keychain -/// The first-run secrets modal calls -/// this once per pending entry the user fills in. Empty values are -/// rejected so the modal can't silently store blanks (the modal -/// validates client-side too, this is the belt-and-suspenders). +/// Persist a secret value under `keychain_key` in the OS keychain. +/// Empty keys and values are rejected (belt-and-suspenders; the modal also validates client-side). #[tauri::command] pub async fn save_secret_cmd(keychain_key: String, value: String) -> Result<(), String> { let key = keychain_key.trim(); @@ -161,36 +144,24 @@ pub async fn save_secret_cmd(keychain_key: String, value: String) -> Result<(), Keychain.store(key, &value) } -/// Create a brand-new vault at `/` — V1 vertical 1, -/// Composes mkdir + `git init` + scaffold so the user -/// gets a versionable, ready-to-edit vault in one step. The leaf -/// name is the user's input; the backend rejects empty/path-traversal -/// inputs and refuses to overwrite an existing non-empty folder. +/// Create a brand-new vault at `/`. Composes mkdir + `git init` + scaffold. +/// Rejects empty/path-traversal names and refuses to overwrite a non-empty folder. #[tauri::command] pub async fn create_vault_cmd(parent_path: String, name: String) -> Result { let parent = PathBuf::from(parent_path); create_new_vault(&parent, &name) } -/// Probe `vault_path` to decide whether to surface the MVP→v1 -/// migration banner. Returns a `MigrationCandidate { -/// has_legacy_db, has_v1_layout }` -/// `should_prompt()` on the result is `true` iff the legacy -/// `notes.db` is present and the v1 `.httui/` layout is not -/// initialised. Frontend gates the banner on this AND the -/// `mvp_migration_dismissed` user pref. +/// Probe `vault_path` for the MVP→v1 migration. `should_prompt()` is `true` iff +/// the legacy `notes.db` exists and the v1 `.httui/` layout is not yet initialised. #[tauri::command] pub async fn detect_vault_migration(vault_path: String) -> Result { Ok(detect_migration_candidate(&PathBuf::from(vault_path))) } -/// Migrate the MVP SQLite-backed vault to the v1 file layout (Epic -/// 12 / audit-005). Migrates `connections` and `environments` + -/// `env_variables`. Prefs migration is part of the settings -/// split. -/// -/// The Tauri command is the only entry point; there is no CLI flag -/// in v1. Set `dry_run = true` to preview without writing. +/// Migrate the MVP SQLite-backed vault to the v1 file layout. +/// Migrates `connections`, `environments`, and `env_variables`. +/// Set `dry_run = true` to preview without writing. #[tauri::command] pub async fn migrate_vault_to_v1( pool: tauri::State<'_, SqlitePool>, diff --git a/httui-desktop/src/components/atoms/Btn.tsx b/httui-desktop/src/components/atoms/Btn.tsx index 99c468d6..70831107 100644 --- a/httui-desktop/src/components/atoms/Btn.tsx +++ b/httui-desktop/src/components/atoms/Btn.tsx @@ -1,10 +1,3 @@ -// Button atom (design canvas §0). -// -// 24px tall, 0 10px padding, 4px radius. Two variants: `primary` -// (accent bg + accent-fg, weight 600) and `ghost` (transparent bg, -// no border). The Chakra `