From 7700674b15645f0a79ada7361a3016a64ffe1d2f Mon Sep 17 00:00:00 2001 From: roshan <38771624+rohoswagger@users.noreply.github.com> Date: Fri, 30 Jan 2026 09:36:32 -0800 Subject: [PATCH 001/334] chore: launch.json web server uses .env.web (#7993) --- .gitignore | 3 ++- .vscode/env.web_template.txt | 15 +++++++++++++++ .vscode/launch.json | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 .vscode/env.web_template.txt diff --git a/.gitignore b/.gitignore index 35e43eb6525..e65bd576125 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # editors -.vscode +.vscode/* !/.vscode/env_template.txt +!/.vscode/env.web_template.txt !/.vscode/launch.json !/.vscode/tasks.template.jsonc .zed diff --git a/.vscode/env.web_template.txt b/.vscode/env.web_template.txt new file mode 100644 index 00000000000..c0b3328652f --- /dev/null +++ b/.vscode/env.web_template.txt @@ -0,0 +1,15 @@ +# Copy this file to .env.web in the .vscode folder. +# Fill in the values as needed +# Web Server specific environment variables +# Minimal set needed for Next.js dev server + +# Auth +AUTH_TYPE=disabled + +# Enable the full set of Danswer Enterprise Edition features. +# NOTE: DO NOT ENABLE THIS UNLESS YOU HAVE A PAID ENTERPRISE LICENSE (or if you +# are using this for local testing/development). +ENABLE_PAID_ENTERPRISE_EDITION_FEATURES=false + +# Enable Onyx Craft +ENABLE_CRAFT=true diff --git a/.vscode/launch.json b/.vscode/launch.json index 51be5872195..ab2f9e0f222 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -86,7 +86,7 @@ "request": "launch", "cwd": "${workspaceRoot}/web", "runtimeExecutable": "npm", - "envFile": "${workspaceFolder}/.vscode/.env", + "envFile": "${workspaceFolder}/.vscode/.env.web", "runtimeArgs": ["run", "dev"], "presentation": { "group": "2" From 6c46fcd651ba0a3dc90d3f164388ce7ba6f1e973 Mon Sep 17 00:00:00 2001 From: Wenxi Date: Fri, 30 Jan 2026 10:05:36 -0800 Subject: [PATCH 002/334] chore: dev env template defaults (#8015) --- .vscode/env.web_template.txt | 3 ++- .vscode/env_template.txt | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.vscode/env.web_template.txt b/.vscode/env.web_template.txt index c0b3328652f..6754cec1cd0 100644 --- a/.vscode/env.web_template.txt +++ b/.vscode/env.web_template.txt @@ -4,7 +4,8 @@ # Minimal set needed for Next.js dev server # Auth -AUTH_TYPE=disabled +AUTH_TYPE=basic +DEV_MODE=true # Enable the full set of Danswer Enterprise Edition features. # NOTE: DO NOT ENABLE THIS UNLESS YOU HAVE A PAID ENTERPRISE LICENSE (or if you diff --git a/.vscode/env_template.txt b/.vscode/env_template.txt index 35d1f0fe2f8..e669ee3f2a6 100644 --- a/.vscode/env_template.txt +++ b/.vscode/env_template.txt @@ -6,8 +6,8 @@ # processes. -# For local dev, often user Authentication is not needed. -AUTH_TYPE=disabled +AUTH_TYPE=basic +DEV_MODE=true # Always keep these on for Dev. @@ -35,7 +35,6 @@ GEN_AI_API_KEY= OPENAI_API_KEY= # If answer quality isn't important for dev, use gpt-4o-mini since it's cheaper. GEN_AI_MODEL_VERSION=gpt-4o -FAST_GEN_AI_MODEL_VERSION=gpt-4o # Python stuff From 37bfa5833b6b032c6dd39f681a4e2d17174ba10b Mon Sep 17 00:00:00 2001 From: Evan Lohn Date: Fri, 30 Jan 2026 10:30:05 -0800 Subject: [PATCH 003/334] fix: race conditions in drive hiernodes (#8017) --- .../onyx/connectors/google_drive/connector.py | 47 ++++++++++++------- 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/backend/onyx/connectors/google_drive/connector.py b/backend/onyx/connectors/google_drive/connector.py index 5f13e92f4fa..7522213859d 100644 --- a/backend/onyx/connectors/google_drive/connector.py +++ b/backend/onyx/connectors/google_drive/connector.py @@ -297,7 +297,8 @@ def __init__( # Cache of known My Drive root IDs (user_email -> root_id) # Used to verify if a folder with no parents is actually a My Drive root - self._my_drive_root_id_cache: dict[str, str] = {} + # Thread-safe because multiple impersonation threads access this concurrently + self._my_drive_root_id_cache: ThreadSafeDict[str, str] = ThreadSafeDict() self.allow_images = False @@ -574,25 +575,35 @@ def _get_new_ancestors_for_files( folder_parent_id = _get_parent_id_from_file(folder) - # Atomically check and add to avoid race conditions where multiple - # threads could create duplicate hierarchy nodes for the same folder + # Create the node BEFORE marking as seen to avoid a race condition where: + # 1. Thread A marks node as "seen" + # 2. Thread A fails to create node (e.g., API error in get_external_access) + # 3. Thread B sees node as "already seen" and skips it + # 4. Result: node is never yielded + # + # By creating first and then atomically checking/marking, we ensure that + # if creation fails, another thread can still try. If both succeed, + # only one will add to ancestors_to_add (the one that wins check_and_add). + if permission_sync_context: + external_access = get_external_access_for_folder( + folder, permission_sync_context.google_domain, service + ) + else: + external_access = _public_access() + + node = HierarchyNode( + raw_node_id=current_id, + raw_parent_id=folder_parent_id, + display_name=folder.get("name", "Unknown Folder"), + link=folder.get("webViewLink"), + node_type=HierarchyNodeType.FOLDER, + external_access=external_access, + ) + + # Now atomically check and add - only append if we're the first thread + # to successfully create this node already_seen = seen_hierarchy_node_raw_ids.check_and_add(current_id) if not already_seen: - if permission_sync_context: - external_access = get_external_access_for_folder( - folder, permission_sync_context.google_domain, service - ) - else: - external_access = _public_access() - - node = HierarchyNode( - raw_node_id=current_id, - raw_parent_id=folder_parent_id, - display_name=folder.get("name", "Unknown Folder"), - link=folder.get("webViewLink"), - node_type=HierarchyNodeType.FOLDER, - external_access=external_access, - ) ancestors_to_add.append(node) # Check if this is a verified terminal node (actual root, not just From 0e76ae34230844bfbab10931983966678d1912ef Mon Sep 17 00:00:00 2001 From: Evan Lohn Date: Fri, 30 Jan 2026 11:28:34 -0800 Subject: [PATCH 004/334] feat: notion connector hierarchynodes (#7931) --- .../connectors/google_drive/doc_conversion.py | 8 +- backend/onyx/connectors/models.py | 8 +- backend/onyx/connectors/notion/connector.py | 342 ++++++++++++++++-- backend/onyx/db/hierarchy.py | 69 +++- backend/onyx/indexing/indexing_pipeline.py | 12 + .../notion/test_notion_connector.py | 51 ++- 6 files changed, 448 insertions(+), 42 deletions(-) diff --git a/backend/onyx/connectors/google_drive/doc_conversion.py b/backend/onyx/connectors/google_drive/doc_conversion.py index 9e5b56c0567..0e98bc5fb2b 100644 --- a/backend/onyx/connectors/google_drive/doc_conversion.py +++ b/backend/onyx/connectors/google_drive/doc_conversion.py @@ -258,6 +258,9 @@ def download_request( return _download_request(request, file_id, size_threshold) +_DOWNLOAD_NUM_RETRIES = 3 + + def _download_request(request: Any, file_id: str, size_threshold: int) -> bytes: response_bytes = io.BytesIO() downloader = MediaIoBaseDownload( @@ -265,7 +268,10 @@ def _download_request(request: Any, file_id: str, size_threshold: int) -> bytes: ) done = False while not done: - download_progress, done = downloader.next_chunk() + # num_retries enables automatic retry with exponential backoff for transient errors + download_progress, done = downloader.next_chunk( + num_retries=_DOWNLOAD_NUM_RETRIES + ) if download_progress.resumable_progress > size_threshold: logger.warning( f"File {file_id} exceeds size threshold of {size_threshold}. Skipping2." diff --git a/backend/onyx/connectors/models.py b/backend/onyx/connectors/models.py index c1ddf8a4a2e..01a0012d48a 100644 --- a/backend/onyx/connectors/models.py +++ b/backend/onyx/connectors/models.py @@ -403,9 +403,11 @@ class HierarchyNode(BaseModel): # What kind of structural node this is (folder, space, page, etc.) node_type: HierarchyNodeType - # Optional: if this hierarchy node represents a document (e.g., Confluence page), - # this is the document ID. Set by the connector when the node IS a document. - document_id: str | None = None + # If this hierarchy node represents a document (e.g., Confluence page), + # The db model stores that doc's document_id. This gets set during docprocessing + # after the document row is created. Matching is done by raw_node_id matching document.id. + # so, we don't allow connectors to specify this as it would be unused + # document_id: str | None = None # External access information for the node external_access: ExternalAccess | None = None diff --git a/backend/onyx/connectors/notion/connector.py b/backend/onyx/connectors/notion/connector.py index 9dbd9a32a51..f57b2aa4c19 100644 --- a/backend/onyx/connectors/notion/connector.py +++ b/backend/onyx/connectors/notion/connector.py @@ -33,6 +33,7 @@ from onyx.connectors.models import HierarchyNode from onyx.connectors.models import ImageSection from onyx.connectors.models import TextSection +from onyx.db.enums import HierarchyNodeType from onyx.utils.batching import batch_generator from onyx.utils.logger import setup_logger @@ -40,6 +41,7 @@ _NOTION_PAGE_SIZE = 100 _NOTION_CALL_TIMEOUT = 30 # 30 seconds +_MAX_PAGES = 1000 # TODO: Tables need to be ingested, Pages need to have their metadata ingested @@ -56,6 +58,9 @@ class NotionPage(BaseModel): url: str database_name: str | None = None # Only applicable to the database type page (wiki) + parent: dict[str, Any] | None = ( + None # Raw parent object from API for hierarchy tracking + ) class NotionBlock(BaseModel): @@ -76,6 +81,14 @@ class NotionSearchResponse(BaseModel): has_more: bool = False +class BlockReadOutput(BaseModel): + """Output from reading blocks of a page.""" + + blocks: list[NotionBlock] + child_page_ids: list[str] + hierarchy_nodes: list[HierarchyNode] + + class NotionConnector(LoadConnector, PollConnector): """Notion Page connector that reads all Notion pages this integration has been granted access to. @@ -107,6 +120,14 @@ def __init__( # very large, this may not be practical. self.recursive_index_enabled = recursive_index_enabled or self.root_page_id + # Hierarchy tracking state + self.seen_hierarchy_node_raw_ids: set[str] = set() + self.workspace_id: str | None = None + self.workspace_name: str | None = None + # Maps child page IDs to their containing page ID (discovered in _read_blocks). + # Used to resolve block_id parent types to the actual containing page. + self._child_page_parent_map: dict[str, str] = {} + @classmethod @override def normalize_url(cls, url: str) -> NormalizationResult: @@ -221,12 +242,13 @@ def _fetch_database_as_page(self, database_id: str) -> NotionPage: except Exception as e: logger.exception(f"Error fetching database as page - {res.json()}") raise e - database_name = res.json().get("title") + db_data = res.json() + database_name = db_data.get("title") database_name = ( database_name[0].get("text", {}).get("content") if database_name else None ) - return NotionPage(**res.json(), database_name=database_name) + return NotionPage(**db_data, database_name=database_name) @retry(tries=3, delay=1, backoff=2) def _fetch_database( @@ -267,6 +289,105 @@ def _fetch_database( raise e return res.json() + @retry(tries=3, delay=1, backoff=2) + def _fetch_workspace_info(self) -> tuple[str, str]: + """Fetch workspace ID and name from the bot user endpoint.""" + res = rl_requests.get( + "https://api.notion.com/v1/users/me", + headers=self.headers, + timeout=_NOTION_CALL_TIMEOUT, + ) + res.raise_for_status() + data = res.json() + bot = data.get("bot", {}) + # workspace_id may be in bot object, fallback to user id + workspace_id = bot.get("workspace_id", data.get("id")) + workspace_name = bot.get("workspace_name", "Notion Workspace") + return workspace_id, workspace_name + + def _get_workspace_hierarchy_node(self) -> HierarchyNode | None: + """Get the workspace hierarchy node, fetching workspace info if needed. + + Returns None if the workspace node has already been yielded. + """ + if self.workspace_id is None: + self.workspace_id, self.workspace_name = self._fetch_workspace_info() + + if self.workspace_id in self.seen_hierarchy_node_raw_ids: + return None + + self.seen_hierarchy_node_raw_ids.add(self.workspace_id) + return HierarchyNode( + raw_node_id=self.workspace_id, + raw_parent_id=None, # Parent is SOURCE (auto-created by system) + display_name=self.workspace_name or "Notion Workspace", + link=f"https://notion.so/{self.workspace_id.replace('-', '')}", + node_type=HierarchyNodeType.WORKSPACE, + ) + + def _get_parent_raw_id( + self, parent: dict[str, Any] | None, page_id: str | None = None + ) -> str | None: + """Get the parent raw ID for hierarchy tracking. + + Returns workspace_id for top-level pages, or the direct parent ID for nested pages. + + Args: + parent: The parent object from the Notion API + page_id: The page's own ID, used to look up block_id parents in our cache + """ + if not parent: + return self.workspace_id # Default to workspace if no parent info + + parent_type = parent.get("type") + + if parent_type == "workspace": + return self.workspace_id + elif parent_type == "block_id": + # Inline page in a block - resolve to the containing page if we discovered it + if page_id and page_id in self._child_page_parent_map: + return self._child_page_parent_map[page_id] + # Fallback to workspace if we don't know the parent + return self.workspace_id + elif parent_type == "data_source_id": + # Newer Notion API may use data_source_id for databases + return parent.get("database_id") or parent.get("data_source_id") + elif parent_type in ["page_id", "database_id"]: + return parent.get(parent_type) + + return self.workspace_id + + def _maybe_yield_hierarchy_node( + self, + raw_node_id: str, + raw_parent_id: str | None, + display_name: str, + link: str | None, + node_type: HierarchyNodeType, + ) -> HierarchyNode | None: + """Create and return a hierarchy node if not already yielded. + + Args: + raw_node_id: The raw ID of the node + raw_parent_id: The raw ID of the parent node + display_name: Human-readable name + link: URL to the node in Notion + node_type: Type of hierarchy node + + Returns: + HierarchyNode if new, None if already yielded + """ + if raw_node_id in self.seen_hierarchy_node_raw_ids: + return None + self.seen_hierarchy_node_raw_ids.add(raw_node_id) + return HierarchyNode( + raw_node_id=raw_node_id, + raw_parent_id=raw_parent_id, + display_name=display_name, + link=link, + node_type=node_type, + ) + @staticmethod def _properties_to_str(properties: dict[str, Any]) -> str: """Converts Notion properties to a string""" @@ -350,11 +471,34 @@ def _recurse_properties(inner_dict: dict[str, Any]) -> str | None: return result def _read_pages_from_database( - self, database_id: str - ) -> tuple[list[NotionBlock], list[str]]: - """Returns a list of top level blocks and all page IDs in the database""" + self, + database_id: str, + database_parent_raw_id: str | None = None, + database_name: str | None = None, + ) -> BlockReadOutput: + """Returns blocks, page IDs, and hierarchy nodes from a database. + + Args: + database_id: The ID of the database + database_parent_raw_id: The raw ID of the database's parent (containing page or workspace) + database_name: The name of the database (from child_database block title) + """ result_blocks: list[NotionBlock] = [] result_pages: list[str] = [] + hierarchy_nodes: list[HierarchyNode] = [] + + # Create hierarchy node for this database if not already yielded. + # Notion URLs omit dashes from UUIDs: https://notion.so/17ab3186873d418fb899c3f6a43f68de + db_node = self._maybe_yield_hierarchy_node( + raw_node_id=database_id, + raw_parent_id=database_parent_raw_id or self.workspace_id, + display_name=database_name or f"Database {database_id}", + link=f"https://notion.so/{database_id.replace('-', '')}", + node_type=HierarchyNodeType.DATABASE, + ) + if db_node: + hierarchy_nodes.append(db_node) + cursor = None while True: data = self._fetch_database(database_id, cursor) @@ -376,28 +520,59 @@ def _read_pages_from_database( logger.debug( f"Found database with ID '{obj_id}' in database '{database_id}'" ) - # The inner contents are ignored at this level - _, child_pages = self._read_pages_from_database(obj_id) - result_pages.extend(child_pages) + # Get nested database name from properties if available + nested_db_title = result.get("title", []) + nested_db_name = None + if nested_db_title and len(nested_db_title) > 0: + nested_db_name = ( + nested_db_title[0].get("text", {}).get("content") + ) + nested_output = self._read_pages_from_database( + obj_id, + database_parent_raw_id=database_id, + database_name=nested_db_name, + ) + result_pages.extend(nested_output.child_page_ids) + hierarchy_nodes.extend(nested_output.hierarchy_nodes) if data["next_cursor"] is None: break cursor = data["next_cursor"] - return result_blocks, result_pages + return BlockReadOutput( + blocks=result_blocks, + child_page_ids=result_pages, + hierarchy_nodes=hierarchy_nodes, + ) + + def _read_blocks( + self, base_block_id: str, containing_page_id: str | None = None + ) -> BlockReadOutput: + """Reads all child blocks for the specified block. - def _read_blocks(self, base_block_id: str) -> tuple[list[NotionBlock], list[str]]: - """Reads all child blocks for the specified block, returns a list of blocks and child page ids""" + Args: + base_block_id: The block ID to read children from + containing_page_id: The ID of the page that contains this block tree. + Used to correctly map child pages/databases to their parent page + rather than intermediate block IDs. + """ + # If no containing_page_id provided, assume base_block_id is the page itself + page_id = containing_page_id or base_block_id result_blocks: list[NotionBlock] = [] child_pages: list[str] = [] + hierarchy_nodes: list[HierarchyNode] = [] cursor = None while True: data = self._fetch_child_blocks(base_block_id, cursor) # this happens when a block is not shared with the integration if data is None: - return result_blocks, child_pages + return BlockReadOutput( + blocks=result_blocks, + child_page_ids=child_pages, + hierarchy_nodes=hierarchy_nodes, + ) for result in data["results"]: logger.debug( @@ -441,27 +616,35 @@ def _read_blocks(self, base_block_id: str) -> tuple[list[NotionBlock], list[str] if result["has_children"]: if result_type == "child_page": - # Child pages will not be included at this top level, it will be a separate document + # Child pages will not be included at this top level, it will be a separate document. + # Track parent page so we can resolve block_id parents later. + # Use page_id (not base_block_id) to ensure we map to the containing page, + # not an intermediate block like a toggle or callout. child_pages.append(result_block_id) + self._child_page_parent_map[result_block_id] = page_id else: logger.debug(f"Entering sub-block: {result_block_id}") - subblocks, subblock_child_pages = self._read_blocks( - result_block_id - ) + sub_output = self._read_blocks(result_block_id, page_id) logger.debug(f"Finished sub-block: {result_block_id}") - result_blocks.extend(subblocks) - child_pages.extend(subblock_child_pages) + result_blocks.extend(sub_output.blocks) + child_pages.extend(sub_output.child_page_ids) + hierarchy_nodes.extend(sub_output.hierarchy_nodes) if result_type == "child_database": - inner_blocks, inner_child_pages = self._read_pages_from_database( - result_block_id + # Extract database name from the child_database block + db_title = result_obj.get("title", "") + db_output = self._read_pages_from_database( + result_block_id, + database_parent_raw_id=page_id, # Parent is the containing page + database_name=db_title or None, ) # A database on a page often looks like a table, we need to include it for the contents # of the page but the children (cells) should be processed as other Documents - result_blocks.extend(inner_blocks) + result_blocks.extend(db_output.blocks) + hierarchy_nodes.extend(db_output.hierarchy_nodes) if self.recursive_index_enabled: - child_pages.extend(inner_child_pages) + child_pages.extend(db_output.child_page_ids) if cur_result_text_arr: new_block = NotionBlock( @@ -476,7 +659,11 @@ def _read_blocks(self, base_block_id: str) -> tuple[list[NotionBlock], list[str] cursor = data["next_cursor"] - return result_blocks, child_pages + return BlockReadOutput( + blocks=result_blocks, + child_page_ids=child_pages, + hierarchy_nodes=hierarchy_nodes, + ) def _read_page_title(self, page: NotionPage) -> str | None: """Extracts the title from a Notion page""" @@ -494,7 +681,7 @@ def _read_pages( self, pages: list[NotionPage], ) -> Generator[Document | HierarchyNode, None, None]: - """Reads pages for rich text content and generates Documents + """Reads pages for rich text content and generates Documents and HierarchyNodes Note that a page which is turned into a "wiki" becomes a database but both top level pages and top level databases do not seem to have any properties associated with them. @@ -512,8 +699,8 @@ def _read_pages( continue logger.info(f"Reading page with ID '{page.id}', with url {page.url}") - page_blocks, child_page_ids = self._read_blocks(page.id) - all_child_page_ids.extend(child_page_ids) + block_output = self._read_blocks(page.id) + all_child_page_ids.extend(block_output.child_page_ids) # okay to mark here since there's no way for this to not succeed # without a critical failure @@ -521,8 +708,26 @@ def _read_pages( raw_page_title = self._read_page_title(page) page_title = raw_page_title or f"Untitled Page with ID {page.id}" + parent_raw_id = self._get_parent_raw_id(page.parent, page_id=page.id) + + # If this page has children (pages or databases), yield it as a hierarchy node FIRST + # This ensures parent nodes are created before child documents reference them + if block_output.child_page_ids or block_output.hierarchy_nodes: + hierarchy_node = self._maybe_yield_hierarchy_node( + raw_node_id=page.id, + raw_parent_id=parent_raw_id, + display_name=page_title, + link=page.url, + node_type=HierarchyNodeType.PAGE, + ) + if hierarchy_node: + yield hierarchy_node + + # Yield database hierarchy nodes discovered in this page's blocks + for db_node in block_output.hierarchy_nodes: + yield db_node - if not page_blocks: + if not block_output.blocks: if not raw_page_title: logger.warning( f"No blocks OR title found for page with ID '{page.id}'. Skipping." @@ -555,7 +760,7 @@ def _read_pages( link=f"{page.url}#{block.id.replace('-', '')}", text=block.prefix + block.text, ) - for block in page_blocks + for block in block_output.blocks ] yield ( @@ -568,6 +773,7 @@ def _read_pages( page.last_edited_time ).astimezone(timezone.utc), metadata={}, + parent_hierarchy_raw_node_id=parent_raw_id, ) ) self.indexed_pages.add(page.id) @@ -599,6 +805,55 @@ def _search_notion(self, query_dict: dict[str, Any]) -> NotionSearchResponse: res.raise_for_status() return NotionSearchResponse(**res.json()) + # The | Document is needed for mypy type checking + def _yield_database_hierarchy_nodes( + self, + ) -> Generator[HierarchyNode | Document, None, None]: + """Search for all databases and yield hierarchy nodes for each. + + This must be called BEFORE page indexing so that database hierarchy nodes + exist when pages inside databases reference them as parents. + """ + query_dict: dict[str, Any] = { + "filter": {"property": "object", "value": "database"}, + "page_size": _NOTION_PAGE_SIZE, + } + pages_seen = 0 + while pages_seen < _MAX_PAGES: + db_res = self._search_notion(query_dict) + for db in db_res.results: + db_id = db["id"] + # Extract title from the title array + title_arr = db.get("title", []) + db_name = None + if title_arr: + db_name = " ".join( + t.get("plain_text", "") for t in title_arr + ).strip() + if not db_name: + db_name = f"Database {db_id}" + + # Get parent using existing helper + parent_raw_id = self._get_parent_raw_id(db.get("parent")) + + # Notion URLs omit dashes from UUIDs + db_url = db.get("url") or f"https://notion.so/{db_id.replace('-', '')}" + + node = self._maybe_yield_hierarchy_node( + raw_node_id=db_id, + raw_parent_id=parent_raw_id or self.workspace_id, + display_name=db_name, + link=db_url, + node_type=HierarchyNodeType.DATABASE, + ) + if node: + yield node + + if not db_res.has_more: + break + query_dict["start_cursor"] = db_res.next_cursor + pages_seen += 1 + def _filter_pages_by_time( self, pages: list[dict[str, Any]], @@ -632,6 +887,11 @@ def _recursive_load(self) -> GenerateDocumentsOutput: "recursively load pages. This should never happen." ) + # Yield workspace hierarchy node FIRST before any pages + workspace_node = self._get_workspace_hierarchy_node() + if workspace_node: + yield [workspace_node] + logger.info( "Recursively loading pages from Notion based on root page with " f"ID: {self.root_page_id}" @@ -657,7 +917,17 @@ def load_from_state(self) -> GenerateDocumentsOutput: yield from self._recursive_load() return - query_dict = { + # Yield workspace hierarchy node FIRST before any pages + workspace_node = self._get_workspace_hierarchy_node() + if workspace_node: + yield [workspace_node] + + # Yield database hierarchy nodes BEFORE pages so parent references resolve + yield from batch_generator( + self._yield_database_hierarchy_nodes(), self.batch_size + ) + + query_dict: dict[str, Any] = { "filter": {"property": "object", "value": "page"}, "page_size": _NOTION_PAGE_SIZE, } @@ -684,7 +954,19 @@ def poll_source( yield from self._recursive_load() return - query_dict = { + # Yield workspace hierarchy node FIRST before any pages + workspace_node = self._get_workspace_hierarchy_node() + if workspace_node: + yield [workspace_node] + + # Yield database hierarchy nodes BEFORE pages so parent references resolve. + # We yield all databases without time filtering because a page's parent + # database might not have been edited even if the page was. + yield from batch_generator( + self._yield_database_hierarchy_nodes(), self.batch_size + ) + + query_dict: dict[str, Any] = { "page_size": _NOTION_PAGE_SIZE, "sort": {"timestamp": "last_edited_time", "direction": "descending"}, "filter": {"property": "object", "value": "page"}, diff --git a/backend/onyx/db/hierarchy.py b/backend/onyx/db/hierarchy.py index 2f4a5ff465f..337f853aaa3 100644 --- a/backend/onyx/db/hierarchy.py +++ b/backend/onyx/db/hierarchy.py @@ -13,6 +13,18 @@ logger = setup_logger() +# Sources where hierarchy nodes can also be documents. +# For these sources, pages/items can be both a hierarchy node (with children) +# AND a document with indexed content. For example: +# - Notion: Pages with child pages are hierarchy nodes, but also documents +# - Confluence: Pages can have child pages and also contain content +# Other sources like Google Drive have folders as hierarchy nodes, but folders +# are not documents themselves. +SOURCES_WITH_HIERARCHY_NODE_DOCUMENTS: set[DocumentSource] = { + DocumentSource.NOTION, + DocumentSource.CONFLUENCE, +} + def _get_source_display_name(source: DocumentSource) -> str: """Get a human-readable display name for a source type.""" @@ -241,7 +253,6 @@ def upsert_hierarchy_node( existing_node.display_name = node.display_name existing_node.link = node.link existing_node.node_type = node.node_type - existing_node.document_id = node.document_id existing_node.parent_id = parent_id # Update permission fields existing_node.is_public = is_public @@ -256,7 +267,6 @@ def upsert_hierarchy_node( link=node.link, source=source, node_type=node.node_type, - document_id=node.document_id, parent_id=parent_id, is_public=is_public, external_user_emails=external_user_emails, @@ -330,6 +340,61 @@ def upsert_hierarchy_nodes_batch( return results +def link_hierarchy_nodes_to_documents( + db_session: Session, + document_ids: list[str], + source: DocumentSource, + commit: bool = True, +) -> int: + """ + Link hierarchy nodes to their corresponding documents. + + For connectors like Notion and Confluence where pages can be both hierarchy nodes + AND documents, we need to set the document_id field on hierarchy nodes after the + documents are created. This is because hierarchy nodes are processed before documents, + and the FK constraint on document_id requires the document to exist first. + + Args: + db_session: SQLAlchemy session + document_ids: List of document IDs that were just created/updated + source: The document source (e.g., NOTION, CONFLUENCE) + commit: Whether to commit the transaction + + Returns: + Number of hierarchy nodes that were linked to documents + """ + # Skip for sources where hierarchy nodes cannot also be documents + if source not in SOURCES_WITH_HIERARCHY_NODE_DOCUMENTS: + return 0 + + if not document_ids: + return 0 + + # Find hierarchy nodes where raw_node_id matches a document_id + # These are pages that are both hierarchy nodes and documents + stmt = select(HierarchyNode).where( + HierarchyNode.source == source, + HierarchyNode.raw_node_id.in_(document_ids), + HierarchyNode.document_id.is_(None), # Only update if not already linked + ) + nodes_to_update = list(db_session.execute(stmt).scalars().all()) + + # Update document_id for each matching node + for node in nodes_to_update: + node.document_id = node.raw_node_id + + if commit: + db_session.commit() + + if nodes_to_update: + logger.debug( + f"Linked {len(nodes_to_update)} hierarchy nodes to documents " + f"for source {source.value}" + ) + + return len(nodes_to_update) + + def get_hierarchy_node_children( db_session: Session, parent_id: int, diff --git a/backend/onyx/indexing/indexing_pipeline.py b/backend/onyx/indexing/indexing_pipeline.py index eef407d13b8..a38da455476 100644 --- a/backend/onyx/indexing/indexing_pipeline.py +++ b/backend/onyx/indexing/indexing_pipeline.py @@ -29,6 +29,7 @@ from onyx.db.document import get_documents_by_ids from onyx.db.document import upsert_document_by_connector_credential_pair from onyx.db.document import upsert_documents +from onyx.db.hierarchy import link_hierarchy_nodes_to_documents from onyx.db.models import Document as DBDocument from onyx.db.models import IndexModelStatus from onyx.db.search_settings import get_active_search_settings @@ -272,6 +273,17 @@ def index_doc_batch_prepare( document_ids, ) + # Link hierarchy nodes to documents for sources where pages can be both + # hierarchy nodes AND documents (e.g., Notion, Confluence). + # This must happen after documents are upserted due to FK constraint. + if documents: + link_hierarchy_nodes_to_documents( + db_session=db_session, + document_ids=document_ids, + source=documents[0].source, + commit=False, # We'll commit with the rest of the transaction + ) + # No docs to process because the batch is empty or every doc was already indexed if not updatable_docs: return None diff --git a/backend/tests/daily/connectors/notion/test_notion_connector.py b/backend/tests/daily/connectors/notion/test_notion_connector.py index ea5d980ec00..3236f4f7f16 100644 --- a/backend/tests/daily/connectors/notion/test_notion_connector.py +++ b/backend/tests/daily/connectors/notion/test_notion_connector.py @@ -4,10 +4,38 @@ import pytest from onyx.configs.constants import DocumentSource +from onyx.connectors.models import Document from onyx.connectors.models import HierarchyNode from onyx.connectors.notion.connector import NotionConnector +def compare_hierarchy_nodes( + yielded_nodes: list[HierarchyNode], + expected_nodes: list[HierarchyNode], +) -> None: + """Compare yielded HierarchyNodes against expected ground truth. + + Compares nodes by their essential fields (raw_node_id, raw_parent_id, display_name, link). + Order does not matter. + """ + if not expected_nodes: + # Empty ground truth - skip comparison for now + return + + yielded_set = { + (n.raw_node_id, n.raw_parent_id, n.display_name, n.link) for n in yielded_nodes + } + expected_set = { + (n.raw_node_id, n.raw_parent_id, n.display_name, n.link) for n in expected_nodes + } + + missing = expected_set - yielded_set + extra = yielded_set - expected_set + + assert not missing, f"Missing expected HierarchyNodes: {missing}" + assert not extra, f"Unexpected HierarchyNodes: {extra}" + + @pytest.fixture def notion_connector() -> NotionConnector: """Create a NotionConnector with credentials from environment variables""" @@ -27,21 +55,32 @@ def test_notion_connector_basic(notion_connector: NotionConnector) -> None: """ doc_batch_generator = notion_connector.poll_source(0, time.time()) - # Get first batch of documents - doc_batch = next(doc_batch_generator) + # Collect all documents and hierarchy nodes from all batches + documents: list[Document] = [] + hierarchy_nodes: list[HierarchyNode] = [] + for doc_batch in doc_batch_generator: + for item in doc_batch: + if isinstance(item, HierarchyNode): + hierarchy_nodes.append(item) + else: + documents.append(item) + + # Verify document count assert ( - len(doc_batch) == 5 + len(documents) == 5 ), "Expected exactly 5 documents (root, two children, table entry, and table entry child)" + # Verify HierarchyNodes against ground truth (empty for now) + expected_hierarchy_nodes: list[HierarchyNode] = [] + compare_hierarchy_nodes(hierarchy_nodes, expected_hierarchy_nodes) + # Find root and child documents by semantic identifier root_doc = None child1_doc = None child2_doc = None table_entry_doc = None table_entry_child_doc = None - for doc in doc_batch: - if isinstance(doc, HierarchyNode): - continue + for doc in documents: if doc.semantic_identifier == "Root": root_doc = doc elif doc.semantic_identifier == "Child1": From a48d74c7fd76a7905c8e7a568aeac238533a44f4 Mon Sep 17 00:00:00 2001 From: Chris Weaver Date: Fri, 30 Jan 2026 11:57:11 -0800 Subject: [PATCH 005/334] fix: onboarding model specification (#8019) --- .../onboarding/components/llmConnectionHelpers.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/web/src/refresh-components/onboarding/components/llmConnectionHelpers.ts b/web/src/refresh-components/onboarding/components/llmConnectionHelpers.ts index 81cf698c875..0dbe5fda554 100644 --- a/web/src/refresh-components/onboarding/components/llmConnectionHelpers.ts +++ b/web/src/refresh-components/onboarding/components/llmConnectionHelpers.ts @@ -85,7 +85,10 @@ export const testApiKeyHelper = async ( api_version: finalApiVersion, deployment_name: finalDeploymentName, provider: providerName, + // since this is used for onboarding, we always specify the + // API key and custom config api_key_changed: true, + custom_config_changed: true, custom_config: { ...(formValues?.custom_config ?? {}), ...(customConfigOverride ?? {}), From e670bd994b985d3c5197cdfc264f82c709d972a5 Mon Sep 17 00:00:00 2001 From: Danelegend <43459662+Danelegend@users.noreply.github.com> Date: Fri, 30 Jan 2026 12:44:03 -0800 Subject: [PATCH 006/334] feat(persona): Add default_model_configuration_id column (#8020) --- ...ersona_new_default_model_configuration_.py | 40 +++++++++++++++++++ backend/onyx/db/models.py | 9 ++++- 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 backend/alembic/versions/be87a654d5af_persona_new_default_model_configuration_.py diff --git a/backend/alembic/versions/be87a654d5af_persona_new_default_model_configuration_.py b/backend/alembic/versions/be87a654d5af_persona_new_default_model_configuration_.py new file mode 100644 index 00000000000..d476420806d --- /dev/null +++ b/backend/alembic/versions/be87a654d5af_persona_new_default_model_configuration_.py @@ -0,0 +1,40 @@ +"""Persona new default model configuration id column + +Revision ID: be87a654d5af +Revises: e7f8a9b0c1d2 +Create Date: 2026-01-30 11:14:17.306275 + +""" + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "be87a654d5af" +down_revision = "e7f8a9b0c1d2" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.add_column( + "persona", + sa.Column("default_model_configuration_id", sa.Integer(), nullable=True), + ) + op.create_foreign_key( + "fk_persona_default_model_configuration_id", + "persona", + "model_configuration", + ["default_model_configuration_id"], + ["id"], + ondelete="SET NULL", + ) + + +def downgrade() -> None: + op.drop_constraint( + "fk_persona_default_model_configuration_id", "persona", type_="foreignkey" + ) + + op.drop_column("persona", "default_model_configuration_id") diff --git a/backend/onyx/db/models.py b/backend/onyx/db/models.py index 14fbed3d298..33e33daf71c 100644 --- a/backend/onyx/db/models.py +++ b/backend/onyx/db/models.py @@ -3010,8 +3010,7 @@ class Persona(Base): Enum(RecencyBiasSetting, native_enum=False) ) - # Allows the Persona to specify a different LLM version than is controlled - # globablly via env variables. For flexibility, validity is not currently enforced + # Allows the persona to specify a specific default LLM model # NOTE: only is applied on the actual response generation - is not used for things like # auto-detected time filters, relevance filters, etc. llm_model_provider_override: Mapped[str | None] = mapped_column( @@ -3020,6 +3019,12 @@ class Persona(Base): llm_model_version_override: Mapped[str | None] = mapped_column( String, nullable=True ) + default_model_configuration_id: Mapped[int | None] = mapped_column( + Integer, + ForeignKey("model_configuration.id", ondelete="SET NULL"), + nullable=True, + ) + starter_messages: Mapped[list[StarterMessage] | None] = mapped_column( PydanticListType(StarterMessage), nullable=True ) From e9be9101e5d2611f7efb41c1ec6eaae095e2f0d3 Mon Sep 17 00:00:00 2001 From: Raunak Bhagat Date: Fri, 30 Jan 2026 12:48:14 -0800 Subject: [PATCH 007/334] fix: Add explicit sizings to icons (#8018) --- web/lib/opal/src/icons/arrow-down-dot.tsx | 6 ++++-- web/lib/opal/src/icons/arrow-left-dot.tsx | 6 ++++-- web/lib/opal/src/icons/arrow-right-dot.tsx | 6 ++++-- web/lib/opal/src/icons/arrow-up-dot.tsx | 6 ++++-- web/lib/opal/src/icons/bracket-curly.tsx | 6 ++++-- web/lib/opal/src/icons/claude.tsx | 4 +++- web/lib/opal/src/icons/clipboard.tsx | 6 ++++-- web/lib/opal/src/icons/corner-right-up-dot.tsx | 6 ++++-- web/lib/opal/src/icons/onyx-logo.tsx | 14 ++++---------- web/lib/opal/src/icons/openai.tsx | 4 +++- web/lib/opal/src/icons/two-line-small.tsx | 6 ++++-- web/lib/opal/src/icons/user-plus.tsx | 2 ++ web/lib/opal/src/icons/wallet.tsx | 6 ++++-- .../admin/configuration/default-assistant/page.tsx | 8 +------- .../web-search/WebProviderSetupModal.tsx | 6 +----- .../app/admin/configuration/web-search/page.tsx | 4 ++-- .../refresh-components/ConnectionProviderIcon.tsx | 2 +- web/src/refresh-components/Modal.tsx | 10 +++++++++- 18 files changed, 62 insertions(+), 46 deletions(-) diff --git a/web/lib/opal/src/icons/arrow-down-dot.tsx b/web/lib/opal/src/icons/arrow-down-dot.tsx index 2df48c8a43c..9349740fccf 100644 --- a/web/lib/opal/src/icons/arrow-down-dot.tsx +++ b/web/lib/opal/src/icons/arrow-down-dot.tsx @@ -1,6 +1,8 @@ -import type { SVGProps } from "react"; -const SvgArrowDownDot = (props: SVGProps) => ( +import type { IconProps } from "@opal/types"; +const SvgArrowDownDot = ({ size, ...props }: IconProps) => ( ) => ( +import type { IconProps } from "@opal/types"; +const SvgArrowLeftDot = ({ size, ...props }: IconProps) => ( ) => ( +import type { IconProps } from "@opal/types"; +const SvgArrowRightDot = ({ size, ...props }: IconProps) => ( ) => ( +import type { IconProps } from "@opal/types"; +const SvgArrowUpDot = ({ size, ...props }: IconProps) => ( ) => ( +const SvgBracketCurly = ({ size, ...props }: IconProps) => ( { +const SvgClaude = ({ size, ...props }: IconProps) => { const clipId = React.useId(); return ( ) => ( +import type { IconProps } from "@opal/types"; +const SvgClipboard = ({ size, ...props }: IconProps) => ( ) => ( +import type { IconProps } from "@opal/types"; +const SvgCornerRightUpDot = ({ size, ...props }: IconProps) => ( ( +const SvgOnyxLogo = ({ size, ...props }: IconProps) => ( @@ -23,4 +17,4 @@ const OnyxLogo = ({ /> ); -export default OnyxLogo; +export default SvgOnyxLogo; diff --git a/web/lib/opal/src/icons/openai.tsx b/web/lib/opal/src/icons/openai.tsx index 0392d3b6dd7..d0826b1e775 100644 --- a/web/lib/opal/src/icons/openai.tsx +++ b/web/lib/opal/src/icons/openai.tsx @@ -1,10 +1,12 @@ import React from "react"; import type { IconProps } from "@opal/types"; -const SvgOpenAI = (props: IconProps) => { +const SvgOpenAI = ({ size, ...props }: IconProps) => { const clipId = React.useId(); return ( ) => ( +import type { IconProps } from "@opal/types"; +const SvgTwoLineSmall = ({ size, ...props }: IconProps) => ( ( ) => ( +import type { IconProps } from "@opal/types"; +const SvgWallet = ({ size, ...props }: IconProps) => ( - } + icon={} /> diff --git a/web/src/app/admin/configuration/web-search/WebProviderSetupModal.tsx b/web/src/app/admin/configuration/web-search/WebProviderSetupModal.tsx index a32de519dcc..56442b68804 100644 --- a/web/src/app/admin/configuration/web-search/WebProviderSetupModal.tsx +++ b/web/src/app/admin/configuration/web-search/WebProviderSetupModal.tsx @@ -68,11 +68,7 @@ export const WebProviderSetupModal = memo(
- +
); diff --git a/web/src/app/admin/configuration/web-search/page.tsx b/web/src/app/admin/configuration/web-search/page.tsx index fa555d55339..edb853d8b90 100644 --- a/web/src/app/admin/configuration/web-search/page.tsx +++ b/web/src/app/admin/configuration/web-search/page.tsx @@ -1168,7 +1168,7 @@ export default function Page() { alt: `${label} logo`, fallback: provider.provider_type === "onyx_web_crawler" ? ( - + ) : undefined, size: 16, isHighlighted: isCurrentCrawler, @@ -1381,7 +1381,7 @@ export default function Page() { } logo`, fallback: selectedContentProviderType === "onyx_web_crawler" ? ( - + ) : undefined, size: 24, containerSize: 28, diff --git a/web/src/refresh-components/ConnectionProviderIcon.tsx b/web/src/refresh-components/ConnectionProviderIcon.tsx index f323f6f4c00..5f65aa31835 100644 --- a/web/src/refresh-components/ConnectionProviderIcon.tsx +++ b/web/src/refresh-components/ConnectionProviderIcon.tsx @@ -13,7 +13,7 @@ const ConnectionProviderIcon = memo(({ icon }: ConnectionProviderIconProps) => {
- +
); diff --git a/web/src/refresh-components/Modal.tsx b/web/src/refresh-components/Modal.tsx index 514c4562d56..6c5023f84e0 100644 --- a/web/src/refresh-components/Modal.tsx +++ b/web/src/refresh-components/Modal.tsx @@ -402,7 +402,15 @@ const ModalHeader = React.forwardRef( flexDirection="row" justifyContent="between" > - + {/* + The `h-[1.5rem]` and `w-[1.5rem]` were added as backups here. + However, prop-resolution technically resolves to choosing classNames over size props, so technically the `size={24}` is the backup. + We specify both to be safe. + + # Note + 1.5rem === 24px + */} + {onClose && (
Date: Fri, 30 Jan 2026 12:52:21 -0800 Subject: [PATCH 008/334] fix(asana): Workspace Team ID mismatch (#7674) --- backend/onyx/connectors/asana/connector.py | 16 ++++-- .../connectors/asana/test_asana_connector.py | 50 +++++++++++++++++++ 2 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 backend/tests/unit/onyx/connectors/asana/test_asana_connector.py diff --git a/backend/onyx/connectors/asana/connector.py b/backend/onyx/connectors/asana/connector.py index c17e435e469..9cd50932313 100755 --- a/backend/onyx/connectors/asana/connector.py +++ b/backend/onyx/connectors/asana/connector.py @@ -26,11 +26,17 @@ def __init__( batch_size: int = INDEX_BATCH_SIZE, continue_on_failure: bool = CONTINUE_ON_CONNECTOR_FAILURE, ) -> None: - self.workspace_id = asana_workspace_id - self.project_ids_to_index: list[str] | None = ( - asana_project_ids.split(",") if asana_project_ids is not None else None - ) - self.asana_team_id = asana_team_id + self.workspace_id = asana_workspace_id.strip() + if asana_project_ids: + project_ids = [ + project_id.strip() + for project_id in asana_project_ids.split(",") + if project_id.strip() + ] + self.project_ids_to_index = project_ids or None + else: + self.project_ids_to_index = None + self.asana_team_id = (asana_team_id.strip() or None) if asana_team_id else None self.batch_size = batch_size self.continue_on_failure = continue_on_failure logger.info( diff --git a/backend/tests/unit/onyx/connectors/asana/test_asana_connector.py b/backend/tests/unit/onyx/connectors/asana/test_asana_connector.py new file mode 100644 index 00000000000..4c9b671e569 --- /dev/null +++ b/backend/tests/unit/onyx/connectors/asana/test_asana_connector.py @@ -0,0 +1,50 @@ +"""Tests for Asana connector configuration parsing.""" + +import pytest + +from onyx.connectors.asana.connector import AsanaConnector + + +@pytest.mark.parametrize( + "project_ids,expected", + [ + (None, None), + ("", None), + (" ", None), + (" 123 ", ["123"]), + (" 123 , , 456 , ", ["123", "456"]), + ], +) +def test_asana_connector_project_ids_normalization( + project_ids: str | None, expected: list[str] | None +) -> None: + connector = AsanaConnector( + asana_workspace_id=" 1153293530468850 ", + asana_project_ids=project_ids, + asana_team_id=" 1210918501948021 ", + ) + + assert connector.workspace_id == "1153293530468850" + assert connector.project_ids_to_index == expected + assert connector.asana_team_id == "1210918501948021" + + +@pytest.mark.parametrize( + "team_id,expected", + [ + (None, None), + ("", None), + (" ", None), + (" 1210918501948021 ", "1210918501948021"), + ], +) +def test_asana_connector_team_id_normalization( + team_id: str | None, expected: str | None +) -> None: + connector = AsanaConnector( + asana_workspace_id="1153293530468850", + asana_project_ids=None, + asana_team_id=team_id, + ) + + assert connector.asana_team_id == expected From b81dd6f4a3ad9b3e51855b3897ecbe061b65072a Mon Sep 17 00:00:00 2001 From: Justin Tahara <105671973+justin-tahara@users.noreply.github.com> Date: Fri, 30 Jan 2026 13:19:55 -0800 Subject: [PATCH 009/334] fix(desktop): Remove Global Shortcuts (#7914) --- desktop/.gitignore | 3 + desktop/src-tauri/Cargo.lock | 96 ------------------- desktop/src-tauri/Cargo.toml | 1 - .../src-tauri/gen/schemas/acl-manifests.json | 2 +- .../src-tauri/gen/schemas/desktop-schema.json | 66 ------------- .../src-tauri/gen/schemas/macOS-schema.json | 66 ------------- desktop/src-tauri/src/main.rs | 76 +-------------- 7 files changed, 5 insertions(+), 305 deletions(-) diff --git a/desktop/.gitignore b/desktop/.gitignore index b2f97fa49ec..3616f122076 100644 --- a/desktop/.gitignore +++ b/desktop/.gitignore @@ -22,3 +22,6 @@ npm-debug.log* # Local env files .env .env.local + +# Generated files +src-tauri/gen/schemas/acl-manifests.json diff --git a/desktop/src-tauri/Cargo.lock b/desktop/src-tauri/Cargo.lock index 42c0afd2973..839a5f65230 100644 --- a/desktop/src-tauri/Cargo.lock +++ b/desktop/src-tauri/Cargo.lock @@ -706,16 +706,6 @@ dependencies = [ "typeid", ] -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - [[package]] name = "fdeflate" version = "0.3.7" @@ -993,16 +983,6 @@ dependencies = [ "version_check", ] -[[package]] -name = "gethostname" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" -dependencies = [ - "rustix", - "windows-link 0.2.1", -] - [[package]] name = "getrandom" version = "0.1.16" @@ -1122,24 +1102,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" -[[package]] -name = "global-hotkey" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9247516746aa8e53411a0db9b62b0e24efbcf6a76e0ba73e5a91b512ddabed7" -dependencies = [ - "crossbeam-channel", - "keyboard-types", - "objc2 0.6.3", - "objc2-app-kit 0.3.2", - "once_cell", - "serde", - "thiserror 2.0.17", - "windows-sys 0.59.0", - "x11rb", - "xkeysym", -] - [[package]] name = "gobject-sys" version = "0.18.0" @@ -1713,12 +1675,6 @@ dependencies = [ "libc", ] -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - [[package]] name = "litemap" version = "0.8.1" @@ -2248,7 +2204,6 @@ dependencies = [ "serde_json", "tauri", "tauri-build", - "tauri-plugin-global-shortcut", "tauri-plugin-shell", "tauri-plugin-window-state", "tokio", @@ -2878,19 +2833,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" -dependencies = [ - "bitflags 2.10.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - [[package]] name = "rustversion" version = "1.0.22" @@ -3605,21 +3547,6 @@ dependencies = [ "walkdir", ] -[[package]] -name = "tauri-plugin-global-shortcut" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "424af23c7e88d05e4a1a6fc2c7be077912f8c76bd7900fd50aa2b7cbf5a2c405" -dependencies = [ - "global-hotkey", - "log", - "serde", - "serde_json", - "tauri", - "tauri-plugin", - "thiserror 2.0.17", -] - [[package]] name = "tauri-plugin-shell" version = "2.3.3" @@ -5021,29 +4948,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "x11rb" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" -dependencies = [ - "gethostname", - "rustix", - "x11rb-protocol", -] - -[[package]] -name = "x11rb-protocol" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" - -[[package]] -name = "xkeysym" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" - [[package]] name = "yoke" version = "0.8.1" diff --git a/desktop/src-tauri/Cargo.toml b/desktop/src-tauri/Cargo.toml index ce3bcf42a94..cfb299a9238 100644 --- a/desktop/src-tauri/Cargo.toml +++ b/desktop/src-tauri/Cargo.toml @@ -11,7 +11,6 @@ tauri-build = { version = "2.0", features = [] } [dependencies] tauri = { version = "2.0", features = ["macos-private-api", "tray-icon", "image-png"] } tauri-plugin-shell = "2.0" -tauri-plugin-global-shortcut = "2.0" tauri-plugin-window-state = "2.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/desktop/src-tauri/gen/schemas/acl-manifests.json b/desktop/src-tauri/gen/schemas/acl-manifests.json index eb5284c1681..7c10d4c4fda 100644 --- a/desktop/src-tauri/gen/schemas/acl-manifests.json +++ b/desktop/src-tauri/gen/schemas/acl-manifests.json @@ -1 +1 @@ -{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier","allow-bundle-type","allow-register-listener","allow-remove-listener"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-bundle-type":{"identifier":"allow-bundle-type","description":"Enables the bundle_type command without any pre-configured scope.","commands":{"allow":["bundle_type"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-remove-listener":{"identifier":"allow-remove-listener","description":"Enables the remove_listener command without any pre-configured scope.","commands":{"allow":["remove_listener"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-set-dock-visibility":{"identifier":"allow-set-dock-visibility","description":"Enables the set_dock_visibility command without any pre-configured scope.","commands":{"allow":["set_dock_visibility"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-bundle-type":{"identifier":"deny-bundle-type","description":"Denies the bundle_type command without any pre-configured scope.","commands":{"allow":[],"deny":["bundle_type"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"Denies the identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["identifier"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-data-store":{"identifier":"deny-remove-data-store","description":"Denies the remove_data_store command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_data_store"]}},"deny-remove-listener":{"identifier":"deny-remove-listener","description":"Denies the remove_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_listener"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-set-dock-visibility":{"identifier":"deny-set-dock-visibility","description":"Denies the set_dock_visibility command without any pre-configured scope.","commands":{"allow":[],"deny":["set_dock_visibility"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-auto-resize":{"identifier":"allow-set-webview-auto-resize","description":"Enables the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":["set_webview_auto_resize"],"deny":[]}},"allow-set-webview-background-color":{"identifier":"allow-set-webview-background-color","description":"Enables the set_webview_background_color command without any pre-configured scope.","commands":{"allow":["set_webview_background_color"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-auto-resize":{"identifier":"deny-set-webview-auto-resize","description":"Denies the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_auto_resize"]}},"deny-set-webview-background-color":{"identifier":"deny-set-webview-background-color","description":"Denies the set_webview_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_background_color"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-is-always-on-top","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-always-on-top":{"identifier":"allow-is-always-on-top","description":"Enables the is_always_on_top command without any pre-configured scope.","commands":{"allow":["is_always_on_top"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-background-color":{"identifier":"allow-set-background-color","description":"Enables the set_background_color command without any pre-configured scope.","commands":{"allow":["set_background_color"],"deny":[]}},"allow-set-badge-count":{"identifier":"allow-set-badge-count","description":"Enables the set_badge_count command without any pre-configured scope.","commands":{"allow":["set_badge_count"],"deny":[]}},"allow-set-badge-label":{"identifier":"allow-set-badge-label","description":"Enables the set_badge_label command without any pre-configured scope.","commands":{"allow":["set_badge_label"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-focusable":{"identifier":"allow-set-focusable","description":"Enables the set_focusable command without any pre-configured scope.","commands":{"allow":["set_focusable"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-overlay-icon":{"identifier":"allow-set-overlay-icon","description":"Enables the set_overlay_icon command without any pre-configured scope.","commands":{"allow":["set_overlay_icon"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-simple-fullscreen":{"identifier":"allow-set-simple-fullscreen","description":"Enables the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":["set_simple_fullscreen"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-always-on-top":{"identifier":"deny-is-always-on-top","description":"Denies the is_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["is_always_on_top"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-background-color":{"identifier":"deny-set-background-color","description":"Denies the set_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_background_color"]}},"deny-set-badge-count":{"identifier":"deny-set-badge-count","description":"Denies the set_badge_count command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_count"]}},"deny-set-badge-label":{"identifier":"deny-set-badge-label","description":"Denies the set_badge_label command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_label"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-focusable":{"identifier":"deny-set-focusable","description":"Denies the set_focusable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focusable"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-overlay-icon":{"identifier":"deny-set-overlay-icon","description":"Denies the set_overlay_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_overlay_icon"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-simple-fullscreen":{"identifier":"deny-set-simple-fullscreen","description":"Denies the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_simple_fullscreen"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"global-shortcut":{"default_permission":{"identifier":"default","description":"No features are enabled by default, as we believe\nthe shortcuts can be inherently dangerous and it is\napplication specific if specific shortcuts should be\nregistered or unregistered.\n","permissions":[]},"permissions":{"allow-is-registered":{"identifier":"allow-is-registered","description":"Enables the is_registered command without any pre-configured scope.","commands":{"allow":["is_registered"],"deny":[]}},"allow-register":{"identifier":"allow-register","description":"Enables the register command without any pre-configured scope.","commands":{"allow":["register"],"deny":[]}},"allow-register-all":{"identifier":"allow-register-all","description":"Enables the register_all command without any pre-configured scope.","commands":{"allow":["register_all"],"deny":[]}},"allow-unregister":{"identifier":"allow-unregister","description":"Enables the unregister command without any pre-configured scope.","commands":{"allow":["unregister"],"deny":[]}},"allow-unregister-all":{"identifier":"allow-unregister-all","description":"Enables the unregister_all command without any pre-configured scope.","commands":{"allow":["unregister_all"],"deny":[]}},"deny-is-registered":{"identifier":"deny-is-registered","description":"Denies the is_registered command without any pre-configured scope.","commands":{"allow":[],"deny":["is_registered"]}},"deny-register":{"identifier":"deny-register","description":"Denies the register command without any pre-configured scope.","commands":{"allow":[],"deny":["register"]}},"deny-register-all":{"identifier":"deny-register-all","description":"Denies the register_all command without any pre-configured scope.","commands":{"allow":[],"deny":["register_all"]}},"deny-unregister":{"identifier":"deny-unregister","description":"Denies the unregister command without any pre-configured scope.","commands":{"allow":[],"deny":["unregister"]}},"deny-unregister-all":{"identifier":"deny-unregister-all","description":"Denies the unregister_all command without any pre-configured scope.","commands":{"allow":[],"deny":["unregister_all"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"}},"required":["cmd","name"],"type":"object"},{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["name","sidecar"],"type":"object"}],"definitions":{"ShellScopeEntryAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ","type":"string"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellScopeEntryAllowedArgs":{"anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.","items":{"$ref":"#/definitions/ShellScopeEntryAllowedArg"},"type":"array"}],"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration."}},"description":"Shell scope entry.","title":"ShellScopeEntry"}},"window-state":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n","permissions":["allow-filename","allow-restore-state","allow-save-window-state"]},"permissions":{"allow-filename":{"identifier":"allow-filename","description":"Enables the filename command without any pre-configured scope.","commands":{"allow":["filename"],"deny":[]}},"allow-restore-state":{"identifier":"allow-restore-state","description":"Enables the restore_state command without any pre-configured scope.","commands":{"allow":["restore_state"],"deny":[]}},"allow-save-window-state":{"identifier":"allow-save-window-state","description":"Enables the save_window_state command without any pre-configured scope.","commands":{"allow":["save_window_state"],"deny":[]}},"deny-filename":{"identifier":"deny-filename","description":"Denies the filename command without any pre-configured scope.","commands":{"allow":[],"deny":["filename"]}},"deny-restore-state":{"identifier":"deny-restore-state","description":"Denies the restore_state command without any pre-configured scope.","commands":{"allow":[],"deny":["restore_state"]}},"deny-save-window-state":{"identifier":"deny-save-window-state","description":"Denies the save_window_state command without any pre-configured scope.","commands":{"allow":[],"deny":["save_window_state"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file +{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier","allow-bundle-type","allow-register-listener","allow-remove-listener"]},"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},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"}},"required":["cmd","name"],"type":"object"},{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["name","sidecar"],"type":"object"}],"definitions":{"ShellScopeEntryAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ","type":"string"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellScopeEntryAllowedArgs":{"anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.","items":{"$ref":"#/definitions/ShellScopeEntryAllowedArg"},"type":"array"}],"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration."}},"description":"Shell scope entry.","title":"ShellScopeEntry"}},"window-state":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\noperations are available from the window state plugin.\n\n#### Granted Permissions\n\nAll operations are enabled by default.\n\n","permissions":["allow-filename","allow-restore-state","allow-save-window-state"]},"permissions":{"allow-filename":{"identifier":"allow-filename","description":"Enables the filename command without any pre-configured scope.","commands":{"allow":["filename"],"deny":[]}},"allow-restore-state":{"identifier":"allow-restore-state","description":"Enables the restore_state command without any pre-configured scope.","commands":{"allow":["restore_state"],"deny":[]}},"allow-save-window-state":{"identifier":"allow-save-window-state","description":"Enables the save_window_state command without any pre-configured scope.","commands":{"allow":["save_window_state"],"deny":[]}},"deny-filename":{"identifier":"deny-filename","description":"Denies the filename command without any pre-configured scope.","commands":{"allow":[],"deny":["filename"]}},"deny-restore-state":{"identifier":"deny-restore-state","description":"Denies the restore_state command without any pre-configured scope.","commands":{"allow":[],"deny":["restore_state"]}},"deny-save-window-state":{"identifier":"deny-save-window-state","description":"Denies the save_window_state command without any pre-configured scope.","commands":{"allow":[],"deny":["save_window_state"]}}},"permission_sets":{},"global_scope_schema":null}} \ No newline at end of file diff --git a/desktop/src-tauri/gen/schemas/desktop-schema.json b/desktop/src-tauri/gen/schemas/desktop-schema.json index cc8f9ff3858..3ba08a5db32 100644 --- a/desktop/src-tauri/gen/schemas/desktop-schema.json +++ b/desktop/src-tauri/gen/schemas/desktop-schema.json @@ -2354,72 +2354,6 @@ "const": "core:window:deny-unminimize", "markdownDescription": "Denies the unminimize command without any pre-configured scope." }, - { - "description": "No features are enabled by default, as we believe\nthe shortcuts can be inherently dangerous and it is\napplication specific if specific shortcuts should be\nregistered or unregistered.\n", - "type": "string", - "const": "global-shortcut:default", - "markdownDescription": "No features are enabled by default, as we believe\nthe shortcuts can be inherently dangerous and it is\napplication specific if specific shortcuts should be\nregistered or unregistered.\n" - }, - { - "description": "Enables the is_registered command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:allow-is-registered", - "markdownDescription": "Enables the is_registered command without any pre-configured scope." - }, - { - "description": "Enables the register command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:allow-register", - "markdownDescription": "Enables the register command without any pre-configured scope." - }, - { - "description": "Enables the register_all command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:allow-register-all", - "markdownDescription": "Enables the register_all command without any pre-configured scope." - }, - { - "description": "Enables the unregister command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:allow-unregister", - "markdownDescription": "Enables the unregister command without any pre-configured scope." - }, - { - "description": "Enables the unregister_all command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:allow-unregister-all", - "markdownDescription": "Enables the unregister_all command without any pre-configured scope." - }, - { - "description": "Denies the is_registered command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:deny-is-registered", - "markdownDescription": "Denies the is_registered command without any pre-configured scope." - }, - { - "description": "Denies the register command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:deny-register", - "markdownDescription": "Denies the register command without any pre-configured scope." - }, - { - "description": "Denies the register_all command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:deny-register-all", - "markdownDescription": "Denies the register_all command without any pre-configured scope." - }, - { - "description": "Denies the unregister command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:deny-unregister", - "markdownDescription": "Denies the unregister command without any pre-configured scope." - }, - { - "description": "Denies the unregister_all command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:deny-unregister-all", - "markdownDescription": "Denies the unregister_all command without any pre-configured scope." - }, { "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", "type": "string", diff --git a/desktop/src-tauri/gen/schemas/macOS-schema.json b/desktop/src-tauri/gen/schemas/macOS-schema.json index cc8f9ff3858..3ba08a5db32 100644 --- a/desktop/src-tauri/gen/schemas/macOS-schema.json +++ b/desktop/src-tauri/gen/schemas/macOS-schema.json @@ -2354,72 +2354,6 @@ "const": "core:window:deny-unminimize", "markdownDescription": "Denies the unminimize command without any pre-configured scope." }, - { - "description": "No features are enabled by default, as we believe\nthe shortcuts can be inherently dangerous and it is\napplication specific if specific shortcuts should be\nregistered or unregistered.\n", - "type": "string", - "const": "global-shortcut:default", - "markdownDescription": "No features are enabled by default, as we believe\nthe shortcuts can be inherently dangerous and it is\napplication specific if specific shortcuts should be\nregistered or unregistered.\n" - }, - { - "description": "Enables the is_registered command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:allow-is-registered", - "markdownDescription": "Enables the is_registered command without any pre-configured scope." - }, - { - "description": "Enables the register command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:allow-register", - "markdownDescription": "Enables the register command without any pre-configured scope." - }, - { - "description": "Enables the register_all command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:allow-register-all", - "markdownDescription": "Enables the register_all command without any pre-configured scope." - }, - { - "description": "Enables the unregister command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:allow-unregister", - "markdownDescription": "Enables the unregister command without any pre-configured scope." - }, - { - "description": "Enables the unregister_all command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:allow-unregister-all", - "markdownDescription": "Enables the unregister_all command without any pre-configured scope." - }, - { - "description": "Denies the is_registered command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:deny-is-registered", - "markdownDescription": "Denies the is_registered command without any pre-configured scope." - }, - { - "description": "Denies the register command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:deny-register", - "markdownDescription": "Denies the register command without any pre-configured scope." - }, - { - "description": "Denies the register_all command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:deny-register-all", - "markdownDescription": "Denies the register_all command without any pre-configured scope." - }, - { - "description": "Denies the unregister command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:deny-unregister", - "markdownDescription": "Denies the unregister command without any pre-configured scope." - }, - { - "description": "Denies the unregister_all command without any pre-configured scope.", - "type": "string", - "const": "global-shortcut:deny-unregister-all", - "markdownDescription": "Denies the unregister_all command without any pre-configured scope." - }, { "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", "type": "string", diff --git a/desktop/src-tauri/src/main.rs b/desktop/src-tauri/src/main.rs index d53d0cf9d92..9cb3a9d3b9e 100644 --- a/desktop/src-tauri/src/main.rs +++ b/desktop/src-tauri/src/main.rs @@ -20,7 +20,6 @@ use tauri::Wry; use tauri::{ webview::PageLoadPayload, AppHandle, Manager, Webview, WebviewUrl, WebviewWindowBuilder, }; -use tauri_plugin_global_shortcut::{Code, GlobalShortcutExt, Modifiers, Shortcut}; use url::Url; #[cfg(target_os = "macos")] use tokio::time::sleep; @@ -448,73 +447,6 @@ async fn start_drag_window(window: tauri::Window) -> Result<(), String> { window.start_dragging().map_err(|e| e.to_string()) } -// ============================================================================ -// Shortcuts Setup -// ============================================================================ - -fn setup_shortcuts(app: &AppHandle) -> Result<(), Box> { - let new_chat = Shortcut::new(Some(Modifiers::SUPER), Code::KeyN); - let reload = Shortcut::new(Some(Modifiers::SUPER), Code::KeyR); - let back = Shortcut::new(Some(Modifiers::SUPER), Code::BracketLeft); - let forward = Shortcut::new(Some(Modifiers::SUPER), Code::BracketRight); - let new_window_shortcut = Shortcut::new(Some(Modifiers::SUPER | Modifiers::SHIFT), Code::KeyN); - let show_app = Shortcut::new(Some(Modifiers::SUPER | Modifiers::SHIFT), Code::Space); - let open_settings_shortcut = Shortcut::new(Some(Modifiers::SUPER), Code::Comma); - - let app_handle = app.clone(); - - // Avoid hijacking the system-wide Cmd+R on macOS. - #[cfg(target_os = "macos")] - let shortcuts = [ - new_chat, - back, - forward, - new_window_shortcut, - show_app, - open_settings_shortcut, - ]; - - #[cfg(not(target_os = "macos"))] - let shortcuts = [ - new_chat, - reload, - back, - forward, - new_window_shortcut, - show_app, - open_settings_shortcut, - ]; - - app.global_shortcut().on_shortcuts( - shortcuts, - move |_app, shortcut, _event| { - if shortcut == &new_chat { - trigger_new_chat(&app_handle); - } - - if let Some(window) = app_handle.get_webview_window("main") { - if shortcut == &reload { - let _ = window.eval("window.location.reload()"); - } else if shortcut == &back { - let _ = window.eval("window.history.back()"); - } else if shortcut == &forward { - let _ = window.eval("window.history.forward()"); - } else if shortcut == &open_settings_shortcut { - open_settings(&app_handle); - } - } - - if shortcut == &new_window_shortcut { - trigger_new_window(&app_handle); - } else if shortcut == &show_app { - focus_main_window(&app_handle); - } - }, - )?; - - Ok(()) -} - // ============================================================================ // Menu Setup // ============================================================================ @@ -574,7 +506,7 @@ fn build_tray_menu(app: &AppHandle) -> tauri::Result> { TRAY_MENU_OPEN_APP_ID, "Open Onyx", true, - Some("CmdOrCtrl+Shift+Space"), + None::<&str>, )?; let open_chat = MenuItem::with_id( app, @@ -666,7 +598,6 @@ fn main() { tauri::Builder::default() .plugin(tauri_plugin_shell::init()) - .plugin(tauri_plugin_global_shortcut::Builder::new().build()) .plugin(tauri_plugin_window_state::Builder::default().build()) .manage(ConfigState { config: RwLock::new(config), @@ -698,11 +629,6 @@ fn main() { .setup(move |app| { let app_handle = app.handle(); - // Setup global shortcuts - if let Err(e) = setup_shortcuts(&app_handle) { - eprintln!("Failed to setup shortcuts: {}", e); - } - if let Err(e) = setup_app_menu(&app_handle) { eprintln!("Failed to setup menu: {}", e); } From 6d12c9c43053509b6da0decfc22b8dfb6d296dd3 Mon Sep 17 00:00:00 2001 From: roshan <38771624+rohoswagger@users.noreply.github.com> Date: Fri, 30 Jan 2026 14:05:57 -0800 Subject: [PATCH 010/334] fix(craft): clear env vars from all sandboxes in file_sync pods (#8028) --- .../build/sandbox/kubernetes/kubernetes_sandbox_manager.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/onyx/server/features/build/sandbox/kubernetes/kubernetes_sandbox_manager.py b/backend/onyx/server/features/build/sandbox/kubernetes/kubernetes_sandbox_manager.py index f3e83b455c5..b1162d4162e 100644 --- a/backend/onyx/server/features/build/sandbox/kubernetes/kubernetes_sandbox_manager.py +++ b/backend/onyx/server/features/build/sandbox/kubernetes/kubernetes_sandbox_manager.py @@ -460,6 +460,12 @@ def _create_sandbox_pod( volumes=volumes, restart_policy="Never", termination_grace_period_seconds=10, # Fast pod termination + # CRITICAL: Disable service environment variable injection + # Without this, Kubernetes injects env vars for ALL services in the namespace, + # which can exceed ARG_MAX (2.6MB) when there are many sandbox pods. + # With 40+ sandboxes × 100 ports × 4 env vars each = ~16k env vars (~2.2MB) + # This causes "exec /bin/sh: argument list too long" errors. + enable_service_links=False, # Node selection for sandbox nodes node_selector={"onyx.app/workload": "sandbox"}, tolerations=[ From 0481b61f8db22136f0e8884488380bdaf1fad01e Mon Sep 17 00:00:00 2001 From: Wenxi Date: Fri, 30 Jan 2026 14:28:03 -0800 Subject: [PATCH 011/334] refactor: craft onboarding ease (#8030) --- .../components/BuildOnboardingModal.tsx | 114 +++--------------- .../components/OnboardingInfoPages.tsx | 50 -------- .../components/OnboardingUserInfo.tsx | 67 +++++----- 3 files changed, 53 insertions(+), 178 deletions(-) diff --git a/web/src/app/craft/onboarding/components/BuildOnboardingModal.tsx b/web/src/app/craft/onboarding/components/BuildOnboardingModal.tsx index 17f8db3a95c..6c5f7551ab4 100644 --- a/web/src/app/craft/onboarding/components/BuildOnboardingModal.tsx +++ b/web/src/app/craft/onboarding/components/BuildOnboardingModal.tsx @@ -2,7 +2,7 @@ import { useState, useEffect, useMemo } from "react"; import { usePostHog } from "posthog-js/react"; -import { SvgArrowRight, SvgArrowLeft, SvgX, SvgLoader } from "@opal/icons"; +import { SvgArrowRight, SvgArrowLeft, SvgX } from "@opal/icons"; import { cn } from "@/lib/utils"; import Text from "@/refresh-components/texts/Text"; import { @@ -76,15 +76,17 @@ function getStepsForMode( ): OnboardingStep[] { switch (mode.type) { case "initial-onboarding": - // Full flow: user-info (if needed) → llm-setup (if admin + not all configured) → page1 → page2 - const steps: OnboardingStep[] = []; - if (!hasUserInfo) { - steps.push("user-info"); - } + // Full flow: page1 → llm-setup (if admin + not all configured) → user-info + const steps: OnboardingStep[] = ["page1"]; + if (isAdmin && !allProvidersConfigured) { steps.push("llm-setup"); } - steps.push("page1", "page2"); + + if (!hasUserInfo) { + steps.push("user-info"); + } + return steps; case "edit-persona": @@ -184,43 +186,9 @@ export default function BuildOnboardingModal({ // Submission state const [isSubmitting, setIsSubmitting] = useState(false); - // Timeout state for informational pages (page1 and page2) - // Track which pages have already been seen (timer completed) - const [seenInfoPages, setSeenInfoPages] = useState>( - new Set() - ); - const [canContinueInfoPage, setCanContinueInfoPage] = useState(false); - - // Set up timeout when entering page1 or page2 (only if not seen before) - useEffect(() => { - if ( - (currentStep === "page1" || currentStep === "page2") && - !seenInfoPages.has(currentStep) - ) { - setCanContinueInfoPage(false); - - // page1: 1s, page2: 3s - const timeoutDuration = currentStep === "page1" ? 1000 : 3000; - - const timeout = setTimeout(() => { - setCanContinueInfoPage(true); - setSeenInfoPages((prev) => new Set(prev).add(currentStep)); - }, timeoutDuration); - - return () => clearTimeout(timeout); - } else if ( - (currentStep === "page1" || currentStep === "page2") && - seenInfoPages.has(currentStep) - ) { - // If already seen, allow immediate continuation - setCanContinueInfoPage(true); - } - }, [currentStep, seenInfoPages]); - const requiresLevel = workArea !== undefined && WORK_AREAS_REQUIRING_LEVEL.includes(workArea); - const isUserInfoValid = - firstName.trim() && workArea && (!requiresLevel || level); + const isUserInfoValid = workArea && (!requiresLevel || level); const currentProviderConfig = PROVIDERS.find( (p) => p.key === selectedProvider @@ -457,15 +425,6 @@ export default function BuildOnboardingModal({ /> )} - {/* Page 2 - Let's get started */} - {currentStep === "page2" && ( - - )} - {/* Navigation buttons */}
{/* Back button */} @@ -537,7 +496,7 @@ export default function BuildOnboardingModal({ {isLastStep ? isSubmitting ? "Saving..." - : "Save" + : "Get Started!" : "Continue"} {!isLastStep && ( @@ -557,53 +516,12 @@ export default function BuildOnboardingModal({ - )} - - {currentStep === "page2" && ( - )} diff --git a/web/src/app/craft/onboarding/components/OnboardingInfoPages.tsx b/web/src/app/craft/onboarding/components/OnboardingInfoPages.tsx index 84fc2f46f45..c3a8a5e16f6 100644 --- a/web/src/app/craft/onboarding/components/OnboardingInfoPages.tsx +++ b/web/src/app/craft/onboarding/components/OnboardingInfoPages.tsx @@ -75,61 +75,11 @@ export default function OnboardingInfoPages({ Let's get started! - - While we sync your data, try our demo dataset -
- of 1,000+ simulated documents! -
Onyx Craft - - In the simulated dataset, you are {article}{" "} - {positionText} named{" "} - - {personaInfo?.name || "Temp temp"} - {" "} - working at {DEMO_COMPANY_NAME} - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
); } diff --git a/web/src/app/craft/onboarding/components/OnboardingUserInfo.tsx b/web/src/app/craft/onboarding/components/OnboardingUserInfo.tsx index 52ada27f20a..112289e41a2 100644 --- a/web/src/app/craft/onboarding/components/OnboardingUserInfo.tsx +++ b/web/src/app/craft/onboarding/components/OnboardingUserInfo.tsx @@ -1,15 +1,16 @@ "use client"; -import { FiInfo } from "react-icons/fi"; import { cn } from "@/lib/utils"; import Text from "@/refresh-components/texts/Text"; -import SimpleTooltip from "@/refresh-components/SimpleTooltip"; import { WorkArea, Level, WORK_AREA_OPTIONS, LEVEL_OPTIONS, WORK_AREAS_REQUIRING_LEVEL, + PERSONA_MAPPING, + DEMO_COMPANY_NAME, + getPositionText, } from "@/app/craft/onboarding/constants"; interface SelectableButtonProps { @@ -18,7 +19,6 @@ interface SelectableButtonProps { children: React.ReactNode; subtext?: string; disabled?: boolean; - tooltip?: string; } function SelectableButton({ @@ -27,9 +27,8 @@ function SelectableButton({ children, subtext, disabled, - tooltip, }: SelectableButtonProps) { - const button = ( + return (
- +
- Tell us about yourself + Demo Data Configuration
- {/* Name inputs */} + {/* Name inputs - commented out for now, can be re-enabled later
@@ -134,11 +123,18 @@ export default function OnboardingUserInfo({
+ */} + + + While you wait for your data to sync, try out our simulated demo + dataset!
+ The simulated data will adapt to your role and level choices below. +
{/* Work area */}
- What do you do? + Select your role:
{WORK_AREA_OPTIONS.map((option) => ( @@ -177,6 +173,17 @@ export default function OnboardingUserInfo({
+ + {/* Persona preview - always reserve space to prevent layout shift */} +
+ {personaInfo && positionText && ( + + You will play the role of {positionText} named {personaInfo.name}{" "} + working at
+ {DEMO_COMPANY_NAME} +
+ )} +
); From 2661e2774195e95dd7b7e6b94bfc46bdace55a46 Mon Sep 17 00:00:00 2001 From: Raunak Bhagat Date: Fri, 30 Jan 2026 14:33:10 -0800 Subject: [PATCH 012/334] feat: Add new tag icon (#8029) --- web/lib/opal/src/icons/index.ts | 1 + web/lib/opal/src/icons/tag.tsx | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 web/lib/opal/src/icons/tag.tsx diff --git a/web/lib/opal/src/icons/index.ts b/web/lib/opal/src/icons/index.ts index 55aceca6e4c..2547ed98dad 100644 --- a/web/lib/opal/src/icons/index.ts +++ b/web/lib/opal/src/icons/index.ts @@ -143,6 +143,7 @@ export { default as SvgStep3End } from "@opal/icons/step3-end"; export { default as SvgStop } from "@opal/icons/stop"; export { default as SvgStopCircle } from "@opal/icons/stop-circle"; export { default as SvgSun } from "@opal/icons/sun"; +export { default as SvgTag } from "@opal/icons/tag"; export { default as SvgTerminal } from "@opal/icons/terminal"; export { default as SvgTerminalSmall } from "@opal/icons/terminal-small"; export { default as SvgTextLinesSmall } from "@opal/icons/text-lines-small"; diff --git a/web/lib/opal/src/icons/tag.tsx b/web/lib/opal/src/icons/tag.tsx new file mode 100644 index 00000000000..3c913770429 --- /dev/null +++ b/web/lib/opal/src/icons/tag.tsx @@ -0,0 +1,20 @@ +import type { IconProps } from "@opal/types"; +const SvgTag = ({ size, ...props }: IconProps) => ( + + + +); +export default SvgTag; From d9f97090d5ee42f0a44ff14eaff78d66f1cbf799 Mon Sep 17 00:00:00 2001 From: Jamison Lahman Date: Fri, 30 Jan 2026 14:54:28 -0800 Subject: [PATCH 013/334] chore(gha): build desktop app in CI (#7996) --- .github/workflows/pr-desktop-build.yml | 114 +++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 .github/workflows/pr-desktop-build.yml diff --git a/.github/workflows/pr-desktop-build.yml b/.github/workflows/pr-desktop-build.yml new file mode 100644 index 00000000000..516f59965ff --- /dev/null +++ b/.github/workflows/pr-desktop-build.yml @@ -0,0 +1,114 @@ +name: Build Desktop App +concurrency: + group: Build-Desktop-App-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }} + cancel-in-progress: true + +on: + merge_group: + pull_request: + branches: + - main + - "release/**" + paths: + - "desktop/**" + - ".github/workflows/pr-desktop-build.yml" + push: + tags: + - "v*.*.*" + +permissions: + contents: read + +jobs: + build-desktop: + name: Build Desktop (${{ matrix.platform }}) + runs-on: ${{ matrix.os }} + timeout-minutes: 60 + strategy: + fail-fast: false + matrix: + include: + - platform: linux + os: ubuntu-latest + target: x86_64-unknown-linux-gnu + args: "--bundles deb,rpm" + # TODO: Fix and enable the macOS build. + #- platform: macos + # os: macos-latest + # target: universal-apple-darwin + # args: "--target universal-apple-darwin" + # TODO: Fix and enable the Windows build. + #- platform: windows + # os: windows-latest + # target: x86_64-pc-windows-msvc + # args: "" + + steps: + - name: Checkout code + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 + with: + persist-credentials: false + + - name: Setup node + uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 + with: + node-version: 24 + cache: "npm" # zizmor: ignore[cache-poisoning] + cache-dependency-path: ./desktop/package-lock.json + + - name: Setup Rust + uses: dtolnay/rust-toolchain@4be9e76fd7c4901c61fb841f559994984270fce7 + with: + toolchain: stable + targets: ${{ matrix.target }} + + - name: Cache Cargo registry and build + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # zizmor: ignore[cache-poisoning] + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + desktop/src-tauri/target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('desktop/src-tauri/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Install Linux dependencies + if: matrix.platform == 'linux' + run: | + sudo apt-get update + sudo apt-get install -y \ + build-essential \ + libglib2.0-dev \ + libgirepository1.0-dev \ + libgtk-3-dev \ + libjavascriptcoregtk-4.1-dev \ + libwebkit2gtk-4.1-dev \ + libayatana-appindicator3-dev \ + gobject-introspection \ + pkg-config \ + curl \ + xdg-utils + + - name: Install npm dependencies + working-directory: ./desktop + run: npm ci + + - name: Build desktop app + working-directory: ./desktop + run: npx tauri build ${{ matrix.args }} + env: + TAURI_SIGNING_PRIVATE_KEY: "" + TAURI_SIGNING_PRIVATE_KEY_PASSWORD: "" + + - name: Upload build artifacts + if: always() + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 + with: + name: desktop-build-${{ matrix.platform }}-${{ github.run_id }} + path: | + desktop/src-tauri/target/release/bundle/ + retention-days: 7 + if-no-files-found: ignore From 90ac23a564e793f787cf389f552736850c4dc1fc Mon Sep 17 00:00:00 2001 From: Justin Tahara <105671973+justin-tahara@users.noreply.github.com> Date: Fri, 30 Jan 2026 15:00:52 -0800 Subject: [PATCH 014/334] fix(ui): Updating Dropdown Modal component (#8033) --- web/src/app/ee/admin/groups/UserEditor.tsx | 43 ++-- web/src/components/Dropdown.tsx | 238 +-------------------- web/src/components/GenericMultiSelect.tsx | 30 +-- 3 files changed, 36 insertions(+), 275 deletions(-) diff --git a/web/src/app/ee/admin/groups/UserEditor.tsx b/web/src/app/ee/admin/groups/UserEditor.tsx index 6d6dc4cf75f..586b4a6f87e 100644 --- a/web/src/app/ee/admin/groups/UserEditor.tsx +++ b/web/src/app/ee/admin/groups/UserEditor.tsx @@ -1,7 +1,6 @@ import { User } from "@/lib/types"; -import { FiPlus, FiX } from "react-icons/fi"; -import { SearchMultiSelectDropdown } from "@/components/Dropdown"; -import { UsersIcon } from "@/components/icons/icons"; +import { FiX } from "react-icons/fi"; +import InputComboBox from "@/refresh-components/inputs/InputComboBox/InputComboBox"; import Button from "@/refresh-components/buttons/Button"; interface UserEditorProps { @@ -51,35 +50,27 @@ export const UserEditor = ({
- {}} + onValueChange={(selectedValue) => { + setSelectedUserIds([ + ...Array.from(new Set([...selectedUserIds, selectedValue])), + ]); + }} options={allUsers .filter( (user) => !selectedUserIds.includes(user.id) && !existingUsers.map((user) => user.id).includes(user.id) ) - .map((user) => { - return { - name: user.email, - value: user.id, - }; - })} - onSelect={(option) => { - setSelectedUserIds([ - ...Array.from( - new Set([...selectedUserIds, option.value as string]) - ), - ]); - }} - itemComponent={({ option }) => ( -
- - {option.name} -
- -
-
- )} + .map((user) => ({ + label: user.email, + value: user.id, + }))} + strict + leftSearchIcon /> {onSubmit && ( - ); -} - -export function SearchMultiSelectDropdown({ - options, - onSelect, - itemComponent, - onCreate, - onDelete, - onSearchTermChange, - initialSearchTerm = "", - allowCustomValues = false, -}: { - options: StringOrNumberOption[]; - onSelect: (selected: StringOrNumberOption) => void; - itemComponent?: (props: { option: StringOrNumberOption }) => JSX.Element; - onCreate?: (name: string) => void; - onDelete?: (name: string) => void; - onSearchTermChange?: (term: string) => void; - initialSearchTerm?: string; - allowCustomValues?: boolean; -}) { - const [isOpen, setIsOpen] = useState(false); - const [searchTerm, setSearchTerm] = useState(initialSearchTerm); - const dropdownRef = useRef(null); - - const handleSelect = (option: StringOrNumberOption) => { - onSelect(option); - setIsOpen(false); - setSearchTerm(""); // Clear search term after selection - }; - - const filteredOptions = options.filter((option) => - option.name.toLowerCase().includes(searchTerm.toLowerCase()) - ); - - // Handle selecting a custom value not in the options list - const handleCustomValueSelect = () => { - if (allowCustomValues && searchTerm.trim() !== "") { - const customOption: StringOrNumberOption = { - name: searchTerm, - value: searchTerm, - }; - onSelect(customOption); - setIsOpen(false); - } - }; - - useEffect(() => { - const handleClickOutside = (event: MouseEvent) => { - if ( - dropdownRef.current && - !dropdownRef.current.contains(event.target as Node) - ) { - // If allowCustomValues is enabled and there's text in the search field, - // treat clicking outside as selecting the custom value - if (allowCustomValues && searchTerm.trim() !== "") { - handleCustomValueSelect(); - } - setIsOpen(false); - } - }; - - document.addEventListener("mousedown", handleClickOutside); - return () => { - document.removeEventListener("mousedown", handleClickOutside); - }; - }, [allowCustomValues, searchTerm]); - - useEffect(() => { - setSearchTerm(initialSearchTerm); - }, [initialSearchTerm]); - - return ( -
-
- ) => { - const newValue = e.target.value; - setSearchTerm(newValue); - if (onSearchTermChange) { - onSearchTermChange(newValue); - } - if (newValue) { - setIsOpen(true); - } else { - setIsOpen(false); - } - }} - onFocus={() => setIsOpen(true)} - onKeyDown={(e) => { - if ( - e.key === "Enter" && - allowCustomValues && - searchTerm.trim() !== "" - ) { - e.preventDefault(); - handleCustomValueSelect(); - } - }} - className="inline-flex justify-between w-full px-4 py-2 text-sm bg-white dark:bg-transparent text-neutral-800 dark:text-neutral-200 border border-neutral-200 dark:border-neutral-700 rounded-md shadow-sm" - /> - -
- - {isOpen && ( -
-
- {filteredOptions.map((option, index) => - itemComponent ? ( -
{ - handleSelect(option); - }} - > - {itemComponent({ option })} -
- ) : ( - - ) - )} - - {allowCustomValues && - searchTerm.trim() !== "" && - !filteredOptions.some( - (option) => - option.name.toLowerCase() === searchTerm.toLowerCase() - ) && ( - - )} - - {onCreate && - searchTerm.trim() !== "" && - !filteredOptions.some( - (option) => - option.name.toLowerCase() === searchTerm.toLowerCase() - ) && ( - <> -
- - - )} - - {filteredOptions.length === 0 && - ((!onCreate && !allowCustomValues) || - searchTerm.trim() === "") && ( -
- No matches found -
- )} -
-
- )} -
- ); -} - export const CustomDropdown = ({ children, dropdown, diff --git a/web/src/components/GenericMultiSelect.tsx b/web/src/components/GenericMultiSelect.tsx index 765ea8798f7..104cd26ecf9 100644 --- a/web/src/components/GenericMultiSelect.tsx +++ b/web/src/components/GenericMultiSelect.tsx @@ -1,7 +1,7 @@ import { FormikProps, ErrorMessage } from "formik"; import Text from "@/refresh-components/texts/Text"; import Button from "@/refresh-components/buttons/Button"; -import { SearchMultiSelectDropdown } from "@/components/Dropdown"; +import InputComboBox from "@/refresh-components/inputs/InputComboBox/InputComboBox"; import { cn } from "@/lib/utils"; import { SvgX } from "@opal/icons"; export type GenericMultiSelectFormType = { @@ -84,15 +84,11 @@ export function GenericMultiSelect< const selectedIds = (formikProps.values[fieldName] as number[]) || []; const selectedItems = items.filter((item) => selectedIds.includes(item.id)); - const handleSelect = (option: { name: string; value: string | number }) => { + const handleSelect = (itemId: number) => { if (disabled) return; const currentIds = (formikProps.values[fieldName] as number[]) || []; - const numValue = - typeof option.value === "string" - ? parseInt(option.value, 10) - : option.value; - if (!currentIds.includes(numValue)) { - formikProps.setFieldValue(fieldName, [...currentIds, numValue]); + if (!currentIds.includes(itemId)) { + formikProps.setFieldValue(fieldName, [...currentIds, itemId]); } }; @@ -118,14 +114,24 @@ export function GenericMultiSelect< )}
- {}} + onValueChange={(selectedValue) => { + const numValue = parseInt(selectedValue, 10); + if (!isNaN(numValue)) { + handleSelect(numValue); + } + }} options={items .filter((item) => !selectedIds.includes(item.id)) .map((item) => ({ - name: item.name, - value: item.id, + label: item.name, + value: String(item.id), }))} - onSelect={handleSelect} + strict + leftSearchIcon />
From ce43dee20f16b7016982f158131608f5ba5f79dc Mon Sep 17 00:00:00 2001 From: Wenxi Date: Fri, 30 Jan 2026 15:32:09 -0800 Subject: [PATCH 015/334] fix: discord connector tests (#8036) --- .github/workflows/pr-python-connector-tests.yml | 5 ++++- .../daily/connectors/discord/test_discord_connector.py | 7 +++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pr-python-connector-tests.yml b/.github/workflows/pr-python-connector-tests.yml index 1e8340de05a..7e8eed47fc1 100644 --- a/.github/workflows/pr-python-connector-tests.yml +++ b/.github/workflows/pr-python-connector-tests.yml @@ -65,7 +65,7 @@ env: ZENDESK_TOKEN: ${{ secrets.ZENDESK_TOKEN }} # Salesforce - SF_USERNAME: ${{ secrets.SF_USERNAME }} + SF_USERNAME: ${{ vars.SF_USERNAME }} SF_PASSWORD: ${{ secrets.SF_PASSWORD }} SF_SECURITY_TOKEN: ${{ secrets.SF_SECURITY_TOKEN }} @@ -110,6 +110,9 @@ env: # Slack SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + # Discord + DISCORD_CONNECTOR_BOT_TOKEN: ${{ secrets.DISCORD_CONNECTOR_BOT_TOKEN }} + # Teams TEAMS_APPLICATION_ID: ${{ secrets.TEAMS_APPLICATION_ID }} TEAMS_DIRECTORY_ID: ${{ secrets.TEAMS_DIRECTORY_ID }} diff --git a/backend/tests/daily/connectors/discord/test_discord_connector.py b/backend/tests/daily/connectors/discord/test_discord_connector.py index c968025541a..f5ba890865d 100644 --- a/backend/tests/daily/connectors/discord/test_discord_connector.py +++ b/backend/tests/daily/connectors/discord/test_discord_connector.py @@ -21,13 +21,12 @@ def load_test_data(file_name: str = "test_discord_data.json") -> dict[str, Any]: @pytest.fixture def discord_connector() -> DiscordConnector: connector = DiscordConnector() - connector.load_credentials({"discord_bot_token": os.environ["DISCORD_BOT_TOKEN"]}) + connector.load_credentials( + {"discord_bot_token": os.environ["DISCORD_CONNECTOR_BOT_TOKEN"]} + ) return connector -@pytest.mark.xfail( - reason="Environment variable not set for some reason", -) def test_discord_connector_basic(discord_connector: DiscordConnector) -> None: test_data = load_test_data() From d9cf5afee81d57ac822c09a99ab32d4658e10252 Mon Sep 17 00:00:00 2001 From: Nikolas Garza <90273783+nmgarza5@users.noreply.github.com> Date: Fri, 30 Jan 2026 16:16:40 -0800 Subject: [PATCH 016/334] fix(ee): use set(ex=) instead of setex() for license cache updates (#8004) --- backend/ee/onyx/db/license.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/ee/onyx/db/license.py b/backend/ee/onyx/db/license.py index e2524f8be03..1b3f4d2e565 100644 --- a/backend/ee/onyx/db/license.py +++ b/backend/ee/onyx/db/license.py @@ -227,10 +227,10 @@ def update_license_cache( stripe_subscription_id=payload.stripe_subscription_id, ) - redis_client.setex( + redis_client.set( LICENSE_METADATA_KEY, - LICENSE_CACHE_TTL_SECONDS, metadata.model_dump_json(), + ex=LICENSE_CACHE_TTL_SECONDS, ) logger.info(f"License cache updated: {metadata.seats} seats, status={status.value}") From 97d90a82f8fd9a4db26cde514f05c52d15cde814 Mon Sep 17 00:00:00 2001 From: roshan <38771624+rohoswagger@users.noreply.github.com> Date: Fri, 30 Jan 2026 16:16:33 -0800 Subject: [PATCH 017/334] fix(craft): files stuff (#8037) --- backend/onyx/server/features/build/configs.py | 2 +- .../sandbox/kubernetes/docker/Dockerfile | 11 ++++++----- .../sandbox/kubernetes/docker/demo_data.zip | Bin 2875092 -> 2908496 bytes .../kubernetes/kubernetes_sandbox_manager.py | 9 +++++---- .../sandbox/manager/directory_manager.py | 2 +- .../build/sandbox/util/opencode_config.py | 6 +++--- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/backend/onyx/server/features/build/configs.py b/backend/onyx/server/features/build/configs.py index dd1a31c9df7..dbabf1be3f0 100644 --- a/backend/onyx/server/features/build/configs.py +++ b/backend/onyx/server/features/build/configs.py @@ -28,7 +28,7 @@ class SandboxBackend(str, Enum): # Demo Data Path # Local: Source tree path (relative to this file) -# Kubernetes: Baked into container image at /workspace/demo-data +# Kubernetes: Baked into container image at /workspace/demo_data _THIS_FILE = Path(__file__) DEMO_DATA_PATH = str( _THIS_FILE.parent / "sandbox" / "kubernetes" / "docker" / "demo_data" diff --git a/backend/onyx/server/features/build/sandbox/kubernetes/docker/Dockerfile b/backend/onyx/server/features/build/sandbox/kubernetes/docker/Dockerfile index 5cc7e4c7c9f..34efca684c5 100644 --- a/backend/onyx/server/features/build/sandbox/kubernetes/docker/Dockerfile +++ b/backend/onyx/server/features/build/sandbox/kubernetes/docker/Dockerfile @@ -7,12 +7,12 @@ # # Directory structure (created by init container + session setup): # /workspace/ -# ├── demo-data/ # Demo data (baked into image, for demo sessions) +# ├── demo_data/ # Demo data (baked into image, for demo sessions) # ├── files/ # User's knowledge files (synced from S3) # ├── templates/ # Output templates (baked into image) # └── sessions/ # Per-session workspaces (created via exec) # └── $session_id/ -# ├── files/ # Symlink to /workspace/demo-data or /workspace/files +# ├── files/ # Symlink to /workspace/demo_data or /workspace/files # ├── outputs/ # ├── AGENTS.md # └── opencode.json @@ -48,7 +48,7 @@ RUN EXISTING_USER=$(id -nu 1000 2>/dev/null || echo ""); \ fi # Create workspace directories -RUN mkdir -p workspace/sessions /workspace/files /workspace/templates /workspace/demo-data && \ +RUN mkdir -p workspace/sessions /workspace/files /workspace/templates /workspace/demo_data && \ chown -R sandbox:sandbox /workspace # Copy outputs template (web app scaffold, without node_modules) @@ -56,10 +56,11 @@ COPY --exclude=.next --exclude=node_modules templates/outputs /workspace/templat RUN chown -R sandbox:sandbox /workspace/templates # Copy and extract demo data from zip file +# Zip contains demo_data/ as root folder COPY demo_data.zip /tmp/demo_data.zip -RUN unzip -q /tmp/demo_data.zip -d /workspace/demo-data && \ +RUN unzip -q /tmp/demo_data.zip -d /workspace && \ rm /tmp/demo_data.zip && \ - chown -R sandbox:sandbox /workspace/demo-data + chown -R sandbox:sandbox /workspace/demo_data # Copy and install Python requirements into a venv COPY initial-requirements.txt /tmp/initial-requirements.txt diff --git a/backend/onyx/server/features/build/sandbox/kubernetes/docker/demo_data.zip b/backend/onyx/server/features/build/sandbox/kubernetes/docker/demo_data.zip index ecbe6f68a5bd4f0bebf198924bdf29063f754daa..9ccd9e95c354f9bf3f8e27ae87d651ad9a483ef3 100644 GIT binary patch delta 295650 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 delta 258204 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 diff --git a/backend/onyx/server/features/build/sandbox/kubernetes/kubernetes_sandbox_manager.py b/backend/onyx/server/features/build/sandbox/kubernetes/kubernetes_sandbox_manager.py index b1162d4162e..59a14502b6c 100644 --- a/backend/onyx/server/features/build/sandbox/kubernetes/kubernetes_sandbox_manager.py +++ b/backend/onyx/server/features/build/sandbox/kubernetes/kubernetes_sandbox_manager.py @@ -950,7 +950,7 @@ def setup_session_workspace( user_role: User's role/title for personalization in AGENTS.md user_work_area: User's work area for demo persona (e.g., "engineering") user_level: User's level for demo persona (e.g., "ic", "manager") - use_demo_data: If True, symlink files/ to /workspace/demo-data; + use_demo_data: If True, symlink files/ to /workspace/demo_data; else to /workspace/files (S3-synced user files) Raises: @@ -1018,7 +1018,7 @@ def setup_session_workspace( # Choose between demo data (baked in image) or user's S3-synced files if use_demo_data: # Demo mode: symlink to demo data baked into the container image - symlink_target = "/workspace/demo-data" + symlink_target = "/workspace/demo_data" files_symlink_setup = f""" # Create files symlink to demo data (baked into image) echo "Creating files symlink to demo data: {symlink_target}" @@ -1542,10 +1542,11 @@ def list_directory( logger.info(f"Listing directory {target_path} in pod {pod_name}") # Use exec to list directory + # -L follows symlinks (important for files/ -> /workspace/demo_data) exec_command = [ "/bin/sh", "-c", - f"ls -la --time-style=+%s {quoted_path} 2>/dev/null || echo 'ERROR_NOT_FOUND'", + f"ls -laL --time-style=+%s {quoted_path} 2>/dev/null || echo 'ERROR_NOT_FOUND'", ] try: @@ -1618,7 +1619,7 @@ def _parse_ls_output(self, ls_output: str, base_path: str) -> list[FilesystemEnt # Directories start with 'd', symlinks start with 'l' # Treat symlinks as directories (they typically point to directories - # in our sandbox setup, like files/ -> /workspace/demo-data) + # in our sandbox setup, like files/ -> /workspace/demo_data) is_directory = line.startswith("d") or is_symlink size_str = parts[4] diff --git a/backend/onyx/server/features/build/sandbox/manager/directory_manager.py b/backend/onyx/server/features/build/sandbox/manager/directory_manager.py index c04c33fd11a..a41c2fadb8f 100644 --- a/backend/onyx/server/features/build/sandbox/manager/directory_manager.py +++ b/backend/onyx/server/features/build/sandbox/manager/directory_manager.py @@ -394,7 +394,7 @@ def setup_opencode_config( disabled_tools: Optional list of tools to disable (e.g., ["question", "webfetch"]) overwrite: If True, overwrite existing config. If False, preserve existing config. dev_mode: If True, allow all external directories (local dev). - If False (default), only whitelist /workspace/files and /workspace/demo-data. + If False (default), only whitelist /workspace/files and /workspace/demo_data. """ config_path = sandbox_path / "opencode.json" if not overwrite and config_path.exists(): diff --git a/backend/onyx/server/features/build/sandbox/util/opencode_config.py b/backend/onyx/server/features/build/sandbox/util/opencode_config.py index 108a969964e..b008963c838 100644 --- a/backend/onyx/server/features/build/sandbox/util/opencode_config.py +++ b/backend/onyx/server/features/build/sandbox/util/opencode_config.py @@ -27,7 +27,7 @@ def build_opencode_config( api_base: Optional custom API base URL disabled_tools: Optional list of tools to disable (e.g., ["question", "webfetch"]) dev_mode: If True, allow all external directories. If False (Docker/Kubernetes), - only whitelist /workspace/files and /workspace/demo-data. + only whitelist /workspace/files and /workspace/demo_data. Returns: Configuration dict ready to be serialized to JSON @@ -150,8 +150,8 @@ def build_opencode_config( "*": "deny", # Deny all external directories by default "/workspace/files": "allow", # Allow files directory "/workspace/files/**": "allow", # Allow files directory contents - "/workspace/demo-data": "allow", # Allow demo data directory - "/workspace/demo-data/**": "allow", # Allow demo data directory contents + "/workspace/demo_data": "allow", # Allow demo data directory + "/workspace/demo_data/**": "allow", # Allow demo data directory contents } ), } From d7a22b916bf7a9d52a3a808c410d5bb38f6bc77e Mon Sep 17 00:00:00 2001 From: Jamison Lahman Date: Fri, 30 Jan 2026 16:25:59 -0800 Subject: [PATCH 018/334] fix(fe): polish chat UI with custom background (#8016) Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> --- web/src/app/app/components/AppHeader.tsx | 68 +++++------ web/src/app/app/components/AppPage.tsx | 113 ++++++++++++------ web/src/app/app/components/WelcomeMessage.tsx | 5 +- web/src/app/app/nrf/NRFPage.tsx | 4 +- web/src/app/css/colors.css | 6 + .../components/chat/ChatScrollContainer.tsx | 52 +++----- web/src/components/chat/MessageList.tsx | 13 +- web/src/layouts/app-layouts.tsx | 18 +-- web/src/refresh-components/FrostedDiv.tsx | 86 +++++++++++++ 9 files changed, 232 insertions(+), 133 deletions(-) create mode 100644 web/src/refresh-components/FrostedDiv.tsx diff --git a/web/src/app/app/components/AppHeader.tsx b/web/src/app/app/components/AppHeader.tsx index 3d1a12a6642..4ba70bb772f 100644 --- a/web/src/app/app/components/AppHeader.tsx +++ b/web/src/app/app/components/AppHeader.tsx @@ -20,6 +20,7 @@ import { deleteChatSession } from "@/app/app/services/lib"; import { useRouter } from "next/navigation"; import MoveCustomAgentChatModal from "@/components/modals/MoveCustomAgentChatModal"; import ConfirmationModalLayout from "@/refresh-components/layouts/ConfirmationModalLayout"; +import FrostedDiv from "@/refresh-components/FrostedDiv"; import { PopoverMenu } from "@/refresh-components/Popover"; import { PopoverSearchInput } from "@/sections/sidebar/ChatButton"; import SimplePopover from "@/refresh-components/SimplePopover"; @@ -266,17 +267,6 @@ export default function AppHeader() { )}

- {/* Fading blur overlay for mobile/tablet - hidden on xl+ */} -
- {/* Left - contains the icon-button to fold the AppSidebar on mobile */}
{/* Right - contains the share and more-options buttons */} -
- - - } - onOpenChange={(state) => { - setPopoverOpen(state); - if (!state) setShowMoveOptions(false); - }} - side="bottom" - align="end" - > - {popoverItems} - +
+ + + + } + onOpenChange={(state) => { + setPopoverOpen(state); + if (!state) setShowMoveOptions(false); + }} + side="bottom" + align="end" + > + {popoverItems} + +
diff --git a/web/src/app/app/components/AppPage.tsx b/web/src/app/app/components/AppPage.tsx index 92250299d79..2b198f174ac 100644 --- a/web/src/app/app/components/AppPage.tsx +++ b/web/src/app/app/components/AppPage.tsx @@ -77,6 +77,7 @@ import { CHAT_BACKGROUND_NONE, getBackgroundById, } from "@/lib/constants/chatBackgrounds"; +import { useTheme } from "next-themes"; export interface ChatPageProps { firstMessage?: string; @@ -134,6 +135,8 @@ export default function AppPage({ firstMessage }: ChatPageProps) { // settings are passed in via Context and therefore aren't // available in server-side components const settings = useSettingsContext(); + const { resolvedTheme } = useTheme(); + const isLightMode = resolvedTheme === "light"; const isInitialLoad = useRef(true); @@ -638,7 +641,7 @@ export default function AppPage({ firstMessage }: ChatPageProps) { - + handleMessageSpecificFileUpload(acceptedFiles) @@ -658,9 +661,43 @@ export default function AppPage({ firstMessage }: ChatPageProps) { } {...getRootProps({ tabIndex: -1 })} > + {/* Vignette overlay for custom backgrounds (disabled in light mode) */} + {hasBackground && !isLightMode && ( +
+ )} + {/* Semi-transparent overlay for readability when background is set */} - {hasBackground && ( -
+ {!!currentChatSessionId && liveAssistant && hasBackground && ( + <> +
+
+ )} {/* ProjectUI */} @@ -674,42 +711,48 @@ export default function AppPage({ firstMessage }: ChatPageProps) { {/* ChatUI */} {!!currentChatSessionId && liveAssistant && ( - - + <> + {/* Header positioned outside scroll container to avoid mask effect */} +
- - - +
+ + {/* Spacer for the header height */} +
+ + + )} {!currentChatSessionId && !currentProjectId && ( -
- - -
+ <> + +
+ + +
+ )} {/* ChatInputBar container - absolutely positioned when in chat, centered when no session */} diff --git a/web/src/app/app/components/WelcomeMessage.tsx b/web/src/app/app/components/WelcomeMessage.tsx index 58913f654ba..6109146dec7 100644 --- a/web/src/app/app/components/WelcomeMessage.tsx +++ b/web/src/app/app/components/WelcomeMessage.tsx @@ -10,6 +10,7 @@ import Text from "@/refresh-components/texts/Text"; import { MinimalPersonaSnapshot } from "@/app/admin/assistants/interfaces"; import { useState, useEffect } from "react"; import { useSettingsContext } from "@/components/settings/SettingsProvider"; +import FrostedDiv from "@/refresh-components/FrostedDiv"; export interface WelcomeMessageProps { agent?: MinimalPersonaSnapshot; @@ -71,11 +72,11 @@ export default function WelcomeMessage({ if (!content) return null; return ( -
{content} -
+ ); } diff --git a/web/src/app/app/nrf/NRFPage.tsx b/web/src/app/app/nrf/NRFPage.tsx index 0f07e036d5a..ab698b94365 100644 --- a/web/src/app/app/nrf/NRFPage.tsx +++ b/web/src/app/app/nrf/NRFPage.tsx @@ -372,7 +372,6 @@ export default function NRFPage({ isSidePanel = false }: NRFPageProps) { anchorSelector={anchorSelector} autoScroll={autoScrollEnabled} isStreaming={isStreaming} - disableFadeOverlay={!isSidePanel} > @@ -393,7 +391,7 @@ export default function NRFPage({ isSidePanel = false }: NRFPageProps) { {/* Welcome message - centered when no messages */} {!hasMessages && ( -
+
diff --git a/web/src/app/css/colors.css b/web/src/app/css/colors.css index 392255ba629..184410c78b9 100644 --- a/web/src/app/css/colors.css +++ b/web/src/app/css/colors.css @@ -422,6 +422,9 @@ --mask-01: var(--alpha-grey-100-10); --mask-02: var(--alpha-grey-100-20); --mask-03: var(--alpha-grey-100-40); + + /* Frost Overlay (for FrostedDiv component) - lighter in light mode */ + --frost-overlay: var(--alpha-grey-00-10); } /* Dark Colors */ @@ -620,4 +623,7 @@ --mask-01: var(--alpha-grey-100-10); --mask-02: var(--alpha-grey-100-20); --mask-03: var(--alpha-grey-100-40); + + /* Frost Overlay (for FrostedDiv component) - darker in dark mode */ + --frost-overlay: var(--alpha-grey-100-10); } diff --git a/web/src/components/chat/ChatScrollContainer.tsx b/web/src/components/chat/ChatScrollContainer.tsx index 3a1820b044d..28ccd55a289 100644 --- a/web/src/components/chat/ChatScrollContainer.tsx +++ b/web/src/components/chat/ChatScrollContainer.tsx @@ -13,7 +13,11 @@ import React, { const DEFAULT_ANCHOR_OFFSET_PX = 16; // 1rem const DEFAULT_FADE_THRESHOLD_PX = 80; // 5rem const DEFAULT_BUTTON_THRESHOLD_PX = 32; // 2rem -const FADE_OVERLAY_HEIGHT = "h-8"; // 2rem + +// Fade configuration +const TOP_FADE_HEIGHT = "6rem"; +const TOP_OPAQUE_ZONE = "2.5rem"; +const BOTTOM_FADE_HEIGHT = "16px"; export interface ScrollState { isAtBottom: boolean; @@ -45,31 +49,15 @@ export interface ChatScrollContainerProps { /** Session ID - resets scroll state when changed */ sessionId?: string; - - /** Disable fade overlays (e.g., when a background image is set) */ - disableFadeOverlay?: boolean; } -const FadeOverlay = React.memo( - ({ show, position }: { show: boolean; position: "top" | "bottom" }) => { - if (!show) return null; - const isTop = position === "top"; - return ( -