From d8c1392587997d35825772e07105623febcfd6ef Mon Sep 17 00:00:00 2001 From: Christian Nennemann Date: Fri, 6 Mar 2026 21:42:49 +0100 Subject: [PATCH] chore: public-readiness cleanup - Remove default Grafana password (fail loudly if unset) - Clean up stale delivery-proof TODO (already implemented at RPC layer) - Document TUI send as local-only, point to REPL for E2E delivery - Gitignore AI workflow files (CLAUDE.md, master-prompt.md, ai_team.py) - Remove 5 orphaned v1 crates (bot, ffi, gen, gui, mobile) - Commit ROADMAP.html updates --- .env.example | 4 +- .gitignore | 5 + CLAUDE.md | 23 - ROADMAP.html | 88 +- crates/quicproquo-bot/Cargo.toml | 22 - crates/quicproquo-bot/src/lib.rs | 353 --- crates/quicproquo-client/src/client/v2_tui.rs | 11 +- crates/quicproquo-ffi/Cargo.toml | 20 - crates/quicproquo-ffi/src/lib.rs | 428 ---- crates/quicproquo-gen/Cargo.toml | 16 - crates/quicproquo-gen/src/generators/bot.rs | 212 -- crates/quicproquo-gen/src/generators/hook.rs | 134 - crates/quicproquo-gen/src/generators/mod.rs | 4 - .../quicproquo-gen/src/generators/plugin.rs | 186 -- crates/quicproquo-gen/src/generators/rpc.rs | 129 - crates/quicproquo-gen/src/main.rs | 55 - crates/quicproquo-gui/Cargo.toml | 22 - crates/quicproquo-gui/README.md | 32 - crates/quicproquo-gui/build.rs | 3 - .../quicproquo-gui/capabilities/default.json | 11 - .../gen/schemas/acl-manifests.json | 1 - .../gen/schemas/capabilities.json | 1 - .../gen/schemas/desktop-schema.json | 2244 ----------------- .../gen/schemas/linux-schema.json | 2244 ----------------- .../gen/schemas/macOS-schema.json | 2244 ----------------- crates/quicproquo-gui/icons/icon.png | Bin 2200 -> 0 bytes crates/quicproquo-gui/src/backend.rs | 86 - crates/quicproquo-gui/src/lib.rs | 76 - crates/quicproquo-gui/src/main.rs | 5 - crates/quicproquo-gui/tauri.conf.json | 24 - crates/quicproquo-gui/ui/index.html | 54 - crates/quicproquo-mobile/Cargo.toml | 32 - crates/quicproquo-mobile/src/lib.rs | 433 ---- .../quicproquo-server/src/domain/delivery.rs | 2 +- docker-compose.prod.yml | 2 +- master-prompt.md | 329 --- scripts/ai_team.py | 1156 --------- 37 files changed, 61 insertions(+), 10630 deletions(-) delete mode 100644 CLAUDE.md delete mode 100644 crates/quicproquo-bot/Cargo.toml delete mode 100644 crates/quicproquo-bot/src/lib.rs delete mode 100644 crates/quicproquo-ffi/Cargo.toml delete mode 100644 crates/quicproquo-ffi/src/lib.rs delete mode 100644 crates/quicproquo-gen/Cargo.toml delete mode 100644 crates/quicproquo-gen/src/generators/bot.rs delete mode 100644 crates/quicproquo-gen/src/generators/hook.rs delete mode 100644 crates/quicproquo-gen/src/generators/mod.rs delete mode 100644 crates/quicproquo-gen/src/generators/plugin.rs delete mode 100644 crates/quicproquo-gen/src/generators/rpc.rs delete mode 100644 crates/quicproquo-gen/src/main.rs delete mode 100644 crates/quicproquo-gui/Cargo.toml delete mode 100644 crates/quicproquo-gui/README.md delete mode 100644 crates/quicproquo-gui/build.rs delete mode 100644 crates/quicproquo-gui/capabilities/default.json delete mode 100644 crates/quicproquo-gui/gen/schemas/acl-manifests.json delete mode 100644 crates/quicproquo-gui/gen/schemas/capabilities.json delete mode 100644 crates/quicproquo-gui/gen/schemas/desktop-schema.json delete mode 100644 crates/quicproquo-gui/gen/schemas/linux-schema.json delete mode 100644 crates/quicproquo-gui/gen/schemas/macOS-schema.json delete mode 100644 crates/quicproquo-gui/icons/icon.png delete mode 100644 crates/quicproquo-gui/src/backend.rs delete mode 100644 crates/quicproquo-gui/src/lib.rs delete mode 100644 crates/quicproquo-gui/src/main.rs delete mode 100644 crates/quicproquo-gui/tauri.conf.json delete mode 100644 crates/quicproquo-gui/ui/index.html delete mode 100644 crates/quicproquo-mobile/Cargo.toml delete mode 100644 crates/quicproquo-mobile/src/lib.rs delete mode 100644 master-prompt.md delete mode 100755 scripts/ai_team.py diff --git a/.env.example b/.env.example index 66a1f20..cbfb698 100644 --- a/.env.example +++ b/.env.example @@ -16,5 +16,5 @@ QPQ_SEALED_SENDER=false QPQ_REDACT_LOGS=true QPQ_WS_LISTEN= -# Grafana admin password -GRAFANA_ADMIN_PASSWORD=changeme +# Grafana admin password (required — must be strong, no default) +GRAFANA_ADMIN_PASSWORD= diff --git a/.gitignore b/.gitignore index 33a57a4..7520509 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,8 @@ qpq-server.toml # Internal planning docs (not for public distribution) docs/internal/ + +# AI development workflow files +CLAUDE.md +master-prompt.md +scripts/ai_team.py diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index e01df49..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,23 +0,0 @@ -# quicproquo — Claude Code Instructions - -## Agent Team Workflow Rules - -### NEVER delete worktrees before preserving changes -When using agent teams with `isolation: "worktree"`: -1. **Before calling `TeamDelete`**, always check each worktree for uncommitted or committed changes -2. **Create a named branch** from each worktree's HEAD and push/preserve it before cleanup -3. **Preferred pattern**: use `git branch fix/ ` to save the work -4. If an agent reports changes, its worktree branch MUST be merged or saved before the team is deleted - -### Agent team best practices -- Always have agents **commit their changes** with descriptive messages before shutting them down -- After all agents report, **list worktrees** (`git worktree list`) and **save branches** before cleanup -- When using worktree isolation, the sequence must be: agents finish → save branches → merge → TeamDelete -- Never call TeamDelete as a shortcut to kill zombie agents — use `rm -rf ~/.claude/teams/` for the team metadata only, preserving worktree dirs - -### Git workflow -- Conventional commits: `feat:`, `fix:`, `chore:`, `docs:`, `test:`, `refactor:` -- GPG-signed commits only -- No `Co-authored-by` trailers -- No `.unwrap()` on crypto or I/O in non-test paths -- Secrets: zeroize on drop, never in logs diff --git a/ROADMAP.html b/ROADMAP.html index 8450eff..f41dd2e 100644 --- a/ROADMAP.html +++ b/ROADMAP.html @@ -3,7 +3,7 @@ - Full Roadmap (Phases 1–8) - quicproquo + Full Roadmap (Phases 1-8) - quicproquo @@ -35,10 +35,10 @@ const path_to_root = ""; const default_light_theme = "navy"; const default_dark_theme = "navy"; - window.path_to_searchindex_js = "searchindex-92ce38c7.js"; + window.path_to_searchindex_js = "searchindex-1e4ee6e2.js"; - +
@@ -185,7 +185,7 @@ can be parallelised. Check the box when done.

Eliminate all crash paths, enforce secure defaults, fix deployment blockers.

  • -

    1.1 Remove .unwrap() / .expect() from production paths

    +

    1.1 Remove .unwrap() / .expect() from production paths

    • Replace AUTH_CONTEXT.read().expect() in client RPC with proper Result
    • Replace "0.0.0.0:0".parse().unwrap() in client with fallible parse
    • @@ -194,7 +194,7 @@ can be parallelised. Check the box when done.

  • -

    1.2 Enforce secure defaults in production mode

    +

    1.2 Enforce secure defaults in production mode

    • Reject startup if QPQ_PRODUCTION=true and auth_token is empty or "devtoken"
    • Require non-empty db_key when using SQL backend in production
    • @@ -203,14 +203,14 @@ can be parallelised. Check the box when done.

  • -

    1.3 Fix .gitignore

    +

    1.3 Fix .gitignore

    • Add data/, *.der, *.pem, *.db, *.bin (state files), *.ks (keystores)
    • Verify no secrets are already tracked: git ls-files data/ *.der *.db
  • -

    1.4 Fix Dockerfile

    +

    1.4 Fix Dockerfile

    • Sync workspace members (handle excluded p2p crate)
    • Create dedicated user/group instead of nobody
    • @@ -219,7 +219,7 @@ can be parallelised. Check the box when done.

  • -

    1.5 TLS certificate lifecycle

    +

    1.5 TLS certificate lifecycle

    • Document CA-signed cert setup (Let’s Encrypt / custom CA)
    • Add --tls-required flag that refuses to start without valid cert
    • @@ -233,7 +233,7 @@ can be parallelised. Check the box when done.

      Build confidence before adding features.

      • -

        2.1 Expand E2E test coverage

        +

        2.1 Expand E2E test coverage

        • Auth failure scenarios (wrong password, expired token, invalid token)
        • Message ordering verification (send N messages, verify seq numbers)
        • @@ -246,7 +246,7 @@ can be parallelised. Check the box when done.

      • -

        2.2 Add unit tests for untested paths

        +

        2.2 Add unit tests for untested paths

        • Client retry logic (exponential backoff, jitter, retriable classification)
        • REPL input parsing edge cases (empty input, special characters, / commands)
        • @@ -256,7 +256,7 @@ can be parallelised. Check the box when done.

      • -

        2.3 CI hardening

        +

        2.3 CI hardening

        • Add .github/CODEOWNERS (crypto, auth, wire-format require 2 reviewers)
        • Ensure cargo deny check runs on every PR (already in CI — verify)
        • @@ -266,7 +266,7 @@ can be parallelised. Check the box when done.

      • -

        2.4 Clean up build warnings

        +

        2.4 Clean up build warnings

        • Fix Cap’n Proto generated unused_parens warnings
        • Remove dead code / unused imports
        • @@ -328,7 +328,7 @@ WASM/FFI for the crypto layer.

      • -

        3.2 Python SDK (quicproquo-py)

        +

        3.2 Python SDK (quicproquo-py)

        • QUIC transport: aioquic with custom Cap’n Proto stream handler
        • Cap’n Proto serialization: pycapnp for message types
        • @@ -357,7 +357,7 @@ WASM/FFI for the crypto layer.

      • -

        3.5 WebTransport server endpoint

        +

        3.5 WebTransport server endpoint

        • Add HTTP/3 + WebTransport listener to server (same QUIC stack via quinn)
        • Cap’n Proto RPC framed over WebTransport bidirectional streams
        • @@ -378,7 +378,7 @@ WASM/FFI for the crypto layer.

      • -

        3.7 SDK documentation and schema publishing

        +

        3.7 SDK documentation and schema publishing

        • Publish .capnp schemas as the canonical API contract
        • Document the QUIC + Cap’n Proto connection pattern for each language
        • @@ -401,7 +401,7 @@ WASM/FFI for the crypto layer.

      • -

        4.2 Key Transparency / revocation

        +

        4.2 Key Transparency / revocation

        • Replace BasicCredential with X.509-based MLS credentials
        • Or: verifiable key directory (Merkle tree, auditable log)
        • @@ -418,7 +418,7 @@ WASM/FFI for the crypto layer.

      • -

        4.4 M7 — Post-quantum MLS integration

        +

        4.4 M7 — Post-quantum MLS integration

        • Integrate hybrid KEM (X25519 + ML-KEM-768) into the OpenMLS crypto provider
        • Group key material gets post-quantum confidentiality
        • @@ -439,7 +439,7 @@ WASM/FFI for the crypto layer.

          Make it a product people want to use.

          • -

            5.1 Multi-device support

            +

            5.1 Multi-device support

            • Account → multiple devices, each with own Ed25519 key + MLS KeyPackages
            • Device graph management (add device, remove device, list devices)
            • @@ -448,7 +448,7 @@ WASM/FFI for the crypto layer.

          • -

            5.2 Account recovery

            +

            5.2 Account recovery

            • Recovery codes or backup key (encrypted, stored by user)
            • Option: server-assisted recovery with security questions (lower security)
            • @@ -456,7 +456,7 @@ WASM/FFI for the crypto layer.

          • -

            5.3 Full MLS lifecycle

            +

            5.3 Full MLS lifecycle

            • Member removal (Remove proposal → Commit → fan-out)
            • Credential update (Update proposal for key rotation)
            • @@ -483,7 +483,7 @@ WASM/FFI for the crypto layer.

          • -

            5.6 Abuse prevention and moderation

            +

            5.6 Abuse prevention and moderation

            • Block user (client-side, suppress display)
            • Report message (encrypted report to admin key)
            • @@ -491,7 +491,7 @@ WASM/FFI for the crypto layer.

          • -

            5.7 Offline message queue (client-side)

            +

            5.7 Offline message queue (client-side)

            • Queue messages when disconnected, send on reconnect
            • Idempotent message IDs to prevent duplicates
            • @@ -504,7 +504,7 @@ WASM/FFI for the crypto layer.

              Prepare for real traffic.

              • -

                6.1 Distributed rate limiting

                +

                6.1 Distributed rate limiting

                • Current: in-memory per-process, lost on restart
                • Move to Redis or shared state for multi-node deployments
                • @@ -512,7 +512,7 @@ WASM/FFI for the crypto layer.

              • -

                6.2 Multi-node / horizontal scaling

                +

                6.2 Multi-node / horizontal scaling

                • Stateless server design (already mostly there — state is in storage backend)
                • Shared PostgreSQL or CockroachDB backend (replace SQLite)
                • @@ -521,7 +521,7 @@ WASM/FFI for the crypto layer.

              • -

                6.3 Operational runbook

                +

                6.3 Operational runbook

                • Backup / restore procedures (SQLCipher, file backend)
                • Key rotation (auth token, TLS cert, DB encryption key)
                • @@ -531,7 +531,7 @@ WASM/FFI for the crypto layer.

              • -

                6.4 Connection draining and graceful shutdown

                +

                6.4 Connection draining and graceful shutdown

                • Stop accepting new connections on SIGTERM
                • Wait for in-flight RPCs (configurable timeout, default 30s)
                • @@ -540,7 +540,7 @@ WASM/FFI for the crypto layer.

              • -

                6.5 Request-level timeouts

                +

                6.5 Request-level timeouts

                • Per-RPC timeout (prevent slow clients from holding resources)
                • Database query timeout
                • @@ -548,7 +548,7 @@ WASM/FFI for the crypto layer.

              • -

                6.6 Observability enhancements

                +

                6.6 Observability enhancements

                • Request correlation IDs (trace across RPC → storage)
                • Storage operation latency metrics
                • @@ -563,7 +563,7 @@ WASM/FFI for the crypto layer.

                  Long-term vision for wide adoption.

                  • -

                    7.1 Mobile clients (iOS + Android)

                    +

                    7.1 Mobile clients (iOS + Android)

                    • Use C FFI (Phase 3.3) for crypto + transport (single library)
                    • Push notifications via APNs / FCM (server sends notification on enqueue)
                    • @@ -572,7 +572,7 @@ WASM/FFI for the crypto layer.

                  • -

                    7.2 Web client (browser)

                    +

                    7.2 Web client (browser)

                    • Use WASM (Phase 3.4) for crypto
                    • Use WebTransport (Phase 3.5) for native QUIC transport
                    • @@ -583,7 +583,7 @@ WASM/FFI for the crypto layer.

                  • -

                    7.3 Federation

                    +

                    7.3 Federation

                    • Server-to-server protocol via Cap’n Proto RPC over QUIC (see federation.capnp)
                    • relayEnqueue, proxyFetchKeyPackage, federationHealth methods
                    • @@ -601,7 +601,7 @@ WASM/FFI for the crypto layer.

                  • -

                    7.5 Additional language SDKs

                    +

                    7.5 Additional language SDKs

                    • Java/Kotlin: JNI bindings to C FFI (Phase 3.3) + native QUIC (netty-quic)
                    • Swift: Swift wrapper over C FFI + Network.framework QUIC
                    • @@ -610,7 +610,7 @@ WASM/FFI for the crypto layer.

                  • -

                    7.6 P2P / NAT traversal

                    +

                    7.6 P2P / NAT traversal

                    • Direct peer-to-peer via iroh (foundation exists in quicproquo-p2p)
                    • Server as fallback relay only
                    • @@ -619,7 +619,7 @@ WASM/FFI for the crypto layer.

                  • -

                    7.7 Traffic analysis resistance

                    +

                    7.7 Traffic analysis resistance

                    • Padding messages to uniform size
                    • Decoy traffic to mask timing patterns
                    • @@ -706,7 +706,7 @@ functions without any central infrastructure or internet uplink.

                  • -

                    F7 — OpenWrt cross-compilation guide

                    +

                    F7 — OpenWrt cross-compilation guide

                    • Musl static builds: x86_64-unknown-linux-musl, armv7-unknown-linux-musleabihf, mips-unknown-linux-musl
                    • Strip binary: --release + strip → target size < 5 MB for flash storage
                    • @@ -716,7 +716,7 @@ functions without any central infrastructure or internet uplink.

                  • -

                    F8 — Traffic analysis resistance for mesh

                    +

                    F8 — Traffic analysis resistance for mesh

                    • Uniform message padding to nearest 256-byte boundary (hides message size)
                    • Configurable decoy traffic rate (fake messages to mask send timing)
                    • @@ -731,7 +731,7 @@ functions without any central infrastructure or internet uplink.

                      and lower the barrier to entry for non-crypto developers.

                      • -

                        9.1 Criterion Benchmark Suite (qpq-bench)

                        +

                        9.1 Criterion Benchmark Suite (qpq-bench)

                        • Criterion benchmarks for all crypto primitives: hybrid KEM encap/decap, MLS group-add at 10/100/1000 members, epoch rotation, Noise_XX handshake
                        • @@ -748,7 +748,7 @@ MLS group-add at 10/100/1000 members, epoch rotation, Noise_XX handshake
                      • -

                        9.3 Full-Screen TUI (Ratatui + Crossterm)

                        +

                        9.3 Full-Screen TUI (Ratatui + Crossterm)

                        • qpq tui launches a full-screen terminal UI: message pane, input bar, channel sidebar with unread counts, MLS epoch indicator
                        • @@ -757,7 +757,7 @@ channel sidebar with unread counts, MLS epoch indicator
                      • -

                        9.4 Delivery Proof Canary Tokens

                        +

                        9.4 Delivery Proof Canary Tokens

                        • Server signs Ed25519(SHA-256(message_id || recipient || timestamp)) on enqueue
                        • Sender stores proof locally — cryptographic evidence the server queued the message
                        • @@ -765,7 +765,7 @@ channel sidebar with unread counts, MLS epoch indicator
                      • -

                        9.5 Verifiable Transcript Archive

                        +

                        9.5 Verifiable Transcript Archive

                        • GroupMember::export_transcript(path, password) writes encrypted, tamper-evident message archive (CBOR records, Argon2id + ChaCha20-Poly1305, Merkle chain)
                        • @@ -774,7 +774,7 @@ message archive (CBOR records, Argon2id + ChaCha20-Poly1305, Merkle chain)
                      • -

                        9.6 Key Transparency (Merkle-Log Identity Binding)

                        +

                        9.6 Key Transparency (Merkle-Log Identity Binding)

                        • Append-only Merkle log of (username, identity_key) bindings in the AS
                        • Clients receive inclusion proofs alongside key fetches
                        • @@ -792,7 +792,7 @@ message archive (CBOR records, Argon2id + ChaCha20-Poly1305, Merkle chain)
                      • -

                        9.8 PQ Noise Transport Layer

                        +

                        9.8 PQ Noise Transport Layer

                        • Hybrid Noise_XX + ML-KEM-768 handshake for post-quantum transport security
                        • Closes the harvest-now-decrypt-later gap on handshake metadata (ADR-006)
                        • @@ -840,7 +840,7 @@ message archive (CBOR records, Argon2id + ChaCha20-Poly1305, Merkle chain) - @@ -854,7 +854,7 @@ message archive (CBOR records, Argon2id + ChaCha20-Poly1305, Merkle chain) - diff --git a/crates/quicproquo-bot/Cargo.toml b/crates/quicproquo-bot/Cargo.toml deleted file mode 100644 index 2b4bb00..0000000 --- a/crates/quicproquo-bot/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "quicproquo-bot" -version = "0.1.0" -edition = "2021" -description = "Bot SDK for quicproquo — build automated agents on E2E encrypted messaging." -license = "MIT" - -[lints] -workspace = true - -[dependencies] -quicproquo-core = { path = "../quicproquo-core" } -quicproquo-proto = { path = "../quicproquo-proto" } -quicproquo-client = { path = "../quicproquo-client" } - -openmls_rust_crypto = { workspace = true } -tokio = { workspace = true } -anyhow = { workspace = true } -tracing = { workspace = true } -serde = { workspace = true } -serde_json = { workspace = true } -hex = { workspace = true } diff --git a/crates/quicproquo-bot/src/lib.rs b/crates/quicproquo-bot/src/lib.rs deleted file mode 100644 index 6a05a00..0000000 --- a/crates/quicproquo-bot/src/lib.rs +++ /dev/null @@ -1,353 +0,0 @@ -//! # quicproquo-bot — Bot SDK for E2E encrypted messaging -//! -//! Build automated agents that run on the quicproquo network with full MLS -//! end-to-end encryption. The bot SDK wraps the client library into a simple -//! polling-based API: connect, authenticate, send, receive. -//! -//! ## Quick start -//! -//! ```rust,no_run -//! use quicproquo_bot::{Bot, BotConfig}; -//! -//! #[tokio::main] -//! async fn main() -> anyhow::Result<()> { -//! let config = BotConfig::new("127.0.0.1:7000", "bot-user", "bot-password") -//! .ca_cert("server-cert.der") -//! .state_path("bot-state.bin"); -//! -//! let bot = Bot::connect(config).await?; -//! -//! // Send a DM -//! bot.send_dm("alice", "Hello from bot!").await?; -//! -//! // Poll for messages -//! loop { -//! for msg in bot.receive(5000).await? { -//! println!("{}: {}", msg.sender, msg.text); -//! if msg.text.starts_with("!echo ") { -//! bot.send_dm(&msg.sender, &msg.text[6..]).await?; -//! } -//! } -//! } -//! } -//! ``` -//! -//! ## Pipe mode (stdin/stdout JSON lines) -//! -//! The bot SDK also supports non-interactive pipe mode for shell integration: -//! -//! ```bash -//! # Send via pipe -//! echo '{"to":"alice","text":"hello"}' | qpq pipe --state bot.bin -//! -//! # Receive via pipe (JSON lines to stdout) -//! qpq pipe --recv --state bot.bin -//! ``` - -use std::path::PathBuf; -use std::sync::Arc; - -use anyhow::Context; -use tokio::task::LocalSet; - -use quicproquo_client::{connect_node, init_auth, opaque_login, resolve_user, ClientAuth}; -use quicproquo_core::IdentityKeypair; - -/// Configuration for connecting a bot to a quicproquo server. -#[derive(Clone, Debug)] -pub struct BotConfig { - /// Server address (host:port). - pub server: String, - /// Path to the server's CA certificate (DER format). - pub ca_cert: PathBuf, - /// TLS server name (defaults to "localhost"). - pub server_name: String, - /// Bot's username for OPAQUE authentication. - pub username: String, - /// Bot's password for OPAQUE authentication. - pub password: String, - /// Path to the bot's encrypted state file. - pub state_path: PathBuf, - /// Password for the encrypted state file (None = unencrypted). - pub state_password: Option, - /// Device ID reported to the server. - pub device_id: Option, -} - -impl BotConfig { - /// Create a new bot configuration with required fields. - pub fn new(server: &str, username: &str, password: &str) -> Self { - Self { - server: server.to_string(), - ca_cert: PathBuf::from("server-cert.der"), - server_name: "localhost".to_string(), - username: username.to_string(), - password: password.to_string(), - state_path: PathBuf::from("bot-state.bin"), - state_password: None, - device_id: None, - } - } - - /// Set the CA certificate path. - pub fn ca_cert(mut self, path: &str) -> Self { - self.ca_cert = PathBuf::from(path); - self - } - - /// Set the TLS server name for certificate validation. - pub fn server_name(mut self, name: &str) -> Self { - self.server_name = name.to_string(); - self - } - - /// Set the state file path. - pub fn state_path(mut self, path: &str) -> Self { - self.state_path = PathBuf::from(path); - self - } - - /// Set the state file encryption password. - pub fn state_password(mut self, pwd: &str) -> Self { - self.state_password = Some(pwd.to_string()); - self - } - - /// Set the device ID. - pub fn device_id(mut self, id: &str) -> Self { - self.device_id = Some(id.to_string()); - self - } -} - -/// A received message from the quicproquo network. -#[derive(Clone, Debug, serde::Serialize)] -pub struct Message { - /// The sender's username (or "unknown" if resolution failed). - pub sender: String, - /// The decrypted plaintext message content. - pub text: String, - /// Server-assigned sequence number. - pub seq: u64, -} - -/// A bot connected to a quicproquo server. -/// -/// The bot maintains its identity and MLS group state. Each call to -/// `send_dm` or `receive` opens a fresh QUIC connection (stateless -/// reconnect pattern — same as the CLI client). -pub struct Bot { - config: BotConfig, - identity: Arc, -} - -impl Bot { - /// Connect to a quicproquo server and authenticate. - /// - /// Loads or creates an identity from the state file, connects via QUIC/TLS, - /// and performs OPAQUE password authentication. - pub async fn connect(config: BotConfig) -> anyhow::Result { - let state = quicproquo_client::client::state::load_or_init_state( - &config.state_path, - config.state_password.as_deref(), - ) - .context("load or init bot state")?; - - let identity = Arc::new(IdentityKeypair::from_seed(state.identity_seed)); - - // Authenticate on the first connection. - let local = LocalSet::new(); - let cfg = config.clone(); - let id = Arc::clone(&identity); - - local - .run_until(async { - let client = - connect_node(&cfg.server, &cfg.ca_cert, &cfg.server_name).await?; - - let pk = id.public_key_bytes(); - let token = opaque_login( - &client, - &cfg.username, - &cfg.password, - &pk, - ) - .await - .context("OPAQUE login")?; - - init_auth(ClientAuth::from_raw(token, cfg.device_id.clone())); - - tracing::info!(username = %cfg.username, server = %cfg.server, "bot authenticated"); - Ok::<(), anyhow::Error>(()) - }) - .await?; - - Ok(Self { config, identity }) - } - - /// Send a plaintext message to a peer by username. - /// - /// Resolves the username to an identity key, then encrypts via MLS - /// and delivers through the server. - pub async fn send_dm(&self, peer_username: &str, text: &str) -> anyhow::Result<()> { - // Resolve username → identity key hex so we send to the specific peer. - let peer_key = self - .resolve_user(peer_username) - .await - .context("resolve peer username")?; - let peer_key_hex = hex::encode(&peer_key); - - quicproquo_client::cmd_send( - &self.config.state_path, - &self.config.server, - &self.config.ca_cert, - &self.config.server_name, - Some(&peer_key_hex), - false, - text, - self.config.state_password.as_deref(), - ) - .await - .context("send message")?; - - Ok(()) - } - - /// Receive pending messages, waiting up to `timeout_ms` milliseconds. - /// - /// Returns decrypted application messages. MLS control messages (commits, - /// welcomes) are processed internally but not returned. - pub async fn receive(&self, timeout_ms: u64) -> anyhow::Result> { - let plaintexts = quicproquo_client::receive_pending_plaintexts( - &self.config.state_path, - &self.config.server, - &self.config.ca_cert, - &self.config.server_name, - timeout_ms, - self.config.state_password.as_deref(), - ) - .await?; - - let messages: Vec = plaintexts - .into_iter() - .enumerate() - .map(|(i, plaintext)| Message { - sender: "peer".to_string(), // TODO: resolve from MLS group roster - text: String::from_utf8_lossy(&plaintext).to_string(), - seq: i as u64, - }) - .collect(); - - Ok(messages) - } - - /// Receive raw plaintext bytes (for binary protocols or non-UTF-8 content). - pub async fn receive_raw(&self, timeout_ms: u64) -> anyhow::Result>> { - quicproquo_client::receive_pending_plaintexts( - &self.config.state_path, - &self.config.server, - &self.config.ca_cert, - &self.config.server_name, - timeout_ms, - self.config.state_password.as_deref(), - ) - .await - } - - /// Resolve a username to a 32-byte identity key. - pub async fn resolve_user(&self, username: &str) -> anyhow::Result> { - let local = LocalSet::new(); - let cfg = self.config.clone(); - let username = username.to_string(); - - local - .run_until(async { - let client = connect_node(&cfg.server, &cfg.ca_cert, &cfg.server_name).await?; - let key = resolve_user(&client, &username) - .await? - .ok_or_else(|| anyhow::anyhow!("user not found: {username}"))?; - Ok(key) - }) - .await - } - - /// Get the bot's own username. - pub fn username(&self) -> &str { - &self.config.username - } - - /// Get the bot's identity public key (32 bytes, Ed25519). - pub fn identity_key(&self) -> [u8; 32] { - self.identity.public_key_bytes() - } - - /// Get the bot's identity key as a hex string. - pub fn identity_key_hex(&self) -> String { - hex::encode(self.identity.public_key_bytes()) - } -} - -/// Read JSON commands from stdin and process them. -/// -/// Each line should be a JSON object with: -/// - `{"action": "send", "to": "username", "text": "message"}` -/// - `{"action": "recv", "timeout_ms": 5000}` -/// - `{"action": "resolve", "username": "alice"}` -/// -/// Results are written to stdout as JSON lines. -pub async fn run_pipe_mode(bot: &Bot) -> anyhow::Result<()> { - use tokio::io::{AsyncBufReadExt, BufReader}; - - let stdin = BufReader::new(tokio::io::stdin()); - let mut lines = stdin.lines(); - - while let Ok(Some(line)) = lines.next_line().await { - let line = line.trim().to_string(); - if line.is_empty() { - continue; - } - - let cmd: serde_json::Value = match serde_json::from_str(&line) { - Ok(v) => v, - Err(e) => { - let err = serde_json::json!({"error": format!("invalid JSON: {e}")}); - println!("{err}"); - continue; - } - }; - - let action = cmd["action"].as_str().unwrap_or(""); - let result = match action { - "send" => { - let to = cmd["to"].as_str().unwrap_or(""); - let text = cmd["text"].as_str().unwrap_or(""); - match bot.send_dm(to, text).await { - Ok(()) => serde_json::json!({"status": "ok", "action": "send"}), - Err(e) => serde_json::json!({"error": format!("{e:#}")}), - } - } - "recv" => { - let timeout = cmd["timeout_ms"].as_u64().unwrap_or(5000); - match bot.receive(timeout).await { - Ok(msgs) => serde_json::json!({"status": "ok", "messages": msgs}), - Err(e) => serde_json::json!({"error": format!("{e:#}")}), - } - } - "resolve" => { - let username = cmd["username"].as_str().unwrap_or(""); - match bot.resolve_user(username).await { - Ok(key) => serde_json::json!({ - "status": "ok", - "identity_key": hex::encode(&key), - }), - Err(e) => serde_json::json!({"error": format!("{e:#}")}), - } - } - _ => serde_json::json!({"error": format!("unknown action: {action}")}), - }; - - println!("{result}"); - } - - Ok(()) -} diff --git a/crates/quicproquo-client/src/client/v2_tui.rs b/crates/quicproquo-client/src/client/v2_tui.rs index 5ae66e1..97af973 100644 --- a/crates/quicproquo-client/src/client/v2_tui.rs +++ b/crates/quicproquo-client/src/client/v2_tui.rs @@ -20,6 +20,9 @@ //! Ctrl+C / Ctrl+Q -- quit //! //! Feature gate: requires both `v2` and `tui` features. +//! +//! **Note:** Message display is currently local-only. Use the REPL client for +//! end-to-end encrypted delivery. See `quicproquo-sdk::messaging` for the full pipeline. use std::time::Duration; @@ -535,9 +538,11 @@ async fn handle_input(app: &mut TuiApp, client: &mut QpqClient, text: &str) { // Snap to bottom. app.scroll_offset = 0; - // TODO: actually send via SDK when the send pipeline is wired up. - // For now, emit a notification. - app.notification = Some(format!("Sent: {text}")); + // NOTE: TUI message display is local-only. The full MLS encryption + // pipeline (sealed sender + hybrid wrap + enqueue) is implemented in + // quicproquo-sdk/src/messaging.rs but is not yet wired into the TUI. + // Use the REPL client (`qpq repl`) for end-to-end message delivery. + app.notification = Some("Message queued locally (TUI send not yet wired to SDK)".to_string()); } } diff --git a/crates/quicproquo-ffi/Cargo.toml b/crates/quicproquo-ffi/Cargo.toml deleted file mode 100644 index 2242c08..0000000 --- a/crates/quicproquo-ffi/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "quicproquo-ffi" -version = "0.1.0" -edition = "2021" -description = "C FFI bindings for quicproquo messaging operations." -license = "MIT" - -[lib] -crate-type = ["cdylib", "staticlib"] - -[dependencies] -quicproquo-client = { path = "../quicproquo-client" } -tokio = { workspace = true } -anyhow = { workspace = true } -capnp = { workspace = true } -serde_json = { workspace = true } -hex = { workspace = true } - -[lints] -workspace = true diff --git a/crates/quicproquo-ffi/src/lib.rs b/crates/quicproquo-ffi/src/lib.rs deleted file mode 100644 index 0e64796..0000000 --- a/crates/quicproquo-ffi/src/lib.rs +++ /dev/null @@ -1,428 +0,0 @@ -#![allow(unsafe_code)] -//! quicproquo-ffi -- C FFI bindings for quicproquo messaging operations. -//! -//! Provides a synchronous C API that wraps the async quicproquo-client library. -//! Each `QpqHandle` owns a Tokio runtime; FFI functions use `runtime.block_on()` -//! to bridge from synchronous C callers to the async Rust internals. -//! -//! # Safety -//! -//! All FFI functions are `unsafe extern "C"` -- callers must ensure pointers -//! are valid and strings are null-terminated UTF-8. - -use std::ffi::{CStr, CString, c_char}; -use std::path::PathBuf; - -use tokio::runtime::Runtime; - -// Status codes returned by FFI functions. -pub const QPQ_OK: i32 = 0; -pub const QPQ_ERROR: i32 = 1; -pub const QPQ_AUTH_FAILED: i32 = 2; -pub const QPQ_TIMEOUT: i32 = 3; -pub const QPQ_NOT_CONNECTED: i32 = 4; - -/// Opaque handle exposed to C callers via pointer. -pub struct QpqHandle { - runtime: Runtime, - server: String, - ca_cert: PathBuf, - server_name: String, - state_path: PathBuf, - state_password: Option, - logged_in: bool, - last_error: Option, -} - -impl QpqHandle { - fn set_error(&mut self, msg: &str) { - self.last_error = CString::new(msg).ok(); - } -} - -// --------------------------------------------------------------------------- -// Error classification -// --------------------------------------------------------------------------- - -/// Classify an `anyhow::Error` from `cmd_login` into an FFI status code. -/// -/// Checks the error chain for typed downcasting before falling back to -/// message-based heuristics. -fn classify_login_error(err: &anyhow::Error) -> i32 { - // Check error chain for OPAQUE-specific typed errors. - for cause in err.chain() { - // capnp::Error indicates transport/RPC failure. - if cause.downcast_ref::().is_some() { - return QPQ_ERROR; - } - } - // Fall back to message inspection for OPAQUE authentication failures, - // since opaque-ke errors are converted to anyhow strings upstream. - let msg = format!("{err:#}"); - if msg.contains("OPAQUE") || msg.contains("bad password") || msg.contains("credential") { - QPQ_AUTH_FAILED - } else { - QPQ_ERROR - } -} - -/// Classify an `anyhow::Error` from receive operations into an FFI status code. -fn classify_receive_error(err: &anyhow::Error) -> i32 { - let msg = format!("{err:#}"); - if msg.contains("timeout") || msg.contains("Timeout") || msg.contains("timed out") { - QPQ_TIMEOUT - } else { - QPQ_ERROR - } -} - -// --------------------------------------------------------------------------- -// Helpers -// --------------------------------------------------------------------------- - -/// Convert a `*const c_char` to `&str`, returning `None` on null or invalid UTF-8. -unsafe fn cstr_to_str<'a>(ptr: *const c_char) -> Option<&'a str> { - if ptr.is_null() { - return None; - } - CStr::from_ptr(ptr).to_str().ok() -} - -// --------------------------------------------------------------------------- -// FFI functions -// --------------------------------------------------------------------------- - -/// Create a new handle and connect to the quicproquo server. -/// -/// Returns a heap-allocated `QpqHandle` pointer on success, or null on failure. -/// -/// # Parameters -/// - `server`: server address as `host:port` (null-terminated UTF-8). -/// - `ca_cert`: path to the CA certificate file (null-terminated UTF-8). -/// - `server_name`: TLS server name (null-terminated UTF-8). -/// -/// # Safety -/// All pointer arguments must be valid, non-null, null-terminated C strings. -#[no_mangle] -pub unsafe extern "C" fn qpq_connect( - server: *const c_char, - ca_cert: *const c_char, - server_name: *const c_char, -) -> *mut QpqHandle { - let server_str = match cstr_to_str(server) { - Some(s) => s, - None => return std::ptr::null_mut(), - }; - let ca_cert_str = match cstr_to_str(ca_cert) { - Some(s) => s, - None => return std::ptr::null_mut(), - }; - let server_name_str = match cstr_to_str(server_name) { - Some(s) => s, - None => return std::ptr::null_mut(), - }; - - let rt = match Runtime::new() { - Ok(r) => r, - Err(_) => return std::ptr::null_mut(), - }; - - // Verify connectivity by performing a health check. - let ca_path = PathBuf::from(ca_cert_str); - let connected = rt.block_on(async { - quicproquo_client::cmd_health(server_str, &ca_path, server_name_str).await - }); - - if let Err(e) = connected { - // Cannot store error in handle since we failed to build one. - eprintln!("qpq_connect: health check failed: {e}"); - return std::ptr::null_mut(); - } - - // Derive a default state path from the server address. - let state_path = PathBuf::from(format!("qpq-ffi-{server_str}.bin")); - - let handle = Box::new(QpqHandle { - runtime: rt, - server: server_str.to_string(), - ca_cert: ca_path, - server_name: server_name_str.to_string(), - state_path, - state_password: None, - logged_in: false, - last_error: None, - }); - Box::into_raw(handle) -} - -/// Authenticate with the server using OPAQUE (username + password). -/// -/// On success the handle is marked as logged-in and subsequent send/receive -/// calls will use the authenticated session. -/// -/// Returns `QPQ_OK` on success, `QPQ_AUTH_FAILED` on bad credentials, -/// or `QPQ_ERROR` on other failures. -/// -/// # Safety -/// - `handle` must be a valid pointer from `qpq_connect`. -/// - `username` and `password` must be valid null-terminated C strings. -#[no_mangle] -pub unsafe extern "C" fn qpq_login( - handle: *mut QpqHandle, - username: *const c_char, - password: *const c_char, -) -> i32 { - let h = match handle.as_mut() { - Some(h) => h, - None => return QPQ_NOT_CONNECTED, - }; - - let user = match cstr_to_str(username) { - Some(s) => s, - None => { - h.set_error("invalid username pointer"); - return QPQ_ERROR; - } - }; - let pass = match cstr_to_str(password) { - Some(s) => s, - None => { - h.set_error("invalid password pointer"); - return QPQ_ERROR; - } - }; - - // Update state path to be username-specific. - h.state_path = PathBuf::from(format!("qpq-ffi-{user}.bin")); - - let result = h.runtime.block_on(async { - quicproquo_client::cmd_login( - &h.server, - &h.ca_cert, - &h.server_name, - user, - pass, - None, // identity_key_hex - Some(h.state_path.as_path()), // state_path - h.state_password.as_deref(), // state_password - ) - .await - }); - - match result { - Ok(()) => { - h.logged_in = true; - QPQ_OK - } - Err(e) => { - let msg = format!("{e:#}"); - let code = classify_login_error(&e); - h.set_error(&msg); - code - } - } -} - -/// Send a message to a recipient (by username). -/// -/// The message is encrypted via MLS before delivery. The `message` buffer -/// does not need to be null-terminated; `message_len` specifies its length. -/// -/// Returns `QPQ_OK` on success. -/// -/// # Safety -/// - `handle` must be a valid pointer from `qpq_connect`. -/// - `recipient` must be a valid null-terminated C string. -/// - `message` must point to at least `message_len` readable bytes. -#[no_mangle] -pub unsafe extern "C" fn qpq_send( - handle: *mut QpqHandle, - recipient: *const c_char, - message: *const u8, - message_len: usize, -) -> i32 { - let h = match handle.as_mut() { - Some(h) => h, - None => return QPQ_NOT_CONNECTED, - }; - - if !h.logged_in { - h.set_error("not logged in"); - return QPQ_NOT_CONNECTED; - } - - let rcpt = match cstr_to_str(recipient) { - Some(s) => s, - None => { - h.set_error("invalid recipient pointer"); - return QPQ_ERROR; - } - }; - - if message.is_null() || message_len == 0 { - h.set_error("empty message"); - return QPQ_ERROR; - } - let msg_bytes = std::slice::from_raw_parts(message, message_len); - let msg_str = match std::str::from_utf8(msg_bytes) { - Ok(s) => s, - Err(e) => { - h.set_error(&format!("message is not valid UTF-8: {e}")); - return QPQ_ERROR; - } - }; - - // Resolve recipient username to identity key, then send. - let result = h.runtime.block_on(async { - let node_client = - quicproquo_client::connect_node(&h.server, &h.ca_cert, &h.server_name).await?; - let peer_key = quicproquo_client::resolve_user(&node_client, rcpt) - .await? - .ok_or_else(|| anyhow::anyhow!("recipient '{rcpt}' not found"))?; - let peer_key_hex = hex::encode(&peer_key); - - quicproquo_client::cmd_send( - &h.state_path, - &h.server, - &h.ca_cert, - &h.server_name, - Some(&peer_key_hex), - false, // send_to_all - msg_str, - h.state_password.as_deref(), - ) - .await - }); - - match result { - Ok(()) => QPQ_OK, - Err(e) => { - h.set_error(&format!("{e:#}")); - QPQ_ERROR - } - } -} - -/// Receive pending messages, blocking up to `timeout_ms` milliseconds. -/// -/// On success, `*out_json` is set to a heap-allocated null-terminated JSON -/// string containing an array of received message objects. The caller must -/// free this string with `qpq_free_string`. -/// -/// Returns `QPQ_OK` on success (even if the array is empty), -/// `QPQ_TIMEOUT` if the wait expires with no messages. -/// -/// # Safety -/// - `handle` must be a valid pointer from `qpq_connect`. -/// - `out_json` must be a valid pointer to a `*mut c_char`. -#[no_mangle] -pub unsafe extern "C" fn qpq_receive( - handle: *mut QpqHandle, - timeout_ms: u32, - out_json: *mut *mut c_char, -) -> i32 { - let h = match handle.as_mut() { - Some(h) => h, - None => return QPQ_NOT_CONNECTED, - }; - - if !h.logged_in { - h.set_error("not logged in"); - return QPQ_NOT_CONNECTED; - } - - if out_json.is_null() { - h.set_error("out_json is null"); - return QPQ_ERROR; - } - - let result = h.runtime.block_on(async { - quicproquo_client::receive_pending_plaintexts( - &h.state_path, - &h.server, - &h.ca_cert, - &h.server_name, - timeout_ms as u64, - h.state_password.as_deref(), - ) - .await - }); - - match result { - Ok(plaintexts) => { - // Convert raw byte payloads to a JSON array of base64 or lossy-UTF-8 strings. - let messages: Vec = plaintexts - .iter() - .map(|pt| String::from_utf8_lossy(pt).into_owned()) - .collect(); - - let json = match serde_json::to_string(&messages) { - Ok(j) => j, - Err(e) => { - h.set_error(&format!("JSON serialisation failed: {e}")); - return QPQ_ERROR; - } - }; - - match CString::new(json) { - Ok(cs) => { - *out_json = cs.into_raw(); - QPQ_OK - } - Err(e) => { - h.set_error(&format!("CString conversion failed: {e}")); - QPQ_ERROR - } - } - } - Err(e) => { - let msg = format!("{e:#}"); - let code = classify_receive_error(&e); - h.set_error(&msg); - code - } - } -} - -/// Disconnect and free the handle. -/// -/// After this call, `handle` must not be used again. -/// -/// # Safety -/// `handle` must be a valid pointer from `qpq_connect`, or null (no-op). -#[no_mangle] -pub unsafe extern "C" fn qpq_disconnect(handle: *mut QpqHandle) { - if !handle.is_null() { - let _ = Box::from_raw(handle); - } -} - -/// Return the last error message, or null if no error has been recorded. -/// -/// The returned pointer is valid until the next FFI call on this handle. -/// Do **not** free the returned pointer; it is owned by the handle. -/// -/// # Safety -/// `handle` must be a valid pointer from `qpq_connect`, or null (returns null). -#[no_mangle] -pub unsafe extern "C" fn qpq_last_error(handle: *const QpqHandle) -> *const c_char { - match handle.as_ref() { - Some(h) => match &h.last_error { - Some(cs) => cs.as_ptr(), - None => std::ptr::null(), - }, - None => std::ptr::null(), - } -} - -/// Free a string previously returned by `qpq_receive` (via `out_json`). -/// -/// # Safety -/// `ptr` must have been allocated by this library (via `CString::into_raw`), -/// or null (no-op). -#[no_mangle] -pub unsafe extern "C" fn qpq_free_string(ptr: *mut c_char) { - if !ptr.is_null() { - let _ = CString::from_raw(ptr); - } -} diff --git a/crates/quicproquo-gen/Cargo.toml b/crates/quicproquo-gen/Cargo.toml deleted file mode 100644 index 50ddc79..0000000 --- a/crates/quicproquo-gen/Cargo.toml +++ /dev/null @@ -1,16 +0,0 @@ -[package] -name = "quicproquo-gen" -version = "0.1.0" -edition = "2021" -description = "Code generators for quicproquo — scaffold plugins, bots, RPC methods, and hooks." -license = "MIT" - -[[bin]] -name = "qpq-gen" -path = "src/main.rs" - -[lints] -workspace = true - -[dependencies] -clap = { workspace = true } diff --git a/crates/quicproquo-gen/src/generators/bot.rs b/crates/quicproquo-gen/src/generators/bot.rs deleted file mode 100644 index e917f74..0000000 --- a/crates/quicproquo-gen/src/generators/bot.rs +++ /dev/null @@ -1,212 +0,0 @@ -use std::fs; -use std::path::Path; - -pub fn generate(name: &str, output: &Path) -> Result<(), String> { - let crate_name = sanitize_name(name); - let dir = output.join(&crate_name); - - if dir.exists() { - return Err(format!("directory already exists: {}", dir.display())); - } - - let src_dir = dir.join("src"); - fs::create_dir_all(&src_dir).map_err(|e| format!("create dir: {e}"))?; - - // Cargo.toml - let cargo_toml = format!( - r#"[package] -name = "{crate_name}" -version = "0.1.0" -edition = "2021" -description = "quicproquo bot: {name}" -license = "MIT" - -[dependencies] -quicproquo-bot = {{ git = "https://github.com/nickvidal/quicproquo" }} -tokio = {{ version = "1", features = ["macros", "rt-multi-thread"] }} -anyhow = "1" -tracing = "0.1" -tracing-subscriber = {{ version = "0.3", features = ["env-filter"] }} -"#, - crate_name = crate_name, - name = name, - ); - write_file(&dir.join("Cargo.toml"), &cargo_toml)?; - - // src/main.rs - let main_rs = format!( - r#"//! quicproquo bot: {name} -//! -//! A bot that connects to a quicproquo server and responds to messages. -//! -//! Usage: -//! {crate_name} --server 127.0.0.1:7000 --username my-bot --password secret -//! -//! Environment variables (alternative to CLI args): -//! QPQ_SERVER, QPQ_USERNAME, QPQ_PASSWORD, QPQ_CA_CERT, QPQ_STATE_PATH - -use quicproquo_bot::{{Bot, BotConfig}}; - -#[tokio::main] -async fn main() -> anyhow::Result<()> {{ - tracing_subscriber::fmt() - .with_env_filter( - tracing_subscriber::EnvFilter::try_from_default_env() - .unwrap_or_else(|_| "info".into()), - ) - .init(); - - // --- Configuration --- - let server = env_or("QPQ_SERVER", "127.0.0.1:7000"); - let username = env_or("QPQ_USERNAME", "{crate_name}"); - let password = env_or("QPQ_PASSWORD", "changeme"); - let ca_cert = env_or("QPQ_CA_CERT", "server-cert.der"); - let state_path = env_or("QPQ_STATE_PATH", "{crate_name}-state.bin"); - - let config = BotConfig::new(&server, &username, &password) - .ca_cert(&ca_cert) - .state_path(&state_path); - - // --- Connect and authenticate --- - tracing::info!("connecting to {{server}} as {{username}}..."); - let bot = Bot::connect(config).await?; - tracing::info!("authenticated as {{}} (key: {{}})", bot.username(), &bot.identity_key_hex()[..16]); - - // --- Main loop: poll for messages and respond --- - tracing::info!("listening for messages (Ctrl+C to stop)..."); - loop {{ - let messages = bot.receive(5000).await?; - for msg in messages {{ - tracing::info!("[{{}}] {{}}", msg.sender, msg.text); - - // --- Add your command handlers here --- - if let Some(response) = handle_message(&msg.sender, &msg.text) {{ - bot.send_dm(&msg.sender, &response).await?; - }} - }} - }} -}} - -/// Process an incoming message and optionally return a response. -/// -/// Add your bot's command logic here. -fn handle_message(sender: &str, text: &str) -> Option {{ - let text = text.trim(); - - // !help — list available commands - if text == "!help" {{ - return Some( - "Available commands:\n\ - !help — show this message\n\ - !echo — echo back the text\n\ - !whoami — show your username\n\ - !ping — pong!" - .to_string(), - ); - }} - - // !echo — echo back - if let Some(rest) = text.strip_prefix("!echo ") {{ - return Some(rest.to_string()); - }} - - // !whoami — tell the sender their username - if text == "!whoami" {{ - return Some(format!("You are {{sender}}")); - }} - - // !ping — respond with pong - if text == "!ping" {{ - return Some("pong!".to_string()); - }} - - // Unknown command or regular message — no response - None -}} - -fn env_or(key: &str, default: &str) -> String {{ - std::env::var(key).unwrap_or_else(|_| default.to_string()) -}} -"#, - name = name, - crate_name = crate_name, - ); - write_file(&src_dir.join("main.rs"), &main_rs)?; - - // README - let readme = format!( - r#"# {name} — quicproquo bot - -## Quick start - -```bash -# Build -cargo build - -# Run (make sure a qpq server is running) -QPQ_SERVER=127.0.0.1:7000 \ -QPQ_USERNAME={crate_name} \ -QPQ_PASSWORD=changeme \ -QPQ_CA_CERT=path/to/server-cert.der \ -cargo run -``` - -## Commands - -| Command | Description | -|---------|-------------| -| `!help` | Show available commands | -| `!echo ` | Echo back the text | -| `!whoami` | Show your username | -| `!ping` | Respond with "pong!" | - -## Adding commands - -Edit the `handle_message` function in `src/main.rs`: - -```rust -fn handle_message(sender: &str, text: &str) -> Option {{ - if text == "!mycommand" {{ - return Some("my response".to_string()); - }} - None -}} -``` - -## Pipe mode - -For shell integration, use the Bot SDK's JSON pipe mode: - -```bash -echo '{{"action":"send","to":"alice","text":"hello"}}' | my-bot -echo '{{"action":"recv","timeout_ms":5000}}' | my-bot -``` - -## Documentation - -- [Bot SDK docs](https://github.com/nickvidal/quicproquo/blob/main/docs/src/getting-started/bot-sdk.md) -- [Server Hooks](https://github.com/nickvidal/quicproquo/blob/main/docs/src/internals/server-hooks.md) -"#, - name = name, - crate_name = crate_name, - ); - write_file(&dir.join("README.md"), &readme)?; - - println!("Created bot project: {}", dir.display()); - println!(); - println!(" cd {crate_name}"); - println!(" # Edit src/main.rs to add your commands"); - println!(" QPQ_SERVER=127.0.0.1:7000 QPQ_PASSWORD=secret cargo run"); - println!(); - println!("The bot responds to !help, !echo, !whoami, !ping out of the box."); - - Ok(()) -} - -fn sanitize_name(name: &str) -> String { - name.replace(['-', ' '], "_") -} - -fn write_file(path: &Path, content: &str) -> Result<(), String> { - fs::write(path, content).map_err(|e| format!("write {}: {e}", path.display())) -} diff --git a/crates/quicproquo-gen/src/generators/hook.rs b/crates/quicproquo-gen/src/generators/hook.rs deleted file mode 100644 index bf63f96..0000000 --- a/crates/quicproquo-gen/src/generators/hook.rs +++ /dev/null @@ -1,134 +0,0 @@ -pub fn generate(name: &str) -> Result<(), String> { - let snake = name.to_lowercase().replace(['-', ' '], "_"); - let pascal = to_pascal_case(&snake); - - println!("=== Adding hook event: on_{snake} ==="); - println!(); - println!("Follow these steps to add a new `on_{snake}` hook event."); - println!(); - - // Step 1: Event struct - println!("--- Step 1: Event struct ---"); - println!("File: crates/quicproquo-server/src/hooks.rs"); - println!(); - println!( - r#"/// Event data for {snake} operations. -#[derive(Clone, Debug)] -pub struct {pascal}Event {{ - // TODO: add your event fields here - // Example: - // pub channel_id: Vec, - // pub user_key: Vec, -}} -"#, - ); - - // Step 2: Trait method - println!("--- Step 2: Trait method ---"); - println!("File: crates/quicproquo-server/src/hooks.rs"); - println!(); - println!("Add to the `ServerHooks` trait:"); - println!(); - println!( - r#" /// Called when {snake} occurs. - fn on_{snake}(&self, _event: &{pascal}Event) {{ - // Default: no-op - }} -"#, - ); - - // Step 3: TracingHooks implementation - println!("--- Step 3: TracingHooks implementation ---"); - println!("File: crates/quicproquo-server/src/hooks.rs"); - println!(); - println!("Add to `impl ServerHooks for TracingHooks`:"); - println!(); - println!( - r#" fn on_{snake}(&self, _event: &{pascal}Event) {{ - tracing::info!("hook: {snake}"); - }} -"#, - ); - - // Step 4: Plugin API (C-compatible struct) - println!("--- Step 4: Plugin API ---"); - println!("File: crates/quicproquo-plugin-api/src/lib.rs"); - println!(); - println!("Add a C-compatible event struct:"); - println!(); - println!( - r#"#[repr(C)] -pub struct C{pascal}Event {{ - // TODO: mirror the fields from {pascal}Event using C-compatible types - // Use *const u8 + len for byte slices, *const c_char for strings -}} -"#, - ); - println!("Add to `HookVTable`:"); - println!(); - println!( - r#" pub on_{snake}: Option, -"#, - ); - - // Step 5: Wire into PluginHooks - println!("--- Step 5: PluginHooks dispatch ---"); - println!("File: crates/quicproquo-server/src/plugin_loader.rs"); - println!(); - println!("Add to `impl ServerHooks for PluginHooks`:"); - println!(); - println!( - r#" fn on_{snake}(&self, event: &{pascal}Event) {{ - if let Some(hook_fn) = self.vtable.on_{snake} {{ - let c_event = C{pascal}Event {{ - // TODO: convert fields - }}; - hook_fn(self.vtable.user_data, &c_event); - }} - }} -"#, - ); - - // Step 6: Call the hook - println!("--- Step 6: Call the hook in the RPC handler ---"); - println!("In the relevant handler file under crates/quicproquo-server/src/node_service/:"); - println!(); - println!( - r#" use crate::hooks::{pascal}Event; - - // At the appropriate point in the handler: - self.hooks.on_{snake}(&{pascal}Event {{ - // fill in fields - }}); -"#, - ); - - // Step 7: Verify - println!("--- Step 7: Verify ---"); - println!(" cargo build -p quicproquo-plugin-api"); - println!(" cargo build -p quicproquo-server"); - println!(" cargo test -p quicproquo-server"); - println!(); - - // Summary - println!("=== Files to modify ==="); - println!(" [modify] crates/quicproquo-server/src/hooks.rs"); - println!(" [modify] crates/quicproquo-plugin-api/src/lib.rs"); - println!(" [modify] crates/quicproquo-server/src/plugin_loader.rs"); - println!(" [modify] crates/quicproquo-server/src/node_service/.rs"); - - Ok(()) -} - -fn to_pascal_case(snake: &str) -> String { - snake - .split('_') - .map(|word| { - let mut chars = word.chars(); - match chars.next() { - None => String::new(), - Some(c) => c.to_uppercase().to_string() + chars.as_str(), - } - }) - .collect() -} diff --git a/crates/quicproquo-gen/src/generators/mod.rs b/crates/quicproquo-gen/src/generators/mod.rs deleted file mode 100644 index 3c75112..0000000 --- a/crates/quicproquo-gen/src/generators/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod bot; -pub mod hook; -pub mod plugin; -pub mod rpc; diff --git a/crates/quicproquo-gen/src/generators/plugin.rs b/crates/quicproquo-gen/src/generators/plugin.rs deleted file mode 100644 index 80dc7cf..0000000 --- a/crates/quicproquo-gen/src/generators/plugin.rs +++ /dev/null @@ -1,186 +0,0 @@ -use std::fs; -use std::path::Path; - -pub fn generate(name: &str, output: &Path) -> Result<(), String> { - let crate_name = sanitize_name(name); - let dir = output.join(&crate_name); - - if dir.exists() { - return Err(format!("directory already exists: {}", dir.display())); - } - - let src_dir = dir.join("src"); - fs::create_dir_all(&src_dir).map_err(|e| format!("create dir: {e}"))?; - - // Cargo.toml - let cargo_toml = format!( - r#"[package] -name = "{crate_name}" -version = "0.1.0" -edition = "2021" -description = "quicproquo server plugin: {name}" -license = "MIT" - -[lib] -crate-type = ["cdylib"] - -# Empty workspace — this plugin builds independently of the qpq workspace. -[workspace] - -[dependencies] -quicproquo-plugin-api = {{ git = "https://github.com/nickvidal/quicproquo", default-features = false }} -"#, - crate_name = crate_name, - name = name, - ); - write_file(&dir.join("Cargo.toml"), &cargo_toml)?; - - // src/lib.rs - let lib_rs = format!( - r#"//! quicproquo server plugin: {name} -//! -//! Build with: cargo build --release -//! Install: cp target/release/lib{crate_name}.so /path/to/plugins/ -//! The server loads it automatically when started with --plugin-dir. - -use quicproquo_plugin_api::{{HookVTable, CMessageEvent, HOOK_CONTINUE, HOOK_REJECT, PLUGIN_OK}}; -use std::ffi::CString; -use std::os::raw::c_int; - -/// Plugin state — allocate on the heap in init, free in destroy. -struct PluginState {{ - /// Example: maximum allowed payload size in bytes. - max_payload_bytes: usize, - /// Stored rejection message (must outlive the hook call). - reject_msg: Option, -}} - -/// Called by the server on plugin load. -/// -/// Fill the vtable with your hook implementations. Return PLUGIN_OK on success. -#[no_mangle] -pub extern "C" fn qpq_plugin_init(vtable: *mut HookVTable) -> c_int {{ - let state = Box::new(PluginState {{ - max_payload_bytes: 1_000_000, // 1 MB limit - reject_msg: None, - }}); - - let vt = unsafe {{ &mut *vtable }}; - vt.user_data = Box::into_raw(state) as *mut _; - vt.on_message_enqueue = Some(on_message_enqueue); - vt.error_message = Some(error_message); - vt.destroy = Some(destroy); - - eprintln!("[{name}] plugin loaded"); - PLUGIN_OK -}} - -/// Hook: called before each message is stored in the delivery queue. -/// -/// Return HOOK_CONTINUE to allow, HOOK_REJECT to block. -extern "C" fn on_message_enqueue( - user_data: *mut std::ffi::c_void, - event: *const CMessageEvent, -) -> c_int {{ - let state = unsafe {{ &mut *(user_data as *mut PluginState) }}; - let event = unsafe {{ &*event }}; - - if event.payload_len > state.max_payload_bytes {{ - let msg = format!( - "payload too large: {{}} > {{}} bytes", - event.payload_len, state.max_payload_bytes - ); - state.reject_msg = CString::new(msg).ok(); - return HOOK_REJECT; - }} - - HOOK_CONTINUE -}} - -/// Return a pointer to the rejection error message (valid until next hook call). -extern "C" fn error_message( - user_data: *mut std::ffi::c_void, -) -> *const std::os::raw::c_char {{ - let state = unsafe {{ &*(user_data as *const PluginState) }}; - match &state.reject_msg {{ - Some(msg) => msg.as_ptr(), - None => std::ptr::null(), - }} -}} - -/// Cleanup: free the plugin state. -extern "C" fn destroy(user_data: *mut std::ffi::c_void) {{ - if !user_data.is_null() {{ - unsafe {{ drop(Box::from_raw(user_data as *mut PluginState)) }}; - }} - eprintln!("[{name}] plugin unloaded"); -}} -"#, - name = name, - crate_name = crate_name, - ); - write_file(&src_dir.join("lib.rs"), &lib_rs)?; - - // README - let readme = format!( - r#"# {name} — quicproquo server plugin - -## Build - -```bash -cargo build --release -``` - -## Install - -Copy the shared library to the server's plugin directory: - -```bash -cp target/release/lib{crate_name}.so /path/to/plugins/ -``` - -Start the server with: - -```bash -qpq-server --plugin-dir /path/to/plugins/ -``` - -## Hooks - -This plugin implements `on_message_enqueue` to reject oversized payloads. -Edit `src/lib.rs` to add your own logic. Available hooks: - -| Hook | Purpose | -|------|---------| -| `on_message_enqueue` | Inspect/reject messages before delivery (return `HOOK_REJECT`) | -| `on_batch_enqueue` | Observe batch message delivery | -| `on_auth` | Observe login success/failure | -| `on_channel_created` | Observe channel creation | -| `on_fetch` | Observe message fetch operations | -| `on_user_registered` | Observe new user registration | - -See the [Server Hooks documentation](https://github.com/nickvidal/quicproquo/blob/main/docs/src/internals/server-hooks.md) for details. -"#, - name = name, - crate_name = crate_name, - ); - write_file(&dir.join("README.md"), &readme)?; - - println!("Created plugin project: {}", dir.display()); - println!(); - println!(" cd {crate_name}"); - println!(" cargo build --release"); - println!(" cp target/release/lib{crate_name}.so /path/to/plugins/"); - println!(); - println!("Edit src/lib.rs to implement your hook logic."); - - Ok(()) -} - -fn sanitize_name(name: &str) -> String { - name.replace(['-', ' '], "_") -} - -fn write_file(path: &Path, content: &str) -> Result<(), String> { - fs::write(path, content).map_err(|e| format!("write {}: {e}", path.display())) -} diff --git a/crates/quicproquo-gen/src/generators/rpc.rs b/crates/quicproquo-gen/src/generators/rpc.rs deleted file mode 100644 index 19c4b77..0000000 --- a/crates/quicproquo-gen/src/generators/rpc.rs +++ /dev/null @@ -1,129 +0,0 @@ -pub fn generate(name: &str) -> Result<(), String> { - let snake = to_snake_case(name); - let camel = name.to_string(); - println!("=== Adding RPC method: {camel} ==="); - println!(); - println!("Follow these steps to add a new `{camel}` RPC method."); - println!("Each step shows the file and the code to add."); - println!(); - - // Step 1: Schema - println!("--- Step 1: Cap'n Proto schema ---"); - println!("File: schemas/node.capnp"); - println!(); - println!("Add to the `interface NodeService` block:"); - println!(); - println!( - r#" {camel} @N (auth :AuthContext, ) -> (); -"#, - ); - println!(" (Replace @N with the next ordinal number in the interface.)"); - println!(); - println!("Then rebuild the proto crate:"); - println!(" cargo build -p quicproquo-proto"); - println!(); - - // Step 2: Handler module - println!("--- Step 2: Handler module ---"); - println!("File: crates/quicproquo-server/src/node_service/{snake}.rs"); - println!(); - println!( - r#"use capnp::capability::Promise; -use quicproquo_proto::node_capnp::node_service; - -use crate::auth::{{coded_error, validate_auth_context}}; -use crate::error_codes::*; - -use super::NodeServiceImpl; - -impl NodeServiceImpl {{ - pub fn handle_{snake}( - &mut self, - params: node_service::{camel}Params, - mut results: node_service::{camel}Results, - ) -> Promise<(), capnp::Error> {{ - let p = match params.get() {{ - Ok(p) => p, - Err(e) => return Promise::err(coded_error(E020_BAD_PARAMS, e)), - }}; - let auth_ctx = match validate_auth_context(&self.auth_cfg, &self.sessions, p.get_auth()) {{ - Ok(ctx) => ctx, - Err(e) => return Promise::err(e), - }}; - - // TODO: implement your logic here - - Promise::ok(()) - }} -}} -"#, - ); - - // Step 3: Wire into mod.rs - println!("--- Step 3: Register in mod.rs ---"); - println!("File: crates/quicproquo-server/src/node_service/mod.rs"); - println!(); - println!("Add to the module declarations at the top:"); - println!(" mod {snake};"); - println!(); - println!("Add to the `impl node_service::Server for NodeServiceImpl` block:"); - println!(); - println!( - r#" fn {snake}( - &mut self, - params: node_service::{camel}Params, - results: node_service::{camel}Results, - ) -> capnp::capability::Promise<(), capnp::Error> {{ - self.handle_{snake}(params, results) - }} -"#, - ); - - // Step 4: Storage (if needed) - println!("--- Step 4: Storage trait (if needed) ---"); - println!("File: crates/quicproquo-server/src/storage.rs"); - println!(); - println!("If your RPC method needs persistent storage, add a method to the Store trait:"); - println!(); - println!( - r#" fn {snake}(&self, /* params */) -> Result; -"#, - ); - println!("Then implement it in:"); - println!(" - crates/quicproquo-server/src/sql_store.rs (SQLite backend)"); - println!(" - crates/quicproquo-server/src/storage.rs (FileBackedStore)"); - println!(); - - // Step 5: Hook (if needed) - println!("--- Step 5: Hook event (optional) ---"); - println!("If you want plugins to observe this RPC, run:"); - println!(" qpq-gen hook {snake}"); - println!(); - - // Step 6: Verify - println!("--- Step 6: Verify ---"); - println!(" cargo build -p quicproquo-server"); - println!(" cargo test -p quicproquo-server"); - println!(); - - // Summary - println!("=== Files to create/modify ==="); - println!(" [modify] schemas/node.capnp"); - println!(" [create] crates/quicproquo-server/src/node_service/{snake}.rs"); - println!(" [modify] crates/quicproquo-server/src/node_service/mod.rs"); - println!(" [modify] crates/quicproquo-server/src/storage.rs (if needed)"); - println!(" [modify] crates/quicproquo-server/src/sql_store.rs (if needed)"); - - Ok(()) -} - -fn to_snake_case(s: &str) -> String { - let mut result = String::with_capacity(s.len() + 4); - for (i, ch) in s.chars().enumerate() { - if ch.is_uppercase() && i > 0 { - result.push('_'); - } - result.push(ch.to_ascii_lowercase()); - } - result -} diff --git a/crates/quicproquo-gen/src/main.rs b/crates/quicproquo-gen/src/main.rs deleted file mode 100644 index 3a49bcc..0000000 --- a/crates/quicproquo-gen/src/main.rs +++ /dev/null @@ -1,55 +0,0 @@ -use clap::{Parser, Subcommand}; -use std::path::PathBuf; - -mod generators; - -#[derive(Parser)] -#[command(name = "qpq-gen", about = "Code generators for quicproquo")] -struct Cli { - #[command(subcommand)] - command: Command, -} - -#[derive(Subcommand)] -enum Command { - /// Scaffold a new server plugin (dynamic .so/.dylib) - Plugin { - /// Plugin name (e.g. "rate-limiter", "audit-log") - name: String, - /// Output directory (default: current directory) - #[arg(short, long, default_value = ".")] - output: PathBuf, - }, - /// Scaffold a new bot project using the Bot SDK - Bot { - /// Bot name (e.g. "echo-bot", "moderation-bot") - name: String, - /// Output directory (default: current directory) - #[arg(short, long, default_value = ".")] - output: PathBuf, - }, - /// Show instructions for adding a new Cap'n Proto RPC method - Rpc { - /// RPC method name in camelCase (e.g. "listChannels") - name: String, - }, - /// Show instructions for adding a new server hook event - Hook { - /// Hook event name in snake_case (e.g. "message_deleted") - name: String, - }, -} - -fn main() { - let cli = Cli::parse(); - let result = match cli.command { - Command::Plugin { name, output } => generators::plugin::generate(&name, &output), - Command::Bot { name, output } => generators::bot::generate(&name, &output), - Command::Rpc { name } => generators::rpc::generate(&name), - Command::Hook { name } => generators::hook::generate(&name), - }; - if let Err(e) = result { - eprintln!("error: {e}"); - std::process::exit(1); - } -} diff --git a/crates/quicproquo-gui/Cargo.toml b/crates/quicproquo-gui/Cargo.toml deleted file mode 100644 index 0452d75..0000000 --- a/crates/quicproquo-gui/Cargo.toml +++ /dev/null @@ -1,22 +0,0 @@ -[package] -name = "quicproquo-gui" -version = "0.1.0" -edition = "2021" -description = "Native GUI for quicproquo (Tauri 2)." -license = "MIT" - -[[bin]] -name = "qpq-gui" -path = "src/main.rs" - -[dependencies] -quicproquo-core = { path = "../quicproquo-core" } -quicproquo-client = { path = "../quicproquo-client" } -quicproquo-proto = { path = "../quicproquo-proto" } -tauri = { version = "2", features = [] } -tokio = { workspace = true } -serde = { workspace = true } -serde_json = { workspace = true } - -[build-dependencies] -tauri-build = "2" diff --git a/crates/quicproquo-gui/README.md b/crates/quicproquo-gui/README.md deleted file mode 100644 index 783e578..0000000 --- a/crates/quicproquo-gui/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# quicproquo-gui - -Native GUI for quicproquo using [Tauri 2](https://v2.tauri.app/). The UI runs in a webview; all server-facing work (capnp-rpc, `node_service::Client`) runs on a **dedicated backend thread** with a tokio `LocalSet`, since that code is `!Send`. - -## Backend threading model - -- A single **backend thread** runs a tokio `LocalSet` and a request-response loop. -- The UI thread sends commands over an `mpsc` channel: `Whoami { state_path, password }` or `Health { server, ca_cert, server_name }`. -- For each request, the backend runs sync code (whoami) or `LocalSet::run_until(async { ... })` (health). It then sends `Result` back on the provided reply channel. -- Tauri commands (`whoami`, `health`) block on that reply so the frontend gets a simple async-style result. - -## How to run - -From the workspace root: - -```bash -cargo run -p quicproquo-gui -``` - -**Linux:** Tauri uses GTK. Install development packages if the build fails, e.g.: - -- Debian/Ubuntu: `sudo apt install libgtk-3-dev libwebkit2gtk-4.1-dev` -- Fedora: `sudo dnf install gtk3-devel webkit2gtk4.1-devel` - -## Frontend - -The frontend is static HTML in `ui/index.html` (no npm or build step). It provides: - -- **Whoami** – state path (and optional password); calls `whoami` and shows JSON (identity_key, fingerprint, etc.). -- **Health** – server address; calls `health` and shows server status and RTT JSON. - -Default CA cert and server name for health are the same as the CLI (`data/server-cert.der`, `localhost`) unless overridden via optional params. diff --git a/crates/quicproquo-gui/build.rs b/crates/quicproquo-gui/build.rs deleted file mode 100644 index d860e1e..0000000 --- a/crates/quicproquo-gui/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - tauri_build::build() -} diff --git a/crates/quicproquo-gui/capabilities/default.json b/crates/quicproquo-gui/capabilities/default.json deleted file mode 100644 index edd2cd2..0000000 --- a/crates/quicproquo-gui/capabilities/default.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://schema.tauri.app/config/2/capability", - "identifier": "default", - "description": "Capability for the main window (custom commands whoami, health are allowed by default)", - "windows": ["main"], - "permissions": [ - "core:default", - "core:window:allow-close", - "core:window:allow-set-title" - ] -} diff --git a/crates/quicproquo-gui/gen/schemas/acl-manifests.json b/crates/quicproquo-gui/gen/schemas/acl-manifests.json deleted file mode 100644 index 43da9ef..0000000 --- a/crates/quicproquo-gui/gen/schemas/acl-manifests.json +++ /dev/null @@ -1 +0,0 @@ -{"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}} \ No newline at end of file diff --git a/crates/quicproquo-gui/gen/schemas/capabilities.json b/crates/quicproquo-gui/gen/schemas/capabilities.json deleted file mode 100644 index 990ab59..0000000 --- a/crates/quicproquo-gui/gen/schemas/capabilities.json +++ /dev/null @@ -1 +0,0 @@ -{"default":{"identifier":"default","description":"Capability for the main window (custom commands whoami, health are allowed by default)","local":true,"windows":["main"],"permissions":["core:default","core:window:allow-close","core:window:allow-set-title"]}} \ No newline at end of file diff --git a/crates/quicproquo-gui/gen/schemas/desktop-schema.json b/crates/quicproquo-gui/gen/schemas/desktop-schema.json deleted file mode 100644 index 260dbe0..0000000 --- a/crates/quicproquo-gui/gen/schemas/desktop-schema.json +++ /dev/null @@ -1,2244 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "CapabilityFile", - "description": "Capability formats accepted in a capability file.", - "anyOf": [ - { - "description": "A single capability.", - "allOf": [ - { - "$ref": "#/definitions/Capability" - } - ] - }, - { - "description": "A list of capabilities.", - "type": "array", - "items": { - "$ref": "#/definitions/Capability" - } - }, - { - "description": "A list of capabilities.", - "type": "object", - "required": [ - "capabilities" - ], - "properties": { - "capabilities": { - "description": "The list of capabilities.", - "type": "array", - "items": { - "$ref": "#/definitions/Capability" - } - } - } - } - ], - "definitions": { - "Capability": { - "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", - "type": "object", - "required": [ - "identifier", - "permissions" - ], - "properties": { - "identifier": { - "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", - "type": "string" - }, - "description": { - "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.", - "default": "", - "type": "string" - }, - "remote": { - "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", - "anyOf": [ - { - "$ref": "#/definitions/CapabilityRemote" - }, - { - "type": "null" - } - ] - }, - "local": { - "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", - "default": true, - "type": "boolean" - }, - "windows": { - "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", - "type": "array", - "items": { - "type": "string" - } - }, - "webviews": { - "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", - "type": "array", - "items": { - "type": "string" - } - }, - "permissions": { - "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", - "type": "array", - "items": { - "$ref": "#/definitions/PermissionEntry" - }, - "uniqueItems": true - }, - "platforms": { - "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Target" - } - } - } - }, - "CapabilityRemote": { - "description": "Configuration for remote URLs that are associated with the capability.", - "type": "object", - "required": [ - "urls" - ], - "properties": { - "urls": { - "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "PermissionEntry": { - "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", - "anyOf": [ - { - "description": "Reference a permission or permission set by identifier.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - { - "description": "Reference a permission or permission set by identifier and extends its scope.", - "type": "object", - "allOf": [ - { - "properties": { - "identifier": { - "description": "Identifier of the permission or permission set.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - "allow": { - "description": "Data that defines what is allowed by the scope.", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Value" - } - }, - "deny": { - "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Value" - } - } - } - } - ], - "required": [ - "identifier" - ] - } - ] - }, - "Identifier": { - "description": "Permission identifier", - "oneOf": [ - { - "description": "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`", - "type": "string", - "const": "core:default", - "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`", - "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`" - }, - { - "description": "Enables the app_hide command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-app-hide", - "markdownDescription": "Enables the app_hide command without any pre-configured scope." - }, - { - "description": "Enables the app_show command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-app-show", - "markdownDescription": "Enables the app_show command without any pre-configured scope." - }, - { - "description": "Enables the bundle_type command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-bundle-type", - "markdownDescription": "Enables the bundle_type command without any pre-configured scope." - }, - { - "description": "Enables the default_window_icon command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-default-window-icon", - "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." - }, - { - "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-fetch-data-store-identifiers", - "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." - }, - { - "description": "Enables the identifier command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-identifier", - "markdownDescription": "Enables the identifier command without any pre-configured scope." - }, - { - "description": "Enables the name command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-name", - "markdownDescription": "Enables the name command without any pre-configured scope." - }, - { - "description": "Enables the register_listener command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-register-listener", - "markdownDescription": "Enables the register_listener command without any pre-configured scope." - }, - { - "description": "Enables the remove_data_store command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-remove-data-store", - "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." - }, - { - "description": "Enables the remove_listener command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-remove-listener", - "markdownDescription": "Enables the remove_listener command without any pre-configured scope." - }, - { - "description": "Enables the set_app_theme command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-set-app-theme", - "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." - }, - { - "description": "Enables the set_dock_visibility command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-set-dock-visibility", - "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." - }, - { - "description": "Enables the tauri_version command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-tauri-version", - "markdownDescription": "Enables the tauri_version command without any pre-configured scope." - }, - { - "description": "Enables the version command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-version", - "markdownDescription": "Enables the version command without any pre-configured scope." - }, - { - "description": "Denies the app_hide command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-app-hide", - "markdownDescription": "Denies the app_hide command without any pre-configured scope." - }, - { - "description": "Denies the app_show command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-app-show", - "markdownDescription": "Denies the app_show command without any pre-configured scope." - }, - { - "description": "Denies the bundle_type command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-bundle-type", - "markdownDescription": "Denies the bundle_type command without any pre-configured scope." - }, - { - "description": "Denies the default_window_icon command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-default-window-icon", - "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." - }, - { - "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-fetch-data-store-identifiers", - "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." - }, - { - "description": "Denies the identifier command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-identifier", - "markdownDescription": "Denies the identifier command without any pre-configured scope." - }, - { - "description": "Denies the name command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-name", - "markdownDescription": "Denies the name command without any pre-configured scope." - }, - { - "description": "Denies the register_listener command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-register-listener", - "markdownDescription": "Denies the register_listener command without any pre-configured scope." - }, - { - "description": "Denies the remove_data_store command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-remove-data-store", - "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." - }, - { - "description": "Denies the remove_listener command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-remove-listener", - "markdownDescription": "Denies the remove_listener command without any pre-configured scope." - }, - { - "description": "Denies the set_app_theme command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-set-app-theme", - "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." - }, - { - "description": "Denies the set_dock_visibility command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-set-dock-visibility", - "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." - }, - { - "description": "Denies the tauri_version command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-tauri-version", - "markdownDescription": "Denies the tauri_version command without any pre-configured scope." - }, - { - "description": "Denies the version command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-version", - "markdownDescription": "Denies the version 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-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", - "type": "string", - "const": "core:event:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" - }, - { - "description": "Enables the emit command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-emit", - "markdownDescription": "Enables the emit command without any pre-configured scope." - }, - { - "description": "Enables the emit_to command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-emit-to", - "markdownDescription": "Enables the emit_to command without any pre-configured scope." - }, - { - "description": "Enables the listen command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-listen", - "markdownDescription": "Enables the listen command without any pre-configured scope." - }, - { - "description": "Enables the unlisten command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-unlisten", - "markdownDescription": "Enables the unlisten command without any pre-configured scope." - }, - { - "description": "Denies the emit command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-emit", - "markdownDescription": "Denies the emit command without any pre-configured scope." - }, - { - "description": "Denies the emit_to command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-emit-to", - "markdownDescription": "Denies the emit_to command without any pre-configured scope." - }, - { - "description": "Denies the listen command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-listen", - "markdownDescription": "Denies the listen command without any pre-configured scope." - }, - { - "description": "Denies the unlisten command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-unlisten", - "markdownDescription": "Denies the unlisten 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-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", - "type": "string", - "const": "core:image:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" - }, - { - "description": "Enables the from_bytes command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-from-bytes", - "markdownDescription": "Enables the from_bytes command without any pre-configured scope." - }, - { - "description": "Enables the from_path command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-from-path", - "markdownDescription": "Enables the from_path command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the rgba command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-rgba", - "markdownDescription": "Enables the rgba command without any pre-configured scope." - }, - { - "description": "Enables the size command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-size", - "markdownDescription": "Enables the size command without any pre-configured scope." - }, - { - "description": "Denies the from_bytes command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-from-bytes", - "markdownDescription": "Denies the from_bytes command without any pre-configured scope." - }, - { - "description": "Denies the from_path command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-from-path", - "markdownDescription": "Denies the from_path command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the rgba command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-rgba", - "markdownDescription": "Denies the rgba command without any pre-configured scope." - }, - { - "description": "Denies the size command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-size", - "markdownDescription": "Denies the size 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-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", - "type": "string", - "const": "core:menu:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" - }, - { - "description": "Enables the append command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-append", - "markdownDescription": "Enables the append command without any pre-configured scope." - }, - { - "description": "Enables the create_default command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-create-default", - "markdownDescription": "Enables the create_default command without any pre-configured scope." - }, - { - "description": "Enables the get command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-get", - "markdownDescription": "Enables the get command without any pre-configured scope." - }, - { - "description": "Enables the insert command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-insert", - "markdownDescription": "Enables the insert command without any pre-configured scope." - }, - { - "description": "Enables the is_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-is-checked", - "markdownDescription": "Enables the is_checked command without any pre-configured scope." - }, - { - "description": "Enables the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-is-enabled", - "markdownDescription": "Enables the is_enabled command without any pre-configured scope." - }, - { - "description": "Enables the items command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-items", - "markdownDescription": "Enables the items command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the popup command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-popup", - "markdownDescription": "Enables the popup command without any pre-configured scope." - }, - { - "description": "Enables the prepend command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-prepend", - "markdownDescription": "Enables the prepend command without any pre-configured scope." - }, - { - "description": "Enables the remove command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-remove", - "markdownDescription": "Enables the remove command without any pre-configured scope." - }, - { - "description": "Enables the remove_at command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-remove-at", - "markdownDescription": "Enables the remove_at command without any pre-configured scope." - }, - { - "description": "Enables the set_accelerator command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-accelerator", - "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." - }, - { - "description": "Enables the set_as_app_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-app-menu", - "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-help-menu-for-nsapp", - "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Enables the set_as_window_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-window-menu", - "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-windows-menu-for-nsapp", - "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Enables the set_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-checked", - "markdownDescription": "Enables the set_checked command without any pre-configured scope." - }, - { - "description": "Enables the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-enabled", - "markdownDescription": "Enables the set_enabled command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-text", - "markdownDescription": "Enables the set_text command without any pre-configured scope." - }, - { - "description": "Enables the text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-text", - "markdownDescription": "Enables the text command without any pre-configured scope." - }, - { - "description": "Denies the append command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-append", - "markdownDescription": "Denies the append command without any pre-configured scope." - }, - { - "description": "Denies the create_default command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-create-default", - "markdownDescription": "Denies the create_default command without any pre-configured scope." - }, - { - "description": "Denies the get command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-get", - "markdownDescription": "Denies the get command without any pre-configured scope." - }, - { - "description": "Denies the insert command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-insert", - "markdownDescription": "Denies the insert command without any pre-configured scope." - }, - { - "description": "Denies the is_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-is-checked", - "markdownDescription": "Denies the is_checked command without any pre-configured scope." - }, - { - "description": "Denies the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-is-enabled", - "markdownDescription": "Denies the is_enabled command without any pre-configured scope." - }, - { - "description": "Denies the items command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-items", - "markdownDescription": "Denies the items command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the popup command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-popup", - "markdownDescription": "Denies the popup command without any pre-configured scope." - }, - { - "description": "Denies the prepend command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-prepend", - "markdownDescription": "Denies the prepend command without any pre-configured scope." - }, - { - "description": "Denies the remove command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-remove", - "markdownDescription": "Denies the remove command without any pre-configured scope." - }, - { - "description": "Denies the remove_at command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-remove-at", - "markdownDescription": "Denies the remove_at command without any pre-configured scope." - }, - { - "description": "Denies the set_accelerator command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-accelerator", - "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." - }, - { - "description": "Denies the set_as_app_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-app-menu", - "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-help-menu-for-nsapp", - "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Denies the set_as_window_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-window-menu", - "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-windows-menu-for-nsapp", - "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Denies the set_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-checked", - "markdownDescription": "Denies the set_checked command without any pre-configured scope." - }, - { - "description": "Denies the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-enabled", - "markdownDescription": "Denies the set_enabled command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-text", - "markdownDescription": "Denies the set_text command without any pre-configured scope." - }, - { - "description": "Denies the text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-text", - "markdownDescription": "Denies the text 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-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", - "type": "string", - "const": "core:path:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" - }, - { - "description": "Enables the basename command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-basename", - "markdownDescription": "Enables the basename command without any pre-configured scope." - }, - { - "description": "Enables the dirname command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-dirname", - "markdownDescription": "Enables the dirname command without any pre-configured scope." - }, - { - "description": "Enables the extname command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-extname", - "markdownDescription": "Enables the extname command without any pre-configured scope." - }, - { - "description": "Enables the is_absolute command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-is-absolute", - "markdownDescription": "Enables the is_absolute command without any pre-configured scope." - }, - { - "description": "Enables the join command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-join", - "markdownDescription": "Enables the join command without any pre-configured scope." - }, - { - "description": "Enables the normalize command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-normalize", - "markdownDescription": "Enables the normalize command without any pre-configured scope." - }, - { - "description": "Enables the resolve command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-resolve", - "markdownDescription": "Enables the resolve command without any pre-configured scope." - }, - { - "description": "Enables the resolve_directory command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-resolve-directory", - "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." - }, - { - "description": "Denies the basename command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-basename", - "markdownDescription": "Denies the basename command without any pre-configured scope." - }, - { - "description": "Denies the dirname command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-dirname", - "markdownDescription": "Denies the dirname command without any pre-configured scope." - }, - { - "description": "Denies the extname command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-extname", - "markdownDescription": "Denies the extname command without any pre-configured scope." - }, - { - "description": "Denies the is_absolute command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-is-absolute", - "markdownDescription": "Denies the is_absolute command without any pre-configured scope." - }, - { - "description": "Denies the join command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-join", - "markdownDescription": "Denies the join command without any pre-configured scope." - }, - { - "description": "Denies the normalize command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-normalize", - "markdownDescription": "Denies the normalize command without any pre-configured scope." - }, - { - "description": "Denies the resolve command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-resolve", - "markdownDescription": "Denies the resolve command without any pre-configured scope." - }, - { - "description": "Denies the resolve_directory command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-resolve-directory", - "markdownDescription": "Denies the resolve_directory 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-close`", - "type": "string", - "const": "core:resources:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" - }, - { - "description": "Enables the close command without any pre-configured scope.", - "type": "string", - "const": "core:resources:allow-close", - "markdownDescription": "Enables the close command without any pre-configured scope." - }, - { - "description": "Denies the close command without any pre-configured scope.", - "type": "string", - "const": "core:resources:deny-close", - "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`", - "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`" - }, - { - "description": "Enables the get_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-get-by-id", - "markdownDescription": "Enables the get_by_id command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the remove_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-remove-by-id", - "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_icon_as_template command without any pre-configured scope.", - "type": "string", - "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_menu command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-menu", - "markdownDescription": "Enables the set_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-show-menu-on-left-click", - "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." - }, - { - "description": "Enables the set_temp_dir_path command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-temp-dir-path", - "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." - }, - { - "description": "Enables the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-title", - "markdownDescription": "Enables the set_title command without any pre-configured scope." - }, - { - "description": "Enables the set_tooltip command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-tooltip", - "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." - }, - { - "description": "Enables the set_visible command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-visible", - "markdownDescription": "Enables the set_visible command without any pre-configured scope." - }, - { - "description": "Denies the get_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-get-by-id", - "markdownDescription": "Denies the get_by_id command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the remove_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-remove-by-id", - "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_icon_as_template command without any pre-configured scope.", - "type": "string", - "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_menu command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-menu", - "markdownDescription": "Denies the set_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-show-menu-on-left-click", - "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." - }, - { - "description": "Denies the set_temp_dir_path command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-temp-dir-path", - "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." - }, - { - "description": "Denies the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-title", - "markdownDescription": "Denies the set_title command without any pre-configured scope." - }, - { - "description": "Denies the set_tooltip command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-tooltip", - "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." - }, - { - "description": "Denies the set_visible command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-visible", - "markdownDescription": "Denies the set_visible command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", - "type": "string", - "const": "core:webview:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" - }, - { - "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-clear-all-browsing-data", - "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." - }, - { - "description": "Enables the create_webview command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-create-webview", - "markdownDescription": "Enables the create_webview command without any pre-configured scope." - }, - { - "description": "Enables the create_webview_window command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-create-webview-window", - "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." - }, - { - "description": "Enables the get_all_webviews command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-get-all-webviews", - "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." - }, - { - "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-internal-toggle-devtools", - "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." - }, - { - "description": "Enables the print command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-print", - "markdownDescription": "Enables the print command without any pre-configured scope." - }, - { - "description": "Enables the reparent command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-reparent", - "markdownDescription": "Enables the reparent command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_auto_resize command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-auto-resize", - "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-background-color", - "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_focus command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-focus", - "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-position", - "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-size", - "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_zoom command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-zoom", - "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." - }, - { - "description": "Enables the webview_close command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-close", - "markdownDescription": "Enables the webview_close command without any pre-configured scope." - }, - { - "description": "Enables the webview_hide command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-hide", - "markdownDescription": "Enables the webview_hide command without any pre-configured scope." - }, - { - "description": "Enables the webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-position", - "markdownDescription": "Enables the webview_position command without any pre-configured scope." - }, - { - "description": "Enables the webview_show command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-show", - "markdownDescription": "Enables the webview_show command without any pre-configured scope." - }, - { - "description": "Enables the webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-size", - "markdownDescription": "Enables the webview_size command without any pre-configured scope." - }, - { - "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-clear-all-browsing-data", - "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." - }, - { - "description": "Denies the create_webview command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-create-webview", - "markdownDescription": "Denies the create_webview command without any pre-configured scope." - }, - { - "description": "Denies the create_webview_window command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-create-webview-window", - "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." - }, - { - "description": "Denies the get_all_webviews command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-get-all-webviews", - "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." - }, - { - "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-internal-toggle-devtools", - "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." - }, - { - "description": "Denies the print command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-print", - "markdownDescription": "Denies the print command without any pre-configured scope." - }, - { - "description": "Denies the reparent command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-reparent", - "markdownDescription": "Denies the reparent command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_auto_resize command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-auto-resize", - "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-background-color", - "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_focus command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-focus", - "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-position", - "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-size", - "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_zoom command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-zoom", - "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." - }, - { - "description": "Denies the webview_close command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-close", - "markdownDescription": "Denies the webview_close command without any pre-configured scope." - }, - { - "description": "Denies the webview_hide command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-hide", - "markdownDescription": "Denies the webview_hide command without any pre-configured scope." - }, - { - "description": "Denies the webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-position", - "markdownDescription": "Denies the webview_position command without any pre-configured scope." - }, - { - "description": "Denies the webview_show command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-show", - "markdownDescription": "Denies the webview_show command without any pre-configured scope." - }, - { - "description": "Denies the webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-size", - "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`", - "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`" - }, - { - "description": "Enables the available_monitors command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-available-monitors", - "markdownDescription": "Enables the available_monitors command without any pre-configured scope." - }, - { - "description": "Enables the center command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-center", - "markdownDescription": "Enables the center command without any pre-configured scope." - }, - { - "description": "Enables the close command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-close", - "markdownDescription": "Enables the close command without any pre-configured scope." - }, - { - "description": "Enables the create command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-create", - "markdownDescription": "Enables the create command without any pre-configured scope." - }, - { - "description": "Enables the current_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-current-monitor", - "markdownDescription": "Enables the current_monitor command without any pre-configured scope." - }, - { - "description": "Enables the cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-cursor-position", - "markdownDescription": "Enables the cursor_position command without any pre-configured scope." - }, - { - "description": "Enables the destroy command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-destroy", - "markdownDescription": "Enables the destroy command without any pre-configured scope." - }, - { - "description": "Enables the get_all_windows command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-get-all-windows", - "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." - }, - { - "description": "Enables the hide command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-hide", - "markdownDescription": "Enables the hide command without any pre-configured scope." - }, - { - "description": "Enables the inner_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-inner-position", - "markdownDescription": "Enables the inner_position command without any pre-configured scope." - }, - { - "description": "Enables the inner_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-inner-size", - "markdownDescription": "Enables the inner_size command without any pre-configured scope." - }, - { - "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-internal-toggle-maximize", - "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." - }, - { - "description": "Enables the is_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-always-on-top", - "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." - }, - { - "description": "Enables the is_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-closable", - "markdownDescription": "Enables the is_closable command without any pre-configured scope." - }, - { - "description": "Enables the is_decorated command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-decorated", - "markdownDescription": "Enables the is_decorated command without any pre-configured scope." - }, - { - "description": "Enables the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-enabled", - "markdownDescription": "Enables the is_enabled command without any pre-configured scope." - }, - { - "description": "Enables the is_focused command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-focused", - "markdownDescription": "Enables the is_focused command without any pre-configured scope." - }, - { - "description": "Enables the is_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-fullscreen", - "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the is_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-maximizable", - "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." - }, - { - "description": "Enables the is_maximized command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-maximized", - "markdownDescription": "Enables the is_maximized command without any pre-configured scope." - }, - { - "description": "Enables the is_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-minimizable", - "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." - }, - { - "description": "Enables the is_minimized command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-minimized", - "markdownDescription": "Enables the is_minimized command without any pre-configured scope." - }, - { - "description": "Enables the is_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-resizable", - "markdownDescription": "Enables the is_resizable command without any pre-configured scope." - }, - { - "description": "Enables the is_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-visible", - "markdownDescription": "Enables the is_visible command without any pre-configured scope." - }, - { - "description": "Enables the maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-maximize", - "markdownDescription": "Enables the maximize command without any pre-configured scope." - }, - { - "description": "Enables the minimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-minimize", - "markdownDescription": "Enables the minimize command without any pre-configured scope." - }, - { - "description": "Enables the monitor_from_point command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-monitor-from-point", - "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." - }, - { - "description": "Enables the outer_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-outer-position", - "markdownDescription": "Enables the outer_position command without any pre-configured scope." - }, - { - "description": "Enables the outer_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-outer-size", - "markdownDescription": "Enables the outer_size command without any pre-configured scope." - }, - { - "description": "Enables the primary_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-primary-monitor", - "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." - }, - { - "description": "Enables the request_user_attention command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-request-user-attention", - "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." - }, - { - "description": "Enables the scale_factor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-scale-factor", - "markdownDescription": "Enables the scale_factor command without any pre-configured scope." - }, - { - "description": "Enables the set_always_on_bottom command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-always-on-bottom", - "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." - }, - { - "description": "Enables the set_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-always-on-top", - "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." - }, - { - "description": "Enables the set_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-background-color", - "markdownDescription": "Enables the set_background_color command without any pre-configured scope." - }, - { - "description": "Enables the set_badge_count command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-badge-count", - "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." - }, - { - "description": "Enables the set_badge_label command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-badge-label", - "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." - }, - { - "description": "Enables the set_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-closable", - "markdownDescription": "Enables the set_closable command without any pre-configured scope." - }, - { - "description": "Enables the set_content_protected command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-content-protected", - "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_grab command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-grab", - "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-icon", - "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-position", - "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-visible", - "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." - }, - { - "description": "Enables the set_decorations command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-decorations", - "markdownDescription": "Enables the set_decorations command without any pre-configured scope." - }, - { - "description": "Enables the set_effects command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-effects", - "markdownDescription": "Enables the set_effects command without any pre-configured scope." - }, - { - "description": "Enables the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-enabled", - "markdownDescription": "Enables the set_enabled command without any pre-configured scope." - }, - { - "description": "Enables the set_focus command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-focus", - "markdownDescription": "Enables the set_focus command without any pre-configured scope." - }, - { - "description": "Enables the set_focusable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-focusable", - "markdownDescription": "Enables the set_focusable command without any pre-configured scope." - }, - { - "description": "Enables the set_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-fullscreen", - "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-ignore-cursor-events", - "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." - }, - { - "description": "Enables the set_max_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-max-size", - "markdownDescription": "Enables the set_max_size command without any pre-configured scope." - }, - { - "description": "Enables the set_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-maximizable", - "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." - }, - { - "description": "Enables the set_min_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-min-size", - "markdownDescription": "Enables the set_min_size command without any pre-configured scope." - }, - { - "description": "Enables the set_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-minimizable", - "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." - }, - { - "description": "Enables the set_overlay_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-overlay-icon", - "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-position", - "markdownDescription": "Enables the set_position command without any pre-configured scope." - }, - { - "description": "Enables the set_progress_bar command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-progress-bar", - "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." - }, - { - "description": "Enables the set_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-resizable", - "markdownDescription": "Enables the set_resizable command without any pre-configured scope." - }, - { - "description": "Enables the set_shadow command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-shadow", - "markdownDescription": "Enables the set_shadow command without any pre-configured scope." - }, - { - "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-simple-fullscreen", - "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the set_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-size", - "markdownDescription": "Enables the set_size command without any pre-configured scope." - }, - { - "description": "Enables the set_size_constraints command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-size-constraints", - "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." - }, - { - "description": "Enables the set_skip_taskbar command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-skip-taskbar", - "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." - }, - { - "description": "Enables the set_theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-theme", - "markdownDescription": "Enables the set_theme command without any pre-configured scope." - }, - { - "description": "Enables the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-title", - "markdownDescription": "Enables the set_title command without any pre-configured scope." - }, - { - "description": "Enables the set_title_bar_style command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-title-bar-style", - "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." - }, - { - "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-visible-on-all-workspaces", - "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." - }, - { - "description": "Enables the show command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-show", - "markdownDescription": "Enables the show command without any pre-configured scope." - }, - { - "description": "Enables the start_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-start-dragging", - "markdownDescription": "Enables the start_dragging command without any pre-configured scope." - }, - { - "description": "Enables the start_resize_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-start-resize-dragging", - "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." - }, - { - "description": "Enables the theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-theme", - "markdownDescription": "Enables the theme command without any pre-configured scope." - }, - { - "description": "Enables the title command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-title", - "markdownDescription": "Enables the title command without any pre-configured scope." - }, - { - "description": "Enables the toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-toggle-maximize", - "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." - }, - { - "description": "Enables the unmaximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-unmaximize", - "markdownDescription": "Enables the unmaximize command without any pre-configured scope." - }, - { - "description": "Enables the unminimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-unminimize", - "markdownDescription": "Enables the unminimize command without any pre-configured scope." - }, - { - "description": "Denies the available_monitors command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-available-monitors", - "markdownDescription": "Denies the available_monitors command without any pre-configured scope." - }, - { - "description": "Denies the center command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-center", - "markdownDescription": "Denies the center command without any pre-configured scope." - }, - { - "description": "Denies the close command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-close", - "markdownDescription": "Denies the close command without any pre-configured scope." - }, - { - "description": "Denies the create command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-create", - "markdownDescription": "Denies the create command without any pre-configured scope." - }, - { - "description": "Denies the current_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-current-monitor", - "markdownDescription": "Denies the current_monitor command without any pre-configured scope." - }, - { - "description": "Denies the cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-cursor-position", - "markdownDescription": "Denies the cursor_position command without any pre-configured scope." - }, - { - "description": "Denies the destroy command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-destroy", - "markdownDescription": "Denies the destroy command without any pre-configured scope." - }, - { - "description": "Denies the get_all_windows command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-get-all-windows", - "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." - }, - { - "description": "Denies the hide command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-hide", - "markdownDescription": "Denies the hide command without any pre-configured scope." - }, - { - "description": "Denies the inner_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-inner-position", - "markdownDescription": "Denies the inner_position command without any pre-configured scope." - }, - { - "description": "Denies the inner_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-inner-size", - "markdownDescription": "Denies the inner_size command without any pre-configured scope." - }, - { - "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-internal-toggle-maximize", - "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." - }, - { - "description": "Denies the is_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-always-on-top", - "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." - }, - { - "description": "Denies the is_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-closable", - "markdownDescription": "Denies the is_closable command without any pre-configured scope." - }, - { - "description": "Denies the is_decorated command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-decorated", - "markdownDescription": "Denies the is_decorated command without any pre-configured scope." - }, - { - "description": "Denies the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-enabled", - "markdownDescription": "Denies the is_enabled command without any pre-configured scope." - }, - { - "description": "Denies the is_focused command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-focused", - "markdownDescription": "Denies the is_focused command without any pre-configured scope." - }, - { - "description": "Denies the is_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-fullscreen", - "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the is_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-maximizable", - "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." - }, - { - "description": "Denies the is_maximized command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-maximized", - "markdownDescription": "Denies the is_maximized command without any pre-configured scope." - }, - { - "description": "Denies the is_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-minimizable", - "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." - }, - { - "description": "Denies the is_minimized command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-minimized", - "markdownDescription": "Denies the is_minimized command without any pre-configured scope." - }, - { - "description": "Denies the is_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-resizable", - "markdownDescription": "Denies the is_resizable command without any pre-configured scope." - }, - { - "description": "Denies the is_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-visible", - "markdownDescription": "Denies the is_visible command without any pre-configured scope." - }, - { - "description": "Denies the maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-maximize", - "markdownDescription": "Denies the maximize command without any pre-configured scope." - }, - { - "description": "Denies the minimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-minimize", - "markdownDescription": "Denies the minimize command without any pre-configured scope." - }, - { - "description": "Denies the monitor_from_point command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-monitor-from-point", - "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." - }, - { - "description": "Denies the outer_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-outer-position", - "markdownDescription": "Denies the outer_position command without any pre-configured scope." - }, - { - "description": "Denies the outer_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-outer-size", - "markdownDescription": "Denies the outer_size command without any pre-configured scope." - }, - { - "description": "Denies the primary_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-primary-monitor", - "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." - }, - { - "description": "Denies the request_user_attention command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-request-user-attention", - "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." - }, - { - "description": "Denies the scale_factor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-scale-factor", - "markdownDescription": "Denies the scale_factor command without any pre-configured scope." - }, - { - "description": "Denies the set_always_on_bottom command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-always-on-bottom", - "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." - }, - { - "description": "Denies the set_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-always-on-top", - "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." - }, - { - "description": "Denies the set_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-background-color", - "markdownDescription": "Denies the set_background_color command without any pre-configured scope." - }, - { - "description": "Denies the set_badge_count command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-badge-count", - "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." - }, - { - "description": "Denies the set_badge_label command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-badge-label", - "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." - }, - { - "description": "Denies the set_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-closable", - "markdownDescription": "Denies the set_closable command without any pre-configured scope." - }, - { - "description": "Denies the set_content_protected command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-content-protected", - "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_grab command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-grab", - "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-icon", - "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-position", - "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-visible", - "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." - }, - { - "description": "Denies the set_decorations command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-decorations", - "markdownDescription": "Denies the set_decorations command without any pre-configured scope." - }, - { - "description": "Denies the set_effects command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-effects", - "markdownDescription": "Denies the set_effects command without any pre-configured scope." - }, - { - "description": "Denies the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-enabled", - "markdownDescription": "Denies the set_enabled command without any pre-configured scope." - }, - { - "description": "Denies the set_focus command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-focus", - "markdownDescription": "Denies the set_focus command without any pre-configured scope." - }, - { - "description": "Denies the set_focusable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-focusable", - "markdownDescription": "Denies the set_focusable command without any pre-configured scope." - }, - { - "description": "Denies the set_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-fullscreen", - "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-ignore-cursor-events", - "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." - }, - { - "description": "Denies the set_max_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-max-size", - "markdownDescription": "Denies the set_max_size command without any pre-configured scope." - }, - { - "description": "Denies the set_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-maximizable", - "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." - }, - { - "description": "Denies the set_min_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-min-size", - "markdownDescription": "Denies the set_min_size command without any pre-configured scope." - }, - { - "description": "Denies the set_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-minimizable", - "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." - }, - { - "description": "Denies the set_overlay_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-overlay-icon", - "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-position", - "markdownDescription": "Denies the set_position command without any pre-configured scope." - }, - { - "description": "Denies the set_progress_bar command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-progress-bar", - "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." - }, - { - "description": "Denies the set_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-resizable", - "markdownDescription": "Denies the set_resizable command without any pre-configured scope." - }, - { - "description": "Denies the set_shadow command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-shadow", - "markdownDescription": "Denies the set_shadow command without any pre-configured scope." - }, - { - "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-simple-fullscreen", - "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the set_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-size", - "markdownDescription": "Denies the set_size command without any pre-configured scope." - }, - { - "description": "Denies the set_size_constraints command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-size-constraints", - "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." - }, - { - "description": "Denies the set_skip_taskbar command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-skip-taskbar", - "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." - }, - { - "description": "Denies the set_theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-theme", - "markdownDescription": "Denies the set_theme command without any pre-configured scope." - }, - { - "description": "Denies the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-title", - "markdownDescription": "Denies the set_title command without any pre-configured scope." - }, - { - "description": "Denies the set_title_bar_style command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-title-bar-style", - "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." - }, - { - "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-visible-on-all-workspaces", - "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." - }, - { - "description": "Denies the show command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-show", - "markdownDescription": "Denies the show command without any pre-configured scope." - }, - { - "description": "Denies the start_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-start-dragging", - "markdownDescription": "Denies the start_dragging command without any pre-configured scope." - }, - { - "description": "Denies the start_resize_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-start-resize-dragging", - "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." - }, - { - "description": "Denies the theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-theme", - "markdownDescription": "Denies the theme command without any pre-configured scope." - }, - { - "description": "Denies the title command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-title", - "markdownDescription": "Denies the title command without any pre-configured scope." - }, - { - "description": "Denies the toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-toggle-maximize", - "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." - }, - { - "description": "Denies the unmaximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-unmaximize", - "markdownDescription": "Denies the unmaximize command without any pre-configured scope." - }, - { - "description": "Denies the unminimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-unminimize", - "markdownDescription": "Denies the unminimize command without any pre-configured scope." - } - ] - }, - "Value": { - "description": "All supported ACL values.", - "anyOf": [ - { - "description": "Represents a null JSON value.", - "type": "null" - }, - { - "description": "Represents a [`bool`].", - "type": "boolean" - }, - { - "description": "Represents a valid ACL [`Number`].", - "allOf": [ - { - "$ref": "#/definitions/Number" - } - ] - }, - { - "description": "Represents a [`String`].", - "type": "string" - }, - { - "description": "Represents a list of other [`Value`]s.", - "type": "array", - "items": { - "$ref": "#/definitions/Value" - } - }, - { - "description": "Represents a map of [`String`] keys to [`Value`]s.", - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Value" - } - } - ] - }, - "Number": { - "description": "A valid ACL number.", - "anyOf": [ - { - "description": "Represents an [`i64`].", - "type": "integer", - "format": "int64" - }, - { - "description": "Represents a [`f64`].", - "type": "number", - "format": "double" - } - ] - }, - "Target": { - "description": "Platform target.", - "oneOf": [ - { - "description": "MacOS.", - "type": "string", - "enum": [ - "macOS" - ] - }, - { - "description": "Windows.", - "type": "string", - "enum": [ - "windows" - ] - }, - { - "description": "Linux.", - "type": "string", - "enum": [ - "linux" - ] - }, - { - "description": "Android.", - "type": "string", - "enum": [ - "android" - ] - }, - { - "description": "iOS.", - "type": "string", - "enum": [ - "iOS" - ] - } - ] - } - } -} \ No newline at end of file diff --git a/crates/quicproquo-gui/gen/schemas/linux-schema.json b/crates/quicproquo-gui/gen/schemas/linux-schema.json deleted file mode 100644 index 260dbe0..0000000 --- a/crates/quicproquo-gui/gen/schemas/linux-schema.json +++ /dev/null @@ -1,2244 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "CapabilityFile", - "description": "Capability formats accepted in a capability file.", - "anyOf": [ - { - "description": "A single capability.", - "allOf": [ - { - "$ref": "#/definitions/Capability" - } - ] - }, - { - "description": "A list of capabilities.", - "type": "array", - "items": { - "$ref": "#/definitions/Capability" - } - }, - { - "description": "A list of capabilities.", - "type": "object", - "required": [ - "capabilities" - ], - "properties": { - "capabilities": { - "description": "The list of capabilities.", - "type": "array", - "items": { - "$ref": "#/definitions/Capability" - } - } - } - } - ], - "definitions": { - "Capability": { - "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", - "type": "object", - "required": [ - "identifier", - "permissions" - ], - "properties": { - "identifier": { - "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", - "type": "string" - }, - "description": { - "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.", - "default": "", - "type": "string" - }, - "remote": { - "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", - "anyOf": [ - { - "$ref": "#/definitions/CapabilityRemote" - }, - { - "type": "null" - } - ] - }, - "local": { - "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", - "default": true, - "type": "boolean" - }, - "windows": { - "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", - "type": "array", - "items": { - "type": "string" - } - }, - "webviews": { - "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", - "type": "array", - "items": { - "type": "string" - } - }, - "permissions": { - "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", - "type": "array", - "items": { - "$ref": "#/definitions/PermissionEntry" - }, - "uniqueItems": true - }, - "platforms": { - "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Target" - } - } - } - }, - "CapabilityRemote": { - "description": "Configuration for remote URLs that are associated with the capability.", - "type": "object", - "required": [ - "urls" - ], - "properties": { - "urls": { - "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "PermissionEntry": { - "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", - "anyOf": [ - { - "description": "Reference a permission or permission set by identifier.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - { - "description": "Reference a permission or permission set by identifier and extends its scope.", - "type": "object", - "allOf": [ - { - "properties": { - "identifier": { - "description": "Identifier of the permission or permission set.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - "allow": { - "description": "Data that defines what is allowed by the scope.", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Value" - } - }, - "deny": { - "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Value" - } - } - } - } - ], - "required": [ - "identifier" - ] - } - ] - }, - "Identifier": { - "description": "Permission identifier", - "oneOf": [ - { - "description": "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`", - "type": "string", - "const": "core:default", - "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`", - "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`" - }, - { - "description": "Enables the app_hide command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-app-hide", - "markdownDescription": "Enables the app_hide command without any pre-configured scope." - }, - { - "description": "Enables the app_show command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-app-show", - "markdownDescription": "Enables the app_show command without any pre-configured scope." - }, - { - "description": "Enables the bundle_type command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-bundle-type", - "markdownDescription": "Enables the bundle_type command without any pre-configured scope." - }, - { - "description": "Enables the default_window_icon command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-default-window-icon", - "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." - }, - { - "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-fetch-data-store-identifiers", - "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." - }, - { - "description": "Enables the identifier command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-identifier", - "markdownDescription": "Enables the identifier command without any pre-configured scope." - }, - { - "description": "Enables the name command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-name", - "markdownDescription": "Enables the name command without any pre-configured scope." - }, - { - "description": "Enables the register_listener command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-register-listener", - "markdownDescription": "Enables the register_listener command without any pre-configured scope." - }, - { - "description": "Enables the remove_data_store command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-remove-data-store", - "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." - }, - { - "description": "Enables the remove_listener command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-remove-listener", - "markdownDescription": "Enables the remove_listener command without any pre-configured scope." - }, - { - "description": "Enables the set_app_theme command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-set-app-theme", - "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." - }, - { - "description": "Enables the set_dock_visibility command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-set-dock-visibility", - "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." - }, - { - "description": "Enables the tauri_version command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-tauri-version", - "markdownDescription": "Enables the tauri_version command without any pre-configured scope." - }, - { - "description": "Enables the version command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-version", - "markdownDescription": "Enables the version command without any pre-configured scope." - }, - { - "description": "Denies the app_hide command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-app-hide", - "markdownDescription": "Denies the app_hide command without any pre-configured scope." - }, - { - "description": "Denies the app_show command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-app-show", - "markdownDescription": "Denies the app_show command without any pre-configured scope." - }, - { - "description": "Denies the bundle_type command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-bundle-type", - "markdownDescription": "Denies the bundle_type command without any pre-configured scope." - }, - { - "description": "Denies the default_window_icon command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-default-window-icon", - "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." - }, - { - "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-fetch-data-store-identifiers", - "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." - }, - { - "description": "Denies the identifier command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-identifier", - "markdownDescription": "Denies the identifier command without any pre-configured scope." - }, - { - "description": "Denies the name command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-name", - "markdownDescription": "Denies the name command without any pre-configured scope." - }, - { - "description": "Denies the register_listener command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-register-listener", - "markdownDescription": "Denies the register_listener command without any pre-configured scope." - }, - { - "description": "Denies the remove_data_store command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-remove-data-store", - "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." - }, - { - "description": "Denies the remove_listener command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-remove-listener", - "markdownDescription": "Denies the remove_listener command without any pre-configured scope." - }, - { - "description": "Denies the set_app_theme command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-set-app-theme", - "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." - }, - { - "description": "Denies the set_dock_visibility command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-set-dock-visibility", - "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." - }, - { - "description": "Denies the tauri_version command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-tauri-version", - "markdownDescription": "Denies the tauri_version command without any pre-configured scope." - }, - { - "description": "Denies the version command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-version", - "markdownDescription": "Denies the version 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-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", - "type": "string", - "const": "core:event:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" - }, - { - "description": "Enables the emit command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-emit", - "markdownDescription": "Enables the emit command without any pre-configured scope." - }, - { - "description": "Enables the emit_to command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-emit-to", - "markdownDescription": "Enables the emit_to command without any pre-configured scope." - }, - { - "description": "Enables the listen command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-listen", - "markdownDescription": "Enables the listen command without any pre-configured scope." - }, - { - "description": "Enables the unlisten command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-unlisten", - "markdownDescription": "Enables the unlisten command without any pre-configured scope." - }, - { - "description": "Denies the emit command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-emit", - "markdownDescription": "Denies the emit command without any pre-configured scope." - }, - { - "description": "Denies the emit_to command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-emit-to", - "markdownDescription": "Denies the emit_to command without any pre-configured scope." - }, - { - "description": "Denies the listen command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-listen", - "markdownDescription": "Denies the listen command without any pre-configured scope." - }, - { - "description": "Denies the unlisten command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-unlisten", - "markdownDescription": "Denies the unlisten 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-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", - "type": "string", - "const": "core:image:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" - }, - { - "description": "Enables the from_bytes command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-from-bytes", - "markdownDescription": "Enables the from_bytes command without any pre-configured scope." - }, - { - "description": "Enables the from_path command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-from-path", - "markdownDescription": "Enables the from_path command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the rgba command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-rgba", - "markdownDescription": "Enables the rgba command without any pre-configured scope." - }, - { - "description": "Enables the size command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-size", - "markdownDescription": "Enables the size command without any pre-configured scope." - }, - { - "description": "Denies the from_bytes command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-from-bytes", - "markdownDescription": "Denies the from_bytes command without any pre-configured scope." - }, - { - "description": "Denies the from_path command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-from-path", - "markdownDescription": "Denies the from_path command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the rgba command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-rgba", - "markdownDescription": "Denies the rgba command without any pre-configured scope." - }, - { - "description": "Denies the size command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-size", - "markdownDescription": "Denies the size 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-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", - "type": "string", - "const": "core:menu:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" - }, - { - "description": "Enables the append command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-append", - "markdownDescription": "Enables the append command without any pre-configured scope." - }, - { - "description": "Enables the create_default command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-create-default", - "markdownDescription": "Enables the create_default command without any pre-configured scope." - }, - { - "description": "Enables the get command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-get", - "markdownDescription": "Enables the get command without any pre-configured scope." - }, - { - "description": "Enables the insert command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-insert", - "markdownDescription": "Enables the insert command without any pre-configured scope." - }, - { - "description": "Enables the is_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-is-checked", - "markdownDescription": "Enables the is_checked command without any pre-configured scope." - }, - { - "description": "Enables the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-is-enabled", - "markdownDescription": "Enables the is_enabled command without any pre-configured scope." - }, - { - "description": "Enables the items command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-items", - "markdownDescription": "Enables the items command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the popup command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-popup", - "markdownDescription": "Enables the popup command without any pre-configured scope." - }, - { - "description": "Enables the prepend command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-prepend", - "markdownDescription": "Enables the prepend command without any pre-configured scope." - }, - { - "description": "Enables the remove command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-remove", - "markdownDescription": "Enables the remove command without any pre-configured scope." - }, - { - "description": "Enables the remove_at command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-remove-at", - "markdownDescription": "Enables the remove_at command without any pre-configured scope." - }, - { - "description": "Enables the set_accelerator command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-accelerator", - "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." - }, - { - "description": "Enables the set_as_app_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-app-menu", - "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-help-menu-for-nsapp", - "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Enables the set_as_window_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-window-menu", - "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-windows-menu-for-nsapp", - "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Enables the set_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-checked", - "markdownDescription": "Enables the set_checked command without any pre-configured scope." - }, - { - "description": "Enables the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-enabled", - "markdownDescription": "Enables the set_enabled command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-text", - "markdownDescription": "Enables the set_text command without any pre-configured scope." - }, - { - "description": "Enables the text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-text", - "markdownDescription": "Enables the text command without any pre-configured scope." - }, - { - "description": "Denies the append command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-append", - "markdownDescription": "Denies the append command without any pre-configured scope." - }, - { - "description": "Denies the create_default command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-create-default", - "markdownDescription": "Denies the create_default command without any pre-configured scope." - }, - { - "description": "Denies the get command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-get", - "markdownDescription": "Denies the get command without any pre-configured scope." - }, - { - "description": "Denies the insert command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-insert", - "markdownDescription": "Denies the insert command without any pre-configured scope." - }, - { - "description": "Denies the is_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-is-checked", - "markdownDescription": "Denies the is_checked command without any pre-configured scope." - }, - { - "description": "Denies the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-is-enabled", - "markdownDescription": "Denies the is_enabled command without any pre-configured scope." - }, - { - "description": "Denies the items command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-items", - "markdownDescription": "Denies the items command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the popup command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-popup", - "markdownDescription": "Denies the popup command without any pre-configured scope." - }, - { - "description": "Denies the prepend command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-prepend", - "markdownDescription": "Denies the prepend command without any pre-configured scope." - }, - { - "description": "Denies the remove command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-remove", - "markdownDescription": "Denies the remove command without any pre-configured scope." - }, - { - "description": "Denies the remove_at command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-remove-at", - "markdownDescription": "Denies the remove_at command without any pre-configured scope." - }, - { - "description": "Denies the set_accelerator command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-accelerator", - "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." - }, - { - "description": "Denies the set_as_app_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-app-menu", - "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-help-menu-for-nsapp", - "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Denies the set_as_window_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-window-menu", - "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-windows-menu-for-nsapp", - "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Denies the set_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-checked", - "markdownDescription": "Denies the set_checked command without any pre-configured scope." - }, - { - "description": "Denies the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-enabled", - "markdownDescription": "Denies the set_enabled command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-text", - "markdownDescription": "Denies the set_text command without any pre-configured scope." - }, - { - "description": "Denies the text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-text", - "markdownDescription": "Denies the text 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-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", - "type": "string", - "const": "core:path:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" - }, - { - "description": "Enables the basename command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-basename", - "markdownDescription": "Enables the basename command without any pre-configured scope." - }, - { - "description": "Enables the dirname command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-dirname", - "markdownDescription": "Enables the dirname command without any pre-configured scope." - }, - { - "description": "Enables the extname command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-extname", - "markdownDescription": "Enables the extname command without any pre-configured scope." - }, - { - "description": "Enables the is_absolute command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-is-absolute", - "markdownDescription": "Enables the is_absolute command without any pre-configured scope." - }, - { - "description": "Enables the join command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-join", - "markdownDescription": "Enables the join command without any pre-configured scope." - }, - { - "description": "Enables the normalize command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-normalize", - "markdownDescription": "Enables the normalize command without any pre-configured scope." - }, - { - "description": "Enables the resolve command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-resolve", - "markdownDescription": "Enables the resolve command without any pre-configured scope." - }, - { - "description": "Enables the resolve_directory command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-resolve-directory", - "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." - }, - { - "description": "Denies the basename command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-basename", - "markdownDescription": "Denies the basename command without any pre-configured scope." - }, - { - "description": "Denies the dirname command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-dirname", - "markdownDescription": "Denies the dirname command without any pre-configured scope." - }, - { - "description": "Denies the extname command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-extname", - "markdownDescription": "Denies the extname command without any pre-configured scope." - }, - { - "description": "Denies the is_absolute command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-is-absolute", - "markdownDescription": "Denies the is_absolute command without any pre-configured scope." - }, - { - "description": "Denies the join command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-join", - "markdownDescription": "Denies the join command without any pre-configured scope." - }, - { - "description": "Denies the normalize command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-normalize", - "markdownDescription": "Denies the normalize command without any pre-configured scope." - }, - { - "description": "Denies the resolve command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-resolve", - "markdownDescription": "Denies the resolve command without any pre-configured scope." - }, - { - "description": "Denies the resolve_directory command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-resolve-directory", - "markdownDescription": "Denies the resolve_directory 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-close`", - "type": "string", - "const": "core:resources:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" - }, - { - "description": "Enables the close command without any pre-configured scope.", - "type": "string", - "const": "core:resources:allow-close", - "markdownDescription": "Enables the close command without any pre-configured scope." - }, - { - "description": "Denies the close command without any pre-configured scope.", - "type": "string", - "const": "core:resources:deny-close", - "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`", - "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`" - }, - { - "description": "Enables the get_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-get-by-id", - "markdownDescription": "Enables the get_by_id command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the remove_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-remove-by-id", - "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_icon_as_template command without any pre-configured scope.", - "type": "string", - "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_menu command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-menu", - "markdownDescription": "Enables the set_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-show-menu-on-left-click", - "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." - }, - { - "description": "Enables the set_temp_dir_path command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-temp-dir-path", - "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." - }, - { - "description": "Enables the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-title", - "markdownDescription": "Enables the set_title command without any pre-configured scope." - }, - { - "description": "Enables the set_tooltip command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-tooltip", - "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." - }, - { - "description": "Enables the set_visible command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-visible", - "markdownDescription": "Enables the set_visible command without any pre-configured scope." - }, - { - "description": "Denies the get_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-get-by-id", - "markdownDescription": "Denies the get_by_id command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the remove_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-remove-by-id", - "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_icon_as_template command without any pre-configured scope.", - "type": "string", - "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_menu command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-menu", - "markdownDescription": "Denies the set_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-show-menu-on-left-click", - "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." - }, - { - "description": "Denies the set_temp_dir_path command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-temp-dir-path", - "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." - }, - { - "description": "Denies the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-title", - "markdownDescription": "Denies the set_title command without any pre-configured scope." - }, - { - "description": "Denies the set_tooltip command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-tooltip", - "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." - }, - { - "description": "Denies the set_visible command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-visible", - "markdownDescription": "Denies the set_visible command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", - "type": "string", - "const": "core:webview:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" - }, - { - "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-clear-all-browsing-data", - "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." - }, - { - "description": "Enables the create_webview command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-create-webview", - "markdownDescription": "Enables the create_webview command without any pre-configured scope." - }, - { - "description": "Enables the create_webview_window command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-create-webview-window", - "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." - }, - { - "description": "Enables the get_all_webviews command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-get-all-webviews", - "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." - }, - { - "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-internal-toggle-devtools", - "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." - }, - { - "description": "Enables the print command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-print", - "markdownDescription": "Enables the print command without any pre-configured scope." - }, - { - "description": "Enables the reparent command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-reparent", - "markdownDescription": "Enables the reparent command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_auto_resize command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-auto-resize", - "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-background-color", - "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_focus command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-focus", - "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-position", - "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-size", - "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_zoom command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-zoom", - "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." - }, - { - "description": "Enables the webview_close command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-close", - "markdownDescription": "Enables the webview_close command without any pre-configured scope." - }, - { - "description": "Enables the webview_hide command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-hide", - "markdownDescription": "Enables the webview_hide command without any pre-configured scope." - }, - { - "description": "Enables the webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-position", - "markdownDescription": "Enables the webview_position command without any pre-configured scope." - }, - { - "description": "Enables the webview_show command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-show", - "markdownDescription": "Enables the webview_show command without any pre-configured scope." - }, - { - "description": "Enables the webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-size", - "markdownDescription": "Enables the webview_size command without any pre-configured scope." - }, - { - "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-clear-all-browsing-data", - "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." - }, - { - "description": "Denies the create_webview command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-create-webview", - "markdownDescription": "Denies the create_webview command without any pre-configured scope." - }, - { - "description": "Denies the create_webview_window command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-create-webview-window", - "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." - }, - { - "description": "Denies the get_all_webviews command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-get-all-webviews", - "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." - }, - { - "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-internal-toggle-devtools", - "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." - }, - { - "description": "Denies the print command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-print", - "markdownDescription": "Denies the print command without any pre-configured scope." - }, - { - "description": "Denies the reparent command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-reparent", - "markdownDescription": "Denies the reparent command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_auto_resize command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-auto-resize", - "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-background-color", - "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_focus command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-focus", - "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-position", - "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-size", - "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_zoom command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-zoom", - "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." - }, - { - "description": "Denies the webview_close command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-close", - "markdownDescription": "Denies the webview_close command without any pre-configured scope." - }, - { - "description": "Denies the webview_hide command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-hide", - "markdownDescription": "Denies the webview_hide command without any pre-configured scope." - }, - { - "description": "Denies the webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-position", - "markdownDescription": "Denies the webview_position command without any pre-configured scope." - }, - { - "description": "Denies the webview_show command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-show", - "markdownDescription": "Denies the webview_show command without any pre-configured scope." - }, - { - "description": "Denies the webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-size", - "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`", - "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`" - }, - { - "description": "Enables the available_monitors command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-available-monitors", - "markdownDescription": "Enables the available_monitors command without any pre-configured scope." - }, - { - "description": "Enables the center command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-center", - "markdownDescription": "Enables the center command without any pre-configured scope." - }, - { - "description": "Enables the close command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-close", - "markdownDescription": "Enables the close command without any pre-configured scope." - }, - { - "description": "Enables the create command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-create", - "markdownDescription": "Enables the create command without any pre-configured scope." - }, - { - "description": "Enables the current_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-current-monitor", - "markdownDescription": "Enables the current_monitor command without any pre-configured scope." - }, - { - "description": "Enables the cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-cursor-position", - "markdownDescription": "Enables the cursor_position command without any pre-configured scope." - }, - { - "description": "Enables the destroy command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-destroy", - "markdownDescription": "Enables the destroy command without any pre-configured scope." - }, - { - "description": "Enables the get_all_windows command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-get-all-windows", - "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." - }, - { - "description": "Enables the hide command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-hide", - "markdownDescription": "Enables the hide command without any pre-configured scope." - }, - { - "description": "Enables the inner_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-inner-position", - "markdownDescription": "Enables the inner_position command without any pre-configured scope." - }, - { - "description": "Enables the inner_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-inner-size", - "markdownDescription": "Enables the inner_size command without any pre-configured scope." - }, - { - "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-internal-toggle-maximize", - "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." - }, - { - "description": "Enables the is_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-always-on-top", - "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." - }, - { - "description": "Enables the is_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-closable", - "markdownDescription": "Enables the is_closable command without any pre-configured scope." - }, - { - "description": "Enables the is_decorated command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-decorated", - "markdownDescription": "Enables the is_decorated command without any pre-configured scope." - }, - { - "description": "Enables the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-enabled", - "markdownDescription": "Enables the is_enabled command without any pre-configured scope." - }, - { - "description": "Enables the is_focused command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-focused", - "markdownDescription": "Enables the is_focused command without any pre-configured scope." - }, - { - "description": "Enables the is_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-fullscreen", - "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the is_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-maximizable", - "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." - }, - { - "description": "Enables the is_maximized command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-maximized", - "markdownDescription": "Enables the is_maximized command without any pre-configured scope." - }, - { - "description": "Enables the is_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-minimizable", - "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." - }, - { - "description": "Enables the is_minimized command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-minimized", - "markdownDescription": "Enables the is_minimized command without any pre-configured scope." - }, - { - "description": "Enables the is_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-resizable", - "markdownDescription": "Enables the is_resizable command without any pre-configured scope." - }, - { - "description": "Enables the is_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-visible", - "markdownDescription": "Enables the is_visible command without any pre-configured scope." - }, - { - "description": "Enables the maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-maximize", - "markdownDescription": "Enables the maximize command without any pre-configured scope." - }, - { - "description": "Enables the minimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-minimize", - "markdownDescription": "Enables the minimize command without any pre-configured scope." - }, - { - "description": "Enables the monitor_from_point command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-monitor-from-point", - "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." - }, - { - "description": "Enables the outer_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-outer-position", - "markdownDescription": "Enables the outer_position command without any pre-configured scope." - }, - { - "description": "Enables the outer_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-outer-size", - "markdownDescription": "Enables the outer_size command without any pre-configured scope." - }, - { - "description": "Enables the primary_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-primary-monitor", - "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." - }, - { - "description": "Enables the request_user_attention command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-request-user-attention", - "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." - }, - { - "description": "Enables the scale_factor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-scale-factor", - "markdownDescription": "Enables the scale_factor command without any pre-configured scope." - }, - { - "description": "Enables the set_always_on_bottom command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-always-on-bottom", - "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." - }, - { - "description": "Enables the set_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-always-on-top", - "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." - }, - { - "description": "Enables the set_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-background-color", - "markdownDescription": "Enables the set_background_color command without any pre-configured scope." - }, - { - "description": "Enables the set_badge_count command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-badge-count", - "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." - }, - { - "description": "Enables the set_badge_label command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-badge-label", - "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." - }, - { - "description": "Enables the set_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-closable", - "markdownDescription": "Enables the set_closable command without any pre-configured scope." - }, - { - "description": "Enables the set_content_protected command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-content-protected", - "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_grab command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-grab", - "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-icon", - "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-position", - "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-visible", - "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." - }, - { - "description": "Enables the set_decorations command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-decorations", - "markdownDescription": "Enables the set_decorations command without any pre-configured scope." - }, - { - "description": "Enables the set_effects command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-effects", - "markdownDescription": "Enables the set_effects command without any pre-configured scope." - }, - { - "description": "Enables the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-enabled", - "markdownDescription": "Enables the set_enabled command without any pre-configured scope." - }, - { - "description": "Enables the set_focus command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-focus", - "markdownDescription": "Enables the set_focus command without any pre-configured scope." - }, - { - "description": "Enables the set_focusable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-focusable", - "markdownDescription": "Enables the set_focusable command without any pre-configured scope." - }, - { - "description": "Enables the set_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-fullscreen", - "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-ignore-cursor-events", - "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." - }, - { - "description": "Enables the set_max_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-max-size", - "markdownDescription": "Enables the set_max_size command without any pre-configured scope." - }, - { - "description": "Enables the set_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-maximizable", - "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." - }, - { - "description": "Enables the set_min_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-min-size", - "markdownDescription": "Enables the set_min_size command without any pre-configured scope." - }, - { - "description": "Enables the set_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-minimizable", - "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." - }, - { - "description": "Enables the set_overlay_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-overlay-icon", - "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-position", - "markdownDescription": "Enables the set_position command without any pre-configured scope." - }, - { - "description": "Enables the set_progress_bar command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-progress-bar", - "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." - }, - { - "description": "Enables the set_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-resizable", - "markdownDescription": "Enables the set_resizable command without any pre-configured scope." - }, - { - "description": "Enables the set_shadow command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-shadow", - "markdownDescription": "Enables the set_shadow command without any pre-configured scope." - }, - { - "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-simple-fullscreen", - "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the set_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-size", - "markdownDescription": "Enables the set_size command without any pre-configured scope." - }, - { - "description": "Enables the set_size_constraints command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-size-constraints", - "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." - }, - { - "description": "Enables the set_skip_taskbar command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-skip-taskbar", - "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." - }, - { - "description": "Enables the set_theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-theme", - "markdownDescription": "Enables the set_theme command without any pre-configured scope." - }, - { - "description": "Enables the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-title", - "markdownDescription": "Enables the set_title command without any pre-configured scope." - }, - { - "description": "Enables the set_title_bar_style command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-title-bar-style", - "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." - }, - { - "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-visible-on-all-workspaces", - "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." - }, - { - "description": "Enables the show command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-show", - "markdownDescription": "Enables the show command without any pre-configured scope." - }, - { - "description": "Enables the start_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-start-dragging", - "markdownDescription": "Enables the start_dragging command without any pre-configured scope." - }, - { - "description": "Enables the start_resize_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-start-resize-dragging", - "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." - }, - { - "description": "Enables the theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-theme", - "markdownDescription": "Enables the theme command without any pre-configured scope." - }, - { - "description": "Enables the title command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-title", - "markdownDescription": "Enables the title command without any pre-configured scope." - }, - { - "description": "Enables the toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-toggle-maximize", - "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." - }, - { - "description": "Enables the unmaximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-unmaximize", - "markdownDescription": "Enables the unmaximize command without any pre-configured scope." - }, - { - "description": "Enables the unminimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-unminimize", - "markdownDescription": "Enables the unminimize command without any pre-configured scope." - }, - { - "description": "Denies the available_monitors command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-available-monitors", - "markdownDescription": "Denies the available_monitors command without any pre-configured scope." - }, - { - "description": "Denies the center command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-center", - "markdownDescription": "Denies the center command without any pre-configured scope." - }, - { - "description": "Denies the close command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-close", - "markdownDescription": "Denies the close command without any pre-configured scope." - }, - { - "description": "Denies the create command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-create", - "markdownDescription": "Denies the create command without any pre-configured scope." - }, - { - "description": "Denies the current_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-current-monitor", - "markdownDescription": "Denies the current_monitor command without any pre-configured scope." - }, - { - "description": "Denies the cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-cursor-position", - "markdownDescription": "Denies the cursor_position command without any pre-configured scope." - }, - { - "description": "Denies the destroy command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-destroy", - "markdownDescription": "Denies the destroy command without any pre-configured scope." - }, - { - "description": "Denies the get_all_windows command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-get-all-windows", - "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." - }, - { - "description": "Denies the hide command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-hide", - "markdownDescription": "Denies the hide command without any pre-configured scope." - }, - { - "description": "Denies the inner_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-inner-position", - "markdownDescription": "Denies the inner_position command without any pre-configured scope." - }, - { - "description": "Denies the inner_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-inner-size", - "markdownDescription": "Denies the inner_size command without any pre-configured scope." - }, - { - "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-internal-toggle-maximize", - "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." - }, - { - "description": "Denies the is_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-always-on-top", - "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." - }, - { - "description": "Denies the is_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-closable", - "markdownDescription": "Denies the is_closable command without any pre-configured scope." - }, - { - "description": "Denies the is_decorated command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-decorated", - "markdownDescription": "Denies the is_decorated command without any pre-configured scope." - }, - { - "description": "Denies the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-enabled", - "markdownDescription": "Denies the is_enabled command without any pre-configured scope." - }, - { - "description": "Denies the is_focused command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-focused", - "markdownDescription": "Denies the is_focused command without any pre-configured scope." - }, - { - "description": "Denies the is_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-fullscreen", - "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the is_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-maximizable", - "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." - }, - { - "description": "Denies the is_maximized command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-maximized", - "markdownDescription": "Denies the is_maximized command without any pre-configured scope." - }, - { - "description": "Denies the is_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-minimizable", - "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." - }, - { - "description": "Denies the is_minimized command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-minimized", - "markdownDescription": "Denies the is_minimized command without any pre-configured scope." - }, - { - "description": "Denies the is_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-resizable", - "markdownDescription": "Denies the is_resizable command without any pre-configured scope." - }, - { - "description": "Denies the is_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-visible", - "markdownDescription": "Denies the is_visible command without any pre-configured scope." - }, - { - "description": "Denies the maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-maximize", - "markdownDescription": "Denies the maximize command without any pre-configured scope." - }, - { - "description": "Denies the minimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-minimize", - "markdownDescription": "Denies the minimize command without any pre-configured scope." - }, - { - "description": "Denies the monitor_from_point command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-monitor-from-point", - "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." - }, - { - "description": "Denies the outer_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-outer-position", - "markdownDescription": "Denies the outer_position command without any pre-configured scope." - }, - { - "description": "Denies the outer_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-outer-size", - "markdownDescription": "Denies the outer_size command without any pre-configured scope." - }, - { - "description": "Denies the primary_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-primary-monitor", - "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." - }, - { - "description": "Denies the request_user_attention command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-request-user-attention", - "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." - }, - { - "description": "Denies the scale_factor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-scale-factor", - "markdownDescription": "Denies the scale_factor command without any pre-configured scope." - }, - { - "description": "Denies the set_always_on_bottom command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-always-on-bottom", - "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." - }, - { - "description": "Denies the set_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-always-on-top", - "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." - }, - { - "description": "Denies the set_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-background-color", - "markdownDescription": "Denies the set_background_color command without any pre-configured scope." - }, - { - "description": "Denies the set_badge_count command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-badge-count", - "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." - }, - { - "description": "Denies the set_badge_label command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-badge-label", - "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." - }, - { - "description": "Denies the set_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-closable", - "markdownDescription": "Denies the set_closable command without any pre-configured scope." - }, - { - "description": "Denies the set_content_protected command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-content-protected", - "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_grab command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-grab", - "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-icon", - "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-position", - "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-visible", - "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." - }, - { - "description": "Denies the set_decorations command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-decorations", - "markdownDescription": "Denies the set_decorations command without any pre-configured scope." - }, - { - "description": "Denies the set_effects command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-effects", - "markdownDescription": "Denies the set_effects command without any pre-configured scope." - }, - { - "description": "Denies the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-enabled", - "markdownDescription": "Denies the set_enabled command without any pre-configured scope." - }, - { - "description": "Denies the set_focus command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-focus", - "markdownDescription": "Denies the set_focus command without any pre-configured scope." - }, - { - "description": "Denies the set_focusable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-focusable", - "markdownDescription": "Denies the set_focusable command without any pre-configured scope." - }, - { - "description": "Denies the set_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-fullscreen", - "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-ignore-cursor-events", - "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." - }, - { - "description": "Denies the set_max_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-max-size", - "markdownDescription": "Denies the set_max_size command without any pre-configured scope." - }, - { - "description": "Denies the set_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-maximizable", - "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." - }, - { - "description": "Denies the set_min_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-min-size", - "markdownDescription": "Denies the set_min_size command without any pre-configured scope." - }, - { - "description": "Denies the set_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-minimizable", - "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." - }, - { - "description": "Denies the set_overlay_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-overlay-icon", - "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-position", - "markdownDescription": "Denies the set_position command without any pre-configured scope." - }, - { - "description": "Denies the set_progress_bar command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-progress-bar", - "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." - }, - { - "description": "Denies the set_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-resizable", - "markdownDescription": "Denies the set_resizable command without any pre-configured scope." - }, - { - "description": "Denies the set_shadow command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-shadow", - "markdownDescription": "Denies the set_shadow command without any pre-configured scope." - }, - { - "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-simple-fullscreen", - "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the set_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-size", - "markdownDescription": "Denies the set_size command without any pre-configured scope." - }, - { - "description": "Denies the set_size_constraints command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-size-constraints", - "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." - }, - { - "description": "Denies the set_skip_taskbar command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-skip-taskbar", - "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." - }, - { - "description": "Denies the set_theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-theme", - "markdownDescription": "Denies the set_theme command without any pre-configured scope." - }, - { - "description": "Denies the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-title", - "markdownDescription": "Denies the set_title command without any pre-configured scope." - }, - { - "description": "Denies the set_title_bar_style command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-title-bar-style", - "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." - }, - { - "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-visible-on-all-workspaces", - "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." - }, - { - "description": "Denies the show command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-show", - "markdownDescription": "Denies the show command without any pre-configured scope." - }, - { - "description": "Denies the start_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-start-dragging", - "markdownDescription": "Denies the start_dragging command without any pre-configured scope." - }, - { - "description": "Denies the start_resize_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-start-resize-dragging", - "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." - }, - { - "description": "Denies the theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-theme", - "markdownDescription": "Denies the theme command without any pre-configured scope." - }, - { - "description": "Denies the title command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-title", - "markdownDescription": "Denies the title command without any pre-configured scope." - }, - { - "description": "Denies the toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-toggle-maximize", - "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." - }, - { - "description": "Denies the unmaximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-unmaximize", - "markdownDescription": "Denies the unmaximize command without any pre-configured scope." - }, - { - "description": "Denies the unminimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-unminimize", - "markdownDescription": "Denies the unminimize command without any pre-configured scope." - } - ] - }, - "Value": { - "description": "All supported ACL values.", - "anyOf": [ - { - "description": "Represents a null JSON value.", - "type": "null" - }, - { - "description": "Represents a [`bool`].", - "type": "boolean" - }, - { - "description": "Represents a valid ACL [`Number`].", - "allOf": [ - { - "$ref": "#/definitions/Number" - } - ] - }, - { - "description": "Represents a [`String`].", - "type": "string" - }, - { - "description": "Represents a list of other [`Value`]s.", - "type": "array", - "items": { - "$ref": "#/definitions/Value" - } - }, - { - "description": "Represents a map of [`String`] keys to [`Value`]s.", - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Value" - } - } - ] - }, - "Number": { - "description": "A valid ACL number.", - "anyOf": [ - { - "description": "Represents an [`i64`].", - "type": "integer", - "format": "int64" - }, - { - "description": "Represents a [`f64`].", - "type": "number", - "format": "double" - } - ] - }, - "Target": { - "description": "Platform target.", - "oneOf": [ - { - "description": "MacOS.", - "type": "string", - "enum": [ - "macOS" - ] - }, - { - "description": "Windows.", - "type": "string", - "enum": [ - "windows" - ] - }, - { - "description": "Linux.", - "type": "string", - "enum": [ - "linux" - ] - }, - { - "description": "Android.", - "type": "string", - "enum": [ - "android" - ] - }, - { - "description": "iOS.", - "type": "string", - "enum": [ - "iOS" - ] - } - ] - } - } -} \ No newline at end of file diff --git a/crates/quicproquo-gui/gen/schemas/macOS-schema.json b/crates/quicproquo-gui/gen/schemas/macOS-schema.json deleted file mode 100644 index 260dbe0..0000000 --- a/crates/quicproquo-gui/gen/schemas/macOS-schema.json +++ /dev/null @@ -1,2244 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "CapabilityFile", - "description": "Capability formats accepted in a capability file.", - "anyOf": [ - { - "description": "A single capability.", - "allOf": [ - { - "$ref": "#/definitions/Capability" - } - ] - }, - { - "description": "A list of capabilities.", - "type": "array", - "items": { - "$ref": "#/definitions/Capability" - } - }, - { - "description": "A list of capabilities.", - "type": "object", - "required": [ - "capabilities" - ], - "properties": { - "capabilities": { - "description": "The list of capabilities.", - "type": "array", - "items": { - "$ref": "#/definitions/Capability" - } - } - } - } - ], - "definitions": { - "Capability": { - "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", - "type": "object", - "required": [ - "identifier", - "permissions" - ], - "properties": { - "identifier": { - "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", - "type": "string" - }, - "description": { - "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.", - "default": "", - "type": "string" - }, - "remote": { - "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", - "anyOf": [ - { - "$ref": "#/definitions/CapabilityRemote" - }, - { - "type": "null" - } - ] - }, - "local": { - "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", - "default": true, - "type": "boolean" - }, - "windows": { - "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", - "type": "array", - "items": { - "type": "string" - } - }, - "webviews": { - "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", - "type": "array", - "items": { - "type": "string" - } - }, - "permissions": { - "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", - "type": "array", - "items": { - "$ref": "#/definitions/PermissionEntry" - }, - "uniqueItems": true - }, - "platforms": { - "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Target" - } - } - } - }, - "CapabilityRemote": { - "description": "Configuration for remote URLs that are associated with the capability.", - "type": "object", - "required": [ - "urls" - ], - "properties": { - "urls": { - "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "PermissionEntry": { - "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", - "anyOf": [ - { - "description": "Reference a permission or permission set by identifier.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - { - "description": "Reference a permission or permission set by identifier and extends its scope.", - "type": "object", - "allOf": [ - { - "properties": { - "identifier": { - "description": "Identifier of the permission or permission set.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - "allow": { - "description": "Data that defines what is allowed by the scope.", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Value" - } - }, - "deny": { - "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Value" - } - } - } - } - ], - "required": [ - "identifier" - ] - } - ] - }, - "Identifier": { - "description": "Permission identifier", - "oneOf": [ - { - "description": "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`", - "type": "string", - "const": "core:default", - "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`", - "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`" - }, - { - "description": "Enables the app_hide command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-app-hide", - "markdownDescription": "Enables the app_hide command without any pre-configured scope." - }, - { - "description": "Enables the app_show command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-app-show", - "markdownDescription": "Enables the app_show command without any pre-configured scope." - }, - { - "description": "Enables the bundle_type command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-bundle-type", - "markdownDescription": "Enables the bundle_type command without any pre-configured scope." - }, - { - "description": "Enables the default_window_icon command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-default-window-icon", - "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." - }, - { - "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-fetch-data-store-identifiers", - "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." - }, - { - "description": "Enables the identifier command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-identifier", - "markdownDescription": "Enables the identifier command without any pre-configured scope." - }, - { - "description": "Enables the name command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-name", - "markdownDescription": "Enables the name command without any pre-configured scope." - }, - { - "description": "Enables the register_listener command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-register-listener", - "markdownDescription": "Enables the register_listener command without any pre-configured scope." - }, - { - "description": "Enables the remove_data_store command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-remove-data-store", - "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." - }, - { - "description": "Enables the remove_listener command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-remove-listener", - "markdownDescription": "Enables the remove_listener command without any pre-configured scope." - }, - { - "description": "Enables the set_app_theme command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-set-app-theme", - "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." - }, - { - "description": "Enables the set_dock_visibility command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-set-dock-visibility", - "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope." - }, - { - "description": "Enables the tauri_version command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-tauri-version", - "markdownDescription": "Enables the tauri_version command without any pre-configured scope." - }, - { - "description": "Enables the version command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-version", - "markdownDescription": "Enables the version command without any pre-configured scope." - }, - { - "description": "Denies the app_hide command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-app-hide", - "markdownDescription": "Denies the app_hide command without any pre-configured scope." - }, - { - "description": "Denies the app_show command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-app-show", - "markdownDescription": "Denies the app_show command without any pre-configured scope." - }, - { - "description": "Denies the bundle_type command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-bundle-type", - "markdownDescription": "Denies the bundle_type command without any pre-configured scope." - }, - { - "description": "Denies the default_window_icon command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-default-window-icon", - "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." - }, - { - "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-fetch-data-store-identifiers", - "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." - }, - { - "description": "Denies the identifier command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-identifier", - "markdownDescription": "Denies the identifier command without any pre-configured scope." - }, - { - "description": "Denies the name command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-name", - "markdownDescription": "Denies the name command without any pre-configured scope." - }, - { - "description": "Denies the register_listener command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-register-listener", - "markdownDescription": "Denies the register_listener command without any pre-configured scope." - }, - { - "description": "Denies the remove_data_store command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-remove-data-store", - "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." - }, - { - "description": "Denies the remove_listener command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-remove-listener", - "markdownDescription": "Denies the remove_listener command without any pre-configured scope." - }, - { - "description": "Denies the set_app_theme command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-set-app-theme", - "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." - }, - { - "description": "Denies the set_dock_visibility command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-set-dock-visibility", - "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope." - }, - { - "description": "Denies the tauri_version command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-tauri-version", - "markdownDescription": "Denies the tauri_version command without any pre-configured scope." - }, - { - "description": "Denies the version command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-version", - "markdownDescription": "Denies the version 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-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", - "type": "string", - "const": "core:event:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" - }, - { - "description": "Enables the emit command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-emit", - "markdownDescription": "Enables the emit command without any pre-configured scope." - }, - { - "description": "Enables the emit_to command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-emit-to", - "markdownDescription": "Enables the emit_to command without any pre-configured scope." - }, - { - "description": "Enables the listen command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-listen", - "markdownDescription": "Enables the listen command without any pre-configured scope." - }, - { - "description": "Enables the unlisten command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-unlisten", - "markdownDescription": "Enables the unlisten command without any pre-configured scope." - }, - { - "description": "Denies the emit command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-emit", - "markdownDescription": "Denies the emit command without any pre-configured scope." - }, - { - "description": "Denies the emit_to command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-emit-to", - "markdownDescription": "Denies the emit_to command without any pre-configured scope." - }, - { - "description": "Denies the listen command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-listen", - "markdownDescription": "Denies the listen command without any pre-configured scope." - }, - { - "description": "Denies the unlisten command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-unlisten", - "markdownDescription": "Denies the unlisten 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-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", - "type": "string", - "const": "core:image:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" - }, - { - "description": "Enables the from_bytes command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-from-bytes", - "markdownDescription": "Enables the from_bytes command without any pre-configured scope." - }, - { - "description": "Enables the from_path command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-from-path", - "markdownDescription": "Enables the from_path command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the rgba command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-rgba", - "markdownDescription": "Enables the rgba command without any pre-configured scope." - }, - { - "description": "Enables the size command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-size", - "markdownDescription": "Enables the size command without any pre-configured scope." - }, - { - "description": "Denies the from_bytes command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-from-bytes", - "markdownDescription": "Denies the from_bytes command without any pre-configured scope." - }, - { - "description": "Denies the from_path command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-from-path", - "markdownDescription": "Denies the from_path command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the rgba command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-rgba", - "markdownDescription": "Denies the rgba command without any pre-configured scope." - }, - { - "description": "Denies the size command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-size", - "markdownDescription": "Denies the size 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-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", - "type": "string", - "const": "core:menu:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" - }, - { - "description": "Enables the append command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-append", - "markdownDescription": "Enables the append command without any pre-configured scope." - }, - { - "description": "Enables the create_default command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-create-default", - "markdownDescription": "Enables the create_default command without any pre-configured scope." - }, - { - "description": "Enables the get command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-get", - "markdownDescription": "Enables the get command without any pre-configured scope." - }, - { - "description": "Enables the insert command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-insert", - "markdownDescription": "Enables the insert command without any pre-configured scope." - }, - { - "description": "Enables the is_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-is-checked", - "markdownDescription": "Enables the is_checked command without any pre-configured scope." - }, - { - "description": "Enables the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-is-enabled", - "markdownDescription": "Enables the is_enabled command without any pre-configured scope." - }, - { - "description": "Enables the items command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-items", - "markdownDescription": "Enables the items command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the popup command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-popup", - "markdownDescription": "Enables the popup command without any pre-configured scope." - }, - { - "description": "Enables the prepend command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-prepend", - "markdownDescription": "Enables the prepend command without any pre-configured scope." - }, - { - "description": "Enables the remove command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-remove", - "markdownDescription": "Enables the remove command without any pre-configured scope." - }, - { - "description": "Enables the remove_at command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-remove-at", - "markdownDescription": "Enables the remove_at command without any pre-configured scope." - }, - { - "description": "Enables the set_accelerator command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-accelerator", - "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." - }, - { - "description": "Enables the set_as_app_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-app-menu", - "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-help-menu-for-nsapp", - "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Enables the set_as_window_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-window-menu", - "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-windows-menu-for-nsapp", - "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Enables the set_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-checked", - "markdownDescription": "Enables the set_checked command without any pre-configured scope." - }, - { - "description": "Enables the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-enabled", - "markdownDescription": "Enables the set_enabled command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-text", - "markdownDescription": "Enables the set_text command without any pre-configured scope." - }, - { - "description": "Enables the text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-text", - "markdownDescription": "Enables the text command without any pre-configured scope." - }, - { - "description": "Denies the append command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-append", - "markdownDescription": "Denies the append command without any pre-configured scope." - }, - { - "description": "Denies the create_default command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-create-default", - "markdownDescription": "Denies the create_default command without any pre-configured scope." - }, - { - "description": "Denies the get command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-get", - "markdownDescription": "Denies the get command without any pre-configured scope." - }, - { - "description": "Denies the insert command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-insert", - "markdownDescription": "Denies the insert command without any pre-configured scope." - }, - { - "description": "Denies the is_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-is-checked", - "markdownDescription": "Denies the is_checked command without any pre-configured scope." - }, - { - "description": "Denies the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-is-enabled", - "markdownDescription": "Denies the is_enabled command without any pre-configured scope." - }, - { - "description": "Denies the items command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-items", - "markdownDescription": "Denies the items command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the popup command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-popup", - "markdownDescription": "Denies the popup command without any pre-configured scope." - }, - { - "description": "Denies the prepend command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-prepend", - "markdownDescription": "Denies the prepend command without any pre-configured scope." - }, - { - "description": "Denies the remove command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-remove", - "markdownDescription": "Denies the remove command without any pre-configured scope." - }, - { - "description": "Denies the remove_at command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-remove-at", - "markdownDescription": "Denies the remove_at command without any pre-configured scope." - }, - { - "description": "Denies the set_accelerator command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-accelerator", - "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." - }, - { - "description": "Denies the set_as_app_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-app-menu", - "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-help-menu-for-nsapp", - "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Denies the set_as_window_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-window-menu", - "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-windows-menu-for-nsapp", - "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Denies the set_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-checked", - "markdownDescription": "Denies the set_checked command without any pre-configured scope." - }, - { - "description": "Denies the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-enabled", - "markdownDescription": "Denies the set_enabled command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-text", - "markdownDescription": "Denies the set_text command without any pre-configured scope." - }, - { - "description": "Denies the text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-text", - "markdownDescription": "Denies the text 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-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", - "type": "string", - "const": "core:path:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" - }, - { - "description": "Enables the basename command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-basename", - "markdownDescription": "Enables the basename command without any pre-configured scope." - }, - { - "description": "Enables the dirname command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-dirname", - "markdownDescription": "Enables the dirname command without any pre-configured scope." - }, - { - "description": "Enables the extname command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-extname", - "markdownDescription": "Enables the extname command without any pre-configured scope." - }, - { - "description": "Enables the is_absolute command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-is-absolute", - "markdownDescription": "Enables the is_absolute command without any pre-configured scope." - }, - { - "description": "Enables the join command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-join", - "markdownDescription": "Enables the join command without any pre-configured scope." - }, - { - "description": "Enables the normalize command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-normalize", - "markdownDescription": "Enables the normalize command without any pre-configured scope." - }, - { - "description": "Enables the resolve command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-resolve", - "markdownDescription": "Enables the resolve command without any pre-configured scope." - }, - { - "description": "Enables the resolve_directory command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-resolve-directory", - "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." - }, - { - "description": "Denies the basename command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-basename", - "markdownDescription": "Denies the basename command without any pre-configured scope." - }, - { - "description": "Denies the dirname command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-dirname", - "markdownDescription": "Denies the dirname command without any pre-configured scope." - }, - { - "description": "Denies the extname command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-extname", - "markdownDescription": "Denies the extname command without any pre-configured scope." - }, - { - "description": "Denies the is_absolute command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-is-absolute", - "markdownDescription": "Denies the is_absolute command without any pre-configured scope." - }, - { - "description": "Denies the join command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-join", - "markdownDescription": "Denies the join command without any pre-configured scope." - }, - { - "description": "Denies the normalize command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-normalize", - "markdownDescription": "Denies the normalize command without any pre-configured scope." - }, - { - "description": "Denies the resolve command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-resolve", - "markdownDescription": "Denies the resolve command without any pre-configured scope." - }, - { - "description": "Denies the resolve_directory command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-resolve-directory", - "markdownDescription": "Denies the resolve_directory 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-close`", - "type": "string", - "const": "core:resources:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" - }, - { - "description": "Enables the close command without any pre-configured scope.", - "type": "string", - "const": "core:resources:allow-close", - "markdownDescription": "Enables the close command without any pre-configured scope." - }, - { - "description": "Denies the close command without any pre-configured scope.", - "type": "string", - "const": "core:resources:deny-close", - "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`", - "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`" - }, - { - "description": "Enables the get_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-get-by-id", - "markdownDescription": "Enables the get_by_id command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the remove_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-remove-by-id", - "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_icon_as_template command without any pre-configured scope.", - "type": "string", - "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_menu command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-menu", - "markdownDescription": "Enables the set_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-show-menu-on-left-click", - "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." - }, - { - "description": "Enables the set_temp_dir_path command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-temp-dir-path", - "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." - }, - { - "description": "Enables the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-title", - "markdownDescription": "Enables the set_title command without any pre-configured scope." - }, - { - "description": "Enables the set_tooltip command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-tooltip", - "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." - }, - { - "description": "Enables the set_visible command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-visible", - "markdownDescription": "Enables the set_visible command without any pre-configured scope." - }, - { - "description": "Denies the get_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-get-by-id", - "markdownDescription": "Denies the get_by_id command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the remove_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-remove-by-id", - "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_icon_as_template command without any pre-configured scope.", - "type": "string", - "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_menu command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-menu", - "markdownDescription": "Denies the set_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-show-menu-on-left-click", - "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." - }, - { - "description": "Denies the set_temp_dir_path command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-temp-dir-path", - "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." - }, - { - "description": "Denies the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-title", - "markdownDescription": "Denies the set_title command without any pre-configured scope." - }, - { - "description": "Denies the set_tooltip command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-tooltip", - "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." - }, - { - "description": "Denies the set_visible command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-visible", - "markdownDescription": "Denies the set_visible command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", - "type": "string", - "const": "core:webview:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" - }, - { - "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-clear-all-browsing-data", - "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." - }, - { - "description": "Enables the create_webview command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-create-webview", - "markdownDescription": "Enables the create_webview command without any pre-configured scope." - }, - { - "description": "Enables the create_webview_window command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-create-webview-window", - "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." - }, - { - "description": "Enables the get_all_webviews command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-get-all-webviews", - "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." - }, - { - "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-internal-toggle-devtools", - "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." - }, - { - "description": "Enables the print command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-print", - "markdownDescription": "Enables the print command without any pre-configured scope." - }, - { - "description": "Enables the reparent command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-reparent", - "markdownDescription": "Enables the reparent command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_auto_resize command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-auto-resize", - "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-background-color", - "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_focus command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-focus", - "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-position", - "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-size", - "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_zoom command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-zoom", - "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." - }, - { - "description": "Enables the webview_close command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-close", - "markdownDescription": "Enables the webview_close command without any pre-configured scope." - }, - { - "description": "Enables the webview_hide command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-hide", - "markdownDescription": "Enables the webview_hide command without any pre-configured scope." - }, - { - "description": "Enables the webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-position", - "markdownDescription": "Enables the webview_position command without any pre-configured scope." - }, - { - "description": "Enables the webview_show command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-show", - "markdownDescription": "Enables the webview_show command without any pre-configured scope." - }, - { - "description": "Enables the webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-size", - "markdownDescription": "Enables the webview_size command without any pre-configured scope." - }, - { - "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-clear-all-browsing-data", - "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." - }, - { - "description": "Denies the create_webview command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-create-webview", - "markdownDescription": "Denies the create_webview command without any pre-configured scope." - }, - { - "description": "Denies the create_webview_window command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-create-webview-window", - "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." - }, - { - "description": "Denies the get_all_webviews command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-get-all-webviews", - "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." - }, - { - "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-internal-toggle-devtools", - "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." - }, - { - "description": "Denies the print command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-print", - "markdownDescription": "Denies the print command without any pre-configured scope." - }, - { - "description": "Denies the reparent command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-reparent", - "markdownDescription": "Denies the reparent command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_auto_resize command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-auto-resize", - "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-background-color", - "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_focus command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-focus", - "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-position", - "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-size", - "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_zoom command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-zoom", - "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." - }, - { - "description": "Denies the webview_close command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-close", - "markdownDescription": "Denies the webview_close command without any pre-configured scope." - }, - { - "description": "Denies the webview_hide command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-hide", - "markdownDescription": "Denies the webview_hide command without any pre-configured scope." - }, - { - "description": "Denies the webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-position", - "markdownDescription": "Denies the webview_position command without any pre-configured scope." - }, - { - "description": "Denies the webview_show command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-show", - "markdownDescription": "Denies the webview_show command without any pre-configured scope." - }, - { - "description": "Denies the webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-size", - "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`", - "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`" - }, - { - "description": "Enables the available_monitors command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-available-monitors", - "markdownDescription": "Enables the available_monitors command without any pre-configured scope." - }, - { - "description": "Enables the center command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-center", - "markdownDescription": "Enables the center command without any pre-configured scope." - }, - { - "description": "Enables the close command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-close", - "markdownDescription": "Enables the close command without any pre-configured scope." - }, - { - "description": "Enables the create command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-create", - "markdownDescription": "Enables the create command without any pre-configured scope." - }, - { - "description": "Enables the current_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-current-monitor", - "markdownDescription": "Enables the current_monitor command without any pre-configured scope." - }, - { - "description": "Enables the cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-cursor-position", - "markdownDescription": "Enables the cursor_position command without any pre-configured scope." - }, - { - "description": "Enables the destroy command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-destroy", - "markdownDescription": "Enables the destroy command without any pre-configured scope." - }, - { - "description": "Enables the get_all_windows command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-get-all-windows", - "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." - }, - { - "description": "Enables the hide command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-hide", - "markdownDescription": "Enables the hide command without any pre-configured scope." - }, - { - "description": "Enables the inner_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-inner-position", - "markdownDescription": "Enables the inner_position command without any pre-configured scope." - }, - { - "description": "Enables the inner_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-inner-size", - "markdownDescription": "Enables the inner_size command without any pre-configured scope." - }, - { - "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-internal-toggle-maximize", - "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." - }, - { - "description": "Enables the is_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-always-on-top", - "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." - }, - { - "description": "Enables the is_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-closable", - "markdownDescription": "Enables the is_closable command without any pre-configured scope." - }, - { - "description": "Enables the is_decorated command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-decorated", - "markdownDescription": "Enables the is_decorated command without any pre-configured scope." - }, - { - "description": "Enables the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-enabled", - "markdownDescription": "Enables the is_enabled command without any pre-configured scope." - }, - { - "description": "Enables the is_focused command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-focused", - "markdownDescription": "Enables the is_focused command without any pre-configured scope." - }, - { - "description": "Enables the is_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-fullscreen", - "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the is_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-maximizable", - "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." - }, - { - "description": "Enables the is_maximized command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-maximized", - "markdownDescription": "Enables the is_maximized command without any pre-configured scope." - }, - { - "description": "Enables the is_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-minimizable", - "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." - }, - { - "description": "Enables the is_minimized command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-minimized", - "markdownDescription": "Enables the is_minimized command without any pre-configured scope." - }, - { - "description": "Enables the is_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-resizable", - "markdownDescription": "Enables the is_resizable command without any pre-configured scope." - }, - { - "description": "Enables the is_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-visible", - "markdownDescription": "Enables the is_visible command without any pre-configured scope." - }, - { - "description": "Enables the maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-maximize", - "markdownDescription": "Enables the maximize command without any pre-configured scope." - }, - { - "description": "Enables the minimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-minimize", - "markdownDescription": "Enables the minimize command without any pre-configured scope." - }, - { - "description": "Enables the monitor_from_point command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-monitor-from-point", - "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." - }, - { - "description": "Enables the outer_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-outer-position", - "markdownDescription": "Enables the outer_position command without any pre-configured scope." - }, - { - "description": "Enables the outer_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-outer-size", - "markdownDescription": "Enables the outer_size command without any pre-configured scope." - }, - { - "description": "Enables the primary_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-primary-monitor", - "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." - }, - { - "description": "Enables the request_user_attention command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-request-user-attention", - "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." - }, - { - "description": "Enables the scale_factor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-scale-factor", - "markdownDescription": "Enables the scale_factor command without any pre-configured scope." - }, - { - "description": "Enables the set_always_on_bottom command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-always-on-bottom", - "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." - }, - { - "description": "Enables the set_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-always-on-top", - "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." - }, - { - "description": "Enables the set_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-background-color", - "markdownDescription": "Enables the set_background_color command without any pre-configured scope." - }, - { - "description": "Enables the set_badge_count command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-badge-count", - "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." - }, - { - "description": "Enables the set_badge_label command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-badge-label", - "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." - }, - { - "description": "Enables the set_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-closable", - "markdownDescription": "Enables the set_closable command without any pre-configured scope." - }, - { - "description": "Enables the set_content_protected command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-content-protected", - "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_grab command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-grab", - "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-icon", - "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-position", - "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-visible", - "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." - }, - { - "description": "Enables the set_decorations command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-decorations", - "markdownDescription": "Enables the set_decorations command without any pre-configured scope." - }, - { - "description": "Enables the set_effects command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-effects", - "markdownDescription": "Enables the set_effects command without any pre-configured scope." - }, - { - "description": "Enables the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-enabled", - "markdownDescription": "Enables the set_enabled command without any pre-configured scope." - }, - { - "description": "Enables the set_focus command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-focus", - "markdownDescription": "Enables the set_focus command without any pre-configured scope." - }, - { - "description": "Enables the set_focusable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-focusable", - "markdownDescription": "Enables the set_focusable command without any pre-configured scope." - }, - { - "description": "Enables the set_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-fullscreen", - "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-ignore-cursor-events", - "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." - }, - { - "description": "Enables the set_max_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-max-size", - "markdownDescription": "Enables the set_max_size command without any pre-configured scope." - }, - { - "description": "Enables the set_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-maximizable", - "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." - }, - { - "description": "Enables the set_min_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-min-size", - "markdownDescription": "Enables the set_min_size command without any pre-configured scope." - }, - { - "description": "Enables the set_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-minimizable", - "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." - }, - { - "description": "Enables the set_overlay_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-overlay-icon", - "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-position", - "markdownDescription": "Enables the set_position command without any pre-configured scope." - }, - { - "description": "Enables the set_progress_bar command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-progress-bar", - "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." - }, - { - "description": "Enables the set_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-resizable", - "markdownDescription": "Enables the set_resizable command without any pre-configured scope." - }, - { - "description": "Enables the set_shadow command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-shadow", - "markdownDescription": "Enables the set_shadow command without any pre-configured scope." - }, - { - "description": "Enables the set_simple_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-simple-fullscreen", - "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the set_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-size", - "markdownDescription": "Enables the set_size command without any pre-configured scope." - }, - { - "description": "Enables the set_size_constraints command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-size-constraints", - "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." - }, - { - "description": "Enables the set_skip_taskbar command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-skip-taskbar", - "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." - }, - { - "description": "Enables the set_theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-theme", - "markdownDescription": "Enables the set_theme command without any pre-configured scope." - }, - { - "description": "Enables the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-title", - "markdownDescription": "Enables the set_title command without any pre-configured scope." - }, - { - "description": "Enables the set_title_bar_style command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-title-bar-style", - "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." - }, - { - "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-visible-on-all-workspaces", - "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." - }, - { - "description": "Enables the show command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-show", - "markdownDescription": "Enables the show command without any pre-configured scope." - }, - { - "description": "Enables the start_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-start-dragging", - "markdownDescription": "Enables the start_dragging command without any pre-configured scope." - }, - { - "description": "Enables the start_resize_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-start-resize-dragging", - "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." - }, - { - "description": "Enables the theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-theme", - "markdownDescription": "Enables the theme command without any pre-configured scope." - }, - { - "description": "Enables the title command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-title", - "markdownDescription": "Enables the title command without any pre-configured scope." - }, - { - "description": "Enables the toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-toggle-maximize", - "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." - }, - { - "description": "Enables the unmaximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-unmaximize", - "markdownDescription": "Enables the unmaximize command without any pre-configured scope." - }, - { - "description": "Enables the unminimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-unminimize", - "markdownDescription": "Enables the unminimize command without any pre-configured scope." - }, - { - "description": "Denies the available_monitors command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-available-monitors", - "markdownDescription": "Denies the available_monitors command without any pre-configured scope." - }, - { - "description": "Denies the center command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-center", - "markdownDescription": "Denies the center command without any pre-configured scope." - }, - { - "description": "Denies the close command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-close", - "markdownDescription": "Denies the close command without any pre-configured scope." - }, - { - "description": "Denies the create command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-create", - "markdownDescription": "Denies the create command without any pre-configured scope." - }, - { - "description": "Denies the current_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-current-monitor", - "markdownDescription": "Denies the current_monitor command without any pre-configured scope." - }, - { - "description": "Denies the cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-cursor-position", - "markdownDescription": "Denies the cursor_position command without any pre-configured scope." - }, - { - "description": "Denies the destroy command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-destroy", - "markdownDescription": "Denies the destroy command without any pre-configured scope." - }, - { - "description": "Denies the get_all_windows command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-get-all-windows", - "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." - }, - { - "description": "Denies the hide command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-hide", - "markdownDescription": "Denies the hide command without any pre-configured scope." - }, - { - "description": "Denies the inner_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-inner-position", - "markdownDescription": "Denies the inner_position command without any pre-configured scope." - }, - { - "description": "Denies the inner_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-inner-size", - "markdownDescription": "Denies the inner_size command without any pre-configured scope." - }, - { - "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-internal-toggle-maximize", - "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." - }, - { - "description": "Denies the is_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-always-on-top", - "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." - }, - { - "description": "Denies the is_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-closable", - "markdownDescription": "Denies the is_closable command without any pre-configured scope." - }, - { - "description": "Denies the is_decorated command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-decorated", - "markdownDescription": "Denies the is_decorated command without any pre-configured scope." - }, - { - "description": "Denies the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-enabled", - "markdownDescription": "Denies the is_enabled command without any pre-configured scope." - }, - { - "description": "Denies the is_focused command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-focused", - "markdownDescription": "Denies the is_focused command without any pre-configured scope." - }, - { - "description": "Denies the is_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-fullscreen", - "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the is_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-maximizable", - "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." - }, - { - "description": "Denies the is_maximized command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-maximized", - "markdownDescription": "Denies the is_maximized command without any pre-configured scope." - }, - { - "description": "Denies the is_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-minimizable", - "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." - }, - { - "description": "Denies the is_minimized command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-minimized", - "markdownDescription": "Denies the is_minimized command without any pre-configured scope." - }, - { - "description": "Denies the is_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-resizable", - "markdownDescription": "Denies the is_resizable command without any pre-configured scope." - }, - { - "description": "Denies the is_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-visible", - "markdownDescription": "Denies the is_visible command without any pre-configured scope." - }, - { - "description": "Denies the maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-maximize", - "markdownDescription": "Denies the maximize command without any pre-configured scope." - }, - { - "description": "Denies the minimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-minimize", - "markdownDescription": "Denies the minimize command without any pre-configured scope." - }, - { - "description": "Denies the monitor_from_point command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-monitor-from-point", - "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." - }, - { - "description": "Denies the outer_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-outer-position", - "markdownDescription": "Denies the outer_position command without any pre-configured scope." - }, - { - "description": "Denies the outer_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-outer-size", - "markdownDescription": "Denies the outer_size command without any pre-configured scope." - }, - { - "description": "Denies the primary_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-primary-monitor", - "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." - }, - { - "description": "Denies the request_user_attention command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-request-user-attention", - "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." - }, - { - "description": "Denies the scale_factor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-scale-factor", - "markdownDescription": "Denies the scale_factor command without any pre-configured scope." - }, - { - "description": "Denies the set_always_on_bottom command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-always-on-bottom", - "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." - }, - { - "description": "Denies the set_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-always-on-top", - "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." - }, - { - "description": "Denies the set_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-background-color", - "markdownDescription": "Denies the set_background_color command without any pre-configured scope." - }, - { - "description": "Denies the set_badge_count command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-badge-count", - "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." - }, - { - "description": "Denies the set_badge_label command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-badge-label", - "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." - }, - { - "description": "Denies the set_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-closable", - "markdownDescription": "Denies the set_closable command without any pre-configured scope." - }, - { - "description": "Denies the set_content_protected command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-content-protected", - "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_grab command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-grab", - "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-icon", - "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-position", - "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-visible", - "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." - }, - { - "description": "Denies the set_decorations command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-decorations", - "markdownDescription": "Denies the set_decorations command without any pre-configured scope." - }, - { - "description": "Denies the set_effects command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-effects", - "markdownDescription": "Denies the set_effects command without any pre-configured scope." - }, - { - "description": "Denies the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-enabled", - "markdownDescription": "Denies the set_enabled command without any pre-configured scope." - }, - { - "description": "Denies the set_focus command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-focus", - "markdownDescription": "Denies the set_focus command without any pre-configured scope." - }, - { - "description": "Denies the set_focusable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-focusable", - "markdownDescription": "Denies the set_focusable command without any pre-configured scope." - }, - { - "description": "Denies the set_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-fullscreen", - "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-ignore-cursor-events", - "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." - }, - { - "description": "Denies the set_max_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-max-size", - "markdownDescription": "Denies the set_max_size command without any pre-configured scope." - }, - { - "description": "Denies the set_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-maximizable", - "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." - }, - { - "description": "Denies the set_min_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-min-size", - "markdownDescription": "Denies the set_min_size command without any pre-configured scope." - }, - { - "description": "Denies the set_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-minimizable", - "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." - }, - { - "description": "Denies the set_overlay_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-overlay-icon", - "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-position", - "markdownDescription": "Denies the set_position command without any pre-configured scope." - }, - { - "description": "Denies the set_progress_bar command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-progress-bar", - "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." - }, - { - "description": "Denies the set_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-resizable", - "markdownDescription": "Denies the set_resizable command without any pre-configured scope." - }, - { - "description": "Denies the set_shadow command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-shadow", - "markdownDescription": "Denies the set_shadow command without any pre-configured scope." - }, - { - "description": "Denies the set_simple_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-simple-fullscreen", - "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the set_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-size", - "markdownDescription": "Denies the set_size command without any pre-configured scope." - }, - { - "description": "Denies the set_size_constraints command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-size-constraints", - "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." - }, - { - "description": "Denies the set_skip_taskbar command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-skip-taskbar", - "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." - }, - { - "description": "Denies the set_theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-theme", - "markdownDescription": "Denies the set_theme command without any pre-configured scope." - }, - { - "description": "Denies the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-title", - "markdownDescription": "Denies the set_title command without any pre-configured scope." - }, - { - "description": "Denies the set_title_bar_style command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-title-bar-style", - "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." - }, - { - "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-visible-on-all-workspaces", - "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." - }, - { - "description": "Denies the show command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-show", - "markdownDescription": "Denies the show command without any pre-configured scope." - }, - { - "description": "Denies the start_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-start-dragging", - "markdownDescription": "Denies the start_dragging command without any pre-configured scope." - }, - { - "description": "Denies the start_resize_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-start-resize-dragging", - "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." - }, - { - "description": "Denies the theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-theme", - "markdownDescription": "Denies the theme command without any pre-configured scope." - }, - { - "description": "Denies the title command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-title", - "markdownDescription": "Denies the title command without any pre-configured scope." - }, - { - "description": "Denies the toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-toggle-maximize", - "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." - }, - { - "description": "Denies the unmaximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-unmaximize", - "markdownDescription": "Denies the unmaximize command without any pre-configured scope." - }, - { - "description": "Denies the unminimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-unminimize", - "markdownDescription": "Denies the unminimize command without any pre-configured scope." - } - ] - }, - "Value": { - "description": "All supported ACL values.", - "anyOf": [ - { - "description": "Represents a null JSON value.", - "type": "null" - }, - { - "description": "Represents a [`bool`].", - "type": "boolean" - }, - { - "description": "Represents a valid ACL [`Number`].", - "allOf": [ - { - "$ref": "#/definitions/Number" - } - ] - }, - { - "description": "Represents a [`String`].", - "type": "string" - }, - { - "description": "Represents a list of other [`Value`]s.", - "type": "array", - "items": { - "$ref": "#/definitions/Value" - } - }, - { - "description": "Represents a map of [`String`] keys to [`Value`]s.", - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Value" - } - } - ] - }, - "Number": { - "description": "A valid ACL number.", - "anyOf": [ - { - "description": "Represents an [`i64`].", - "type": "integer", - "format": "int64" - }, - { - "description": "Represents a [`f64`].", - "type": "number", - "format": "double" - } - ] - }, - "Target": { - "description": "Platform target.", - "oneOf": [ - { - "description": "MacOS.", - "type": "string", - "enum": [ - "macOS" - ] - }, - { - "description": "Windows.", - "type": "string", - "enum": [ - "windows" - ] - }, - { - "description": "Linux.", - "type": "string", - "enum": [ - "linux" - ] - }, - { - "description": "Android.", - "type": "string", - "enum": [ - "android" - ] - }, - { - "description": "iOS.", - "type": "string", - "enum": [ - "iOS" - ] - } - ] - } - } -} \ No newline at end of file diff --git a/crates/quicproquo-gui/icons/icon.png b/crates/quicproquo-gui/icons/icon.png deleted file mode 100644 index b218cf33737dda4541810f55038411b67f4d063f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2200 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4YzZe)e;yqm)Ln`LHy{5>>puljz z;M2su9+5^d1v|s~pN7}%7#vRjkY!-llg_}PaDsusVFDvVg90-HgCo$0CLRU`7D=EP zMhpxBDWeKT!(lW%jOL5c@?o@`9IXyUt3^ojAU0iT@l{!UwPs+8gTd3)&t;ucLK6To Cy&53^ diff --git a/crates/quicproquo-gui/src/backend.rs b/crates/quicproquo-gui/src/backend.rs deleted file mode 100644 index f697655..0000000 --- a/crates/quicproquo-gui/src/backend.rs +++ /dev/null @@ -1,86 +0,0 @@ -//! Backend service running on a dedicated thread with a tokio LocalSet. -//! -//! All server-facing work (capnp-rpc, node_service::Client) is !Send and must run on this -//! single thread. The UI thread sends commands over a channel; this thread runs -//! `LocalSet::run_until` for each request and sends the result back. - -use std::path::PathBuf; -use std::sync::mpsc; -use std::thread; - -use tokio::runtime::Builder; -use tokio::task::LocalSet; - -use quicproquo_client::{cmd_health_json, whoami_json}; - -/// Commands the UI can send to the backend thread. -pub enum BackendCommand { - Whoami { - state_path: String, - password: Option, - }, - Health { - server: String, - ca_cert: PathBuf, - server_name: String, - }, -} - -/// Response sent back to the UI. -pub type BackendResponse = Result; - -/// Spawn the backend thread and return a sender to post commands and a join handle. -/// The backend runs a tokio LocalSet and processes one command at a time: -/// for each received command it runs `LocalSet::run_until(future)` (for async commands) -/// or runs sync code (whoami), then sends the result on the provided reply channel. -pub fn spawn_backend() -> (mpsc::Sender<(BackendCommand, mpsc::Sender)>, thread::JoinHandle<()>) { - let (tx, rx) = mpsc::channel::<(BackendCommand, mpsc::Sender)>(); - - let handle = thread::spawn(move || { - let rt = Builder::new_current_thread() - .enable_all() - .build() - .expect("backend tokio runtime"); - let local = LocalSet::new(); - - while let Ok((cmd, reply_tx)) = rx.recv() { - let result = run_command(&local, &rt, cmd); - let _ = reply_tx.send(result); - } - }); - - (tx, handle) -} - -fn run_command( - local: &LocalSet, - rt: &tokio::runtime::Runtime, - cmd: BackendCommand, -) -> BackendResponse { - match cmd { - BackendCommand::Whoami { state_path, password } => { - let path = PathBuf::from(&state_path); - whoami_json(&path, password.as_deref()).map_err(|e| e.to_string()) - } - BackendCommand::Health { - server, - ca_cert, - server_name, - } => { - // Request-response: we run LocalSet::run_until for this single request so capnp-rpc - // and connect_node stay on this thread (!Send). - let fut = cmd_health_json(&server, &ca_cert, &server_name); - rt.block_on(local.run_until(fut)).map_err(|e| e.to_string()) - } - } -} - -/// Default CA cert path (relative to cwd or absolute); same default as CLI. -pub fn default_ca_cert() -> PathBuf { - PathBuf::from("data/server-cert.der") -} - -/// Default TLS server name. -pub fn default_server_name() -> String { - "localhost".to_string() -} diff --git a/crates/quicproquo-gui/src/lib.rs b/crates/quicproquo-gui/src/lib.rs deleted file mode 100644 index de44430..0000000 --- a/crates/quicproquo-gui/src/lib.rs +++ /dev/null @@ -1,76 +0,0 @@ -//! quicproquo native GUI (Tauri 2). -//! -//! The backend runs on a dedicated thread with a tokio LocalSet; all server-facing -//! work (capnp-rpc, node_service::Client) is dispatched there. Tauri commands -//! block on the request-response channel until the backend returns. - -mod backend; - -use std::path::PathBuf; -use std::sync::mpsc; - -use backend::{spawn_backend, BackendCommand}; - -/// Shared state: sender to the backend thread. -struct BackendState { - tx: mpsc::Sender<(BackendCommand, mpsc::Sender)>, -} - -/// Runs whoami on the backend thread and returns JSON string (identity_key, fingerprint, etc.). -#[tauri::command] -fn whoami( - state: tauri::State, - state_path: String, - password: Option, -) -> Result { - let (reply_tx, reply_rx) = mpsc::channel(); - state - .tx - .send(( - BackendCommand::Whoami { - state_path, - password, - }, - reply_tx, - )) - .map_err(|e| e.to_string())?; - reply_rx.recv().map_err(|e| e.to_string())? -} - -/// Runs health check on the backend thread (LocalSet::run_until) and returns status JSON. -#[tauri::command] -fn health( - state: tauri::State, - server: String, - ca_cert: Option, - server_name: Option, -) -> Result { - let ca_cert = ca_cert - .map(PathBuf::from) - .unwrap_or_else(backend::default_ca_cert); - let server_name = server_name.unwrap_or_else(backend::default_server_name); - let (reply_tx, reply_rx) = mpsc::channel(); - state - .tx - .send(( - BackendCommand::Health { - server, - ca_cert, - server_name, - }, - reply_tx, - )) - .map_err(|e| e.to_string())?; - reply_rx.recv().map_err(|e| e.to_string())? -} - -#[cfg_attr(mobile, tauri::mobile_entry_point)] -pub fn run() { - let (backend_tx, _backend_handle) = spawn_backend(); - - tauri::Builder::default() - .manage(BackendState { tx: backend_tx }) - .invoke_handler(tauri::generate_handler![whoami, health]) - .run(tauri::generate_context!()) - .expect("error while running tauri application"); -} diff --git a/crates/quicproquo-gui/src/main.rs b/crates/quicproquo-gui/src/main.rs deleted file mode 100644 index c0fa2de..0000000 --- a/crates/quicproquo-gui/src/main.rs +++ /dev/null @@ -1,5 +0,0 @@ -//! Desktop entry point for quicproquo-gui. - -fn main() { - quicproquo_gui::run() -} diff --git a/crates/quicproquo-gui/tauri.conf.json b/crates/quicproquo-gui/tauri.conf.json deleted file mode 100644 index 47d1072..0000000 --- a/crates/quicproquo-gui/tauri.conf.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "$schema": "https://schema.tauri.app/config/2", - "productName": "qpq-gui", - "identifier": "chat.quicproquo.gui", - "build": { - "frontendDist": "./ui", - "beforeBuildCommand": "", - "beforeDevCommand": "" - }, - "app": { - "windows": [ - { - "title": "quicproquo", - "width": 640, - "height": 480 - } - ], - "security": { - "csp": null - } - }, - "bundle": {}, - "plugins": {} -} diff --git a/crates/quicproquo-gui/ui/index.html b/crates/quicproquo-gui/ui/index.html deleted file mode 100644 index cc57738..0000000 --- a/crates/quicproquo-gui/ui/index.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - quicproquo - - - -

                          quicproquo

                          -

                          - - -

                          - -
                          - -
                          Click Whoami or Health. Results appear here.
                          - - - - diff --git a/crates/quicproquo-mobile/Cargo.toml b/crates/quicproquo-mobile/Cargo.toml deleted file mode 100644 index 1759a45..0000000 --- a/crates/quicproquo-mobile/Cargo.toml +++ /dev/null @@ -1,32 +0,0 @@ -[package] -name = "quicproquo-mobile" -version = "0.1.0" -edition = "2021" -description = "C FFI layer for quicproquo, proving QUIC connection migration." -license = "MIT" - -[features] -default = [] -# Enable SkipServerVerification for development/testing only. -# NEVER enable in production — this disables TLS certificate validation. -insecure-dev = [] - -[lib] -crate-type = ["staticlib", "cdylib", "rlib"] - -[dependencies] -# Async -tokio = { workspace = true } - -# QUIC -quinn = { workspace = true } -rustls = { workspace = true } - -# TLS root certificates (used when insecure-dev is NOT enabled) -webpki-roots = "0.26" - -# Error handling -anyhow = { workspace = true } - -[dev-dependencies] -rcgen = { workspace = true } diff --git a/crates/quicproquo-mobile/src/lib.rs b/crates/quicproquo-mobile/src/lib.rs deleted file mode 100644 index 02abf86..0000000 --- a/crates/quicproquo-mobile/src/lib.rs +++ /dev/null @@ -1,433 +0,0 @@ -//! quicproquo-mobile — C FFI layer for mobile integration. -//! -//! Provides a minimal C API that proves QUIC connection migration works -//! (wifi → cellular handoff without message loss). Each FFI function uses -//! `runtime.block_on(local.run_until(...))` to satisfy capnp-rpc's `!Send` -//! requirement. -//! -//! # Safety -//! -//! All FFI functions are `unsafe extern "C"` — callers must ensure pointers -//! are valid and buffers are correctly sized. - -use std::ffi::c_char; -use std::net::SocketAddr; -use std::sync::Arc; - -use quinn::Endpoint; -use tokio::runtime::Runtime; - -/// Opaque handle returned by `qnpc_connect`. -#[allow(dead_code)] -pub struct MobileHandle { - runtime: Runtime, - endpoint: Endpoint, - connection: Option, - server_addr: SocketAddr, - server_name: String, -} - -/// Status codes returned by FFI functions. -#[repr(C)] -pub enum QnpcStatus { - Ok = 0, - Error = 1, - Timeout = 2, - NotConnected = 3, -} - -/// Connect to a quicproquo server. Returns a handle pointer (null on failure). -/// -/// # Safety -/// `server_addr` and `server_name` must be valid null-terminated C strings. -#[no_mangle] -pub unsafe extern "C" fn qnpc_connect( - server_addr: *const c_char, - server_name: *const c_char, -) -> *mut MobileHandle { - let addr_str = match std::ffi::CStr::from_ptr(server_addr).to_str() { - Ok(s) => s, - Err(_) => return std::ptr::null_mut(), - }; - let name_str = match std::ffi::CStr::from_ptr(server_name).to_str() { - Ok(s) => s, - Err(_) => return std::ptr::null_mut(), - }; - - let addr: SocketAddr = match addr_str.parse() { - Ok(a) => a, - Err(_) => return std::ptr::null_mut(), - }; - - let rt = match Runtime::new() { - Ok(r) => r, - Err(_) => return std::ptr::null_mut(), - }; - - let result = rt.block_on(async { - connect_inner(addr, name_str).await - }); - - match result { - Ok((endpoint, connection)) => { - let handle = Box::new(MobileHandle { - runtime: rt, - endpoint, - connection: Some(connection), - server_addr: addr, - server_name: name_str.to_string(), - }); - Box::into_raw(handle) - } - Err(_) => std::ptr::null_mut(), - } -} - -async fn connect_inner( - addr: SocketAddr, - server_name: &str, -) -> anyhow::Result<(Endpoint, quinn::Connection)> { - let _ = rustls::crypto::ring::default_provider().install_default(); - - let crypto = build_client_tls_config()?; - - let mut client_config = quinn::ClientConfig::new(Arc::new( - quinn::crypto::rustls::QuicClientConfig::try_from(crypto) - .map_err(|e| anyhow::anyhow!("QUIC client config: {e}"))?, - )); - - let mut transport = quinn::TransportConfig::default(); - transport.max_idle_timeout(Some( - std::time::Duration::from_secs(120) - .try_into() - .expect("120s valid"), - )); - client_config.transport_config(Arc::new(transport)); - - let mut endpoint = Endpoint::client("0.0.0.0:0".parse().unwrap())?; - endpoint.set_default_client_config(client_config); - - let connection = endpoint.connect(addr, server_name)?.await?; - Ok((endpoint, connection)) -} - -/// Simulate QUIC connection migration by rebinding the endpoint to a new local address. -/// -/// This is the key proof-of-concept: after rebind, the QUIC connection survives -/// and messages continue flowing without loss. -/// -/// # Safety -/// `handle` must be a valid pointer from `qnpc_connect`. -#[no_mangle] -pub unsafe extern "C" fn qnpc_migrate( - handle: *mut MobileHandle, - new_port: u16, -) -> QnpcStatus { - let handle = match handle.as_mut() { - Some(h) => h, - None => return QnpcStatus::Error, - }; - - let new_addr: SocketAddr = format!("0.0.0.0:{new_port}").parse().unwrap(); - let socket = match std::net::UdpSocket::bind(new_addr) { - Ok(s) => s, - Err(_) => return QnpcStatus::Error, - }; - - match handle.endpoint.rebind(socket) { - Ok(_) => QnpcStatus::Ok, - Err(_) => QnpcStatus::Error, - } -} - -/// Disconnect and free the handle. -/// -/// # Safety -/// `handle` must be a valid pointer from `qnpc_connect`, and must not be used after this call. -#[no_mangle] -pub unsafe extern "C" fn qnpc_disconnect(handle: *mut MobileHandle) { - if !handle.is_null() { - let handle = Box::from_raw(handle); - if let Some(conn) = &handle.connection { - conn.close(0u32.into(), b"disconnect"); - } - drop(handle); - } -} - -// ── TLS configuration ─────────────────────────────────────────────────────── - -/// Build the rustls `ClientConfig` for the QUIC transport. -/// -/// Without the `insecure-dev` feature, this uses the platform's native root -/// certificates for server verification. With `insecure-dev` enabled, all -/// certificate verification is skipped (MITM-vulnerable — dev/testing only). -fn build_client_tls_config() -> anyhow::Result { - #[cfg(feature = "insecure-dev")] - { - Ok(rustls::ClientConfig::builder() - .dangerous() - .with_custom_certificate_verifier(Arc::new(SkipServerVerification)) - .with_no_client_auth()) - } - #[cfg(not(feature = "insecure-dev"))] - { - let mut root_store = rustls::RootCertStore::empty(); - root_store.extend(webpki_roots::TLS_SERVER_ROOTS.iter().cloned()); - Ok(rustls::ClientConfig::builder() - .with_root_certificates(root_store) - .with_no_client_auth()) - } -} - -#[cfg(feature = "insecure-dev")] -#[derive(Debug)] -struct SkipServerVerification; - -#[cfg(feature = "insecure-dev")] -impl rustls::client::danger::ServerCertVerifier for SkipServerVerification { - fn verify_server_cert( - &self, - _end_entity: &rustls::pki_types::CertificateDer<'_>, - _intermediates: &[rustls::pki_types::CertificateDer<'_>], - _server_name: &rustls::pki_types::ServerName<'_>, - _ocsp_response: &[u8], - _now: rustls::pki_types::UnixTime, - ) -> Result { - Ok(rustls::client::danger::ServerCertVerified::assertion()) - } - - fn verify_tls12_signature( - &self, - _message: &[u8], - _cert: &rustls::pki_types::CertificateDer<'_>, - _dss: &rustls::DigitallySignedStruct, - ) -> Result { - Ok(rustls::client::danger::HandshakeSignatureValid::assertion()) - } - - fn verify_tls13_signature( - &self, - _message: &[u8], - _cert: &rustls::pki_types::CertificateDer<'_>, - _dss: &rustls::DigitallySignedStruct, - ) -> Result { - Ok(rustls::client::danger::HandshakeSignatureValid::assertion()) - } - - fn supported_verify_schemes(&self) -> Vec { - vec![ - rustls::SignatureScheme::ECDSA_NISTP256_SHA256, - rustls::SignatureScheme::ECDSA_NISTP384_SHA384, - rustls::SignatureScheme::ED25519, - rustls::SignatureScheme::RSA_PSS_SHA256, - rustls::SignatureScheme::RSA_PSS_SHA384, - rustls::SignatureScheme::RSA_PSS_SHA512, - rustls::SignatureScheme::RSA_PKCS1_SHA256, - rustls::SignatureScheme::RSA_PKCS1_SHA384, - rustls::SignatureScheme::RSA_PKCS1_SHA512, - ] - } -} - -// ── Tests ─────────────────────────────────────────────────────────────────── - -#[cfg(test)] -mod tests { - use super::*; - use std::net::UdpSocket; - - /// Test-only insecure verifier (always available in test builds). - #[derive(Debug)] - struct TestSkipServerVerification; - - impl rustls::client::danger::ServerCertVerifier for TestSkipServerVerification { - fn verify_server_cert( - &self, - _end_entity: &rustls::pki_types::CertificateDer<'_>, - _intermediates: &[rustls::pki_types::CertificateDer<'_>], - _server_name: &rustls::pki_types::ServerName<'_>, - _ocsp_response: &[u8], - _now: rustls::pki_types::UnixTime, - ) -> Result { - Ok(rustls::client::danger::ServerCertVerified::assertion()) - } - - fn verify_tls12_signature( - &self, - _message: &[u8], - _cert: &rustls::pki_types::CertificateDer<'_>, - _dss: &rustls::DigitallySignedStruct, - ) -> Result { - Ok(rustls::client::danger::HandshakeSignatureValid::assertion()) - } - - fn verify_tls13_signature( - &self, - _message: &[u8], - _cert: &rustls::pki_types::CertificateDer<'_>, - _dss: &rustls::DigitallySignedStruct, - ) -> Result { - Ok(rustls::client::danger::HandshakeSignatureValid::assertion()) - } - - fn supported_verify_schemes(&self) -> Vec { - vec![ - rustls::SignatureScheme::ECDSA_NISTP256_SHA256, - rustls::SignatureScheme::ECDSA_NISTP384_SHA384, - rustls::SignatureScheme::ED25519, - rustls::SignatureScheme::RSA_PSS_SHA256, - rustls::SignatureScheme::RSA_PSS_SHA384, - rustls::SignatureScheme::RSA_PSS_SHA512, - rustls::SignatureScheme::RSA_PKCS1_SHA256, - rustls::SignatureScheme::RSA_PKCS1_SHA384, - rustls::SignatureScheme::RSA_PKCS1_SHA512, - ] - } - } - - /// Connect to a test server using the insecure cert verifier. - async fn test_connect_inner( - addr: SocketAddr, - server_name: &str, - ) -> anyhow::Result<(Endpoint, quinn::Connection)> { - let _ = rustls::crypto::ring::default_provider().install_default(); - - let crypto = rustls::ClientConfig::builder() - .dangerous() - .with_custom_certificate_verifier(Arc::new(TestSkipServerVerification)) - .with_no_client_auth(); - - let mut client_config = quinn::ClientConfig::new(Arc::new( - quinn::crypto::rustls::QuicClientConfig::try_from(crypto) - .map_err(|e| anyhow::anyhow!("QUIC client config: {e}"))?, - )); - - let mut transport = quinn::TransportConfig::default(); - transport.max_idle_timeout(Some( - std::time::Duration::from_secs(120) - .try_into() - .expect("120s valid"), - )); - client_config.transport_config(Arc::new(transport)); - - let mut endpoint = Endpoint::client("0.0.0.0:0".parse().unwrap())?; - endpoint.set_default_client_config(client_config); - - let connection = endpoint.connect(addr, server_name)?.await?; - Ok((endpoint, connection)) - } - - /// Prove QUIC connection migration: connect, send messages, rebind the - /// UDP socket (simulating wifi→cellular), send more messages, verify - /// all messages arrive. - #[test] - fn quic_connection_migration() { - let _ = rustls::crypto::ring::default_provider().install_default(); - - let rt = Runtime::new().unwrap(); - rt.block_on(async { - // Start an in-process echo server. - let server_addr = start_echo_server().await; - - // Connect client using test-only insecure verifier. - let (endpoint, connection) = test_connect_inner(server_addr, "localhost") - .await - .expect("connect"); - - // Send 5 messages before migration. - for i in 0..5u32 { - let (mut send, mut recv) = connection.open_bi().await.unwrap(); - let msg = format!("pre-migrate-{i}"); - send.write_all(msg.as_bytes()).await.unwrap(); - send.finish().unwrap(); - let response = recv.read_to_end(4096).await.unwrap(); - assert_eq!(response, msg.as_bytes(), "pre-migrate echo mismatch"); - } - - // Migrate: rebind to a new local UDP socket (simulates wifi→cellular). - let new_socket = UdpSocket::bind("127.0.0.1:0").unwrap(); - let new_local = new_socket.local_addr().unwrap(); - endpoint.rebind(new_socket).expect("rebind should succeed"); - - // Send 5 more messages after migration. - for i in 0..5u32 { - let (mut send, mut recv) = connection.open_bi().await.unwrap(); - let msg = format!("post-migrate-{i}"); - send.write_all(msg.as_bytes()).await.unwrap(); - send.finish().unwrap(); - let response = recv.read_to_end(4096).await.unwrap(); - assert_eq!(response, msg.as_bytes(), "post-migrate echo mismatch"); - } - - // Assert: connection still alive after migration. - assert!( - connection.close_reason().is_none(), - "connection should still be open after migration" - ); - - // Verify the local address changed. - let _ = new_local; // We successfully used a new socket. - - connection.close(0u32.into(), b"test done"); - endpoint.wait_idle().await; - }); - } - - /// Start a simple QUIC echo server that echoes back whatever it receives. - async fn start_echo_server() -> SocketAddr { - let cert = rcgen::generate_simple_self_signed(vec!["localhost".into()]).unwrap(); - let cert_der = cert.cert.der().to_vec(); - let key_der = cert.key_pair.serialize_der(); - - let cert_chain = vec![rustls::pki_types::CertificateDer::from(cert_der)]; - let key = rustls::pki_types::PrivateKeyDer::try_from(key_der).unwrap(); - - let tls = rustls::ServerConfig::builder() - .with_no_client_auth() - .with_single_cert(cert_chain, key) - .unwrap(); - - let server_config = quinn::ServerConfig::with_crypto(Arc::new( - quinn::crypto::rustls::QuicServerConfig::try_from(tls).unwrap(), - )); - - let endpoint = Endpoint::server( - server_config, - "127.0.0.1:0".parse().unwrap(), - ) - .unwrap(); - - let addr = endpoint.local_addr().unwrap(); - - // Spawn echo acceptor. - tokio::spawn(async move { - while let Some(incoming) = endpoint.accept().await { - let connecting = match incoming.accept() { - Ok(c) => c, - Err(_) => continue, - }; - tokio::spawn(async move { - let conn = match connecting.await { - Ok(c) => c, - Err(_) => return, - }; - loop { - let (mut send, mut recv) = match conn.accept_bi().await { - Ok(s) => s, - Err(_) => break, - }; - let data = match recv.read_to_end(4096).await { - Ok(d) => d, - Err(_) => break, - }; - let _ = send.write_all(&data).await; - let _ = send.finish(); - } - }); - } - }); - - addr - } -} diff --git a/crates/quicproquo-server/src/domain/delivery.rs b/crates/quicproquo-server/src/domain/delivery.rs index 6883d89..bc7622d 100644 --- a/crates/quicproquo-server/src/domain/delivery.rs +++ b/crates/quicproquo-server/src/domain/delivery.rs @@ -97,7 +97,7 @@ impl DeliveryService { Ok(EnqueueResp { seq: first_seq, - delivery_proof: Vec::new(), // TODO: sign in Phase 2 + delivery_proof: Vec::new(), // Proof generated at RPC handler layer (see v2_handlers/delivery.rs) }) } diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 0b6f18f..52b3d97 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -101,7 +101,7 @@ services: ports: - "127.0.0.1:3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD: "${GRAFANA_ADMIN_PASSWORD:-changeme}" + GF_SECURITY_ADMIN_PASSWORD: "${GRAFANA_ADMIN_PASSWORD:?Set GRAFANA_ADMIN_PASSWORD in .env}" GF_USERS_ALLOW_SIGN_UP: "false" volumes: - grafana-data:/var/lib/grafana diff --git a/master-prompt.md b/master-prompt.md deleted file mode 100644 index 0caf143..0000000 --- a/master-prompt.md +++ /dev/null @@ -1,329 +0,0 @@ -# quicproquo — Master Project Prompt - -## Project Identity - -You are building **quicproquo**, a production-grade end-to-end encrypted group messenger in Rust. It uses the MLS protocol (RFC 9420) for group key agreement, ML-KEM-768 (NIST FIPS 203) hybrid post-quantum key exchange, the Noise Protocol Framework (Noise_XX pattern) over raw TCP as the transport layer, and Cap'n Proto for wire serialisation and RPC. There is no TLS, no HTTP, no WebSocket, no MessagePack. - -This is not a prototype. Every milestone produces production-ready, tested, deployable code. - ---- - -## Non-Negotiable Engineering Standards - -- **Production-ready only.** No stubs, mocks, `todo!()`, `unimplemented!()`, or placeholder logic in deliverables. If something is out of scope for the current milestone, it is explicitly omitted with a documented reason, not silently stubbed. -- **YAGNI / KISS / DRY.** Do not add features, abstractions, or generics that are not required by the current milestone. Favour clarity over cleverness. -- **Spec-first.** Document the design (ADR or inline doc comment) before implementing it. Every public API must have a doc comment explaining what it does, its invariants, and any error conditions. -- **Security-by-design.** Secrets use `zeroize`. No secret material in logs. No `unwrap()` on cryptographic operations — all errors are typed and propagated. Constant-time comparisons where required. -- **Containerised.** The server runs in Docker. `docker-compose.yml` is always kept up to date. -- **Dependency hygiene.** Pin major versions. Prefer the `dalek` ecosystem for classical crypto, `snow` for Noise, `openmls` for MLS, `ml-kem` for post-quantum, `capnp`/`capnp-rpc` for serialisation and RPC. Do not introduce new dependencies without justification. -- **Review before presenting.** Before presenting any code, review it for: missing error handling, security gaps, incomplete implementations, and deviation from these standards. Fix all issues found before output. - ---- - -## Git Standards - -- GPG-signed commits only. -- Conventional commits: `feat:`, `fix:`, `chore:`, `docs:`, `test:`, `refactor:`. -- Feature branches per milestone: `feat/m1-noise-transport`, `feat/m2-keypackage-as`, etc. -- No `Co-authored-by` trailers. -- Commit messages describe *why*, not just *what*. - ---- - -## Architecture - -### Workspace Layout - -``` -quicproquo/ -├── Cargo.toml # workspace root -├── crates/ -│ ├── quicproquo-core/ # crypto primitives, MLS wrapper, Noise framing codec -│ ├── quicproquo-proto/ # Cap'n Proto schemas + generated types, no crypto, no I/O -│ ├── quicproquo-server/ # Delivery Service (DS) + Authentication Service (AS) -│ └── quicproquo-client/ # CLI client -├── schemas/ # .capnp schema files (canonical source of truth) -│ ├── envelope.capnp -│ ├── auth.capnp -│ └── delivery.capnp -├── docker/ -│ └── Dockerfile -├── docker-compose.yml -└── docs/ - └── architecture.md -``` - -### Crate Responsibilities - -**quicproquo-core** -- Noise_XX handshake initiator and responder (via `snow`) -- Length-prefixed Cap'n Proto frame codec (Tokio `Encoder`/`Decoder` traits) -- MLS group state machine wrapper around `openmls` -- Hybrid PQ ciphersuite (X25519 + ML-KEM-768) -- Key generation and zeroize-on-drop key types - -**quicproquo-proto** -- Cap'n Proto `.capnp` schemas in `schemas/` (workspace root, shared) -- `build.rs` invokes `capnpc` to generate Rust types into `src/generated/` -- Re-exports generated types with ergonomic builder/reader helpers -- Canonical serialisation helpers for signing (uses `capnp::message::Builder::canonicalize()`) -- No crypto, no I/O, no async - -**quicproquo-server** -- Authentication Service: KeyPackage store (DashMap → SQLite at M6) -- Delivery Service: Cap'n Proto RPC interface, fan-out router, per-group append-only message log -- Tokio TCP listener, Noise handshake per connection, then Cap'n Proto RPC over the encrypted channel -- Structured logging (tracing) - -**quicproquo-client** -- Tokio TCP connection to server -- Noise handshake, then Cap'n Proto RPC client stub -- CLI interface (clap) -- Drives quicproquo-core for all crypto operations -- Displays received messages to stdout - -### Transport Stack - -``` -TCP connection -└── Noise_XX handshake (snow) - └── Authenticated encrypted channel (ChaCha20-Poly1305) - └── [u32 frame_len][Cap'n Proto encoded message] - └── Cap'n Proto RPC (capnp-rpc, M2+) -``` - -Both sides hold static X25519 keypairs for the Noise handshake and Ed25519 keypairs for MLS identity. After Noise_XX, mutual authentication is complete. All subsequent frames are Noise-encrypted. Cap'n Proto RPC runs inside the encrypted channel — it has no knowledge of the transport security. - -### Cap'n Proto Schemas - -```capnp -# schemas/envelope.capnp -@0xDEADBEEFCAFEBABE; # unique file ID (generate with: capnp id) - -struct Envelope { - msgType @0 :MsgType; - groupId @1 :Data; # 32 bytes, SHA-256 of group name - senderId @2 :Data; # 32 bytes, SHA-256 of sender identity key - payload @3 :Data; # opaque: MLS blob or control payload - timestampMs @4 :UInt64; # unix milliseconds - - enum MsgType { - ping @0; - pong @1; - keyPackageUpload @2; - keyPackageFetch @3; - keyPackageResponse @4; - mlsWelcome @5; - mlsCommit @6; - mlsApplication @7; - error @8; - } -} - -# schemas/auth.capnp -@0xAAAABBBBCCCCDDDD; - -interface AuthenticationService { - # Upload a KeyPackage for later retrieval by peers adding this client to a group. - # identityKey: Ed25519 public key bytes (32 bytes) - # package: openmls-serialised KeyPackage blob - # Returns the SHA-256 fingerprint of the package on success. - uploadKeyPackage @0 (identityKey :Data, package :Data) -> (fingerprint :Data); - - # Fetch one KeyPackage for a given identity key. - # Consuming: the server removes the returned KeyPackage (one-time use, MLS spec). - # Returns empty Data if no KeyPackage is available for this identity. - fetchKeyPackage @1 (identityKey :Data) -> (package :Data); -} - -# schemas/delivery.capnp -@0x1111222233334444; - -interface DeliveryService { - # Fan out an MLS message to all current members of a group. - # groupId: 32-byte group identifier - # message: serialised MLSMessage blob - # Returns count of recipients the message was queued for. - fanOut @0 (groupId :Data, message :Data) -> (recipientCount :UInt32); - - # Subscribe to incoming messages for a group. - # memberId: 32-byte identity key fingerprint of the subscribing client. - # Returns a capability stream; server pushes MLS blobs as they arrive. - subscribe @1 (groupId :Data, memberId :Data) -> (stream :MessageStream); -} - -interface MessageStream { - # Pull the next available message for this subscriber. - # Blocks (promise does not resolve) until a message is available. - # sequenceNo is monotonically increasing per group, used for gap detection. - next @0 () -> (message :Data, sequenceNo :UInt64); -} -``` - -### MLS Design - -- Ciphersuite: `MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519` as baseline (M1–M4), replaced with hybrid PQ ciphersuite at M5. -- DS is MLS-unaware: routes `MLSMessage` blobs by `group_id`. Does not inspect epoch or content. -- AS stores `KeyPackage` blobs indexed by `(identity_key_fingerprint, package_id)`. One KeyPackage consumed per member-add operation (MLS requirement: KeyPackages are single-use). -- Welcome messages routed by the DS to the target client using `sender_id` → `target_id` mapping in the Envelope. -- Cap'n Proto canonical form used when serialising any structure that is subsequently signed (MLS Commit signatures, AS KeyPackage fingerprints). - -### Post-Quantum (M5) - -Hybrid KEM construction: -``` -SharedSecret = HKDF-SHA256( - ikm = X25519_ss || ML-KEM-768_ss, - info = "quicproquo-hybrid-v1", - len = 32 -) -``` -Follows the combiner approach from draft-ietf-tls-hybrid-design. Implemented as a custom `openmls` `OpenMlsCryptoProvider` trait implementation in `quicproquo-core`. - ---- - -## Milestones - -### M1 — Noise Transport ✦ current -**Goal:** Two processes complete Noise_XX handshake over TCP and exchange typed Cap'n Proto frames. - -Deliverables: -- `schemas/envelope.capnp`: `Envelope` + `MsgType` (Ping/Pong only needed at this stage) -- `quicproquo-proto`: `build.rs` with `capnpc`, generated type re-exports, canonical helper -- `quicproquo-core`: static X25519 keypair generation, Noise_XX initiator + responder, length-prefixed Cap'n Proto frame codec -- `quicproquo-server`: TCP listener, Noise handshake, Ping→Pong handler, one tokio task per connection -- `quicproquo-client`: connects, Noise handshake, sends Ping, receives Pong, exits 0 -- Integration test: server and client in same test binary using `tokio::spawn` -- `docker-compose.yml` running the server - -### M2 — Authentication Service + KeyPackage Exchange -**Goal:** Clients register identity and publish/fetch MLS KeyPackages via Cap'n Proto RPC. - -Deliverables: -- `schemas/auth.capnp`: `AuthenticationService` interface -- `quicproquo-proto`: generated RPC stubs + client/server bootstrap helpers -- `quicproquo-core`: MLS KeyPackage generation (openmls) -- `quicproquo-server`: AS RPC server implementation with DashMap store -- `quicproquo-client`: `register` and `fetch-key` CLI subcommands -- Test: Alice uploads KeyPackage, Bob fetches it, fingerprints match - -### M3 — MLS Group Create + Welcome -**Goal:** Alice creates a group and adds Bob via MLS Welcome. Both hold valid epoch 1 state. - -Deliverables: -- `schemas/delivery.capnp`: `DeliveryService` + `MessageStream` interfaces -- `quicproquo-core`: group create, add member, process Welcome -- `quicproquo-server`: DS RPC server, Welcome routing by identity -- `quicproquo-client`: `create-group` and `join` CLI subcommands -- Test: two clients reach identical epoch 1 group state, verified by comparing group context hashes - -### M4 — Encrypted Group Messaging -**Goal:** Alice and Bob exchange MLS Application messages through the DS. - -Deliverables: -- `quicproquo-core`: send/receive application message, epoch rotation on Commit -- `quicproquo-server`: DS fan-out via `MessageStream` capability stream, per-group ordered log (in-memory) -- `quicproquo-client`: `send` subcommand, live receive loop via `MessageStream.next()` -- Test: round-trip message integrity, forward secrecy verified by confirming distinct key material across epochs - -### M5 — Hybrid PQ Ciphersuite -**Goal:** Replace MLS crypto backend with X25519 + ML-KEM-768 hybrid. - -Deliverables: -- `quicproquo-core`: custom `OpenMlsCryptoProvider` with hybrid KEM -- All M3/M4 tests pass unchanged with new ciphersuite -- Criterion benchmarks: key generation, encap/decap, group-add latency (10/100/1000 members) - -### M6 — Persistence + Production Docker -**Goal:** Server survives restart. Full containerised deployment. - -Deliverables: -- `quicproquo-server`: SQLite via `sqlx` for AS key store and DS message log, `migrations/` directory -- `docker/Dockerfile`: multi-stage build (rust:bookworm builder → debian:bookworm-slim runtime) -- `docker-compose.yml`: server + SQLite volume, healthcheck -- Client reconnect with session resume (re-handshake + rejoin group epoch from DS log) - ---- - -## Dependencies (pinned majors) - -```toml -# Crypto -openmls = "0.6" -openmls_rust_crypto = "0.6" -ml-kem = "0.3" -x25519-dalek = "2" -ed25519-dalek = "2" -snow = "0.9" -chacha20poly1305 = "0.10" -sha2 = "0.10" -hkdf = "0.12" -zeroize = { version = "1", features = ["derive"] } -rand = "0.8" - -# Serialisation + RPC -capnp = "0.19" -capnp-rpc = "0.19" - -# Build-time only -capnpc = "0.19" # build-dependency in quicproquo-proto - -# Async / networking -tokio = { version = "1", features = ["full"] } -tokio-util = { version = "0.7", features = ["codec"] } - -# Server utilities -dashmap = "5" -sqlx = { version = "0.7", features = ["sqlite", "runtime-tokio"] } # M6+ -tracing = "0.1" -tracing-subscriber = { version = "0.3", features = ["env-filter"] } -anyhow = "1" -thiserror = "1" - -# CLI -clap = { version = "4", features = ["derive"] } -``` - ---- - -## Key Design Decisions (ADR Summary) - -**ADR-001: Noise_XX for transport authentication** -Both parties hold static keys registered with the AS. XX pattern provides mutual authentication and identity hiding for the initiator. No TLS dependency, no certificate infrastructure. - -**ADR-002: Cap'n Proto replaces MessagePack** -Cap'n Proto provides: zero-copy reads, schema-enforced types, canonical serialisation for cryptographic signing, and a built-in async RPC system (capnp-rpc) that eliminates hand-rolled message dispatch. The build-time codegen overhead is accepted as worthwhile. - -**ADR-003: Cap'n Proto RPC runs inside the Noise tunnel** -Cap'n Proto RPC has no transport security of its own. It operates over the byte stream produced by the Noise session. Separation of concerns: Noise owns authentication and confidentiality, Cap'n Proto owns framing and dispatch. - -**ADR-004: DS is MLS-unaware** -The Delivery Service routes opaque `MLSMessage` blobs by `group_id`. It never decrypts or inspects MLS content. This is the correct MLS architecture (RFC 9420 §4) and is a natural Audit-Core integration point: the DS log is an append-only sequence of authenticated blobs. - -**ADR-005: Single-use KeyPackages** -MLS requires that each KeyPackage be used at most once (to preserve forward secrecy of the initial key exchange). The AS consumes a KeyPackage on fetch. Clients should pre-upload multiple KeyPackages. The AS warns when a client's supply runs low (M2+). - -**ADR-006: PQ gap in Noise transport is accepted** -The MLS content layer is PQ-protected from M5. The Noise transport (X25519) remains classical — PQ-Noise (draft-noise-pq) is not yet supported by `snow`. Harvest-now-decrypt-later against the handshake metadata is an accepted residual risk for M1–M5. No long-lived content secrets transit the Noise handshake, so the practical impact is limited to identity/timing metadata. - ---- - -## How to Use This Prompt - -Paste this document at the start of any session working on quicproquo. Then state which milestone you are working on and what specific task you need. The assistant will: - -1. Confirm the current milestone and task. -2. State any design decisions being made (ADR format if significant). -3. Produce complete, production-ready code for the task. -4. Review the code internally for gaps before presenting. -5. State what the next logical task is. - -When asking for code, always specify: -- Which crate(s) are affected. -- Whether this is a new file or modification to existing. -- Any constraints or context the assistant may not have (e.g. existing types already defined). - ---- - -*quicproquo — MLS + Post-Quantum + Noise/TCP + Cap'n Proto messenger in Rust* -*Architecture version: 1.1 | Last updated: 2026-02-19* diff --git a/scripts/ai_team.py b/scripts/ai_team.py deleted file mode 100755 index c78f63b..0000000 --- a/scripts/ai_team.py +++ /dev/null @@ -1,1156 +0,0 @@ - -#!/usr/bin/env python3 -""" -quicproquo AI Team -================== -A multi-agent Claude team specialised for the quicproquo Rust workspace. -Agents cover development, security, testing, documentation, and infrastructure. - -Usage: - python scripts/ai_team.py "" # orchestrator - python scripts/ai_team.py --agent "" # single agent - python scripts/ai_team.py --sprint # parallel sprint - python scripts/ai_team.py --parallel \\ - "rust-server-dev: Fix unwrap() in server" \\ - "security-auditor: Audit quicproquo-core" # ad-hoc parallel - python scripts/ai_team.py --pipeline # full production readiness pipeline - python scripts/ai_team.py --list-agents - python scripts/ai_team.py --list-sprints - -Requires: - pip install claude-agent-sdk - -The ANTHROPIC_API_KEY environment variable must be set. - -Team specification: docs/AGENT-TEAM.md -""" - -import argparse -import asyncio -import sys -import os -from datetime import datetime -from pathlib import Path - -try: - from claude_agent_sdk import ( - query, - ClaudeAgentOptions, - AgentDefinition, - ResultMessage, - SystemMessage, - AssistantMessage, - TextBlock, - CLINotFoundError, - CLIConnectionError, - ) -except ImportError: - print("ERROR: claude-agent-sdk not found.") - print("Install with: pip install claude-agent-sdk") - sys.exit(1) - -# ── Project root ─────────────────────────────────────────────────────────────── -PROJECT_ROOT = str(Path(__file__).parent.parent.resolve()) - -# ── Shared project context injected into every agent's system prompt ─────────── -PROJECT_CONTEXT = """ -## Project: quicproquo - -A production-grade end-to-end encrypted group messenger written in Rust. - -### Transport stack -TCP → Noise_XX (snow) → ChaCha20-Poly1305 encrypted channel → Cap'n Proto RPC - -### Workspace layout -``` -quicproquo/ -├── Cargo.toml # workspace root -├── crates/ -│ ├── quicproquo-core/ # crypto primitives, MLS wrapper, Noise codec -│ ├── quicproquo-proto/ # Cap'n Proto schemas + generated types -│ ├── quicproquo-server/ # Delivery Service (DS) + Authentication Service (AS) -│ ├── quicproquo-client/ # CLI client (clap, REPL) -│ ├── quicproquo-gui/ # GUI frontend (WIP) -│ └── quicproquo-mobile/ # Mobile frontend (WIP) -├── schemas/ # .capnp schema files (canonical source) -├── docker/ + docker-compose.yml -├── docs/ -├── scripts/ -├── ROADMAP.md # phased milestone plan -└── master-prompt.md # full architecture reference -``` - -### Non-negotiable engineering standards -- Production-ready only — no stubs, todo!(), unimplemented!(), or placeholder logic. -- YAGNI / KISS / DRY. -- Spec-first: doc comments before implementation. -- Security-by-design: zeroize secrets, typed errors, no unwrap() on crypto paths. -- Conventional commits: feat:, fix:, chore:, docs:, test:, refactor:. -- No Co-authored-by trailers. GPG-signed commits only. - -### Key dependencies (pinned majors) -openmls 0.5, openmls_rust_crypto 0.2, ml-kem 0.2, x25519-dalek 2, ed25519-dalek 2, -snow 0.9, chacha20poly1305 0.10, capnp 0.19, capnp-rpc 0.19, tokio 1, -tokio-util 0.7, dashmap 5, rusqlite (SQLite), tracing 0.1, anyhow 1, thiserror 1, clap 4. - -Always read ROADMAP.md and master-prompt.md before making architectural decisions. -""".strip() - - -# ── Agent definitions ────────────────────────────────────────────────────────── - -AGENTS: dict[str, AgentDefinition] = { - - "rust-architect": AgentDefinition( - description=( - "Senior Rust architect for quicproquo. Designs new features, writes ADRs, " - "reviews architecture decisions, analyses crate boundaries, and ensures the " - "design conforms to master-prompt.md. Does NOT write implementation code." - ), - prompt=f"""{PROJECT_CONTEXT} - -You are the **Rust Architect** for quicproquo. - -Responsibilities: -- Read ROADMAP.md and master-prompt.md to understand the current milestone and constraints. -- Produce concise Architecture Decision Records (ADR format) when a significant decision is made. -- Review proposed designs for correctness against MLS RFC 9420, Noise protocol spec, and Cap'n Proto semantics. -- Identify crate-boundary violations (e.g. I/O in quicproquo-proto, crypto in quicproquo-server). -- Flag when a feature would require a new crate dependency and evaluate it. -- Never produce implementation code — your output is design documents and reviews. - -Output format: -1. One-sentence summary of the architectural concern. -2. ADR (if applicable): Context → Decision → Consequences. -3. Concrete list of action items for the development agents. -""", - tools=["Read", "Glob", "Grep"], - ), - - "rust-core-dev": AgentDefinition( - description=( - "Implements quicproquo-core: Noise_XX handshake, Cap'n Proto frame codec, " - "MLS group state machine, hybrid PQ KEM (X25519 + ML-KEM-768), key types " - "with zeroize-on-drop, and all crypto primitives." - ), - prompt=f"""{PROJECT_CONTEXT} - -You are the **Core Developer** for quicproquo, responsible for the `quicproquo-core` crate. - -Crate responsibilities: -- Noise_XX handshake initiator and responder (via `snow`). -- Length-prefixed Cap'n Proto frame codec (Tokio Encoder/Decoder traits). -- MLS group state machine wrapper around `openmls`. -- Hybrid PQ ciphersuite: X25519 + ML-KEM-768 → HKDF-SHA256 → 32-byte shared secret. -- Key generation, zeroize-on-drop key types. -- OPAQUE password auth helper types. - -Before any edit: -1. Read the relevant source file(s) in full. -2. Check ROADMAP.md for the current milestone scope. -3. Confirm no new dependencies are needed or justify additions. - -After any edit: run `cargo check -p quicproquo-core` to verify compilation. - -Security requirements: -- All crypto errors must be propagated as typed `Result` — never `.unwrap()`. -- Key material structs must derive `Zeroize` and `ZeroizeOnDrop`. -- No secret bytes in log output. -""", - tools=["Read", "Glob", "Grep", "Edit", "Write", "Bash"], - ), - - "rust-server-dev": AgentDefinition( - description=( - "Implements quicproquo-server: TCP listener, Noise handshake per connection, " - "Cap'n Proto RPC server for the Authentication Service (AS) and Delivery " - "Service (DS), fan-out router, per-group message log, SQLite persistence." - ), - prompt=f"""{PROJECT_CONTEXT} - -You are the **Server Developer** for quicproquo, responsible for the `quicproquo-server` crate. - -Crate responsibilities: -- Tokio TCP listener; one task per connection. -- Noise_XX responder using quicproquo-core. -- Cap'n Proto RPC server stubs (capnp-rpc) for AuthenticationService and DeliveryService. -- Authentication Service: KeyPackage store (DashMap → SQLite at M6). -- Delivery Service: fan-out router, per-group append-only message log. -- Structured logging via `tracing`. - -Before any edit: -1. Read the relevant source file(s) in full. -2. Verify the Cap'n Proto schema in `schemas/` for the interface you are implementing. -3. Check ROADMAP.md for what is in scope. - -After any edit: run `cargo check -p quicproquo-server` to verify compilation. - -Security requirements: -- No `.unwrap()` on any lock or I/O operation in production paths. -- Auth tokens validated before any privileged operation. -- `QPQ_PRODUCTION=true` check: reject weak/default tokens on startup. -""", - tools=["Read", "Glob", "Grep", "Edit", "Write", "Bash"], - ), - - "rust-client-dev": AgentDefinition( - description=( - "Implements quicproquo-client: CLI (clap), interactive REPL, Noise handshake, " - "Cap'n Proto RPC client stubs, OPAQUE login/register, encrypted local state " - "(SQLCipher + Argon2id), conversation and session management." - ), - prompt=f"""{PROJECT_CONTEXT} - -You are the **Client Developer** for quicproquo, responsible for the `quicproquo-client` crate. - -Crate responsibilities: -- Tokio TCP connection to server; Noise_XX initiator via quicproquo-core. -- Cap'n Proto RPC client stubs. -- OPAQUE password-authenticated key exchange (register + login). -- CLI interface (clap) with subcommands and an interactive REPL. -- Encrypted local state: SQLCipher + Argon2id + ChaCha20-Poly1305 for session tokens. -- Conversation management, background polling, message history. - -Before any edit: -1. Read the relevant source file(s) in full. -2. Understand existing command handlers in `commands.rs` and state management in `state.rs`. -3. Check ROADMAP.md for the current milestone scope. - -After any edit: run `cargo check -p quicproquo-client` to verify compilation. - -UX requirements: -- Clear error messages for the user — no raw Rust error types exposed in REPL output. -- REPL prompt must show current context (server, active conversation). -""", - tools=["Read", "Glob", "Grep", "Edit", "Write", "Bash"], - ), - - "security-auditor": AgentDefinition( - description=( - "Security-focused auditor for quicproquo. Reviews Rust source for: unwrap()/expect() " - "on crypto paths, missing zeroize, secrets in logs, non-constant-time comparisons, " - "improper error handling, and deviations from the security standards in master-prompt.md. " - "Produces a prioritised finding report — does NOT edit files." - ), - prompt=f"""{PROJECT_CONTEXT} - -You are the **Security Auditor** for quicproquo. - -Your job is to read Rust source code and produce a prioritised security finding report. - -Audit checklist: -1. `.unwrap()` / `.expect()` in non-test code on crypto or I/O operations. -2. Key material types missing `Zeroize` / `ZeroizeOnDrop`. -3. Secret bytes (keys, passwords, tokens) potentially reaching `tracing`/`log` output. -4. Non-constant-time comparisons on authentication tags or tokens. -5. `panic!` / `unreachable!` in production paths. -6. `unsafe` blocks without documented safety invariants. -7. Missing `#[cfg(not(test))]` guards around debug-only logic. -8. Deviations from the engineering standards in master-prompt.md. -9. Dockerfile / docker-compose security issues (running as root, secrets in ENV, etc.). - -Output format (Markdown): -## Security Audit Report - -### Critical -- [file:line] Description. Remediation: ... - -### High -- ... - -### Medium -- ... - -### Low / Informational -- ... - -Do NOT edit any files. Findings only. -""", - tools=["Read", "Glob", "Grep"], - ), - - "test-engineer": AgentDefinition( - description=( - "Writes and runs tests for quicproquo. Adds unit tests, integration tests, " - "and property-based tests. Runs `cargo test` and interprets failures. " - "Knows the milestone-by-milestone test requirements from ROADMAP.md." - ), - prompt=f"""{PROJECT_CONTEXT} - -You are the **Test Engineer** for quicproquo. - -Responsibilities: -- Write unit tests inside `#[cfg(test)]` modules in the relevant crate. -- Write integration tests in `crates//tests/`. -- Run `cargo test --workspace` and interpret failures. -- For crypto code, write property-based tests using `proptest` when applicable. -- Verify test coverage against the milestone acceptance criteria in ROADMAP.md. - -Test naming convention: `test__` (snake_case). - -After writing tests, run them with Bash and report: -- Which tests pass / fail. -- Root cause of any failure. -- Suggested fix (but do not edit non-test files without instruction). -""", - tools=["Read", "Glob", "Grep", "Edit", "Write", "Bash"], - ), - - "devops-engineer": AgentDefinition( - description=( - "Infrastructure and deployment engineer for quicproquo. Owns Docker, CI/CD " - "(GitHub Actions), deployment configs, cross-compilation, monitoring setup, " - "release automation, and binary size optimisation. Edits docker/, .github/, " - "docker-compose.yml, and infrastructure scripts." - ), - prompt=f"""{PROJECT_CONTEXT} - -You are the **DevOps Engineer** for quicproquo. - -You own: `docker/`, `.github/`, `docker-compose.yml`, deployment configs, CI pipelines. - -Responsibilities: -- Docker image builds: multi-stage, minimal final image, non-root user, security hardening. -- GitHub Actions CI: build matrix, test parallelism, caching, artifact publishing. -- Release automation: cargo-release workflow, CHANGELOG generation, version tagging. -- Cross-compilation: musl static builds for x86_64, armv7, aarch64 (OpenWrt targets). -- Monitoring: Prometheus metrics endpoint stub, health check endpoint. -- Infrastructure-as-code: docker-compose for dev/staging, systemd unit files. - -Before any edit: -1. Read the target file in full. -2. Check ROADMAP.md Phase 1.3, 1.4, 2.3 for infrastructure items. -3. Test Docker builds with `docker build -f docker/Dockerfile .` - -Quality gates: -- Docker image builds successfully. -- CI pipeline syntax is valid (check with `act --dryrun` if available). -- No secrets in Dockerfile ARG/ENV, no running as root in final stage. -- `.gitignore` covers all sensitive file patterns (*.der, *.pem, *.db, *.bin, *.ks). -""", - tools=["Read", "Glob", "Grep", "Edit", "Write", "Bash"], - ), - - "docs-engineer": AgentDefinition( - description=( - "Technical writer for quicproquo. Writes and maintains user guides, operator " - "documentation, API references, architecture docs, SECURITY.md, CONTRIBUTING.md, " - "and the mdBook site in docs/. Ensures all public APIs have doc comments. " - "Edits docs/, README.md, and inline doc comments only." - ), - prompt=f"""{PROJECT_CONTEXT} - -You are the **Documentation Engineer** for quicproquo. - -You own: `docs/`, `README.md`, `CONTRIBUTING.md`, `SECURITY.md`, and inline `///` doc -comments on public API items. - -Documentation tiers (in priority order): -1. **User docs** — Getting started, installation, REPL commands, configuration reference. -2. **Operator docs** — Deployment guide (Docker, systemd), certificate setup, backup/restore, - monitoring, operational runbook, troubleshooting. -3. **Developer docs** — Architecture overview, crate responsibilities, contribution guide, - coding standards, testing guide, PR review checklist. -4. **Protocol docs** — Wire format reference, Cap'n Proto schema docs, MLS integration, - Noise transport spec, federation protocol. -5. **Security docs** — Threat model, trust boundaries, key lifecycle, responsible disclosure - policy, audit report summaries. - -Before any edit: -1. Read the target file and any related source code to ensure accuracy. -2. Check the mdBook structure in `docs/book.toml` and `docs/src/SUMMARY.md`. -3. Verify code examples compile (`cargo test --doc` for inline examples). - -Quality gates: -- `mdbook build docs/` succeeds without warnings. -- All internal links resolve (no broken cross-references). -- No stale information — verify claims against current source code. -- Spelling and grammar are correct. - -Style: -- Write for an audience of experienced developers who may not know Rust. -- Use active voice, present tense. -- Include code examples where they clarify usage. -- Cross-reference related docs sections with relative links. -""", - tools=["Read", "Glob", "Grep", "Edit", "Write", "Bash"], - ), - - "roadmap-tracker": AgentDefinition( - description=( - "Reads ROADMAP.md and the codebase to determine: which milestones are complete, " - "which are in progress, what the next actionable tasks are, and which ROADMAP items " - "are blocked. Produces a concise status report — does NOT edit files." - ), - prompt=f"""{PROJECT_CONTEXT} - -You are the **Roadmap Tracker** for quicproquo. - -Your job is to read ROADMAP.md and grep/read the source code to assess progress and produce -a status report. - -Steps: -1. Read ROADMAP.md in full. -2. For each unchecked `- [ ]` item, search the codebase for evidence of implementation. -3. Identify blockers (e.g. a later item depending on an incomplete earlier item). -4. Identify quick wins (small, self-contained tasks that can be done immediately). - -Output format (Markdown): -## Roadmap Status Report - -### Completed -- Phase X, item Y: ... - -### In Progress -- Phase X, item Y: partial — what exists vs what's missing. - -### Next Actionable Tasks (prioritised) -1. ... -2. ... - -### Blockers -- ... - -Do NOT edit any files. Analysis only. -""", - tools=["Read", "Glob", "Grep"], - ), -} - - -# ── Parallel sprint definitions ──────────────────────────────────────────────── -# Each sprint is a list of (agent_name, task) pairs run concurrently. -# Independent tasks that touch different crates can always be parallelised. -# Tasks that depend on each other (e.g. audit after code changes) should be -# run as separate sprints. - -SPRINTS: dict[str, list[tuple[str, str]]] = { - - "audit": [ - ("security-auditor", - "Perform a full security audit of all production Rust source in quicproquo-core " - "and quicproquo-server. Check every file for: .unwrap()/.expect() outside #[cfg(test)], " - "key material types missing Zeroize/ZeroizeOnDrop, secrets potentially reaching tracing " - "output, non-constant-time comparisons, unsafe blocks without safety docs, and Dockerfile " - "security issues. Produce a prioritised finding report in Markdown."), - ("roadmap-tracker", - "Read ROADMAP.md and the full codebase. Assess which Phase 1 and Phase 2 items are " - "complete, partially done, or not started. For each incomplete item search the source " - "for relevant code. Produce a concise status report with prioritised next actions."), - ], - - "phase1-hardening": [ - ("rust-server-dev", - "Fix Phase 1.1: eliminate all .unwrap() and .expect() in quicproquo-server production " - "paths (anything outside #[cfg(test)]). Read every .rs file in crates/quicproquo-server/src/. " - "Replace each .unwrap() with proper ? propagation or map_err. Replace .expect() with " - "a typed error or explicit match. Run `cargo check -p quicproquo-server` after each file. " - "Also check Phase 1.2 (QPQ_PRODUCTION=true startup validation) and implement if missing."), - ("rust-client-dev", - "Fix Phase 1.1: eliminate all .unwrap() and .expect() in quicproquo-client production " - "paths (anything outside #[cfg(test)]). Read every .rs file in crates/quicproquo-client/src/. " - "Replace each .unwrap() with proper ? propagation or map_err. Replace .expect() with " - "a typed error or explicit match. Run `cargo check -p quicproquo-client` after each file. " - "Pay special attention to AUTH_CONTEXT.read().expect() and any Mutex::lock().unwrap() calls."), - ("rust-core-dev", - "Fix Phase 1.1: check quicproquo-core for any .unwrap()/.expect() in non-test code. " - "Read all files in crates/quicproquo-core/src/. Replace any found instances with typed " - "Result propagation. Also review all key material types: ensure every struct holding " - "secret bytes derives Zeroize and ZeroizeOnDrop. Run `cargo check -p quicproquo-core`."), - ], - - "phase2-tests": [ - ("test-engineer", - "Implement Phase 2.1 E2E test coverage for auth failure scenarios. Add to " - "crates/quicproquo-client/tests/e2e.rs: (1) wrong-password login returns error, " - "(2) expired/invalid token is rejected by server, (3) message ordering: send 5 messages " - "in sequence, verify seq numbers arrive in order. Read the existing e2e.rs first to " - "match the test harness pattern (spawn_test_server, AUTH_LOCK). Run tests with " - "`cargo test -p quicproquo-client --test e2e -- --test-threads 1` and fix any failures."), - ("test-engineer", - "Implement Phase 2.2 unit tests for untested paths. Add to quicproquo-client: " - "(1) REPL input parsing edge cases — test parse_input() with empty string, whitespace-only, " - "'/dm' with no args, '/send' with no args, unknown slash command. " - "(2) Token cache expiry — test that an expired token is evicted on next access. " - "Read repl.rs and token_cache.rs first to understand the APIs. " - "Run `cargo test -p quicproquo-client` and fix any failures."), - ], - - "phase1-infra": [ - ("rust-server-dev", - "Fix Phase 1.3 and 1.4. " - "1.3 — Check .gitignore at project root. Add missing entries: data/, *.der, *.pem, " - "*.db, *.bin, *.ks, qpq-state.*, target/. Verify with `git ls-files --error-unmatch` " - "for each pattern to ensure no secrets are tracked. " - "1.4 — Fix docker/Dockerfile: (a) add the p2p crate correctly to workspace, " - "(b) create a dedicated non-root user instead of nobody, (c) set writable QPQ_DATA_DIR " - "with correct permissions. Test with `docker build -f docker/Dockerfile .`"), - ("rust-architect", - "Design the TLS certificate lifecycle for Phase 1.5. Read crates/quicproquo-server/src/tls.rs " - "and config.rs in full. Produce an ADR covering: (1) how CA-signed certs (Let's Encrypt / " - "custom CA) should be configured, (2) what --tls-required flag behaviour should be, " - "(3) how the server should warn when using self-signed certs, " - "(4) certificate rotation procedure without downtime. " - "Output: ADR + concrete action items for rust-server-dev."), - ], - - "status": [ - ("roadmap-tracker", - "Full roadmap status report. Read ROADMAP.md completely. For every unchecked item " - "across all phases, search the source to determine if it's implemented, partial, or missing. " - "Produce a structured report: Completed / In Progress / Not Started / Blockers / " - "Top 5 Quick Wins."), - ("security-auditor", - "Quick security sweep of all recent changes (git diff HEAD~5). Read the modified files " - "in full. Focus on: any new .unwrap()/.expect() introduced, new code paths that handle " - "key material, any new logging that might leak secrets, and any new external inputs that " - "lack validation. Produce a concise finding report."), - ], - - # ── Documentation sprints ───────────────────────────────────────────────── - - "docs-foundation": [ - ("docs-engineer", - "Create a root-level SECURITY.md file for quicproquo. Include: " - "(1) Responsible disclosure policy — where to report vulnerabilities (email, PGP key if available). " - "(2) Scope — what's covered (server, client, core crypto, protocol). " - "(3) Response timeline — acknowledge within 48h, triage within 7 days, fix within 30 days for critical. " - "(4) Security contact — project maintainer contact info. " - "(5) Out-of-scope — social engineering, DoS against test instances, etc. " - "Read existing docs/SECURITY-AUDIT.md for context on known security posture. " - "Keep it concise and professional. Follow the format used by major open-source crypto projects."), - ("docs-engineer", - "Create a root-level CONTRIBUTING.md file for quicproquo. Read the existing guidance in " - "docs/src/contributing/coding-standards.md and docs/src/contributing/testing.md first. " - "Include: (1) Development setup (Rust toolchain, Cap'n Proto compiler, SQLCipher). " - "(2) Building the project (cargo build --workspace, feature flags). " - "(3) Running tests (cargo test --workspace, E2E with --test-threads 1). " - "(4) PR process (branch naming, conventional commits, review checklist). " - "(5) Coding standards summary (link to full docs). " - "(6) Security requirements for contributions (no unwrap on crypto, zeroize, etc). " - "Keep it actionable — a new contributor should be able to submit a PR after reading this."), - ("docs-engineer", - "Write a comprehensive operator deployment guide at docs/src/getting-started/deployment.md. " - "Read the existing docs/src/getting-started/ pages and docker/Dockerfile first. " - "Cover: (1) Docker deployment (docker-compose, volume mounts, env vars). " - "(2) Bare-metal deployment (systemd unit file example, user/group setup). " - "(3) TLS certificate setup (self-signed for dev, Let's Encrypt for prod). " - "(4) Configuration reference (all QPQ_* environment variables). " - "(5) Backup and restore (SQLite/SQLCipher database, key material). " - "(6) Monitoring (structured log output, health checks). " - "(7) Troubleshooting common issues. " - "Update docs/src/SUMMARY.md to include the new page if needed."), - ("docs-engineer", - "Audit all existing docs/src/ pages for accuracy against the current codebase. " - "Read each .md file in docs/src/ and cross-reference claims against actual source code. " - "Fix: (1) Stale API references (function names, struct names that changed). " - "(2) Broken internal links between docs pages. " - "(3) Outdated architecture descriptions (e.g. references to MessagePack, old ALPN strings). " - "(4) Missing entries in docs/src/SUMMARY.md for pages that exist. " - "Produce a list of all changes made and any issues you couldn't fix."), - ], - - "docs-api": [ - ("docs-engineer", - "Ensure every public API item in quicproquo-core has a doc comment (/// or //!). " - "Read crates/quicproquo-core/src/lib.rs to find all pub exports. For each pub fn, " - "pub struct, pub enum, and pub trait: check if it has a doc comment. If missing, " - "read the implementation to understand what it does, then add a concise doc comment " - "with: one-line summary, parameters, return value, errors, and a short example where " - "appropriate. Run `cargo doc -p quicproquo-core --no-deps` to verify."), - ("docs-engineer", - "Document all Cap'n Proto schemas in schemas/. For each .capnp file (auth.capnp, " - "delivery.capnp, federation.capnp, node.capnp): read the schema and the Rust " - "implementation that uses it. Write or update docs/src/wire-format/ pages with: " - "(1) Purpose of each interface. (2) Method signatures with parameter semantics. " - "(3) Error conditions. (4) Example message flows (e.g. auth flow, message send flow). " - "Ensure docs/src/wire-format/overview.md links to all sub-pages."), - ], - - # ── Infrastructure sprints ──────────────────────────────────────────────── - - "infra-hardening": [ - ("devops-engineer", - "Fix the Dockerfile at docker/Dockerfile for production readiness. Read it first. " - "Changes needed: (1) Create a dedicated non-root user 'qpq' (not nobody) with a " - "specific UID/GID. (2) Set QPQ_DATA_DIR=/var/lib/qpq with correct ownership. " - "(3) Handle the excluded p2p crate correctly in workspace build. " - "(4) Add HEALTHCHECK instruction. (5) Use specific base image tags (not :latest). " - "(6) Ensure COPY commands don't pull in .git, target/, logs/, or test data. " - "Test with: docker build -f docker/Dockerfile ."), - ("devops-engineer", - "Harden .gitignore at project root. Read the current .gitignore first. Add missing " - "patterns: data/, *.der, *.pem, *.db, *.db-shm, *.db-wal, *.bin, *.ks, " - "qpq-state.*, logs/ai_team/, .env, .env.*, *.key. " - "Verify no sensitive files are already tracked: run git ls-files for each pattern. " - "If any are tracked, report them (do NOT remove from git without confirmation)."), - ("devops-engineer", - "Enhance CI pipeline at .github/workflows/ci.yml. Read it first. Add or verify: " - "(1) cargo fmt check passes. (2) cargo clippy --workspace -- -D warnings. " - "(3) cargo test --workspace (with --test-threads 1 for E2E). " - "(4) cargo deny check runs on every PR. (5) cargo audit as blocking check. " - "(6) Docker build validation job (docker build -f docker/Dockerfile .). " - "(7) Rust cache action for faster builds. (8) Matrix for stable + nightly Rust. " - "Also check .github/CODEOWNERS is correctly configured for crypto paths."), - ], - - # ── Security sprints ────────────────────────────────────────────────────── - - "security-full": [ - ("security-auditor", - "Perform a FULL security audit of the entire quicproquo codebase. Read every .rs file " - "in crates/quicproquo-core/src/, crates/quicproquo-server/src/, and " - "crates/quicproquo-client/src/. Check every file for ALL of: " - "(1) .unwrap()/.expect() outside #[cfg(test)] on crypto, I/O, lock, or parse operations. " - "(2) Key material types missing Zeroize/ZeroizeOnDrop. " - "(3) Secret bytes (keys, passwords, tokens, nonces) potentially reaching tracing/log/println. " - "(4) Non-constant-time comparisons on auth tags, tokens, MACs, or passwords. " - "(5) panic!/unreachable! in production paths. " - "(6) unsafe blocks without // SAFETY: documentation. " - "(7) Missing input validation on RPC boundaries (data from network). " - "(8) Race conditions in shared state (DashMap, Mutex, RwLock). " - "(9) Replay attack vectors in message delivery. " - "(10) Timing side channels in OPAQUE or token validation. " - "Produce a prioritised finding report: Critical > High > Medium > Low > Informational. " - "Each finding must include: file:line, description, attack scenario, remediation."), - ("security-auditor", - "Audit infrastructure security. Read docker/Dockerfile, docker-compose.yml, " - ".github/workflows/ci.yml, and all files in scripts/. Check: " - "(1) Dockerfile: running as root? secrets in ENV/ARG? base image pinned? " - "(2) docker-compose: volumes expose host paths? ports exposed unnecessarily? " - "(3) CI: secrets handled correctly? artifact permissions? supply chain attacks? " - "(4) Scripts: command injection? path traversal? unsafe eval? " - "(5) Dependencies: check deny.toml config, look for unmaintained/yanked crates. " - "Produce a separate infrastructure security report."), - ("security-auditor", - "Review the threat model at docs/src/cryptography/threat-model.md against the current " - "implementation. Read the threat model doc, then verify each claim: " - "(1) Are the stated trust boundaries correctly implemented in code? " - "(2) Does the OPAQUE flow match the documented auth model? " - "(3) Is the Noise_XX handshake configured as documented (XX pattern, not IK/KK)? " - "(4) Does the MLS integration follow RFC 9420 as claimed? " - "(5) Is the hybrid KEM combiner implemented as documented (HKDF-SHA256 with correct info string)? " - "(6) Are there attack vectors NOT covered by the threat model? " - "Produce a threat model gap analysis report."), - ], - - "security-review": [ - ("security-auditor", - "Post-change security review. Read all modified files from the most recent work. " - "Focus on: any new .unwrap()/.expect() introduced, new code paths handling key material, " - "new logging that might leak secrets, new external inputs lacking validation, and " - "any new unsafe blocks. Compare against the engineering standards in master-prompt.md. " - "Produce a concise pass/fail report with findings."), - ("roadmap-tracker", - "Quick progress check after recent changes. Read ROADMAP.md and check which Phase 1 " - "and Phase 2 items have been completed by the recent work. Update the status report " - "with: items newly completed, items still in progress, next priorities."), - ], - - # ── Release preparation ─────────────────────────────────────────────────── - - "release-prep": [ - ("devops-engineer", - "Prepare release infrastructure. Read Cargo.toml (workspace root) and all crate " - "Cargo.toml files. (1) Verify version numbers are consistent across all crates. " - "(2) Create or update CHANGELOG.md at project root — read git log for recent commits " - "and categorise by: Added, Changed, Fixed, Security. Follow keepachangelog.com format. " - "(3) Verify docker/Dockerfile builds successfully with release profile. " - "(4) Check that cargo package -p quicproquo-server would succeed (dry run). " - "(5) Verify .github/workflows/ci.yml has a release/tag-triggered job if applicable."), - ("docs-engineer", - "Final documentation review for release readiness. " - "(1) Verify README.md: feature matrix matches actual implementation, quick start " - "instructions work, crate layout is accurate, all badges are correct. " - "(2) Verify docs/src/getting-started/ pages are up to date. " - "(3) Check that SECURITY.md and CONTRIBUTING.md exist and are accurate. " - "(4) Run mdbook build docs/ and verify no warnings. " - "(5) Produce a docs readiness report: pass/fail with specific issues found."), - ("roadmap-tracker", - "Final pre-release status report. Read ROADMAP.md completely. Classify every item as: " - "Complete (implemented + tested), Deferred (not blocking release), or Blocking (must fix " - "before release). Focus on Phase 1 (Production Hardening) — all items must be Complete " - "or have documented mitigations. Produce a release readiness assessment."), - ], -} - -# ── Production readiness pipeline ───────────────────────────────────────────── -# Ordered list of sprints that form the full production readiness path. -# Each sprint must pass its quality gate before the next begins. -# Sprints within a step run in parallel; steps run sequentially. - -PIPELINE: list[tuple[str, str]] = [ - ("status", "Baseline: assess current state and recent security posture"), - ("audit", "Deep dive: full security audit + detailed roadmap analysis"), - ("phase1-hardening", "Code: eliminate crash paths across all crates (parallel by crate)"), - ("phase1-infra", "Infra: fix Dockerfile, .gitignore, design TLS lifecycle"), - ("infra-hardening", "Infra: CI hardening, Docker production config, .gitignore completion"), - ("phase2-tests", "Tests: E2E coverage, unit tests for untested paths"), - ("docs-foundation", "Docs: SECURITY.md, CONTRIBUTING.md, deployment guide, accuracy audit"), - ("docs-api", "Docs: public API doc comments, Cap'n Proto schema documentation"), - ("security-full", "Security: comprehensive audit of all code + infra + threat model"), - ("security-review", "Gate: post-change security review + progress check"), - ("release-prep", "Release: changelog, version consistency, final docs review"), -] - - -# ── Orchestrator system prompt ───────────────────────────────────────────────── - -ORCHESTRATOR_PROMPT = f"""{PROJECT_CONTEXT} - -You are the **Orchestrator** for the quicproquo AI development team. - -Your team of specialist subagents: - -| Agent | Role | Edits? | -|-------|------|--------| -| rust-architect | Architecture design, ADRs, design reviews | No | -| rust-core-dev | quicproquo-core: crypto, MLS, Noise codec | Yes | -| rust-server-dev | quicproquo-server: AS, DS, RPC server | Yes | -| rust-client-dev | quicproquo-client: CLI, REPL, local state | Yes | -| security-auditor | Security review: code, infra, threat model | No | -| test-engineer | Unit, integration, E2E tests | Yes (tests) | -| devops-engineer | Docker, CI/CD, deployment, monitoring | Yes (infra) | -| docs-engineer | User/operator/developer/protocol docs | Yes (docs) | -| roadmap-tracker | Roadmap progress assessment | No | - -Parallelisation rules: -- Agents that own DIFFERENT crates or concern areas can run in parallel. -- rust-core-dev, rust-server-dev, rust-client-dev ALWAYS run in parallel (different crates). -- security-auditor runs AFTER code-changing agents complete (reads their output). -- test-engineer runs AFTER code-changing agents complete (tests their changes). -- docs-engineer and devops-engineer can run in parallel with each other and with dev agents. -- roadmap-tracker can run in parallel with anything (read-only). - -Workflow: -1. Read the task carefully. -2. Decide which agent(s) are needed. For multi-step tasks, sequence them logically. -3. Maximise parallelism: launch agents that touch different files simultaneously. -4. Call each required agent with a precise, scoped prompt. -5. Synthesise the agents' outputs into a final report or code deliverable. -6. Always end with: "Next suggested task: ..." based on the ROADMAP. - -Rules: -- Read master-prompt.md and ROADMAP.md before delegating significant tasks. -- Do NOT delegate everything to one agent — split by crate/concern. -- If a task touches security, always invoke security-auditor AFTER code changes. -- If a task adds/modifies functionality, always invoke test-engineer LAST. -- docs-engineer and devops-engineer work independently — launch them in parallel. -- Keep your synthesis concise — prefer structured output (headers, bullet lists). -""" - - -# ── Parallel runner ──────────────────────────────────────────────────────────── - -async def run_agent_to_file( - agent_name: str, - task: str, - max_turns: int, - output_dir: Path, - label: str, -) -> tuple[str, str, str | None]: - """ - Run a single agent and stream its result to an output file. - - Returns (agent_name, label, result_text_or_None). - `result_text` is None if the agent produced no ResultMessage. - """ - output_file = output_dir / f"{label}.md" - result_text: str | None = None - - agent = AGENTS[agent_name] - options = ClaudeAgentOptions( - cwd=PROJECT_ROOT, - allowed_tools=agent.tools or ["Read", "Glob", "Grep"], - system_prompt=agent.prompt, - max_turns=max_turns, - permission_mode="acceptEdits", - setting_sources=["project"], - ) - - with open(output_file, "w") as f: - f.write(f"# Agent: {agent_name}\n\n") - f.write(f"**Task:** {task}\n\n") - f.write(f"**Started:** {datetime.now().isoformat()}\n\n---\n\n") - - async for message in query(prompt=task, options=options): - if isinstance(message, ResultMessage): - result_text = message.result - f.write(f"## Result\n\n{result_text}\n") - f.write(f"\n**Finished:** {datetime.now().isoformat()}\n") - - return agent_name, label, result_text - - -async def run_parallel( - agent_tasks: list[tuple[str, str]], - max_turns: int, - verbose: bool, - sprint_name: str = "custom", -) -> None: - """Launch all (agent, task) pairs concurrently and print a summary when done.""" - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - output_dir = Path(PROJECT_ROOT) / "logs" / "ai_team" / f"{sprint_name}_{timestamp}" - output_dir.mkdir(parents=True, exist_ok=True) - - print(f"\n{'═' * 70}") - print(f" quicproquo AI Team — Parallel Sprint: {sprint_name}") - print(f" Agents: {len(agent_tasks)} | Max turns each: {max_turns}") - print(f" Logs: {output_dir}/") - print(f"{'═' * 70}\n") - - for i, (agent, task) in enumerate(agent_tasks, 1): - label = f"{i:02d}_{agent}" - print(f" [{i}] {agent}") - print(f" {task[:80]}{'…' if len(task) > 80 else ''}") - print() - - # Build coroutines with stable labels for output files. - coros = [ - run_agent_to_file(agent, task, max_turns, output_dir, f"{i:02d}_{agent}") - for i, (agent, task) in enumerate(agent_tasks, 1) - ] - - print(f" Starting {len(coros)} agents in parallel…\n") - results = await asyncio.gather(*coros, return_exceptions=True) - - print(f"\n{'─' * 70}") - print(" SPRINT RESULTS") - print(f"{'─' * 70}") - - success = 0 - for result in results: - if isinstance(result, Exception): - print(f"\n ❌ ERROR: {result}") - else: - agent_name, label, text = result - if text is not None: - success += 1 - print(f"\n ✅ {agent_name} ({label}.md)") - # Show first 300 chars of result as a preview. - preview = text.strip()[:300] - for line in preview.splitlines(): - print(f" {line}") - if len(text.strip()) > 300: - print(" …") - else: - print(f"\n ⚠️ {agent_name}: no result produced") - - print(f"\n {success}/{len(agent_tasks)} agents completed successfully.") - print(f" Full outputs: {output_dir}/\n") - - -# ── Sequential runners ───────────────────────────────────────────────────────── - -async def run_orchestrator(task: str, max_turns: int, verbose: bool) -> None: - """Run the full team via the orchestrator.""" - print(f"\n{'═' * 70}") - print(f" quicproquo AI Team — Orchestrator") - print(f" Task: {task[:72]}{'…' if len(task) > 72 else ''}") - print(f"{'═' * 70}\n") - - options = ClaudeAgentOptions( - cwd=PROJECT_ROOT, - allowed_tools=["Read", "Glob", "Grep", "Agent"], - system_prompt=ORCHESTRATOR_PROMPT, - agents=AGENTS, - max_turns=max_turns, - permission_mode="acceptEdits", - setting_sources=["project"], - ) - - async for message in query(prompt=task, options=options): - if isinstance(message, ResultMessage): - print("\n" + "─" * 70) - print("RESULT") - print("─" * 70) - print(message.result) - elif verbose: - if isinstance(message, AssistantMessage): - for block in message.content: - if isinstance(block, TextBlock) and block.text.strip(): - print(block.text, end="", flush=True) - elif isinstance(message, SystemMessage) and message.subtype == "init": - print(f"[Session: {message.session_id}]") - - -async def run_single_agent( - agent_name: str, task: str, max_turns: int, verbose: bool -) -> None: - """Bypass the orchestrator and run a single specialist agent directly.""" - agent = AGENTS[agent_name] - print(f"\n{'═' * 70}") - print(f" quicproquo AI Team — {agent_name}") - print(f" Task: {task[:72]}{'…' if len(task) > 72 else ''}") - print(f"{'═' * 70}\n") - - options = ClaudeAgentOptions( - cwd=PROJECT_ROOT, - allowed_tools=agent.tools or ["Read", "Glob", "Grep"], - system_prompt=agent.prompt, - max_turns=max_turns, - permission_mode="acceptEdits", - setting_sources=["project"], - ) - - async for message in query(prompt=task, options=options): - if isinstance(message, ResultMessage): - print("\n" + "─" * 70) - print("RESULT") - print("─" * 70) - print(message.result) - elif verbose: - if isinstance(message, AssistantMessage): - for block in message.content: - if isinstance(block, TextBlock) and block.text.strip(): - print(block.text, end="", flush=True) - - -# ── CLI ──────────────────────────────────────────────────────────────────────── - -def build_parser() -> argparse.ArgumentParser: - parser = argparse.ArgumentParser( - prog="ai_team", - description="quicproquo multi-agent Claude team", - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=__doc__, - ) - parser.add_argument( - "task", - nargs="?", - help="Task description for the orchestrator", - ) - parser.add_argument( - "--agent", "-a", - choices=list(AGENTS.keys()), - default=None, - help="Bypass orchestrator and send task directly to a specific agent", - ) - parser.add_argument( - "--sprint", "-s", - choices=list(SPRINTS.keys()), - default=None, - metavar="SPRINT", - help="Run a predefined parallel sprint (see --list-sprints)", - ) - parser.add_argument( - "--parallel", "-p", - nargs="+", - metavar="AGENT:TASK", - default=None, - help=( - 'Ad-hoc parallel run. Each argument is "agent-name: task description". ' - 'Example: --parallel "rust-server-dev: Fix unwrap() in server" ' - '"security-auditor: Audit core crate"' - ), - ) - parser.add_argument( - "--list-agents", "-l", - action="store_true", - help="List available agents and exit", - ) - parser.add_argument( - "--list-sprints", - action="store_true", - help="List predefined sprints and exit", - ) - parser.add_argument( - "--pipeline", - action="store_true", - help="Run the full production readiness pipeline (all sprints in dependency order)", - ) - parser.add_argument( - "--pipeline-from", - metavar="SPRINT", - default=None, - help="Start the pipeline from a specific sprint (skip earlier steps)", - ) - parser.add_argument( - "--max-turns", - type=int, - default=60, - help="Maximum agentic turns per agent (default: 60)", - ) - parser.add_argument( - "--verbose", "-v", - action="store_true", - help="Print all message types (not just results)", - ) - return parser - - -def list_agents() -> None: - print("Available agents:\n") - for name, defn in AGENTS.items(): - print(f" {name}") - desc = defn.description - wrapped = "\n ".join( - desc[i : i + 72] for i in range(0, len(desc), 72) - ) - print(f" {wrapped}\n") - - -def list_sprints() -> None: - print("Predefined sprints:\n") - for name, tasks in SPRINTS.items(): - print(f" {name} ({len(tasks)} agents in parallel)") - for agent, task in tasks: - preview = task[:60] + ("…" if len(task) > 60 else "") - print(f" [{agent}] {preview}") - print() - - print("Production readiness pipeline (--pipeline):\n") - for i, (sprint_name, description) in enumerate(PIPELINE, 1): - count = len(SPRINTS[sprint_name]) - print(f" {i:2d}. {sprint_name:<20s} {count} agent(s) — {description}") - print() - - -def parse_parallel_args(args: list[str]) -> list[tuple[str, str]]: - """ - Parse --parallel arguments of the form "agent-name: task description". - The colon after the agent name is required. - """ - pairs: list[tuple[str, str]] = [] - valid = set(AGENTS.keys()) - for arg in args: - if ":" not in arg: - print(f"ERROR: --parallel argument missing colon separator: {arg!r}") - print(" Expected format: \"agent-name: task description\"") - sys.exit(1) - agent, _, task = arg.partition(":") - agent = agent.strip() - task = task.strip() - if agent not in valid: - print(f"ERROR: unknown agent {agent!r}. Valid: {', '.join(sorted(valid))}") - sys.exit(1) - if not task: - print(f"ERROR: empty task for agent {agent!r}") - sys.exit(1) - pairs.append((agent, task)) - return pairs - - -# ── Pipeline runner ──────────────────────────────────────────────────────────── - -async def run_pipeline( - max_turns: int, - verbose: bool, - start_from: str | None = None, -) -> None: - """ - Run the full production readiness pipeline: all sprints in dependency order. - - Each sprint runs its agents in parallel. Sprints run sequentially because - later sprints depend on earlier ones (e.g. security-review after code changes). - - If start_from is set, skip all sprints before that one. - """ - pipeline = list(PIPELINE) - if start_from: - names = [name for name, _ in PIPELINE] - if start_from not in names: - print(f"ERROR: unknown sprint {start_from!r} in pipeline.") - print(f" Valid: {', '.join(names)}") - sys.exit(1) - idx = names.index(start_from) - pipeline = pipeline[idx:] - print(f"\n Skipping {idx} sprint(s), starting from: {start_from}\n") - - total = len(pipeline) - print(f"\n{'=' * 70}") - print(f" quicproquo AI Team — Production Readiness Pipeline") - print(f" Steps: {total} | Max turns per agent: {max_turns}") - print(f"{'=' * 70}") - for i, (name, desc) in enumerate(pipeline, 1): - count = len(SPRINTS[name]) - print(f" {i:2d}. [{name}] {count} agent(s) — {desc}") - print(f"{'=' * 70}\n") - - for step, (sprint_name, description) in enumerate(pipeline, 1): - print(f"\n{'#' * 70}") - print(f" PIPELINE STEP {step}/{total}: {sprint_name}") - print(f" {description}") - print(f"{'#' * 70}\n") - - agent_tasks = SPRINTS[sprint_name] - await run_parallel( - agent_tasks, max_turns, verbose, sprint_name=sprint_name - ) - - if step < total: - print(f"\n Step {step}/{total} complete. Proceeding to next step...\n") - - print(f"\n{'=' * 70}") - print(f" PIPELINE COMPLETE — {total} steps executed") - print(f" Review outputs in: logs/ai_team/") - print(f"{'=' * 70}\n") - - -# ── Entry point ──────────────────────────────────────────────────────────────── - -async def main() -> None: - parser = build_parser() - args = parser.parse_args() - - if args.list_agents: - list_agents() - return - - if args.list_sprints: - list_sprints() - return - - if not os.environ.get("ANTHROPIC_API_KEY"): - print("ERROR: ANTHROPIC_API_KEY environment variable is not set.") - sys.exit(1) - - try: - if args.pipeline or args.pipeline_from: - await run_pipeline( - args.max_turns, args.verbose, start_from=args.pipeline_from - ) - - elif args.sprint: - agent_tasks = SPRINTS[args.sprint] - await run_parallel( - agent_tasks, args.max_turns, args.verbose, sprint_name=args.sprint - ) - - elif args.parallel: - agent_tasks = parse_parallel_args(args.parallel) - await run_parallel( - agent_tasks, args.max_turns, args.verbose, sprint_name="custom" - ) - - elif args.agent: - if not args.task: - print("ERROR: --agent requires a task argument.") - sys.exit(1) - await run_single_agent( - args.agent, args.task, args.max_turns, args.verbose - ) - - elif args.task: - await run_orchestrator(args.task, args.max_turns, args.verbose) - - else: - parser.print_help() - sys.exit(1) - - except CLINotFoundError: - print( - "\nERROR: Claude Code CLI not found.\n" - "Install with: pip install claude-agent-sdk" - ) - sys.exit(1) - except CLIConnectionError as e: - print(f"\nERROR: Connection error: {e}") - sys.exit(1) - except KeyboardInterrupt: - print("\n\nInterrupted.") - sys.exit(0) - - -if __name__ == "__main__": - asyncio.run(main())