diff --git a/apps/desktop/e2e/tests/comparator.spec.ts b/apps/desktop/e2e/tests/comparator.spec.ts deleted file mode 100644 index 31e7526d..00000000 --- a/apps/desktop/e2e/tests/comparator.spec.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { test, expect } from "../fixtures"; - -test.describe("Comparator setup page", () => { - test("harness cards render from mock data", async ({ appPage }) => { - await appPage.goto("/comparator"); - await appPage.waitForLoadState("networkidle"); - - // Available harnesses show up with their names - await expect(appPage.getByText("Claude Code")).toBeVisible(); - await expect(appPage.getByText("GitHub Copilot")).toBeVisible(); - // Unavailable harness still renders (with "Not found" badge) - await expect(appPage.getByText("Cursor")).toBeVisible(); - await expect(appPage.getByText("Not found")).toBeVisible(); - }); - - test("first available harness is pre-selected", async ({ appPage }) => { - await appPage.goto("/comparator"); - await appPage.waitForLoadState("networkidle"); - - // Claude Code is the first available harness; its card should have the - // "selected" class and the model selector should be visible. - const claudeCard = appPage.locator(".harness-card.selected"); - await expect(claudeCard).toBeVisible(); - await expect(claudeCard.getByText("Claude Code")).toBeVisible(); - }); - - test("prompt textarea and Run Comparison button present", async ({ appPage }) => { - await appPage.goto("/comparator"); - await appPage.waitForLoadState("networkidle"); - - // Prompt textarea exists - const prompt = appPage.getByPlaceholder(/prompt/i); - await expect(prompt).toBeVisible(); - - // Run button exists but is disabled until prompt is filled - const runBtn = appPage.getByRole("button", { name: /run comparison/i }); - await expect(runBtn).toBeVisible(); - }); - - test("Run button enables after typing a prompt", async ({ appPage }) => { - await appPage.goto("/comparator"); - await appPage.waitForLoadState("networkidle"); - - const prompt = appPage.getByPlaceholder(/prompt/i); - const runBtn = appPage.getByRole("button", { name: /run comparison/i }); - - // Initially disabled (harness pre-selected, but no prompt) - await expect(runBtn).toBeDisabled(); - - // Type a prompt - await prompt.fill("hello world"); - await expect(runBtn).not.toBeDisabled(); - }); - - test("version number shown for available harness", async ({ appPage }) => { - await appPage.goto("/comparator"); - await appPage.waitForLoadState("networkidle"); - - // Mock returns version "1.5.0" for Claude Code - await expect(appPage.getByText("1.5.0")).toBeVisible(); - }); -}); - -test.describe("Comparator history page", () => { - test("comparison list renders from mock data", async ({ appPage }) => { - await appPage.goto("/comparator/history"); - await appPage.waitForLoadState("networkidle"); - - // Both mock comparisons should appear - await expect(appPage.getByText("write a hello world function")).toBeVisible(); - await expect(appPage.getByText("refactor the auth module")).toBeVisible(); - }); - - test("harness names shown in comparison rows", async ({ appPage }) => { - await appPage.goto("/comparator/history"); - await appPage.waitForLoadState("networkidle"); - - // First comparison has "Claude Code vs GitHub Copilot" in the panel summary - await expect( - appPage.getByText("Claude Code vs GitHub Copilot"), - ).toBeVisible(); - }); - - test("status badges visible", async ({ appPage }) => { - await appPage.goto("/comparator/history"); - await appPage.waitForLoadState("networkidle"); - - // Both mock comparisons have status "complete" - const badges = appPage.getByText("complete"); - await expect(badges.first()).toBeVisible(); - }); - - test("delete buttons present for each comparison", async ({ appPage }) => { - await appPage.goto("/comparator/history"); - await appPage.waitForLoadState("networkidle"); - - const deleteButtons = appPage.getByRole("button", { name: /delete/i }); - await expect(deleteButtons).toHaveCount(2); - }); -}); - -test.describe("Comparator analytics page", () => { - test("shows empty state when no evaluations exist", async ({ appPage }) => { - await appPage.goto("/comparator/analytics"); - await appPage.waitForLoadState("networkidle"); - - // Mock returns totalComparisons: 0, so the empty state message shows - await expect( - appPage.getByText(/no evaluated comparisons yet/i), - ).toBeVisible(); - }); -}); diff --git a/apps/desktop/src-tauri/capabilities/default.json b/apps/desktop/src-tauri/capabilities/default.json index 1e130da9..691ce980 100644 --- a/apps/desktop/src-tauri/capabilities/default.json +++ b/apps/desktop/src-tauri/capabilities/default.json @@ -32,8 +32,9 @@ "identifier": "shell:allow-execute", "allow": [ { "name": "claude", "cmd": "claude", "args": true }, - { "name": "copilot", "cmd": "copilot", "args": true }, - { "name": "cursor", "cmd": "cursor", "args": true }, + { "name": "agent", "cmd": "agent", "args": ["--version"] }, + { "name": "copilot", "cmd": "copilot", "args": ["--version"] }, + { "name": "codex", "cmd": "codex", "args": ["--version"] }, { "name": "gh", "cmd": "gh", "args": true }, { "name": "git", "cmd": "git", "args": true }, { "name": "security", "cmd": "security", "args": true } @@ -70,17 +71,12 @@ "allow-read-live-activity", "allow-compute-live-stats", "allow-read-session-transcript", + "allow-get-cwd", + "allow-create-terminal", + "allow-destroy-terminal", + "allow-write-terminal", + "allow-resize-terminal", "allow-detect-harnesses", - "allow-start-comparison", - "allow-kill-panel", - "allow-save-comparison", - "allow-save-panel-result", - "allow-list-comparisons", - "allow-get-comparison", - "allow-delete-comparison", - "allow-save-file-diffs", - "allow-get-comparison-diffs", - "allow-get-comparison-setup", "allow-check-git-repo", "allow-create-worktrees", "allow-remove-worktrees", diff --git a/apps/desktop/src-tauri/gen/schemas/acl-manifests.json b/apps/desktop/src-tauri/gen/schemas/acl-manifests.json index d235a781..d1846712 100644 --- a/apps/desktop/src-tauri/gen/schemas/acl-manifests.json +++ b/apps/desktop/src-tauri/gen/schemas/acl-manifests.json @@ -1 +1 @@ -{"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},"__app-acl__":{"default_permission":null,"permissions":{"allow-acknowledge-drift":{"identifier":"allow-acknowledge-drift","description":"Enables the acknowledge_drift command without any pre-configured scope.","commands":{"allow":["acknowledge_drift"],"deny":[]}},"allow-add-to-parity-baseline":{"identifier":"allow-add-to-parity-baseline","description":"Enables the add_to_parity_baseline command without any pre-configured scope.","commands":{"allow":["add_to_parity_baseline"],"deny":[]}},"allow-apply-security-preset":{"identifier":"allow-apply-security-preset","description":"Enables the apply_security_preset command without any pre-configured scope.","commands":{"allow":["apply_security_preset"],"deny":[]}},"allow-board-server-check-installed":{"identifier":"allow-board-server-check-installed","description":"Enables the board_server_check_installed command without any pre-configured scope.","commands":{"allow":["board_server_check_installed"],"deny":[]}},"allow-board-server-install":{"identifier":"allow-board-server-install","description":"Enables the board_server_install command without any pre-configured scope.","commands":{"allow":["board_server_install"],"deny":[]}},"allow-board-server-restart":{"identifier":"allow-board-server-restart","description":"Enables the board_server_restart command without any pre-configured scope.","commands":{"allow":["board_server_restart"],"deny":[]}},"allow-board-server-start":{"identifier":"allow-board-server-start","description":"Enables the board_server_start command without any pre-configured scope.","commands":{"allow":["board_server_start"],"deny":[]}},"allow-chat-leave-room":{"identifier":"allow-chat-leave-room","description":"Enables the chat_leave_room command without any pre-configured scope.","commands":{"allow":["chat_leave_room"],"deny":[]}},"allow-chat-list-rooms":{"identifier":"allow-chat-list-rooms","description":"Enables the chat_list_rooms command without any pre-configured scope.","commands":{"allow":["chat_list_rooms"],"deny":[]}},"allow-chat-load-messages":{"identifier":"allow-chat-load-messages","description":"Enables the chat_load_messages command without any pre-configured scope.","commands":{"allow":["chat_load_messages"],"deny":[]}},"allow-chat-local-relay-running":{"identifier":"allow-chat-local-relay-running","description":"Enables the chat_local_relay_running command without any pre-configured scope.","commands":{"allow":["chat_local_relay_running"],"deny":[]}},"allow-chat-purge-room":{"identifier":"allow-chat-purge-room","description":"Enables the chat_purge_room command without any pre-configured scope.","commands":{"allow":["chat_purge_room"],"deny":[]}},"allow-chat-save-messages":{"identifier":"allow-chat-save-messages","description":"Enables the chat_save_messages command without any pre-configured scope.","commands":{"allow":["chat_save_messages"],"deny":[]}},"allow-chat-save-room":{"identifier":"allow-chat-save-room","description":"Enables the chat_save_room command without any pre-configured scope.","commands":{"allow":["chat_save_room"],"deny":[]}},"allow-chat-start-local-relay":{"identifier":"allow-chat-start-local-relay","description":"Enables the chat_start_local_relay command without any pre-configured scope.","commands":{"allow":["chat_start_local_relay"],"deny":[]}},"allow-chat-stop-local-relay":{"identifier":"allow-chat-stop-local-relay","description":"Enables the chat_stop_local_relay command without any pre-configured scope.","commands":{"allow":["chat_stop_local_relay"],"deny":[]}},"allow-check-git-repo":{"identifier":"allow-check-git-repo","description":"Enables the check_git_repo command without any pre-configured scope.","commands":{"allow":["check_git_repo"],"deny":[]}},"allow-check-plugin-updates":{"identifier":"allow-check-plugin-updates","description":"Enables the check_plugin_updates command without any pre-configured scope.","commands":{"allow":["check_plugin_updates"],"deny":[]}},"allow-clear-audit-entries":{"identifier":"allow-clear-audit-entries","description":"Enables the clear_audit_entries command without any pre-configured scope.","commands":{"allow":["clear_audit_entries"],"deny":[]}},"allow-compute-live-stats":{"identifier":"allow-compute-live-stats","description":"Enables the compute_live_stats command without any pre-configured scope.","commands":{"allow":["compute_live_stats"],"deny":[]}},"allow-create-config-file":{"identifier":"allow-create-config-file","description":"Enables the create_config_file command without any pre-configured scope.","commands":{"allow":["create_config_file"],"deny":[]}},"allow-create-evaluation-session":{"identifier":"allow-create-evaluation-session","description":"Enables the create_evaluation_session command without any pre-configured scope.","commands":{"allow":["create_evaluation_session"],"deny":[]}},"allow-create-worktrees":{"identifier":"allow-create-worktrees","description":"Enables the create_worktrees command without any pre-configured scope.","commands":{"allow":["create_worktrees"],"deny":[]}},"allow-delete-comparison":{"identifier":"allow-delete-comparison","description":"Enables the delete_comparison command without any pre-configured scope.","commands":{"allow":["delete_comparison"],"deny":[]}},"allow-delete-custom-profile":{"identifier":"allow-delete-custom-profile","description":"Enables the delete_custom_profile command without any pre-configured scope.","commands":{"allow":["delete_custom_profile"],"deny":[]}},"allow-delete-keychain-secret":{"identifier":"allow-delete-keychain-secret","description":"Enables the delete_keychain_secret command without any pre-configured scope.","commands":{"allow":["delete_keychain_secret"],"deny":[]}},"allow-delete-pairwise-vote":{"identifier":"allow-delete-pairwise-vote","description":"Enables the delete_pairwise_vote command without any pre-configured scope.","commands":{"allow":["delete_pairwise_vote"],"deny":[]}},"allow-detect-harnesses":{"identifier":"allow-detect-harnesses","description":"Enables the detect_harnesses command without any pre-configured scope.","commands":{"allow":["detect_harnesses"],"deny":[]}},"allow-export-comparison-json":{"identifier":"allow-export-comparison-json","description":"Enables the export_comparison_json command without any pre-configured scope.","commands":{"allow":["export_comparison_json"],"deny":[]}},"allow-export-plugin-as-zip":{"identifier":"allow-export-plugin-as-zip","description":"Enables the export_plugin_as_zip command without any pre-configured scope.","commands":{"allow":["export_plugin_as_zip"],"deny":[]}},"allow-export-plugin-to-folder":{"identifier":"allow-export-plugin-to-folder","description":"Enables the export_plugin_to_folder command without any pre-configured scope.","commands":{"allow":["export_plugin_to_folder"],"deny":[]}},"allow-get-comparator-analytics":{"identifier":"allow-get-comparator-analytics","description":"Enables the get_comparator_analytics command without any pre-configured scope.","commands":{"allow":["get_comparator_analytics"],"deny":[]}},"allow-get-comparison":{"identifier":"allow-get-comparison","description":"Enables the get_comparison command without any pre-configured scope.","commands":{"allow":["get_comparison"],"deny":[]}},"allow-get-comparison-diffs":{"identifier":"allow-get-comparison-diffs","description":"Enables the get_comparison_diffs command without any pre-configured scope.","commands":{"allow":["get_comparison_diffs"],"deny":[]}},"allow-get-comparison-setup":{"identifier":"allow-get-comparison-setup","description":"Enables the get_comparison_setup command without any pre-configured scope.","commands":{"allow":["get_comparison_setup"],"deny":[]}},"allow-get-custom-profile":{"identifier":"allow-get-custom-profile","description":"Allows the get_custom_profile command.","commands":{"allow":["get_custom_profile"],"deny":[]}},"allow-get-diff-against-commit":{"identifier":"allow-get-diff-against-commit","description":"Enables the get_diff_against_commit command without any pre-configured scope.","commands":{"allow":["get_diff_against_commit"],"deny":[]}},"allow-get-evaluation-session":{"identifier":"allow-get-evaluation-session","description":"Enables the get_evaluation_session command without any pre-configured scope.","commands":{"allow":["get_evaluation_session"],"deny":[]}},"allow-get-evaluations":{"identifier":"allow-get-evaluations","description":"Enables the get_evaluations command without any pre-configured scope.","commands":{"allow":["get_evaluations"],"deny":[]}},"allow-get-history-size":{"identifier":"allow-get-history-size","description":"Enables the get_history_size command without any pre-configured scope.","commands":{"allow":["get_history_size"],"deny":[]}},"allow-get-pairwise-analytics":{"identifier":"allow-get-pairwise-analytics","description":"Enables the get_pairwise_analytics command without any pre-configured scope.","commands":{"allow":["get_pairwise_analytics"],"deny":[]}},"allow-get-pairwise-votes":{"identifier":"allow-get-pairwise-votes","description":"Enables the get_pairwise_votes command without any pre-configured scope.","commands":{"allow":["get_pairwise_votes"],"deny":[]}},"allow-get-parity-drift":{"identifier":"allow-get-parity-drift","description":"Enables the get_parity_drift command without any pre-configured scope.","commands":{"allow":["get_parity_drift"],"deny":[]}},"allow-get-parity-history":{"identifier":"allow-get-parity-history","description":"Enables the get_parity_history command without any pre-configured scope.","commands":{"allow":["get_parity_history"],"deny":[]}},"allow-get-parity-snapshot":{"identifier":"allow-get-parity-snapshot","description":"Enables the get_parity_snapshot command without any pre-configured scope.","commands":{"allow":["get_parity_snapshot"],"deny":[]}},"allow-import-plugin-from-path":{"identifier":"allow-import-plugin-from-path","description":"Enables the import_plugin_from_path command without any pre-configured scope.","commands":{"allow":["import_plugin_from_path"],"deny":[]}},"allow-import-plugin-from-zip":{"identifier":"allow-import-plugin-from-zip","description":"Enables the import_plugin_from_zip command without any pre-configured scope.","commands":{"allow":["import_plugin_from_zip"],"deny":[]}},"allow-kill-panel":{"identifier":"allow-kill-panel","description":"Enables the kill_panel command without any pre-configured scope.","commands":{"allow":["kill_panel"],"deny":[]}},"allow-list-active-sessions":{"identifier":"allow-list-active-sessions","description":"Enables the list_active_sessions command without any pre-configured scope.","commands":{"allow":["list_active_sessions"],"deny":[]}},"allow-list-audit-entries":{"identifier":"allow-list-audit-entries","description":"Enables the list_audit_entries command without any pre-configured scope.","commands":{"allow":["list_audit_entries"],"deny":[]}},"allow-list-claude-dir":{"identifier":"allow-list-claude-dir","description":"Enables the list_claude_dir command without any pre-configured scope.","commands":{"allow":["list_claude_dir"],"deny":[]}},"allow-list-comparisons":{"identifier":"allow-list-comparisons","description":"Enables the list_comparisons command without any pre-configured scope.","commands":{"allow":["list_comparisons"],"deny":[]}},"allow-list-custom-profiles":{"identifier":"allow-list-custom-profiles","description":"Enables the list_custom_profiles command without any pre-configured scope.","commands":{"allow":["list_custom_profiles"],"deny":[]}},"allow-list-installed-plugins":{"identifier":"allow-list-installed-plugins","description":"Enables the list_installed_plugins command without any pre-configured scope.","commands":{"allow":["list_installed_plugins"],"deny":[]}},"allow-list-marketplaces":{"identifier":"allow-list-marketplaces","description":"Enables the list_marketplaces command without any pre-configured scope.","commands":{"allow":["list_marketplaces"],"deny":[]}},"allow-list-required-env":{"identifier":"allow-list-required-env","description":"Enables the list_required_env command without any pre-configured scope.","commands":{"allow":["list_required_env"],"deny":[]}},"allow-list-security-presets":{"identifier":"allow-list-security-presets","description":"Enables the list_security_presets command without any pre-configured scope.","commands":{"allow":["list_security_presets"],"deny":[]}},"allow-list-sessions-summary":{"identifier":"allow-list-sessions-summary","description":"Enables the list_sessions_summary command without any pre-configured scope.","commands":{"allow":["list_sessions_summary"],"deny":[]}},"allow-membrain-check-installed":{"identifier":"allow-membrain-check-installed","description":"Enables the membrain_check_installed command without any pre-configured scope.","commands":{"allow":["membrain_check_installed"],"deny":[]}},"allow-membrain-get-port":{"identifier":"allow-membrain-get-port","description":"Enables the membrain_get_port command without any pre-configured scope.","commands":{"allow":["membrain_get_port"],"deny":[]}},"allow-membrain-start":{"identifier":"allow-membrain-start","description":"Enables the membrain_start command without any pre-configured scope.","commands":{"allow":["membrain_start"],"deny":[]}},"allow-membrain-stop":{"identifier":"allow-membrain-stop","description":"Enables the membrain_stop command without any pre-configured scope.","commands":{"allow":["membrain_stop"],"deny":[]}},"allow-push-file-history":{"identifier":"allow-push-file-history","description":"Enables the push_file_history command without any pre-configured scope.","commands":{"allow":["push_file_history"],"deny":[]}},"allow-read-claude-md":{"identifier":"allow-read-claude-md","description":"Enables the read_claude_md command without any pre-configured scope.","commands":{"allow":["read_claude_md"],"deny":[]}},"allow-read-env-config":{"identifier":"allow-read-env-config","description":"Enables the read_env_config command without any pre-configured scope.","commands":{"allow":["read_env_config"],"deny":[]}},"allow-read-file-history":{"identifier":"allow-read-file-history","description":"Enables the read_file_history command without any pre-configured scope.","commands":{"allow":["read_file_history"],"deny":[]}},"allow-read-harness-file":{"identifier":"allow-read-harness-file","description":"Enables the read_harness_file command without any pre-configured scope.","commands":{"allow":["read_harness_file"],"deny":[]}},"allow-read-hooks":{"identifier":"allow-read-hooks","description":"Enables the read_hooks command without any pre-configured scope.","commands":{"allow":["read_hooks"],"deny":[]}},"allow-read-live-activity":{"identifier":"allow-read-live-activity","description":"Enables the read_live_activity command without any pre-configured scope.","commands":{"allow":["read_live_activity"],"deny":[]}},"allow-read-mcp-config":{"identifier":"allow-read-mcp-config","description":"Enables the read_mcp_config command without any pre-configured scope.","commands":{"allow":["read_mcp_config"],"deny":[]}},"allow-read-permissions":{"identifier":"allow-read-permissions","description":"Enables the read_permissions command without any pre-configured scope.","commands":{"allow":["read_permissions"],"deny":[]}},"allow-read-plugin-file":{"identifier":"allow-read-plugin-file","description":"Enables the read_plugin_file command without any pre-configured scope.","commands":{"allow":["read_plugin_file"],"deny":[]}},"allow-read-plugin-tree":{"identifier":"allow-read-plugin-tree","description":"Enables the read_plugin_tree command without any pre-configured scope.","commands":{"allow":["read_plugin_tree"],"deny":[]}},"allow-read-session-facet":{"identifier":"allow-read-session-facet","description":"Enables the read_session_facet command without any pre-configured scope.","commands":{"allow":["read_session_facet"],"deny":[]}},"allow-read-session-transcript":{"identifier":"allow-read-session-transcript","description":"Enables the read_session_transcript command without any pre-configured scope.","commands":{"allow":["read_session_transcript"],"deny":[]}},"allow-read-stats-cache":{"identifier":"allow-read-stats-cache","description":"Enables the read_stats_cache command without any pre-configured scope.","commands":{"allow":["read_stats_cache"],"deny":[]}},"allow-remove-worktrees":{"identifier":"allow-remove-worktrees","description":"Enables the remove_worktrees command without any pre-configured scope.","commands":{"allow":["remove_worktrees"],"deny":[]}},"allow-reveal-evaluation-session":{"identifier":"allow-reveal-evaluation-session","description":"Enables the reveal_evaluation_session command without any pre-configured scope.","commands":{"allow":["reveal_evaluation_session"],"deny":[]}},"allow-run-parity-scan":{"identifier":"allow-run-parity-scan","description":"Enables the run_parity_scan command without any pre-configured scope.","commands":{"allow":["run_parity_scan"],"deny":[]}},"allow-save-comparison":{"identifier":"allow-save-comparison","description":"Enables the save_comparison command without any pre-configured scope.","commands":{"allow":["save_comparison"],"deny":[]}},"allow-save-custom-profile":{"identifier":"allow-save-custom-profile","description":"Enables the save_custom_profile command without any pre-configured scope.","commands":{"allow":["save_custom_profile"],"deny":[]}},"allow-save-evaluation":{"identifier":"allow-save-evaluation","description":"Enables the save_evaluation command without any pre-configured scope.","commands":{"allow":["save_evaluation"],"deny":[]}},"allow-save-file-diffs":{"identifier":"allow-save-file-diffs","description":"Enables the save_file_diffs command without any pre-configured scope.","commands":{"allow":["save_file_diffs"],"deny":[]}},"allow-save-pairwise-vote":{"identifier":"allow-save-pairwise-vote","description":"Enables the save_pairwise_vote command without any pre-configured scope.","commands":{"allow":["save_pairwise_vote"],"deny":[]}},"allow-save-panel-result":{"identifier":"allow-save-panel-result","description":"Enables the save_panel_result command without any pre-configured scope.","commands":{"allow":["save_panel_result"],"deny":[]}},"allow-scan-claude-config":{"identifier":"allow-scan-claude-config","description":"Enables the scan_claude_config command without any pre-configured scope.","commands":{"allow":["scan_claude_config"],"deny":[]}},"allow-set-keychain-secret":{"identifier":"allow-set-keychain-secret","description":"Enables the set_keychain_secret command without any pre-configured scope.","commands":{"allow":["set_keychain_secret"],"deny":[]}},"allow-start-comparison":{"identifier":"allow-start-comparison","description":"Enables the start_comparison command without any pre-configured scope.","commands":{"allow":["start_comparison"],"deny":[]}},"allow-sync-create-backup":{"identifier":"allow-sync-create-backup","description":"Enables the sync_create_backup command without any pre-configured scope.","commands":{"allow":["sync_create_backup"],"deny":[]}},"allow-sync-file-exists":{"identifier":"allow-sync-file-exists","description":"Enables the sync_file_exists command without any pre-configured scope.","commands":{"allow":["sync_file_exists"],"deny":[]}},"allow-sync-list-backups":{"identifier":"allow-sync-list-backups","description":"Enables the sync_list_backups command without any pre-configured scope.","commands":{"allow":["sync_list_backups"],"deny":[]}},"allow-sync-read-dir":{"identifier":"allow-sync-read-dir","description":"Enables the sync_read_dir command without any pre-configured scope.","commands":{"allow":["sync_read_dir"],"deny":[]}},"allow-sync-read-file":{"identifier":"allow-sync-read-file","description":"Enables the sync_read_file command without any pre-configured scope.","commands":{"allow":["sync_read_file"],"deny":[]}},"allow-sync-restore-backup":{"identifier":"allow-sync-restore-backup","description":"Enables the sync_restore_backup command without any pre-configured scope.","commands":{"allow":["sync_restore_backup"],"deny":[]}},"allow-sync-write-files":{"identifier":"allow-sync-write-files","description":"Enables the sync_write_files command without any pre-configured scope.","commands":{"allow":["sync_write_files"],"deny":[]}},"allow-uninstall-plugin":{"identifier":"allow-uninstall-plugin","description":"Enables the uninstall_plugin command without any pre-configured scope.","commands":{"allow":["uninstall_plugin"],"deny":[]}},"allow-update-evaluation-score":{"identifier":"allow-update-evaluation-score","description":"Enables the update_evaluation_score command without any pre-configured scope.","commands":{"allow":["update_evaluation_score"],"deny":[]}},"allow-update-permissions":{"identifier":"allow-update-permissions","description":"Enables the update_permissions command without any pre-configured scope.","commands":{"allow":["update_permissions"],"deny":[]}},"allow-write-env-config":{"identifier":"allow-write-env-config","description":"Enables the write_env_config command without any pre-configured scope.","commands":{"allow":["write_env_config"],"deny":[]}},"allow-write-harness-file":{"identifier":"allow-write-harness-file","description":"Enables the write_harness_file command without any pre-configured scope.","commands":{"allow":["write_harness_file"],"deny":[]}},"allow-write-mcp-config":{"identifier":"allow-write-mcp-config","description":"Enables the write_mcp_config command without any pre-configured scope.","commands":{"allow":["write_mcp_config"],"deny":[]}},"allow-write-plugin-file":{"identifier":"allow-write-plugin-file","description":"Enables the write_plugin_file command without any pre-configured scope.","commands":{"allow":["write_plugin_file"],"deny":[]}},"deny-acknowledge-drift":{"identifier":"deny-acknowledge-drift","description":"Denies the acknowledge_drift command without any pre-configured scope.","commands":{"allow":[],"deny":["acknowledge_drift"]}},"deny-add-to-parity-baseline":{"identifier":"deny-add-to-parity-baseline","description":"Denies the add_to_parity_baseline command without any pre-configured scope.","commands":{"allow":[],"deny":["add_to_parity_baseline"]}},"deny-apply-security-preset":{"identifier":"deny-apply-security-preset","description":"Denies the apply_security_preset command without any pre-configured scope.","commands":{"allow":[],"deny":["apply_security_preset"]}},"deny-board-server-check-installed":{"identifier":"deny-board-server-check-installed","description":"Denies the board_server_check_installed command without any pre-configured scope.","commands":{"allow":[],"deny":["board_server_check_installed"]}},"deny-board-server-install":{"identifier":"deny-board-server-install","description":"Denies the board_server_install command without any pre-configured scope.","commands":{"allow":[],"deny":["board_server_install"]}},"deny-board-server-restart":{"identifier":"deny-board-server-restart","description":"Denies the board_server_restart command without any pre-configured scope.","commands":{"allow":[],"deny":["board_server_restart"]}},"deny-board-server-start":{"identifier":"deny-board-server-start","description":"Denies the board_server_start command without any pre-configured scope.","commands":{"allow":[],"deny":["board_server_start"]}},"deny-chat-leave-room":{"identifier":"deny-chat-leave-room","description":"Denies the chat_leave_room command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_leave_room"]}},"deny-chat-list-rooms":{"identifier":"deny-chat-list-rooms","description":"Denies the chat_list_rooms command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_list_rooms"]}},"deny-chat-load-messages":{"identifier":"deny-chat-load-messages","description":"Denies the chat_load_messages command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_load_messages"]}},"deny-chat-local-relay-running":{"identifier":"deny-chat-local-relay-running","description":"Denies the chat_local_relay_running command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_local_relay_running"]}},"deny-chat-purge-room":{"identifier":"deny-chat-purge-room","description":"Denies the chat_purge_room command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_purge_room"]}},"deny-chat-save-messages":{"identifier":"deny-chat-save-messages","description":"Denies the chat_save_messages command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_save_messages"]}},"deny-chat-save-room":{"identifier":"deny-chat-save-room","description":"Denies the chat_save_room command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_save_room"]}},"deny-chat-start-local-relay":{"identifier":"deny-chat-start-local-relay","description":"Denies the chat_start_local_relay command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_start_local_relay"]}},"deny-chat-stop-local-relay":{"identifier":"deny-chat-stop-local-relay","description":"Denies the chat_stop_local_relay command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_stop_local_relay"]}},"deny-check-git-repo":{"identifier":"deny-check-git-repo","description":"Denies the check_git_repo command without any pre-configured scope.","commands":{"allow":[],"deny":["check_git_repo"]}},"deny-check-plugin-updates":{"identifier":"deny-check-plugin-updates","description":"Denies the check_plugin_updates command without any pre-configured scope.","commands":{"allow":[],"deny":["check_plugin_updates"]}},"deny-clear-audit-entries":{"identifier":"deny-clear-audit-entries","description":"Denies the clear_audit_entries command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_audit_entries"]}},"deny-compute-live-stats":{"identifier":"deny-compute-live-stats","description":"Denies the compute_live_stats command without any pre-configured scope.","commands":{"allow":[],"deny":["compute_live_stats"]}},"deny-create-config-file":{"identifier":"deny-create-config-file","description":"Denies the create_config_file command without any pre-configured scope.","commands":{"allow":[],"deny":["create_config_file"]}},"deny-create-evaluation-session":{"identifier":"deny-create-evaluation-session","description":"Denies the create_evaluation_session command without any pre-configured scope.","commands":{"allow":[],"deny":["create_evaluation_session"]}},"deny-create-worktrees":{"identifier":"deny-create-worktrees","description":"Denies the create_worktrees command without any pre-configured scope.","commands":{"allow":[],"deny":["create_worktrees"]}},"deny-delete-comparison":{"identifier":"deny-delete-comparison","description":"Denies the delete_comparison command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_comparison"]}},"deny-delete-custom-profile":{"identifier":"deny-delete-custom-profile","description":"Denies the delete_custom_profile command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_custom_profile"]}},"deny-delete-keychain-secret":{"identifier":"deny-delete-keychain-secret","description":"Denies the delete_keychain_secret command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_keychain_secret"]}},"deny-delete-pairwise-vote":{"identifier":"deny-delete-pairwise-vote","description":"Denies the delete_pairwise_vote command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_pairwise_vote"]}},"deny-detect-harnesses":{"identifier":"deny-detect-harnesses","description":"Denies the detect_harnesses command without any pre-configured scope.","commands":{"allow":[],"deny":["detect_harnesses"]}},"deny-export-comparison-json":{"identifier":"deny-export-comparison-json","description":"Denies the export_comparison_json command without any pre-configured scope.","commands":{"allow":[],"deny":["export_comparison_json"]}},"deny-export-plugin-as-zip":{"identifier":"deny-export-plugin-as-zip","description":"Denies the export_plugin_as_zip command without any pre-configured scope.","commands":{"allow":[],"deny":["export_plugin_as_zip"]}},"deny-export-plugin-to-folder":{"identifier":"deny-export-plugin-to-folder","description":"Denies the export_plugin_to_folder command without any pre-configured scope.","commands":{"allow":[],"deny":["export_plugin_to_folder"]}},"deny-get-comparator-analytics":{"identifier":"deny-get-comparator-analytics","description":"Denies the get_comparator_analytics command without any pre-configured scope.","commands":{"allow":[],"deny":["get_comparator_analytics"]}},"deny-get-comparison":{"identifier":"deny-get-comparison","description":"Denies the get_comparison command without any pre-configured scope.","commands":{"allow":[],"deny":["get_comparison"]}},"deny-get-comparison-diffs":{"identifier":"deny-get-comparison-diffs","description":"Denies the get_comparison_diffs command without any pre-configured scope.","commands":{"allow":[],"deny":["get_comparison_diffs"]}},"deny-get-comparison-setup":{"identifier":"deny-get-comparison-setup","description":"Denies the get_comparison_setup command without any pre-configured scope.","commands":{"allow":[],"deny":["get_comparison_setup"]}},"deny-get-custom-profile":{"identifier":"deny-get-custom-profile","description":"Denies the get_custom_profile command.","commands":{"allow":[],"deny":["get_custom_profile"]}},"deny-get-diff-against-commit":{"identifier":"deny-get-diff-against-commit","description":"Denies the get_diff_against_commit command without any pre-configured scope.","commands":{"allow":[],"deny":["get_diff_against_commit"]}},"deny-get-evaluation-session":{"identifier":"deny-get-evaluation-session","description":"Denies the get_evaluation_session command without any pre-configured scope.","commands":{"allow":[],"deny":["get_evaluation_session"]}},"deny-get-evaluations":{"identifier":"deny-get-evaluations","description":"Denies the get_evaluations command without any pre-configured scope.","commands":{"allow":[],"deny":["get_evaluations"]}},"deny-get-history-size":{"identifier":"deny-get-history-size","description":"Denies the get_history_size command without any pre-configured scope.","commands":{"allow":[],"deny":["get_history_size"]}},"deny-get-pairwise-analytics":{"identifier":"deny-get-pairwise-analytics","description":"Denies the get_pairwise_analytics command without any pre-configured scope.","commands":{"allow":[],"deny":["get_pairwise_analytics"]}},"deny-get-pairwise-votes":{"identifier":"deny-get-pairwise-votes","description":"Denies the get_pairwise_votes command without any pre-configured scope.","commands":{"allow":[],"deny":["get_pairwise_votes"]}},"deny-get-parity-drift":{"identifier":"deny-get-parity-drift","description":"Denies the get_parity_drift command without any pre-configured scope.","commands":{"allow":[],"deny":["get_parity_drift"]}},"deny-get-parity-history":{"identifier":"deny-get-parity-history","description":"Denies the get_parity_history command without any pre-configured scope.","commands":{"allow":[],"deny":["get_parity_history"]}},"deny-get-parity-snapshot":{"identifier":"deny-get-parity-snapshot","description":"Denies the get_parity_snapshot command without any pre-configured scope.","commands":{"allow":[],"deny":["get_parity_snapshot"]}},"deny-import-plugin-from-path":{"identifier":"deny-import-plugin-from-path","description":"Denies the import_plugin_from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["import_plugin_from_path"]}},"deny-import-plugin-from-zip":{"identifier":"deny-import-plugin-from-zip","description":"Denies the import_plugin_from_zip command without any pre-configured scope.","commands":{"allow":[],"deny":["import_plugin_from_zip"]}},"deny-kill-panel":{"identifier":"deny-kill-panel","description":"Denies the kill_panel command without any pre-configured scope.","commands":{"allow":[],"deny":["kill_panel"]}},"deny-list-active-sessions":{"identifier":"deny-list-active-sessions","description":"Denies the list_active_sessions command without any pre-configured scope.","commands":{"allow":[],"deny":["list_active_sessions"]}},"deny-list-audit-entries":{"identifier":"deny-list-audit-entries","description":"Denies the list_audit_entries command without any pre-configured scope.","commands":{"allow":[],"deny":["list_audit_entries"]}},"deny-list-claude-dir":{"identifier":"deny-list-claude-dir","description":"Denies the list_claude_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["list_claude_dir"]}},"deny-list-comparisons":{"identifier":"deny-list-comparisons","description":"Denies the list_comparisons command without any pre-configured scope.","commands":{"allow":[],"deny":["list_comparisons"]}},"deny-list-custom-profiles":{"identifier":"deny-list-custom-profiles","description":"Denies the list_custom_profiles command without any pre-configured scope.","commands":{"allow":[],"deny":["list_custom_profiles"]}},"deny-list-installed-plugins":{"identifier":"deny-list-installed-plugins","description":"Denies the list_installed_plugins command without any pre-configured scope.","commands":{"allow":[],"deny":["list_installed_plugins"]}},"deny-list-marketplaces":{"identifier":"deny-list-marketplaces","description":"Denies the list_marketplaces command without any pre-configured scope.","commands":{"allow":[],"deny":["list_marketplaces"]}},"deny-list-required-env":{"identifier":"deny-list-required-env","description":"Denies the list_required_env command without any pre-configured scope.","commands":{"allow":[],"deny":["list_required_env"]}},"deny-list-security-presets":{"identifier":"deny-list-security-presets","description":"Denies the list_security_presets command without any pre-configured scope.","commands":{"allow":[],"deny":["list_security_presets"]}},"deny-list-sessions-summary":{"identifier":"deny-list-sessions-summary","description":"Denies the list_sessions_summary command without any pre-configured scope.","commands":{"allow":[],"deny":["list_sessions_summary"]}},"deny-membrain-check-installed":{"identifier":"deny-membrain-check-installed","description":"Denies the membrain_check_installed command without any pre-configured scope.","commands":{"allow":[],"deny":["membrain_check_installed"]}},"deny-membrain-get-port":{"identifier":"deny-membrain-get-port","description":"Denies the membrain_get_port command without any pre-configured scope.","commands":{"allow":[],"deny":["membrain_get_port"]}},"deny-membrain-start":{"identifier":"deny-membrain-start","description":"Denies the membrain_start command without any pre-configured scope.","commands":{"allow":[],"deny":["membrain_start"]}},"deny-membrain-stop":{"identifier":"deny-membrain-stop","description":"Denies the membrain_stop command without any pre-configured scope.","commands":{"allow":[],"deny":["membrain_stop"]}},"deny-push-file-history":{"identifier":"deny-push-file-history","description":"Denies the push_file_history command without any pre-configured scope.","commands":{"allow":[],"deny":["push_file_history"]}},"deny-read-claude-md":{"identifier":"deny-read-claude-md","description":"Denies the read_claude_md command without any pre-configured scope.","commands":{"allow":[],"deny":["read_claude_md"]}},"deny-read-env-config":{"identifier":"deny-read-env-config","description":"Denies the read_env_config command without any pre-configured scope.","commands":{"allow":[],"deny":["read_env_config"]}},"deny-read-file-history":{"identifier":"deny-read-file-history","description":"Denies the read_file_history command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file_history"]}},"deny-read-harness-file":{"identifier":"deny-read-harness-file","description":"Denies the read_harness_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_harness_file"]}},"deny-read-hooks":{"identifier":"deny-read-hooks","description":"Denies the read_hooks command without any pre-configured scope.","commands":{"allow":[],"deny":["read_hooks"]}},"deny-read-live-activity":{"identifier":"deny-read-live-activity","description":"Denies the read_live_activity command without any pre-configured scope.","commands":{"allow":[],"deny":["read_live_activity"]}},"deny-read-mcp-config":{"identifier":"deny-read-mcp-config","description":"Denies the read_mcp_config command without any pre-configured scope.","commands":{"allow":[],"deny":["read_mcp_config"]}},"deny-read-permissions":{"identifier":"deny-read-permissions","description":"Denies the read_permissions command without any pre-configured scope.","commands":{"allow":[],"deny":["read_permissions"]}},"deny-read-plugin-file":{"identifier":"deny-read-plugin-file","description":"Denies the read_plugin_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_plugin_file"]}},"deny-read-plugin-tree":{"identifier":"deny-read-plugin-tree","description":"Denies the read_plugin_tree command without any pre-configured scope.","commands":{"allow":[],"deny":["read_plugin_tree"]}},"deny-read-session-facet":{"identifier":"deny-read-session-facet","description":"Denies the read_session_facet command without any pre-configured scope.","commands":{"allow":[],"deny":["read_session_facet"]}},"deny-read-session-transcript":{"identifier":"deny-read-session-transcript","description":"Denies the read_session_transcript command without any pre-configured scope.","commands":{"allow":[],"deny":["read_session_transcript"]}},"deny-read-stats-cache":{"identifier":"deny-read-stats-cache","description":"Denies the read_stats_cache command without any pre-configured scope.","commands":{"allow":[],"deny":["read_stats_cache"]}},"deny-remove-worktrees":{"identifier":"deny-remove-worktrees","description":"Denies the remove_worktrees command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_worktrees"]}},"deny-reveal-evaluation-session":{"identifier":"deny-reveal-evaluation-session","description":"Denies the reveal_evaluation_session command without any pre-configured scope.","commands":{"allow":[],"deny":["reveal_evaluation_session"]}},"deny-run-parity-scan":{"identifier":"deny-run-parity-scan","description":"Denies the run_parity_scan command without any pre-configured scope.","commands":{"allow":[],"deny":["run_parity_scan"]}},"deny-save-comparison":{"identifier":"deny-save-comparison","description":"Denies the save_comparison command without any pre-configured scope.","commands":{"allow":[],"deny":["save_comparison"]}},"deny-save-custom-profile":{"identifier":"deny-save-custom-profile","description":"Denies the save_custom_profile command without any pre-configured scope.","commands":{"allow":[],"deny":["save_custom_profile"]}},"deny-save-evaluation":{"identifier":"deny-save-evaluation","description":"Denies the save_evaluation command without any pre-configured scope.","commands":{"allow":[],"deny":["save_evaluation"]}},"deny-save-file-diffs":{"identifier":"deny-save-file-diffs","description":"Denies the save_file_diffs command without any pre-configured scope.","commands":{"allow":[],"deny":["save_file_diffs"]}},"deny-save-pairwise-vote":{"identifier":"deny-save-pairwise-vote","description":"Denies the save_pairwise_vote command without any pre-configured scope.","commands":{"allow":[],"deny":["save_pairwise_vote"]}},"deny-save-panel-result":{"identifier":"deny-save-panel-result","description":"Denies the save_panel_result command without any pre-configured scope.","commands":{"allow":[],"deny":["save_panel_result"]}},"deny-scan-claude-config":{"identifier":"deny-scan-claude-config","description":"Denies the scan_claude_config command without any pre-configured scope.","commands":{"allow":[],"deny":["scan_claude_config"]}},"deny-set-keychain-secret":{"identifier":"deny-set-keychain-secret","description":"Denies the set_keychain_secret command without any pre-configured scope.","commands":{"allow":[],"deny":["set_keychain_secret"]}},"deny-start-comparison":{"identifier":"deny-start-comparison","description":"Denies the start_comparison command without any pre-configured scope.","commands":{"allow":[],"deny":["start_comparison"]}},"deny-sync-create-backup":{"identifier":"deny-sync-create-backup","description":"Denies the sync_create_backup command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_create_backup"]}},"deny-sync-file-exists":{"identifier":"deny-sync-file-exists","description":"Denies the sync_file_exists command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_file_exists"]}},"deny-sync-list-backups":{"identifier":"deny-sync-list-backups","description":"Denies the sync_list_backups command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_list_backups"]}},"deny-sync-read-dir":{"identifier":"deny-sync-read-dir","description":"Denies the sync_read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_read_dir"]}},"deny-sync-read-file":{"identifier":"deny-sync-read-file","description":"Denies the sync_read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_read_file"]}},"deny-sync-restore-backup":{"identifier":"deny-sync-restore-backup","description":"Denies the sync_restore_backup command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_restore_backup"]}},"deny-sync-write-files":{"identifier":"deny-sync-write-files","description":"Denies the sync_write_files command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_write_files"]}},"deny-uninstall-plugin":{"identifier":"deny-uninstall-plugin","description":"Denies the uninstall_plugin command without any pre-configured scope.","commands":{"allow":[],"deny":["uninstall_plugin"]}},"deny-update-evaluation-score":{"identifier":"deny-update-evaluation-score","description":"Denies the update_evaluation_score command without any pre-configured scope.","commands":{"allow":[],"deny":["update_evaluation_score"]}},"deny-update-permissions":{"identifier":"deny-update-permissions","description":"Denies the update_permissions command without any pre-configured scope.","commands":{"allow":[],"deny":["update_permissions"]}},"deny-write-env-config":{"identifier":"deny-write-env-config","description":"Denies the write_env_config command without any pre-configured scope.","commands":{"allow":[],"deny":["write_env_config"]}},"deny-write-harness-file":{"identifier":"deny-write-harness-file","description":"Denies the write_harness_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_harness_file"]}},"deny-write-mcp-config":{"identifier":"deny-write-mcp-config","description":"Denies the write_mcp_config command without any pre-configured scope.","commands":{"allow":[],"deny":["write_mcp_config"]}},"deny-write-plugin-file":{"identifier":"deny-write-plugin-file","description":"Denies the write_plugin_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_plugin_file"]}},"allow-write-config-file":{"identifier":"allow-write-config-file","description":"Enables the write_config_file command without any pre-configured scope.","commands":{"allow":["write_config_file"],"deny":[]}},"deny-write-config-file":{"identifier":"deny-write-config-file","description":"Denies the write_config_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_config_file"]}}},"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: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},"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},"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: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},"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"}},"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: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},"dialog":{"default_permission":{"identifier":"default","description":"This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n","permissions":["allow-ask","allow-confirm","allow-message","allow-save","allow-open"]},"permissions":{"allow-ask":{"identifier":"allow-ask","description":"Enables the ask command without any pre-configured scope.","commands":{"allow":["ask"],"deny":[]}},"allow-confirm":{"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope.","commands":{"allow":["confirm"],"deny":[]}},"allow-message":{"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"deny-ask":{"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope.","commands":{"allow":[],"deny":["ask"]}},"deny-confirm":{"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope.","commands":{"allow":[],"deny":["confirm"]}},"deny-message":{"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}}},"permission_sets":{},"global_scope_schema":null},"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},"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: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},"fs":{"default_permission":{"identifier":"default","description":"This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n","permissions":["create-app-specific-dirs","read-app-specific-dirs-recursive","deny-default"]},"permissions":{"allow-copy-file":{"identifier":"allow-copy-file","description":"Enables the copy_file command without any pre-configured scope.","commands":{"allow":["copy_file"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-exists":{"identifier":"allow-exists","description":"Enables the exists command without any pre-configured scope.","commands":{"allow":["exists"],"deny":[]}},"allow-fstat":{"identifier":"allow-fstat","description":"Enables the fstat command without any pre-configured scope.","commands":{"allow":["fstat"],"deny":[]}},"allow-ftruncate":{"identifier":"allow-ftruncate","description":"Enables the ftruncate command without any pre-configured scope.","commands":{"allow":["ftruncate"],"deny":[]}},"allow-lstat":{"identifier":"allow-lstat","description":"Enables the lstat command without any pre-configured scope.","commands":{"allow":["lstat"],"deny":[]}},"allow-mkdir":{"identifier":"allow-mkdir","description":"Enables the mkdir command without any pre-configured scope.","commands":{"allow":["mkdir"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-read":{"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]}},"allow-read-dir":{"identifier":"allow-read-dir","description":"Enables the read_dir command without any pre-configured scope.","commands":{"allow":["read_dir"],"deny":[]}},"allow-read-file":{"identifier":"allow-read-file","description":"Enables the read_file command without any pre-configured scope.","commands":{"allow":["read_file"],"deny":[]}},"allow-read-text-file":{"identifier":"allow-read-text-file","description":"Enables the read_text_file command without any pre-configured scope.","commands":{"allow":["read_text_file"],"deny":[]}},"allow-read-text-file-lines":{"identifier":"allow-read-text-file-lines","description":"Enables the read_text_file_lines command without any pre-configured scope.","commands":{"allow":["read_text_file_lines","read_text_file_lines_next"],"deny":[]}},"allow-read-text-file-lines-next":{"identifier":"allow-read-text-file-lines-next","description":"Enables the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":["read_text_file_lines_next"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-rename":{"identifier":"allow-rename","description":"Enables the rename command without any pre-configured scope.","commands":{"allow":["rename"],"deny":[]}},"allow-seek":{"identifier":"allow-seek","description":"Enables the seek command without any pre-configured scope.","commands":{"allow":["seek"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"allow-stat":{"identifier":"allow-stat","description":"Enables the stat command without any pre-configured scope.","commands":{"allow":["stat"],"deny":[]}},"allow-truncate":{"identifier":"allow-truncate","description":"Enables the truncate command without any pre-configured scope.","commands":{"allow":["truncate"],"deny":[]}},"allow-unwatch":{"identifier":"allow-unwatch","description":"Enables the unwatch command without any pre-configured scope.","commands":{"allow":["unwatch"],"deny":[]}},"allow-watch":{"identifier":"allow-watch","description":"Enables the watch command without any pre-configured scope.","commands":{"allow":["watch"],"deny":[]}},"allow-write":{"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]}},"allow-write-file":{"identifier":"allow-write-file","description":"Enables the write_file command without any pre-configured scope.","commands":{"allow":["write_file","open","write"],"deny":[]}},"allow-write-text-file":{"identifier":"allow-write-text-file","description":"Enables the write_text_file command without any pre-configured scope.","commands":{"allow":["write_text_file"],"deny":[]}},"create-app-specific-dirs":{"identifier":"create-app-specific-dirs","description":"This permissions allows to create the application specific directories.\n","commands":{"allow":["mkdir","scope-app-index"],"deny":[]}},"deny-copy-file":{"identifier":"deny-copy-file","description":"Denies the copy_file command without any pre-configured scope.","commands":{"allow":[],"deny":["copy_file"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-exists":{"identifier":"deny-exists","description":"Denies the exists command without any pre-configured scope.","commands":{"allow":[],"deny":["exists"]}},"deny-fstat":{"identifier":"deny-fstat","description":"Denies the fstat command without any pre-configured scope.","commands":{"allow":[],"deny":["fstat"]}},"deny-ftruncate":{"identifier":"deny-ftruncate","description":"Denies the ftruncate command without any pre-configured scope.","commands":{"allow":[],"deny":["ftruncate"]}},"deny-lstat":{"identifier":"deny-lstat","description":"Denies the lstat command without any pre-configured scope.","commands":{"allow":[],"deny":["lstat"]}},"deny-mkdir":{"identifier":"deny-mkdir","description":"Denies the mkdir command without any pre-configured scope.","commands":{"allow":[],"deny":["mkdir"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-read":{"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]}},"deny-read-dir":{"identifier":"deny-read-dir","description":"Denies the read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["read_dir"]}},"deny-read-file":{"identifier":"deny-read-file","description":"Denies the read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file"]}},"deny-read-text-file":{"identifier":"deny-read-text-file","description":"Denies the read_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file"]}},"deny-read-text-file-lines":{"identifier":"deny-read-text-file-lines","description":"Denies the read_text_file_lines command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines"]}},"deny-read-text-file-lines-next":{"identifier":"deny-read-text-file-lines-next","description":"Denies the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines_next"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-rename":{"identifier":"deny-rename","description":"Denies the rename command without any pre-configured scope.","commands":{"allow":[],"deny":["rename"]}},"deny-seek":{"identifier":"deny-seek","description":"Denies the seek command without any pre-configured scope.","commands":{"allow":[],"deny":["seek"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}},"deny-stat":{"identifier":"deny-stat","description":"Denies the stat command without any pre-configured scope.","commands":{"allow":[],"deny":["stat"]}},"deny-truncate":{"identifier":"deny-truncate","description":"Denies the truncate command without any pre-configured scope.","commands":{"allow":[],"deny":["truncate"]}},"deny-unwatch":{"identifier":"deny-unwatch","description":"Denies the unwatch command without any pre-configured scope.","commands":{"allow":[],"deny":["unwatch"]}},"deny-watch":{"identifier":"deny-watch","description":"Denies the watch command without any pre-configured scope.","commands":{"allow":[],"deny":["watch"]}},"deny-webview-data-linux":{"identifier":"deny-webview-data-linux","description":"This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-webview-data-windows":{"identifier":"deny-webview-data-windows","description":"This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-write":{"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]}},"deny-write-file":{"identifier":"deny-write-file","description":"Denies the write_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_file"]}},"deny-write-text-file":{"identifier":"deny-write-text-file","description":"Denies the write_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text_file"]}},"read-all":{"identifier":"read-all","description":"This enables all read related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists","watch","unwatch"],"deny":[]}},"read-app-specific-dirs-recursive":{"identifier":"read-app-specific-dirs-recursive","description":"This permission allows recursive read functionality on the application\nspecific base directories. \n","commands":{"allow":["read_dir","read_file","read_text_file","read_text_file_lines","read_text_file_lines_next","exists","scope-app-recursive"],"deny":[]}},"read-dirs":{"identifier":"read-dirs","description":"This enables directory read and file metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"read-files":{"identifier":"read-files","description":"This enables file read related commands without any pre-configured accessible paths.","commands":{"allow":["read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists"],"deny":[]}},"read-meta":{"identifier":"read-meta","description":"This enables all index or metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists","size"],"deny":[]}},"scope":{"identifier":"scope","description":"An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n","commands":{"allow":[],"deny":[]}},"scope-app":{"identifier":"scope-app","description":"This scope permits access to all files and list content of top level directories in the application folders.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"},{"path":"$APPDATA"},{"path":"$APPDATA/*"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"},{"path":"$APPCACHE"},{"path":"$APPCACHE/*"},{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-app-index":{"identifier":"scope-app-index","description":"This scope permits to list all files and folders in the application directories.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPDATA"},{"path":"$APPLOCALDATA"},{"path":"$APPCACHE"},{"path":"$APPLOG"}]}},"scope-app-recursive":{"identifier":"scope-app-recursive","description":"This scope permits recursive access to the complete application folders, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"},{"path":"$APPDATA"},{"path":"$APPDATA/**"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"},{"path":"$APPCACHE"},{"path":"$APPCACHE/**"},{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-appcache":{"identifier":"scope-appcache","description":"This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/*"}]}},"scope-appcache-index":{"identifier":"scope-appcache-index","description":"This scope permits to list all files and folders in the `$APPCACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"}]}},"scope-appcache-recursive":{"identifier":"scope-appcache-recursive","description":"This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/**"}]}},"scope-appconfig":{"identifier":"scope-appconfig","description":"This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"}]}},"scope-appconfig-index":{"identifier":"scope-appconfig-index","description":"This scope permits to list all files and folders in the `$APPCONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"}]}},"scope-appconfig-recursive":{"identifier":"scope-appconfig-recursive","description":"This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"}]}},"scope-appdata":{"identifier":"scope-appdata","description":"This scope permits access to all files and list content of top level directories in the `$APPDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/*"}]}},"scope-appdata-index":{"identifier":"scope-appdata-index","description":"This scope permits to list all files and folders in the `$APPDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"}]}},"scope-appdata-recursive":{"identifier":"scope-appdata-recursive","description":"This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/**"}]}},"scope-applocaldata":{"identifier":"scope-applocaldata","description":"This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"}]}},"scope-applocaldata-index":{"identifier":"scope-applocaldata-index","description":"This scope permits to list all files and folders in the `$APPLOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"}]}},"scope-applocaldata-recursive":{"identifier":"scope-applocaldata-recursive","description":"This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"}]}},"scope-applog":{"identifier":"scope-applog","description":"This scope permits access to all files and list content of top level directories in the `$APPLOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-applog-index":{"identifier":"scope-applog-index","description":"This scope permits to list all files and folders in the `$APPLOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"}]}},"scope-applog-recursive":{"identifier":"scope-applog-recursive","description":"This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-audio":{"identifier":"scope-audio","description":"This scope permits access to all files and list content of top level directories in the `$AUDIO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/*"}]}},"scope-audio-index":{"identifier":"scope-audio-index","description":"This scope permits to list all files and folders in the `$AUDIO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"}]}},"scope-audio-recursive":{"identifier":"scope-audio-recursive","description":"This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/**"}]}},"scope-cache":{"identifier":"scope-cache","description":"This scope permits access to all files and list content of top level directories in the `$CACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/*"}]}},"scope-cache-index":{"identifier":"scope-cache-index","description":"This scope permits to list all files and folders in the `$CACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"}]}},"scope-cache-recursive":{"identifier":"scope-cache-recursive","description":"This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/**"}]}},"scope-config":{"identifier":"scope-config","description":"This scope permits access to all files and list content of top level directories in the `$CONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/*"}]}},"scope-config-index":{"identifier":"scope-config-index","description":"This scope permits to list all files and folders in the `$CONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"}]}},"scope-config-recursive":{"identifier":"scope-config-recursive","description":"This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/**"}]}},"scope-data":{"identifier":"scope-data","description":"This scope permits access to all files and list content of top level directories in the `$DATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/*"}]}},"scope-data-index":{"identifier":"scope-data-index","description":"This scope permits to list all files and folders in the `$DATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"}]}},"scope-data-recursive":{"identifier":"scope-data-recursive","description":"This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/**"}]}},"scope-desktop":{"identifier":"scope-desktop","description":"This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/*"}]}},"scope-desktop-index":{"identifier":"scope-desktop-index","description":"This scope permits to list all files and folders in the `$DESKTOP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"}]}},"scope-desktop-recursive":{"identifier":"scope-desktop-recursive","description":"This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/**"}]}},"scope-document":{"identifier":"scope-document","description":"This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/*"}]}},"scope-document-index":{"identifier":"scope-document-index","description":"This scope permits to list all files and folders in the `$DOCUMENT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"}]}},"scope-document-recursive":{"identifier":"scope-document-recursive","description":"This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/**"}]}},"scope-download":{"identifier":"scope-download","description":"This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/*"}]}},"scope-download-index":{"identifier":"scope-download-index","description":"This scope permits to list all files and folders in the `$DOWNLOAD`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"}]}},"scope-download-recursive":{"identifier":"scope-download-recursive","description":"This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/**"}]}},"scope-exe":{"identifier":"scope-exe","description":"This scope permits access to all files and list content of top level directories in the `$EXE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/*"}]}},"scope-exe-index":{"identifier":"scope-exe-index","description":"This scope permits to list all files and folders in the `$EXE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"}]}},"scope-exe-recursive":{"identifier":"scope-exe-recursive","description":"This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/**"}]}},"scope-font":{"identifier":"scope-font","description":"This scope permits access to all files and list content of top level directories in the `$FONT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/*"}]}},"scope-font-index":{"identifier":"scope-font-index","description":"This scope permits to list all files and folders in the `$FONT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"}]}},"scope-font-recursive":{"identifier":"scope-font-recursive","description":"This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/**"}]}},"scope-home":{"identifier":"scope-home","description":"This scope permits access to all files and list content of top level directories in the `$HOME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/*"}]}},"scope-home-index":{"identifier":"scope-home-index","description":"This scope permits to list all files and folders in the `$HOME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"}]}},"scope-home-recursive":{"identifier":"scope-home-recursive","description":"This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/**"}]}},"scope-localdata":{"identifier":"scope-localdata","description":"This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/*"}]}},"scope-localdata-index":{"identifier":"scope-localdata-index","description":"This scope permits to list all files and folders in the `$LOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"}]}},"scope-localdata-recursive":{"identifier":"scope-localdata-recursive","description":"This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/**"}]}},"scope-log":{"identifier":"scope-log","description":"This scope permits access to all files and list content of top level directories in the `$LOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/*"}]}},"scope-log-index":{"identifier":"scope-log-index","description":"This scope permits to list all files and folders in the `$LOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"}]}},"scope-log-recursive":{"identifier":"scope-log-recursive","description":"This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/**"}]}},"scope-picture":{"identifier":"scope-picture","description":"This scope permits access to all files and list content of top level directories in the `$PICTURE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/*"}]}},"scope-picture-index":{"identifier":"scope-picture-index","description":"This scope permits to list all files and folders in the `$PICTURE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"}]}},"scope-picture-recursive":{"identifier":"scope-picture-recursive","description":"This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/**"}]}},"scope-public":{"identifier":"scope-public","description":"This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/*"}]}},"scope-public-index":{"identifier":"scope-public-index","description":"This scope permits to list all files and folders in the `$PUBLIC`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"}]}},"scope-public-recursive":{"identifier":"scope-public-recursive","description":"This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/**"}]}},"scope-resource":{"identifier":"scope-resource","description":"This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/*"}]}},"scope-resource-index":{"identifier":"scope-resource-index","description":"This scope permits to list all files and folders in the `$RESOURCE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"}]}},"scope-resource-recursive":{"identifier":"scope-resource-recursive","description":"This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/**"}]}},"scope-runtime":{"identifier":"scope-runtime","description":"This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/*"}]}},"scope-runtime-index":{"identifier":"scope-runtime-index","description":"This scope permits to list all files and folders in the `$RUNTIME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"}]}},"scope-runtime-recursive":{"identifier":"scope-runtime-recursive","description":"This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/**"}]}},"scope-temp":{"identifier":"scope-temp","description":"This scope permits access to all files and list content of top level directories in the `$TEMP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/*"}]}},"scope-temp-index":{"identifier":"scope-temp-index","description":"This scope permits to list all files and folders in the `$TEMP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"}]}},"scope-temp-recursive":{"identifier":"scope-temp-recursive","description":"This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/**"}]}},"scope-template":{"identifier":"scope-template","description":"This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/*"}]}},"scope-template-index":{"identifier":"scope-template-index","description":"This scope permits to list all files and folders in the `$TEMPLATE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"}]}},"scope-template-recursive":{"identifier":"scope-template-recursive","description":"This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/**"}]}},"scope-video":{"identifier":"scope-video","description":"This scope permits access to all files and list content of top level directories in the `$VIDEO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/*"}]}},"scope-video-index":{"identifier":"scope-video-index","description":"This scope permits to list all files and folders in the `$VIDEO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"}]}},"scope-video-recursive":{"identifier":"scope-video-recursive","description":"This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/**"}]}},"write-all":{"identifier":"write-all","description":"This enables all write related commands without any pre-configured accessible paths.","commands":{"allow":["mkdir","create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}},"write-files":{"identifier":"write-files","description":"This enables all file write related commands without any pre-configured accessible paths.","commands":{"allow":["create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}}},"permission_sets":{"allow-app-meta":{"identifier":"allow-app-meta","description":"This allows non-recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-index"]},"allow-app-meta-recursive":{"identifier":"allow-app-meta-recursive","description":"This allows full recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-recursive"]},"allow-app-read":{"identifier":"allow-app-read","description":"This allows non-recursive read access to the application folders.","permissions":["read-all","scope-app"]},"allow-app-read-recursive":{"identifier":"allow-app-read-recursive","description":"This allows full recursive read access to the complete application folders, files and subdirectories.","permissions":["read-all","scope-app-recursive"]},"allow-app-write":{"identifier":"allow-app-write","description":"This allows non-recursive write access to the application folders.","permissions":["write-all","scope-app"]},"allow-app-write-recursive":{"identifier":"allow-app-write-recursive","description":"This allows full recursive write access to the complete application folders, files and subdirectories.","permissions":["write-all","scope-app-recursive"]},"allow-appcache-meta":{"identifier":"allow-appcache-meta","description":"This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-index"]},"allow-appcache-meta-recursive":{"identifier":"allow-appcache-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-recursive"]},"allow-appcache-read":{"identifier":"allow-appcache-read","description":"This allows non-recursive read access to the `$APPCACHE` folder.","permissions":["read-all","scope-appcache"]},"allow-appcache-read-recursive":{"identifier":"allow-appcache-read-recursive","description":"This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["read-all","scope-appcache-recursive"]},"allow-appcache-write":{"identifier":"allow-appcache-write","description":"This allows non-recursive write access to the `$APPCACHE` folder.","permissions":["write-all","scope-appcache"]},"allow-appcache-write-recursive":{"identifier":"allow-appcache-write-recursive","description":"This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["write-all","scope-appcache-recursive"]},"allow-appconfig-meta":{"identifier":"allow-appconfig-meta","description":"This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-index"]},"allow-appconfig-meta-recursive":{"identifier":"allow-appconfig-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-recursive"]},"allow-appconfig-read":{"identifier":"allow-appconfig-read","description":"This allows non-recursive read access to the `$APPCONFIG` folder.","permissions":["read-all","scope-appconfig"]},"allow-appconfig-read-recursive":{"identifier":"allow-appconfig-read-recursive","description":"This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["read-all","scope-appconfig-recursive"]},"allow-appconfig-write":{"identifier":"allow-appconfig-write","description":"This allows non-recursive write access to the `$APPCONFIG` folder.","permissions":["write-all","scope-appconfig"]},"allow-appconfig-write-recursive":{"identifier":"allow-appconfig-write-recursive","description":"This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["write-all","scope-appconfig-recursive"]},"allow-appdata-meta":{"identifier":"allow-appdata-meta","description":"This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-index"]},"allow-appdata-meta-recursive":{"identifier":"allow-appdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-recursive"]},"allow-appdata-read":{"identifier":"allow-appdata-read","description":"This allows non-recursive read access to the `$APPDATA` folder.","permissions":["read-all","scope-appdata"]},"allow-appdata-read-recursive":{"identifier":"allow-appdata-read-recursive","description":"This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["read-all","scope-appdata-recursive"]},"allow-appdata-write":{"identifier":"allow-appdata-write","description":"This allows non-recursive write access to the `$APPDATA` folder.","permissions":["write-all","scope-appdata"]},"allow-appdata-write-recursive":{"identifier":"allow-appdata-write-recursive","description":"This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["write-all","scope-appdata-recursive"]},"allow-applocaldata-meta":{"identifier":"allow-applocaldata-meta","description":"This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-index"]},"allow-applocaldata-meta-recursive":{"identifier":"allow-applocaldata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-recursive"]},"allow-applocaldata-read":{"identifier":"allow-applocaldata-read","description":"This allows non-recursive read access to the `$APPLOCALDATA` folder.","permissions":["read-all","scope-applocaldata"]},"allow-applocaldata-read-recursive":{"identifier":"allow-applocaldata-read-recursive","description":"This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-applocaldata-recursive"]},"allow-applocaldata-write":{"identifier":"allow-applocaldata-write","description":"This allows non-recursive write access to the `$APPLOCALDATA` folder.","permissions":["write-all","scope-applocaldata"]},"allow-applocaldata-write-recursive":{"identifier":"allow-applocaldata-write-recursive","description":"This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-applocaldata-recursive"]},"allow-applog-meta":{"identifier":"allow-applog-meta","description":"This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-index"]},"allow-applog-meta-recursive":{"identifier":"allow-applog-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-recursive"]},"allow-applog-read":{"identifier":"allow-applog-read","description":"This allows non-recursive read access to the `$APPLOG` folder.","permissions":["read-all","scope-applog"]},"allow-applog-read-recursive":{"identifier":"allow-applog-read-recursive","description":"This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["read-all","scope-applog-recursive"]},"allow-applog-write":{"identifier":"allow-applog-write","description":"This allows non-recursive write access to the `$APPLOG` folder.","permissions":["write-all","scope-applog"]},"allow-applog-write-recursive":{"identifier":"allow-applog-write-recursive","description":"This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["write-all","scope-applog-recursive"]},"allow-audio-meta":{"identifier":"allow-audio-meta","description":"This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-index"]},"allow-audio-meta-recursive":{"identifier":"allow-audio-meta-recursive","description":"This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-recursive"]},"allow-audio-read":{"identifier":"allow-audio-read","description":"This allows non-recursive read access to the `$AUDIO` folder.","permissions":["read-all","scope-audio"]},"allow-audio-read-recursive":{"identifier":"allow-audio-read-recursive","description":"This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["read-all","scope-audio-recursive"]},"allow-audio-write":{"identifier":"allow-audio-write","description":"This allows non-recursive write access to the `$AUDIO` folder.","permissions":["write-all","scope-audio"]},"allow-audio-write-recursive":{"identifier":"allow-audio-write-recursive","description":"This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["write-all","scope-audio-recursive"]},"allow-cache-meta":{"identifier":"allow-cache-meta","description":"This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-index"]},"allow-cache-meta-recursive":{"identifier":"allow-cache-meta-recursive","description":"This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-recursive"]},"allow-cache-read":{"identifier":"allow-cache-read","description":"This allows non-recursive read access to the `$CACHE` folder.","permissions":["read-all","scope-cache"]},"allow-cache-read-recursive":{"identifier":"allow-cache-read-recursive","description":"This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.","permissions":["read-all","scope-cache-recursive"]},"allow-cache-write":{"identifier":"allow-cache-write","description":"This allows non-recursive write access to the `$CACHE` folder.","permissions":["write-all","scope-cache"]},"allow-cache-write-recursive":{"identifier":"allow-cache-write-recursive","description":"This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.","permissions":["write-all","scope-cache-recursive"]},"allow-config-meta":{"identifier":"allow-config-meta","description":"This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-index"]},"allow-config-meta-recursive":{"identifier":"allow-config-meta-recursive","description":"This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-recursive"]},"allow-config-read":{"identifier":"allow-config-read","description":"This allows non-recursive read access to the `$CONFIG` folder.","permissions":["read-all","scope-config"]},"allow-config-read-recursive":{"identifier":"allow-config-read-recursive","description":"This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["read-all","scope-config-recursive"]},"allow-config-write":{"identifier":"allow-config-write","description":"This allows non-recursive write access to the `$CONFIG` folder.","permissions":["write-all","scope-config"]},"allow-config-write-recursive":{"identifier":"allow-config-write-recursive","description":"This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["write-all","scope-config-recursive"]},"allow-data-meta":{"identifier":"allow-data-meta","description":"This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-index"]},"allow-data-meta-recursive":{"identifier":"allow-data-meta-recursive","description":"This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-recursive"]},"allow-data-read":{"identifier":"allow-data-read","description":"This allows non-recursive read access to the `$DATA` folder.","permissions":["read-all","scope-data"]},"allow-data-read-recursive":{"identifier":"allow-data-read-recursive","description":"This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.","permissions":["read-all","scope-data-recursive"]},"allow-data-write":{"identifier":"allow-data-write","description":"This allows non-recursive write access to the `$DATA` folder.","permissions":["write-all","scope-data"]},"allow-data-write-recursive":{"identifier":"allow-data-write-recursive","description":"This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.","permissions":["write-all","scope-data-recursive"]},"allow-desktop-meta":{"identifier":"allow-desktop-meta","description":"This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-index"]},"allow-desktop-meta-recursive":{"identifier":"allow-desktop-meta-recursive","description":"This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-recursive"]},"allow-desktop-read":{"identifier":"allow-desktop-read","description":"This allows non-recursive read access to the `$DESKTOP` folder.","permissions":["read-all","scope-desktop"]},"allow-desktop-read-recursive":{"identifier":"allow-desktop-read-recursive","description":"This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["read-all","scope-desktop-recursive"]},"allow-desktop-write":{"identifier":"allow-desktop-write","description":"This allows non-recursive write access to the `$DESKTOP` folder.","permissions":["write-all","scope-desktop"]},"allow-desktop-write-recursive":{"identifier":"allow-desktop-write-recursive","description":"This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["write-all","scope-desktop-recursive"]},"allow-document-meta":{"identifier":"allow-document-meta","description":"This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-index"]},"allow-document-meta-recursive":{"identifier":"allow-document-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-recursive"]},"allow-document-read":{"identifier":"allow-document-read","description":"This allows non-recursive read access to the `$DOCUMENT` folder.","permissions":["read-all","scope-document"]},"allow-document-read-recursive":{"identifier":"allow-document-read-recursive","description":"This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["read-all","scope-document-recursive"]},"allow-document-write":{"identifier":"allow-document-write","description":"This allows non-recursive write access to the `$DOCUMENT` folder.","permissions":["write-all","scope-document"]},"allow-document-write-recursive":{"identifier":"allow-document-write-recursive","description":"This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["write-all","scope-document-recursive"]},"allow-download-meta":{"identifier":"allow-download-meta","description":"This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-index"]},"allow-download-meta-recursive":{"identifier":"allow-download-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-recursive"]},"allow-download-read":{"identifier":"allow-download-read","description":"This allows non-recursive read access to the `$DOWNLOAD` folder.","permissions":["read-all","scope-download"]},"allow-download-read-recursive":{"identifier":"allow-download-read-recursive","description":"This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["read-all","scope-download-recursive"]},"allow-download-write":{"identifier":"allow-download-write","description":"This allows non-recursive write access to the `$DOWNLOAD` folder.","permissions":["write-all","scope-download"]},"allow-download-write-recursive":{"identifier":"allow-download-write-recursive","description":"This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["write-all","scope-download-recursive"]},"allow-exe-meta":{"identifier":"allow-exe-meta","description":"This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-index"]},"allow-exe-meta-recursive":{"identifier":"allow-exe-meta-recursive","description":"This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-recursive"]},"allow-exe-read":{"identifier":"allow-exe-read","description":"This allows non-recursive read access to the `$EXE` folder.","permissions":["read-all","scope-exe"]},"allow-exe-read-recursive":{"identifier":"allow-exe-read-recursive","description":"This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.","permissions":["read-all","scope-exe-recursive"]},"allow-exe-write":{"identifier":"allow-exe-write","description":"This allows non-recursive write access to the `$EXE` folder.","permissions":["write-all","scope-exe"]},"allow-exe-write-recursive":{"identifier":"allow-exe-write-recursive","description":"This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.","permissions":["write-all","scope-exe-recursive"]},"allow-font-meta":{"identifier":"allow-font-meta","description":"This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-index"]},"allow-font-meta-recursive":{"identifier":"allow-font-meta-recursive","description":"This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-recursive"]},"allow-font-read":{"identifier":"allow-font-read","description":"This allows non-recursive read access to the `$FONT` folder.","permissions":["read-all","scope-font"]},"allow-font-read-recursive":{"identifier":"allow-font-read-recursive","description":"This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.","permissions":["read-all","scope-font-recursive"]},"allow-font-write":{"identifier":"allow-font-write","description":"This allows non-recursive write access to the `$FONT` folder.","permissions":["write-all","scope-font"]},"allow-font-write-recursive":{"identifier":"allow-font-write-recursive","description":"This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.","permissions":["write-all","scope-font-recursive"]},"allow-home-meta":{"identifier":"allow-home-meta","description":"This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-index"]},"allow-home-meta-recursive":{"identifier":"allow-home-meta-recursive","description":"This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-recursive"]},"allow-home-read":{"identifier":"allow-home-read","description":"This allows non-recursive read access to the `$HOME` folder.","permissions":["read-all","scope-home"]},"allow-home-read-recursive":{"identifier":"allow-home-read-recursive","description":"This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.","permissions":["read-all","scope-home-recursive"]},"allow-home-write":{"identifier":"allow-home-write","description":"This allows non-recursive write access to the `$HOME` folder.","permissions":["write-all","scope-home"]},"allow-home-write-recursive":{"identifier":"allow-home-write-recursive","description":"This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.","permissions":["write-all","scope-home-recursive"]},"allow-localdata-meta":{"identifier":"allow-localdata-meta","description":"This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-index"]},"allow-localdata-meta-recursive":{"identifier":"allow-localdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-recursive"]},"allow-localdata-read":{"identifier":"allow-localdata-read","description":"This allows non-recursive read access to the `$LOCALDATA` folder.","permissions":["read-all","scope-localdata"]},"allow-localdata-read-recursive":{"identifier":"allow-localdata-read-recursive","description":"This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-localdata-recursive"]},"allow-localdata-write":{"identifier":"allow-localdata-write","description":"This allows non-recursive write access to the `$LOCALDATA` folder.","permissions":["write-all","scope-localdata"]},"allow-localdata-write-recursive":{"identifier":"allow-localdata-write-recursive","description":"This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-localdata-recursive"]},"allow-log-meta":{"identifier":"allow-log-meta","description":"This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-index"]},"allow-log-meta-recursive":{"identifier":"allow-log-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-recursive"]},"allow-log-read":{"identifier":"allow-log-read","description":"This allows non-recursive read access to the `$LOG` folder.","permissions":["read-all","scope-log"]},"allow-log-read-recursive":{"identifier":"allow-log-read-recursive","description":"This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.","permissions":["read-all","scope-log-recursive"]},"allow-log-write":{"identifier":"allow-log-write","description":"This allows non-recursive write access to the `$LOG` folder.","permissions":["write-all","scope-log"]},"allow-log-write-recursive":{"identifier":"allow-log-write-recursive","description":"This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.","permissions":["write-all","scope-log-recursive"]},"allow-picture-meta":{"identifier":"allow-picture-meta","description":"This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-index"]},"allow-picture-meta-recursive":{"identifier":"allow-picture-meta-recursive","description":"This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-recursive"]},"allow-picture-read":{"identifier":"allow-picture-read","description":"This allows non-recursive read access to the `$PICTURE` folder.","permissions":["read-all","scope-picture"]},"allow-picture-read-recursive":{"identifier":"allow-picture-read-recursive","description":"This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["read-all","scope-picture-recursive"]},"allow-picture-write":{"identifier":"allow-picture-write","description":"This allows non-recursive write access to the `$PICTURE` folder.","permissions":["write-all","scope-picture"]},"allow-picture-write-recursive":{"identifier":"allow-picture-write-recursive","description":"This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["write-all","scope-picture-recursive"]},"allow-public-meta":{"identifier":"allow-public-meta","description":"This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-index"]},"allow-public-meta-recursive":{"identifier":"allow-public-meta-recursive","description":"This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-recursive"]},"allow-public-read":{"identifier":"allow-public-read","description":"This allows non-recursive read access to the `$PUBLIC` folder.","permissions":["read-all","scope-public"]},"allow-public-read-recursive":{"identifier":"allow-public-read-recursive","description":"This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["read-all","scope-public-recursive"]},"allow-public-write":{"identifier":"allow-public-write","description":"This allows non-recursive write access to the `$PUBLIC` folder.","permissions":["write-all","scope-public"]},"allow-public-write-recursive":{"identifier":"allow-public-write-recursive","description":"This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["write-all","scope-public-recursive"]},"allow-resource-meta":{"identifier":"allow-resource-meta","description":"This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-index"]},"allow-resource-meta-recursive":{"identifier":"allow-resource-meta-recursive","description":"This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-recursive"]},"allow-resource-read":{"identifier":"allow-resource-read","description":"This allows non-recursive read access to the `$RESOURCE` folder.","permissions":["read-all","scope-resource"]},"allow-resource-read-recursive":{"identifier":"allow-resource-read-recursive","description":"This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["read-all","scope-resource-recursive"]},"allow-resource-write":{"identifier":"allow-resource-write","description":"This allows non-recursive write access to the `$RESOURCE` folder.","permissions":["write-all","scope-resource"]},"allow-resource-write-recursive":{"identifier":"allow-resource-write-recursive","description":"This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["write-all","scope-resource-recursive"]},"allow-runtime-meta":{"identifier":"allow-runtime-meta","description":"This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-index"]},"allow-runtime-meta-recursive":{"identifier":"allow-runtime-meta-recursive","description":"This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-recursive"]},"allow-runtime-read":{"identifier":"allow-runtime-read","description":"This allows non-recursive read access to the `$RUNTIME` folder.","permissions":["read-all","scope-runtime"]},"allow-runtime-read-recursive":{"identifier":"allow-runtime-read-recursive","description":"This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["read-all","scope-runtime-recursive"]},"allow-runtime-write":{"identifier":"allow-runtime-write","description":"This allows non-recursive write access to the `$RUNTIME` folder.","permissions":["write-all","scope-runtime"]},"allow-runtime-write-recursive":{"identifier":"allow-runtime-write-recursive","description":"This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["write-all","scope-runtime-recursive"]},"allow-temp-meta":{"identifier":"allow-temp-meta","description":"This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-index"]},"allow-temp-meta-recursive":{"identifier":"allow-temp-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-recursive"]},"allow-temp-read":{"identifier":"allow-temp-read","description":"This allows non-recursive read access to the `$TEMP` folder.","permissions":["read-all","scope-temp"]},"allow-temp-read-recursive":{"identifier":"allow-temp-read-recursive","description":"This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.","permissions":["read-all","scope-temp-recursive"]},"allow-temp-write":{"identifier":"allow-temp-write","description":"This allows non-recursive write access to the `$TEMP` folder.","permissions":["write-all","scope-temp"]},"allow-temp-write-recursive":{"identifier":"allow-temp-write-recursive","description":"This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.","permissions":["write-all","scope-temp-recursive"]},"allow-template-meta":{"identifier":"allow-template-meta","description":"This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-index"]},"allow-template-meta-recursive":{"identifier":"allow-template-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-recursive"]},"allow-template-read":{"identifier":"allow-template-read","description":"This allows non-recursive read access to the `$TEMPLATE` folder.","permissions":["read-all","scope-template"]},"allow-template-read-recursive":{"identifier":"allow-template-read-recursive","description":"This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["read-all","scope-template-recursive"]},"allow-template-write":{"identifier":"allow-template-write","description":"This allows non-recursive write access to the `$TEMPLATE` folder.","permissions":["write-all","scope-template"]},"allow-template-write-recursive":{"identifier":"allow-template-write-recursive","description":"This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["write-all","scope-template-recursive"]},"allow-video-meta":{"identifier":"allow-video-meta","description":"This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-index"]},"allow-video-meta-recursive":{"identifier":"allow-video-meta-recursive","description":"This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-recursive"]},"allow-video-read":{"identifier":"allow-video-read","description":"This allows non-recursive read access to the `$VIDEO` folder.","permissions":["read-all","scope-video"]},"allow-video-read-recursive":{"identifier":"allow-video-read-recursive","description":"This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["read-all","scope-video-recursive"]},"allow-video-write":{"identifier":"allow-video-write","description":"This allows non-recursive write access to the `$VIDEO` folder.","permissions":["write-all","scope-video"]},"allow-video-write-recursive":{"identifier":"allow-video-write-recursive","description":"This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["write-all","scope-video-recursive"]},"deny-default":{"identifier":"deny-default","description":"This denies access to dangerous Tauri relevant files and folders by default.","permissions":["deny-webview-data-linux","deny-webview-data-windows"]}},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"A path that can be accessed by the webview when using the fs APIs. FS scope path pattern.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},{"properties":{"path":{"description":"A path that can be accessed by the webview when using the fs APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"}},"required":["path"],"type":"object"}],"description":"FS scope entry.","title":"FsScopeEntry"}}} \ No newline at end of file +{"__app-acl__":{"default_permission":null,"permissions":{"allow-acknowledge-drift":{"identifier":"allow-acknowledge-drift","description":"Enables the acknowledge_drift command without any pre-configured scope.","commands":{"allow":["acknowledge_drift"],"deny":[]}},"allow-add-to-parity-baseline":{"identifier":"allow-add-to-parity-baseline","description":"Enables the add_to_parity_baseline command without any pre-configured scope.","commands":{"allow":["add_to_parity_baseline"],"deny":[]}},"allow-apply-security-preset":{"identifier":"allow-apply-security-preset","description":"Enables the apply_security_preset command without any pre-configured scope.","commands":{"allow":["apply_security_preset"],"deny":[]}},"allow-board-server-check-installed":{"identifier":"allow-board-server-check-installed","description":"Enables the board_server_check_installed command without any pre-configured scope.","commands":{"allow":["board_server_check_installed"],"deny":[]}},"allow-board-server-install":{"identifier":"allow-board-server-install","description":"Enables the board_server_install command without any pre-configured scope.","commands":{"allow":["board_server_install"],"deny":[]}},"allow-board-server-restart":{"identifier":"allow-board-server-restart","description":"Enables the board_server_restart command without any pre-configured scope.","commands":{"allow":["board_server_restart"],"deny":[]}},"allow-board-server-start":{"identifier":"allow-board-server-start","description":"Enables the board_server_start command without any pre-configured scope.","commands":{"allow":["board_server_start"],"deny":[]}},"allow-chat-leave-room":{"identifier":"allow-chat-leave-room","description":"Enables the chat_leave_room command without any pre-configured scope.","commands":{"allow":["chat_leave_room"],"deny":[]}},"allow-chat-list-rooms":{"identifier":"allow-chat-list-rooms","description":"Enables the chat_list_rooms command without any pre-configured scope.","commands":{"allow":["chat_list_rooms"],"deny":[]}},"allow-chat-load-messages":{"identifier":"allow-chat-load-messages","description":"Enables the chat_load_messages command without any pre-configured scope.","commands":{"allow":["chat_load_messages"],"deny":[]}},"allow-chat-local-relay-running":{"identifier":"allow-chat-local-relay-running","description":"Enables the chat_local_relay_running command without any pre-configured scope.","commands":{"allow":["chat_local_relay_running"],"deny":[]}},"allow-chat-purge-room":{"identifier":"allow-chat-purge-room","description":"Enables the chat_purge_room command without any pre-configured scope.","commands":{"allow":["chat_purge_room"],"deny":[]}},"allow-chat-save-messages":{"identifier":"allow-chat-save-messages","description":"Enables the chat_save_messages command without any pre-configured scope.","commands":{"allow":["chat_save_messages"],"deny":[]}},"allow-chat-save-room":{"identifier":"allow-chat-save-room","description":"Enables the chat_save_room command without any pre-configured scope.","commands":{"allow":["chat_save_room"],"deny":[]}},"allow-chat-start-local-relay":{"identifier":"allow-chat-start-local-relay","description":"Enables the chat_start_local_relay command without any pre-configured scope.","commands":{"allow":["chat_start_local_relay"],"deny":[]}},"allow-chat-stop-local-relay":{"identifier":"allow-chat-stop-local-relay","description":"Enables the chat_stop_local_relay command without any pre-configured scope.","commands":{"allow":["chat_stop_local_relay"],"deny":[]}},"allow-check-git-repo":{"identifier":"allow-check-git-repo","description":"Enables the check_git_repo command without any pre-configured scope.","commands":{"allow":["check_git_repo"],"deny":[]}},"allow-check-plugin-updates":{"identifier":"allow-check-plugin-updates","description":"Enables the check_plugin_updates command without any pre-configured scope.","commands":{"allow":["check_plugin_updates"],"deny":[]}},"allow-clear-audit-entries":{"identifier":"allow-clear-audit-entries","description":"Enables the clear_audit_entries command without any pre-configured scope.","commands":{"allow":["clear_audit_entries"],"deny":[]}},"allow-compute-live-stats":{"identifier":"allow-compute-live-stats","description":"Enables the compute_live_stats command without any pre-configured scope.","commands":{"allow":["compute_live_stats"],"deny":[]}},"allow-create-config-file":{"identifier":"allow-create-config-file","description":"Enables the create_config_file command without any pre-configured scope.","commands":{"allow":["create_config_file"],"deny":[]}},"allow-create-evaluation-session":{"identifier":"allow-create-evaluation-session","description":"Enables the create_evaluation_session command without any pre-configured scope.","commands":{"allow":["create_evaluation_session"],"deny":[]}},"allow-create-terminal":{"identifier":"allow-create-terminal","description":"Enables the create_terminal command without any pre-configured scope.","commands":{"allow":["create_terminal"],"deny":[]}},"allow-create-worktrees":{"identifier":"allow-create-worktrees","description":"Enables the create_worktrees command without any pre-configured scope.","commands":{"allow":["create_worktrees"],"deny":[]}},"allow-delete-comparison":{"identifier":"allow-delete-comparison","description":"Enables the delete_comparison command without any pre-configured scope.","commands":{"allow":["delete_comparison"],"deny":[]}},"allow-delete-custom-profile":{"identifier":"allow-delete-custom-profile","description":"Enables the delete_custom_profile command without any pre-configured scope.","commands":{"allow":["delete_custom_profile"],"deny":[]}},"allow-delete-keychain-secret":{"identifier":"allow-delete-keychain-secret","description":"Enables the delete_keychain_secret command without any pre-configured scope.","commands":{"allow":["delete_keychain_secret"],"deny":[]}},"allow-delete-pairwise-vote":{"identifier":"allow-delete-pairwise-vote","description":"Enables the delete_pairwise_vote command without any pre-configured scope.","commands":{"allow":["delete_pairwise_vote"],"deny":[]}},"allow-destroy-terminal":{"identifier":"allow-destroy-terminal","description":"Enables the destroy_terminal command without any pre-configured scope.","commands":{"allow":["destroy_terminal"],"deny":[]}},"allow-detect-harnesses":{"identifier":"allow-detect-harnesses","description":"Enables the detect_harnesses command without any pre-configured scope.","commands":{"allow":["detect_harnesses"],"deny":[]}},"allow-export-comparison-json":{"identifier":"allow-export-comparison-json","description":"Enables the export_comparison_json command without any pre-configured scope.","commands":{"allow":["export_comparison_json"],"deny":[]}},"allow-export-plugin-as-zip":{"identifier":"allow-export-plugin-as-zip","description":"Enables the export_plugin_as_zip command without any pre-configured scope.","commands":{"allow":["export_plugin_as_zip"],"deny":[]}},"allow-export-plugin-to-folder":{"identifier":"allow-export-plugin-to-folder","description":"Enables the export_plugin_to_folder command without any pre-configured scope.","commands":{"allow":["export_plugin_to_folder"],"deny":[]}},"allow-get-comparator-analytics":{"identifier":"allow-get-comparator-analytics","description":"Enables the get_comparator_analytics command without any pre-configured scope.","commands":{"allow":["get_comparator_analytics"],"deny":[]}},"allow-get-comparison":{"identifier":"allow-get-comparison","description":"Enables the get_comparison command without any pre-configured scope.","commands":{"allow":["get_comparison"],"deny":[]}},"allow-get-comparison-diffs":{"identifier":"allow-get-comparison-diffs","description":"Enables the get_comparison_diffs command without any pre-configured scope.","commands":{"allow":["get_comparison_diffs"],"deny":[]}},"allow-get-comparison-setup":{"identifier":"allow-get-comparison-setup","description":"Enables the get_comparison_setup command without any pre-configured scope.","commands":{"allow":["get_comparison_setup"],"deny":[]}},"allow-get-custom-profile":{"identifier":"allow-get-custom-profile","description":"Allows the get_custom_profile command.","commands":{"allow":["get_custom_profile"],"deny":[]}},"allow-get-cwd":{"identifier":"allow-get-cwd","description":"Enables the get_cwd command without any pre-configured scope.","commands":{"allow":["get_cwd"],"deny":[]}},"allow-get-diff-against-commit":{"identifier":"allow-get-diff-against-commit","description":"Enables the get_diff_against_commit command without any pre-configured scope.","commands":{"allow":["get_diff_against_commit"],"deny":[]}},"allow-get-evaluation-session":{"identifier":"allow-get-evaluation-session","description":"Enables the get_evaluation_session command without any pre-configured scope.","commands":{"allow":["get_evaluation_session"],"deny":[]}},"allow-get-evaluations":{"identifier":"allow-get-evaluations","description":"Enables the get_evaluations command without any pre-configured scope.","commands":{"allow":["get_evaluations"],"deny":[]}},"allow-get-history-size":{"identifier":"allow-get-history-size","description":"Enables the get_history_size command without any pre-configured scope.","commands":{"allow":["get_history_size"],"deny":[]}},"allow-get-pairwise-analytics":{"identifier":"allow-get-pairwise-analytics","description":"Enables the get_pairwise_analytics command without any pre-configured scope.","commands":{"allow":["get_pairwise_analytics"],"deny":[]}},"allow-get-pairwise-votes":{"identifier":"allow-get-pairwise-votes","description":"Enables the get_pairwise_votes command without any pre-configured scope.","commands":{"allow":["get_pairwise_votes"],"deny":[]}},"allow-get-parity-drift":{"identifier":"allow-get-parity-drift","description":"Enables the get_parity_drift command without any pre-configured scope.","commands":{"allow":["get_parity_drift"],"deny":[]}},"allow-get-parity-history":{"identifier":"allow-get-parity-history","description":"Enables the get_parity_history command without any pre-configured scope.","commands":{"allow":["get_parity_history"],"deny":[]}},"allow-get-parity-snapshot":{"identifier":"allow-get-parity-snapshot","description":"Enables the get_parity_snapshot command without any pre-configured scope.","commands":{"allow":["get_parity_snapshot"],"deny":[]}},"allow-import-plugin-from-path":{"identifier":"allow-import-plugin-from-path","description":"Enables the import_plugin_from_path command without any pre-configured scope.","commands":{"allow":["import_plugin_from_path"],"deny":[]}},"allow-import-plugin-from-zip":{"identifier":"allow-import-plugin-from-zip","description":"Enables the import_plugin_from_zip command without any pre-configured scope.","commands":{"allow":["import_plugin_from_zip"],"deny":[]}},"allow-kill-panel":{"identifier":"allow-kill-panel","description":"Enables the kill_panel command without any pre-configured scope.","commands":{"allow":["kill_panel"],"deny":[]}},"allow-list-active-sessions":{"identifier":"allow-list-active-sessions","description":"Enables the list_active_sessions command without any pre-configured scope.","commands":{"allow":["list_active_sessions"],"deny":[]}},"allow-list-audit-entries":{"identifier":"allow-list-audit-entries","description":"Enables the list_audit_entries command without any pre-configured scope.","commands":{"allow":["list_audit_entries"],"deny":[]}},"allow-list-claude-dir":{"identifier":"allow-list-claude-dir","description":"Enables the list_claude_dir command without any pre-configured scope.","commands":{"allow":["list_claude_dir"],"deny":[]}},"allow-list-comparisons":{"identifier":"allow-list-comparisons","description":"Enables the list_comparisons command without any pre-configured scope.","commands":{"allow":["list_comparisons"],"deny":[]}},"allow-list-custom-profiles":{"identifier":"allow-list-custom-profiles","description":"Enables the list_custom_profiles command without any pre-configured scope.","commands":{"allow":["list_custom_profiles"],"deny":[]}},"allow-list-installed-plugins":{"identifier":"allow-list-installed-plugins","description":"Enables the list_installed_plugins command without any pre-configured scope.","commands":{"allow":["list_installed_plugins"],"deny":[]}},"allow-list-marketplaces":{"identifier":"allow-list-marketplaces","description":"Enables the list_marketplaces command without any pre-configured scope.","commands":{"allow":["list_marketplaces"],"deny":[]}},"allow-list-required-env":{"identifier":"allow-list-required-env","description":"Enables the list_required_env command without any pre-configured scope.","commands":{"allow":["list_required_env"],"deny":[]}},"allow-list-security-presets":{"identifier":"allow-list-security-presets","description":"Enables the list_security_presets command without any pre-configured scope.","commands":{"allow":["list_security_presets"],"deny":[]}},"allow-list-sessions-summary":{"identifier":"allow-list-sessions-summary","description":"Enables the list_sessions_summary command without any pre-configured scope.","commands":{"allow":["list_sessions_summary"],"deny":[]}},"allow-membrain-check-installed":{"identifier":"allow-membrain-check-installed","description":"Enables the membrain_check_installed command without any pre-configured scope.","commands":{"allow":["membrain_check_installed"],"deny":[]}},"allow-membrain-get-port":{"identifier":"allow-membrain-get-port","description":"Enables the membrain_get_port command without any pre-configured scope.","commands":{"allow":["membrain_get_port"],"deny":[]}},"allow-membrain-start":{"identifier":"allow-membrain-start","description":"Enables the membrain_start command without any pre-configured scope.","commands":{"allow":["membrain_start"],"deny":[]}},"allow-membrain-stop":{"identifier":"allow-membrain-stop","description":"Enables the membrain_stop command without any pre-configured scope.","commands":{"allow":["membrain_stop"],"deny":[]}},"allow-push-file-history":{"identifier":"allow-push-file-history","description":"Enables the push_file_history command without any pre-configured scope.","commands":{"allow":["push_file_history"],"deny":[]}},"allow-read-claude-md":{"identifier":"allow-read-claude-md","description":"Enables the read_claude_md command without any pre-configured scope.","commands":{"allow":["read_claude_md"],"deny":[]}},"allow-read-env-config":{"identifier":"allow-read-env-config","description":"Enables the read_env_config command without any pre-configured scope.","commands":{"allow":["read_env_config"],"deny":[]}},"allow-read-file-history":{"identifier":"allow-read-file-history","description":"Enables the read_file_history command without any pre-configured scope.","commands":{"allow":["read_file_history"],"deny":[]}},"allow-read-harness-file":{"identifier":"allow-read-harness-file","description":"Enables the read_harness_file command without any pre-configured scope.","commands":{"allow":["read_harness_file"],"deny":[]}},"allow-read-hooks":{"identifier":"allow-read-hooks","description":"Enables the read_hooks command without any pre-configured scope.","commands":{"allow":["read_hooks"],"deny":[]}},"allow-read-live-activity":{"identifier":"allow-read-live-activity","description":"Enables the read_live_activity command without any pre-configured scope.","commands":{"allow":["read_live_activity"],"deny":[]}},"allow-read-mcp-config":{"identifier":"allow-read-mcp-config","description":"Enables the read_mcp_config command without any pre-configured scope.","commands":{"allow":["read_mcp_config"],"deny":[]}},"allow-read-permissions":{"identifier":"allow-read-permissions","description":"Enables the read_permissions command without any pre-configured scope.","commands":{"allow":["read_permissions"],"deny":[]}},"allow-read-plugin-file":{"identifier":"allow-read-plugin-file","description":"Enables the read_plugin_file command without any pre-configured scope.","commands":{"allow":["read_plugin_file"],"deny":[]}},"allow-read-plugin-tree":{"identifier":"allow-read-plugin-tree","description":"Enables the read_plugin_tree command without any pre-configured scope.","commands":{"allow":["read_plugin_tree"],"deny":[]}},"allow-read-session-facet":{"identifier":"allow-read-session-facet","description":"Enables the read_session_facet command without any pre-configured scope.","commands":{"allow":["read_session_facet"],"deny":[]}},"allow-read-session-transcript":{"identifier":"allow-read-session-transcript","description":"Enables the read_session_transcript command without any pre-configured scope.","commands":{"allow":["read_session_transcript"],"deny":[]}},"allow-read-stats-cache":{"identifier":"allow-read-stats-cache","description":"Enables the read_stats_cache command without any pre-configured scope.","commands":{"allow":["read_stats_cache"],"deny":[]}},"allow-remove-worktrees":{"identifier":"allow-remove-worktrees","description":"Enables the remove_worktrees command without any pre-configured scope.","commands":{"allow":["remove_worktrees"],"deny":[]}},"allow-resize-terminal":{"identifier":"allow-resize-terminal","description":"Enables the resize_terminal command without any pre-configured scope.","commands":{"allow":["resize_terminal"],"deny":[]}},"allow-reveal-evaluation-session":{"identifier":"allow-reveal-evaluation-session","description":"Enables the reveal_evaluation_session command without any pre-configured scope.","commands":{"allow":["reveal_evaluation_session"],"deny":[]}},"allow-run-parity-scan":{"identifier":"allow-run-parity-scan","description":"Enables the run_parity_scan command without any pre-configured scope.","commands":{"allow":["run_parity_scan"],"deny":[]}},"allow-save-comparison":{"identifier":"allow-save-comparison","description":"Enables the save_comparison command without any pre-configured scope.","commands":{"allow":["save_comparison"],"deny":[]}},"allow-save-custom-profile":{"identifier":"allow-save-custom-profile","description":"Enables the save_custom_profile command without any pre-configured scope.","commands":{"allow":["save_custom_profile"],"deny":[]}},"allow-save-evaluation":{"identifier":"allow-save-evaluation","description":"Enables the save_evaluation command without any pre-configured scope.","commands":{"allow":["save_evaluation"],"deny":[]}},"allow-save-file-diffs":{"identifier":"allow-save-file-diffs","description":"Enables the save_file_diffs command without any pre-configured scope.","commands":{"allow":["save_file_diffs"],"deny":[]}},"allow-save-pairwise-vote":{"identifier":"allow-save-pairwise-vote","description":"Enables the save_pairwise_vote command without any pre-configured scope.","commands":{"allow":["save_pairwise_vote"],"deny":[]}},"allow-save-panel-result":{"identifier":"allow-save-panel-result","description":"Enables the save_panel_result command without any pre-configured scope.","commands":{"allow":["save_panel_result"],"deny":[]}},"allow-scan-claude-config":{"identifier":"allow-scan-claude-config","description":"Enables the scan_claude_config command without any pre-configured scope.","commands":{"allow":["scan_claude_config"],"deny":[]}},"allow-set-keychain-secret":{"identifier":"allow-set-keychain-secret","description":"Enables the set_keychain_secret command without any pre-configured scope.","commands":{"allow":["set_keychain_secret"],"deny":[]}},"allow-start-comparison":{"identifier":"allow-start-comparison","description":"Enables the start_comparison command without any pre-configured scope.","commands":{"allow":["start_comparison"],"deny":[]}},"allow-sync-create-backup":{"identifier":"allow-sync-create-backup","description":"Enables the sync_create_backup command without any pre-configured scope.","commands":{"allow":["sync_create_backup"],"deny":[]}},"allow-sync-file-exists":{"identifier":"allow-sync-file-exists","description":"Enables the sync_file_exists command without any pre-configured scope.","commands":{"allow":["sync_file_exists"],"deny":[]}},"allow-sync-list-backups":{"identifier":"allow-sync-list-backups","description":"Enables the sync_list_backups command without any pre-configured scope.","commands":{"allow":["sync_list_backups"],"deny":[]}},"allow-sync-read-dir":{"identifier":"allow-sync-read-dir","description":"Enables the sync_read_dir command without any pre-configured scope.","commands":{"allow":["sync_read_dir"],"deny":[]}},"allow-sync-read-file":{"identifier":"allow-sync-read-file","description":"Enables the sync_read_file command without any pre-configured scope.","commands":{"allow":["sync_read_file"],"deny":[]}},"allow-sync-restore-backup":{"identifier":"allow-sync-restore-backup","description":"Enables the sync_restore_backup command without any pre-configured scope.","commands":{"allow":["sync_restore_backup"],"deny":[]}},"allow-sync-write-files":{"identifier":"allow-sync-write-files","description":"Enables the sync_write_files command without any pre-configured scope.","commands":{"allow":["sync_write_files"],"deny":[]}},"allow-uninstall-plugin":{"identifier":"allow-uninstall-plugin","description":"Enables the uninstall_plugin command without any pre-configured scope.","commands":{"allow":["uninstall_plugin"],"deny":[]}},"allow-update-evaluation-score":{"identifier":"allow-update-evaluation-score","description":"Enables the update_evaluation_score command without any pre-configured scope.","commands":{"allow":["update_evaluation_score"],"deny":[]}},"allow-update-permissions":{"identifier":"allow-update-permissions","description":"Enables the update_permissions command without any pre-configured scope.","commands":{"allow":["update_permissions"],"deny":[]}},"allow-write-config-file":{"identifier":"allow-write-config-file","description":"Enables the write_config_file command without any pre-configured scope.","commands":{"allow":["write_config_file"],"deny":[]}},"allow-write-env-config":{"identifier":"allow-write-env-config","description":"Enables the write_env_config command without any pre-configured scope.","commands":{"allow":["write_env_config"],"deny":[]}},"allow-write-harness-file":{"identifier":"allow-write-harness-file","description":"Enables the write_harness_file command without any pre-configured scope.","commands":{"allow":["write_harness_file"],"deny":[]}},"allow-write-mcp-config":{"identifier":"allow-write-mcp-config","description":"Enables the write_mcp_config command without any pre-configured scope.","commands":{"allow":["write_mcp_config"],"deny":[]}},"allow-write-plugin-file":{"identifier":"allow-write-plugin-file","description":"Enables the write_plugin_file command without any pre-configured scope.","commands":{"allow":["write_plugin_file"],"deny":[]}},"allow-write-terminal":{"identifier":"allow-write-terminal","description":"Enables the write_terminal command without any pre-configured scope.","commands":{"allow":["write_terminal"],"deny":[]}},"deny-acknowledge-drift":{"identifier":"deny-acknowledge-drift","description":"Denies the acknowledge_drift command without any pre-configured scope.","commands":{"allow":[],"deny":["acknowledge_drift"]}},"deny-add-to-parity-baseline":{"identifier":"deny-add-to-parity-baseline","description":"Denies the add_to_parity_baseline command without any pre-configured scope.","commands":{"allow":[],"deny":["add_to_parity_baseline"]}},"deny-apply-security-preset":{"identifier":"deny-apply-security-preset","description":"Denies the apply_security_preset command without any pre-configured scope.","commands":{"allow":[],"deny":["apply_security_preset"]}},"deny-board-server-check-installed":{"identifier":"deny-board-server-check-installed","description":"Denies the board_server_check_installed command without any pre-configured scope.","commands":{"allow":[],"deny":["board_server_check_installed"]}},"deny-board-server-install":{"identifier":"deny-board-server-install","description":"Denies the board_server_install command without any pre-configured scope.","commands":{"allow":[],"deny":["board_server_install"]}},"deny-board-server-restart":{"identifier":"deny-board-server-restart","description":"Denies the board_server_restart command without any pre-configured scope.","commands":{"allow":[],"deny":["board_server_restart"]}},"deny-board-server-start":{"identifier":"deny-board-server-start","description":"Denies the board_server_start command without any pre-configured scope.","commands":{"allow":[],"deny":["board_server_start"]}},"deny-chat-leave-room":{"identifier":"deny-chat-leave-room","description":"Denies the chat_leave_room command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_leave_room"]}},"deny-chat-list-rooms":{"identifier":"deny-chat-list-rooms","description":"Denies the chat_list_rooms command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_list_rooms"]}},"deny-chat-load-messages":{"identifier":"deny-chat-load-messages","description":"Denies the chat_load_messages command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_load_messages"]}},"deny-chat-local-relay-running":{"identifier":"deny-chat-local-relay-running","description":"Denies the chat_local_relay_running command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_local_relay_running"]}},"deny-chat-purge-room":{"identifier":"deny-chat-purge-room","description":"Denies the chat_purge_room command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_purge_room"]}},"deny-chat-save-messages":{"identifier":"deny-chat-save-messages","description":"Denies the chat_save_messages command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_save_messages"]}},"deny-chat-save-room":{"identifier":"deny-chat-save-room","description":"Denies the chat_save_room command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_save_room"]}},"deny-chat-start-local-relay":{"identifier":"deny-chat-start-local-relay","description":"Denies the chat_start_local_relay command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_start_local_relay"]}},"deny-chat-stop-local-relay":{"identifier":"deny-chat-stop-local-relay","description":"Denies the chat_stop_local_relay command without any pre-configured scope.","commands":{"allow":[],"deny":["chat_stop_local_relay"]}},"deny-check-git-repo":{"identifier":"deny-check-git-repo","description":"Denies the check_git_repo command without any pre-configured scope.","commands":{"allow":[],"deny":["check_git_repo"]}},"deny-check-plugin-updates":{"identifier":"deny-check-plugin-updates","description":"Denies the check_plugin_updates command without any pre-configured scope.","commands":{"allow":[],"deny":["check_plugin_updates"]}},"deny-clear-audit-entries":{"identifier":"deny-clear-audit-entries","description":"Denies the clear_audit_entries command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_audit_entries"]}},"deny-compute-live-stats":{"identifier":"deny-compute-live-stats","description":"Denies the compute_live_stats command without any pre-configured scope.","commands":{"allow":[],"deny":["compute_live_stats"]}},"deny-create-config-file":{"identifier":"deny-create-config-file","description":"Denies the create_config_file command without any pre-configured scope.","commands":{"allow":[],"deny":["create_config_file"]}},"deny-create-evaluation-session":{"identifier":"deny-create-evaluation-session","description":"Denies the create_evaluation_session command without any pre-configured scope.","commands":{"allow":[],"deny":["create_evaluation_session"]}},"deny-create-terminal":{"identifier":"deny-create-terminal","description":"Denies the create_terminal command without any pre-configured scope.","commands":{"allow":[],"deny":["create_terminal"]}},"deny-create-worktrees":{"identifier":"deny-create-worktrees","description":"Denies the create_worktrees command without any pre-configured scope.","commands":{"allow":[],"deny":["create_worktrees"]}},"deny-delete-comparison":{"identifier":"deny-delete-comparison","description":"Denies the delete_comparison command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_comparison"]}},"deny-delete-custom-profile":{"identifier":"deny-delete-custom-profile","description":"Denies the delete_custom_profile command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_custom_profile"]}},"deny-delete-keychain-secret":{"identifier":"deny-delete-keychain-secret","description":"Denies the delete_keychain_secret command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_keychain_secret"]}},"deny-delete-pairwise-vote":{"identifier":"deny-delete-pairwise-vote","description":"Denies the delete_pairwise_vote command without any pre-configured scope.","commands":{"allow":[],"deny":["delete_pairwise_vote"]}},"deny-destroy-terminal":{"identifier":"deny-destroy-terminal","description":"Denies the destroy_terminal command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy_terminal"]}},"deny-detect-harnesses":{"identifier":"deny-detect-harnesses","description":"Denies the detect_harnesses command without any pre-configured scope.","commands":{"allow":[],"deny":["detect_harnesses"]}},"deny-export-comparison-json":{"identifier":"deny-export-comparison-json","description":"Denies the export_comparison_json command without any pre-configured scope.","commands":{"allow":[],"deny":["export_comparison_json"]}},"deny-export-plugin-as-zip":{"identifier":"deny-export-plugin-as-zip","description":"Denies the export_plugin_as_zip command without any pre-configured scope.","commands":{"allow":[],"deny":["export_plugin_as_zip"]}},"deny-export-plugin-to-folder":{"identifier":"deny-export-plugin-to-folder","description":"Denies the export_plugin_to_folder command without any pre-configured scope.","commands":{"allow":[],"deny":["export_plugin_to_folder"]}},"deny-get-comparator-analytics":{"identifier":"deny-get-comparator-analytics","description":"Denies the get_comparator_analytics command without any pre-configured scope.","commands":{"allow":[],"deny":["get_comparator_analytics"]}},"deny-get-comparison":{"identifier":"deny-get-comparison","description":"Denies the get_comparison command without any pre-configured scope.","commands":{"allow":[],"deny":["get_comparison"]}},"deny-get-comparison-diffs":{"identifier":"deny-get-comparison-diffs","description":"Denies the get_comparison_diffs command without any pre-configured scope.","commands":{"allow":[],"deny":["get_comparison_diffs"]}},"deny-get-comparison-setup":{"identifier":"deny-get-comparison-setup","description":"Denies the get_comparison_setup command without any pre-configured scope.","commands":{"allow":[],"deny":["get_comparison_setup"]}},"deny-get-custom-profile":{"identifier":"deny-get-custom-profile","description":"Denies the get_custom_profile command.","commands":{"allow":[],"deny":["get_custom_profile"]}},"deny-get-cwd":{"identifier":"deny-get-cwd","description":"Denies the get_cwd command without any pre-configured scope.","commands":{"allow":[],"deny":["get_cwd"]}},"deny-get-diff-against-commit":{"identifier":"deny-get-diff-against-commit","description":"Denies the get_diff_against_commit command without any pre-configured scope.","commands":{"allow":[],"deny":["get_diff_against_commit"]}},"deny-get-evaluation-session":{"identifier":"deny-get-evaluation-session","description":"Denies the get_evaluation_session command without any pre-configured scope.","commands":{"allow":[],"deny":["get_evaluation_session"]}},"deny-get-evaluations":{"identifier":"deny-get-evaluations","description":"Denies the get_evaluations command without any pre-configured scope.","commands":{"allow":[],"deny":["get_evaluations"]}},"deny-get-history-size":{"identifier":"deny-get-history-size","description":"Denies the get_history_size command without any pre-configured scope.","commands":{"allow":[],"deny":["get_history_size"]}},"deny-get-pairwise-analytics":{"identifier":"deny-get-pairwise-analytics","description":"Denies the get_pairwise_analytics command without any pre-configured scope.","commands":{"allow":[],"deny":["get_pairwise_analytics"]}},"deny-get-pairwise-votes":{"identifier":"deny-get-pairwise-votes","description":"Denies the get_pairwise_votes command without any pre-configured scope.","commands":{"allow":[],"deny":["get_pairwise_votes"]}},"deny-get-parity-drift":{"identifier":"deny-get-parity-drift","description":"Denies the get_parity_drift command without any pre-configured scope.","commands":{"allow":[],"deny":["get_parity_drift"]}},"deny-get-parity-history":{"identifier":"deny-get-parity-history","description":"Denies the get_parity_history command without any pre-configured scope.","commands":{"allow":[],"deny":["get_parity_history"]}},"deny-get-parity-snapshot":{"identifier":"deny-get-parity-snapshot","description":"Denies the get_parity_snapshot command without any pre-configured scope.","commands":{"allow":[],"deny":["get_parity_snapshot"]}},"deny-import-plugin-from-path":{"identifier":"deny-import-plugin-from-path","description":"Denies the import_plugin_from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["import_plugin_from_path"]}},"deny-import-plugin-from-zip":{"identifier":"deny-import-plugin-from-zip","description":"Denies the import_plugin_from_zip command without any pre-configured scope.","commands":{"allow":[],"deny":["import_plugin_from_zip"]}},"deny-kill-panel":{"identifier":"deny-kill-panel","description":"Denies the kill_panel command without any pre-configured scope.","commands":{"allow":[],"deny":["kill_panel"]}},"deny-list-active-sessions":{"identifier":"deny-list-active-sessions","description":"Denies the list_active_sessions command without any pre-configured scope.","commands":{"allow":[],"deny":["list_active_sessions"]}},"deny-list-audit-entries":{"identifier":"deny-list-audit-entries","description":"Denies the list_audit_entries command without any pre-configured scope.","commands":{"allow":[],"deny":["list_audit_entries"]}},"deny-list-claude-dir":{"identifier":"deny-list-claude-dir","description":"Denies the list_claude_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["list_claude_dir"]}},"deny-list-comparisons":{"identifier":"deny-list-comparisons","description":"Denies the list_comparisons command without any pre-configured scope.","commands":{"allow":[],"deny":["list_comparisons"]}},"deny-list-custom-profiles":{"identifier":"deny-list-custom-profiles","description":"Denies the list_custom_profiles command without any pre-configured scope.","commands":{"allow":[],"deny":["list_custom_profiles"]}},"deny-list-installed-plugins":{"identifier":"deny-list-installed-plugins","description":"Denies the list_installed_plugins command without any pre-configured scope.","commands":{"allow":[],"deny":["list_installed_plugins"]}},"deny-list-marketplaces":{"identifier":"deny-list-marketplaces","description":"Denies the list_marketplaces command without any pre-configured scope.","commands":{"allow":[],"deny":["list_marketplaces"]}},"deny-list-required-env":{"identifier":"deny-list-required-env","description":"Denies the list_required_env command without any pre-configured scope.","commands":{"allow":[],"deny":["list_required_env"]}},"deny-list-security-presets":{"identifier":"deny-list-security-presets","description":"Denies the list_security_presets command without any pre-configured scope.","commands":{"allow":[],"deny":["list_security_presets"]}},"deny-list-sessions-summary":{"identifier":"deny-list-sessions-summary","description":"Denies the list_sessions_summary command without any pre-configured scope.","commands":{"allow":[],"deny":["list_sessions_summary"]}},"deny-membrain-check-installed":{"identifier":"deny-membrain-check-installed","description":"Denies the membrain_check_installed command without any pre-configured scope.","commands":{"allow":[],"deny":["membrain_check_installed"]}},"deny-membrain-get-port":{"identifier":"deny-membrain-get-port","description":"Denies the membrain_get_port command without any pre-configured scope.","commands":{"allow":[],"deny":["membrain_get_port"]}},"deny-membrain-start":{"identifier":"deny-membrain-start","description":"Denies the membrain_start command without any pre-configured scope.","commands":{"allow":[],"deny":["membrain_start"]}},"deny-membrain-stop":{"identifier":"deny-membrain-stop","description":"Denies the membrain_stop command without any pre-configured scope.","commands":{"allow":[],"deny":["membrain_stop"]}},"deny-push-file-history":{"identifier":"deny-push-file-history","description":"Denies the push_file_history command without any pre-configured scope.","commands":{"allow":[],"deny":["push_file_history"]}},"deny-read-claude-md":{"identifier":"deny-read-claude-md","description":"Denies the read_claude_md command without any pre-configured scope.","commands":{"allow":[],"deny":["read_claude_md"]}},"deny-read-env-config":{"identifier":"deny-read-env-config","description":"Denies the read_env_config command without any pre-configured scope.","commands":{"allow":[],"deny":["read_env_config"]}},"deny-read-file-history":{"identifier":"deny-read-file-history","description":"Denies the read_file_history command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file_history"]}},"deny-read-harness-file":{"identifier":"deny-read-harness-file","description":"Denies the read_harness_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_harness_file"]}},"deny-read-hooks":{"identifier":"deny-read-hooks","description":"Denies the read_hooks command without any pre-configured scope.","commands":{"allow":[],"deny":["read_hooks"]}},"deny-read-live-activity":{"identifier":"deny-read-live-activity","description":"Denies the read_live_activity command without any pre-configured scope.","commands":{"allow":[],"deny":["read_live_activity"]}},"deny-read-mcp-config":{"identifier":"deny-read-mcp-config","description":"Denies the read_mcp_config command without any pre-configured scope.","commands":{"allow":[],"deny":["read_mcp_config"]}},"deny-read-permissions":{"identifier":"deny-read-permissions","description":"Denies the read_permissions command without any pre-configured scope.","commands":{"allow":[],"deny":["read_permissions"]}},"deny-read-plugin-file":{"identifier":"deny-read-plugin-file","description":"Denies the read_plugin_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_plugin_file"]}},"deny-read-plugin-tree":{"identifier":"deny-read-plugin-tree","description":"Denies the read_plugin_tree command without any pre-configured scope.","commands":{"allow":[],"deny":["read_plugin_tree"]}},"deny-read-session-facet":{"identifier":"deny-read-session-facet","description":"Denies the read_session_facet command without any pre-configured scope.","commands":{"allow":[],"deny":["read_session_facet"]}},"deny-read-session-transcript":{"identifier":"deny-read-session-transcript","description":"Denies the read_session_transcript command without any pre-configured scope.","commands":{"allow":[],"deny":["read_session_transcript"]}},"deny-read-stats-cache":{"identifier":"deny-read-stats-cache","description":"Denies the read_stats_cache command without any pre-configured scope.","commands":{"allow":[],"deny":["read_stats_cache"]}},"deny-remove-worktrees":{"identifier":"deny-remove-worktrees","description":"Denies the remove_worktrees command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_worktrees"]}},"deny-resize-terminal":{"identifier":"deny-resize-terminal","description":"Denies the resize_terminal command without any pre-configured scope.","commands":{"allow":[],"deny":["resize_terminal"]}},"deny-reveal-evaluation-session":{"identifier":"deny-reveal-evaluation-session","description":"Denies the reveal_evaluation_session command without any pre-configured scope.","commands":{"allow":[],"deny":["reveal_evaluation_session"]}},"deny-run-parity-scan":{"identifier":"deny-run-parity-scan","description":"Denies the run_parity_scan command without any pre-configured scope.","commands":{"allow":[],"deny":["run_parity_scan"]}},"deny-save-comparison":{"identifier":"deny-save-comparison","description":"Denies the save_comparison command without any pre-configured scope.","commands":{"allow":[],"deny":["save_comparison"]}},"deny-save-custom-profile":{"identifier":"deny-save-custom-profile","description":"Denies the save_custom_profile command without any pre-configured scope.","commands":{"allow":[],"deny":["save_custom_profile"]}},"deny-save-evaluation":{"identifier":"deny-save-evaluation","description":"Denies the save_evaluation command without any pre-configured scope.","commands":{"allow":[],"deny":["save_evaluation"]}},"deny-save-file-diffs":{"identifier":"deny-save-file-diffs","description":"Denies the save_file_diffs command without any pre-configured scope.","commands":{"allow":[],"deny":["save_file_diffs"]}},"deny-save-pairwise-vote":{"identifier":"deny-save-pairwise-vote","description":"Denies the save_pairwise_vote command without any pre-configured scope.","commands":{"allow":[],"deny":["save_pairwise_vote"]}},"deny-save-panel-result":{"identifier":"deny-save-panel-result","description":"Denies the save_panel_result command without any pre-configured scope.","commands":{"allow":[],"deny":["save_panel_result"]}},"deny-scan-claude-config":{"identifier":"deny-scan-claude-config","description":"Denies the scan_claude_config command without any pre-configured scope.","commands":{"allow":[],"deny":["scan_claude_config"]}},"deny-set-keychain-secret":{"identifier":"deny-set-keychain-secret","description":"Denies the set_keychain_secret command without any pre-configured scope.","commands":{"allow":[],"deny":["set_keychain_secret"]}},"deny-start-comparison":{"identifier":"deny-start-comparison","description":"Denies the start_comparison command without any pre-configured scope.","commands":{"allow":[],"deny":["start_comparison"]}},"deny-sync-create-backup":{"identifier":"deny-sync-create-backup","description":"Denies the sync_create_backup command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_create_backup"]}},"deny-sync-file-exists":{"identifier":"deny-sync-file-exists","description":"Denies the sync_file_exists command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_file_exists"]}},"deny-sync-list-backups":{"identifier":"deny-sync-list-backups","description":"Denies the sync_list_backups command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_list_backups"]}},"deny-sync-read-dir":{"identifier":"deny-sync-read-dir","description":"Denies the sync_read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_read_dir"]}},"deny-sync-read-file":{"identifier":"deny-sync-read-file","description":"Denies the sync_read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_read_file"]}},"deny-sync-restore-backup":{"identifier":"deny-sync-restore-backup","description":"Denies the sync_restore_backup command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_restore_backup"]}},"deny-sync-write-files":{"identifier":"deny-sync-write-files","description":"Denies the sync_write_files command without any pre-configured scope.","commands":{"allow":[],"deny":["sync_write_files"]}},"deny-uninstall-plugin":{"identifier":"deny-uninstall-plugin","description":"Denies the uninstall_plugin command without any pre-configured scope.","commands":{"allow":[],"deny":["uninstall_plugin"]}},"deny-update-evaluation-score":{"identifier":"deny-update-evaluation-score","description":"Denies the update_evaluation_score command without any pre-configured scope.","commands":{"allow":[],"deny":["update_evaluation_score"]}},"deny-update-permissions":{"identifier":"deny-update-permissions","description":"Denies the update_permissions command without any pre-configured scope.","commands":{"allow":[],"deny":["update_permissions"]}},"deny-write-config-file":{"identifier":"deny-write-config-file","description":"Denies the write_config_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_config_file"]}},"deny-write-env-config":{"identifier":"deny-write-env-config","description":"Denies the write_env_config command without any pre-configured scope.","commands":{"allow":[],"deny":["write_env_config"]}},"deny-write-harness-file":{"identifier":"deny-write-harness-file","description":"Denies the write_harness_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_harness_file"]}},"deny-write-mcp-config":{"identifier":"deny-write-mcp-config","description":"Denies the write_mcp_config command without any pre-configured scope.","commands":{"allow":[],"deny":["write_mcp_config"]}},"deny-write-plugin-file":{"identifier":"deny-write-plugin-file","description":"Denies the write_plugin_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_plugin_file"]}},"deny-write-terminal":{"identifier":"deny-write-terminal","description":"Denies the write_terminal command without any pre-configured scope.","commands":{"allow":[],"deny":["write_terminal"]}}},"permission_sets":{},"global_scope_schema":null},"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier","allow-bundle-type","allow-register-listener","allow-remove-listener"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-bundle-type":{"identifier":"allow-bundle-type","description":"Enables the bundle_type command without any pre-configured scope.","commands":{"allow":["bundle_type"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-remove-listener":{"identifier":"allow-remove-listener","description":"Enables the remove_listener command without any pre-configured scope.","commands":{"allow":["remove_listener"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-set-dock-visibility":{"identifier":"allow-set-dock-visibility","description":"Enables the set_dock_visibility command without any pre-configured scope.","commands":{"allow":["set_dock_visibility"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-bundle-type":{"identifier":"deny-bundle-type","description":"Denies the bundle_type command without any pre-configured scope.","commands":{"allow":[],"deny":["bundle_type"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"Denies the identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["identifier"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-data-store":{"identifier":"deny-remove-data-store","description":"Denies the remove_data_store command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_data_store"]}},"deny-remove-listener":{"identifier":"deny-remove-listener","description":"Denies the remove_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_listener"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-set-dock-visibility":{"identifier":"deny-set-dock-visibility","description":"Denies the set_dock_visibility command without any pre-configured scope.","commands":{"allow":[],"deny":["set_dock_visibility"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-auto-resize":{"identifier":"allow-set-webview-auto-resize","description":"Enables the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":["set_webview_auto_resize"],"deny":[]}},"allow-set-webview-background-color":{"identifier":"allow-set-webview-background-color","description":"Enables the set_webview_background_color command without any pre-configured scope.","commands":{"allow":["set_webview_background_color"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-auto-resize":{"identifier":"deny-set-webview-auto-resize","description":"Denies the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_auto_resize"]}},"deny-set-webview-background-color":{"identifier":"deny-set-webview-background-color","description":"Denies the set_webview_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_background_color"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-is-always-on-top","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-always-on-top":{"identifier":"allow-is-always-on-top","description":"Enables the is_always_on_top command without any pre-configured scope.","commands":{"allow":["is_always_on_top"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-background-color":{"identifier":"allow-set-background-color","description":"Enables the set_background_color command without any pre-configured scope.","commands":{"allow":["set_background_color"],"deny":[]}},"allow-set-badge-count":{"identifier":"allow-set-badge-count","description":"Enables the set_badge_count command without any pre-configured scope.","commands":{"allow":["set_badge_count"],"deny":[]}},"allow-set-badge-label":{"identifier":"allow-set-badge-label","description":"Enables the set_badge_label command without any pre-configured scope.","commands":{"allow":["set_badge_label"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-focusable":{"identifier":"allow-set-focusable","description":"Enables the set_focusable command without any pre-configured scope.","commands":{"allow":["set_focusable"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-overlay-icon":{"identifier":"allow-set-overlay-icon","description":"Enables the set_overlay_icon command without any pre-configured scope.","commands":{"allow":["set_overlay_icon"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-simple-fullscreen":{"identifier":"allow-set-simple-fullscreen","description":"Enables the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":["set_simple_fullscreen"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-always-on-top":{"identifier":"deny-is-always-on-top","description":"Denies the is_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["is_always_on_top"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-background-color":{"identifier":"deny-set-background-color","description":"Denies the set_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_background_color"]}},"deny-set-badge-count":{"identifier":"deny-set-badge-count","description":"Denies the set_badge_count command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_count"]}},"deny-set-badge-label":{"identifier":"deny-set-badge-label","description":"Denies the set_badge_label command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_label"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-focusable":{"identifier":"deny-set-focusable","description":"Denies the set_focusable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focusable"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-overlay-icon":{"identifier":"deny-set-overlay-icon","description":"Denies the set_overlay_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_overlay_icon"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-simple-fullscreen":{"identifier":"deny-set-simple-fullscreen","description":"Denies the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_simple_fullscreen"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"dialog":{"default_permission":{"identifier":"default","description":"This permission set configures the types of dialogs\navailable from the dialog plugin.\n\n#### Granted Permissions\n\nAll dialog types are enabled.\n\n\n","permissions":["allow-ask","allow-confirm","allow-message","allow-save","allow-open"]},"permissions":{"allow-ask":{"identifier":"allow-ask","description":"Enables the ask command without any pre-configured scope.","commands":{"allow":["ask"],"deny":[]}},"allow-confirm":{"identifier":"allow-confirm","description":"Enables the confirm command without any pre-configured scope.","commands":{"allow":["confirm"],"deny":[]}},"allow-message":{"identifier":"allow-message","description":"Enables the message command without any pre-configured scope.","commands":{"allow":["message"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-save":{"identifier":"allow-save","description":"Enables the save command without any pre-configured scope.","commands":{"allow":["save"],"deny":[]}},"deny-ask":{"identifier":"deny-ask","description":"Denies the ask command without any pre-configured scope.","commands":{"allow":[],"deny":["ask"]}},"deny-confirm":{"identifier":"deny-confirm","description":"Denies the confirm command without any pre-configured scope.","commands":{"allow":[],"deny":["confirm"]}},"deny-message":{"identifier":"deny-message","description":"Denies the message command without any pre-configured scope.","commands":{"allow":[],"deny":["message"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-save":{"identifier":"deny-save","description":"Denies the save command without any pre-configured scope.","commands":{"allow":[],"deny":["save"]}}},"permission_sets":{},"global_scope_schema":null},"fs":{"default_permission":{"identifier":"default","description":"This set of permissions describes the what kind of\nfile system access the `fs` plugin has enabled or denied by default.\n\n#### Granted Permissions\n\nThis default permission set enables read access to the\napplication specific directories (AppConfig, AppData, AppLocalData, AppCache,\nAppLog) and all files and sub directories created in it.\nThe location of these directories depends on the operating system,\nwhere the application is run.\n\nIn general these directories need to be manually created\nby the application at runtime, before accessing files or folders\nin it is possible.\n\nTherefore, it is also allowed to create all of these folders via\nthe `mkdir` command.\n\n#### Denied Permissions\n\nThis default permission set prevents access to critical components\nof the Tauri application by default.\nOn Windows the webview data folder access is denied.\n","permissions":["create-app-specific-dirs","read-app-specific-dirs-recursive","deny-default"]},"permissions":{"allow-copy-file":{"identifier":"allow-copy-file","description":"Enables the copy_file command without any pre-configured scope.","commands":{"allow":["copy_file"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-exists":{"identifier":"allow-exists","description":"Enables the exists command without any pre-configured scope.","commands":{"allow":["exists"],"deny":[]}},"allow-fstat":{"identifier":"allow-fstat","description":"Enables the fstat command without any pre-configured scope.","commands":{"allow":["fstat"],"deny":[]}},"allow-ftruncate":{"identifier":"allow-ftruncate","description":"Enables the ftruncate command without any pre-configured scope.","commands":{"allow":["ftruncate"],"deny":[]}},"allow-lstat":{"identifier":"allow-lstat","description":"Enables the lstat command without any pre-configured scope.","commands":{"allow":["lstat"],"deny":[]}},"allow-mkdir":{"identifier":"allow-mkdir","description":"Enables the mkdir command without any pre-configured scope.","commands":{"allow":["mkdir"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-read":{"identifier":"allow-read","description":"Enables the read command without any pre-configured scope.","commands":{"allow":["read"],"deny":[]}},"allow-read-dir":{"identifier":"allow-read-dir","description":"Enables the read_dir command without any pre-configured scope.","commands":{"allow":["read_dir"],"deny":[]}},"allow-read-file":{"identifier":"allow-read-file","description":"Enables the read_file command without any pre-configured scope.","commands":{"allow":["read_file"],"deny":[]}},"allow-read-text-file":{"identifier":"allow-read-text-file","description":"Enables the read_text_file command without any pre-configured scope.","commands":{"allow":["read_text_file"],"deny":[]}},"allow-read-text-file-lines":{"identifier":"allow-read-text-file-lines","description":"Enables the read_text_file_lines command without any pre-configured scope.","commands":{"allow":["read_text_file_lines","read_text_file_lines_next"],"deny":[]}},"allow-read-text-file-lines-next":{"identifier":"allow-read-text-file-lines-next","description":"Enables the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":["read_text_file_lines_next"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-rename":{"identifier":"allow-rename","description":"Enables the rename command without any pre-configured scope.","commands":{"allow":["rename"],"deny":[]}},"allow-seek":{"identifier":"allow-seek","description":"Enables the seek command without any pre-configured scope.","commands":{"allow":["seek"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"allow-stat":{"identifier":"allow-stat","description":"Enables the stat command without any pre-configured scope.","commands":{"allow":["stat"],"deny":[]}},"allow-truncate":{"identifier":"allow-truncate","description":"Enables the truncate command without any pre-configured scope.","commands":{"allow":["truncate"],"deny":[]}},"allow-unwatch":{"identifier":"allow-unwatch","description":"Enables the unwatch command without any pre-configured scope.","commands":{"allow":["unwatch"],"deny":[]}},"allow-watch":{"identifier":"allow-watch","description":"Enables the watch command without any pre-configured scope.","commands":{"allow":["watch"],"deny":[]}},"allow-write":{"identifier":"allow-write","description":"Enables the write command without any pre-configured scope.","commands":{"allow":["write"],"deny":[]}},"allow-write-file":{"identifier":"allow-write-file","description":"Enables the write_file command without any pre-configured scope.","commands":{"allow":["write_file","open","write"],"deny":[]}},"allow-write-text-file":{"identifier":"allow-write-text-file","description":"Enables the write_text_file command without any pre-configured scope.","commands":{"allow":["write_text_file"],"deny":[]}},"create-app-specific-dirs":{"identifier":"create-app-specific-dirs","description":"This permissions allows to create the application specific directories.\n","commands":{"allow":["mkdir","scope-app-index"],"deny":[]}},"deny-copy-file":{"identifier":"deny-copy-file","description":"Denies the copy_file command without any pre-configured scope.","commands":{"allow":[],"deny":["copy_file"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-exists":{"identifier":"deny-exists","description":"Denies the exists command without any pre-configured scope.","commands":{"allow":[],"deny":["exists"]}},"deny-fstat":{"identifier":"deny-fstat","description":"Denies the fstat command without any pre-configured scope.","commands":{"allow":[],"deny":["fstat"]}},"deny-ftruncate":{"identifier":"deny-ftruncate","description":"Denies the ftruncate command without any pre-configured scope.","commands":{"allow":[],"deny":["ftruncate"]}},"deny-lstat":{"identifier":"deny-lstat","description":"Denies the lstat command without any pre-configured scope.","commands":{"allow":[],"deny":["lstat"]}},"deny-mkdir":{"identifier":"deny-mkdir","description":"Denies the mkdir command without any pre-configured scope.","commands":{"allow":[],"deny":["mkdir"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-read":{"identifier":"deny-read","description":"Denies the read command without any pre-configured scope.","commands":{"allow":[],"deny":["read"]}},"deny-read-dir":{"identifier":"deny-read-dir","description":"Denies the read_dir command without any pre-configured scope.","commands":{"allow":[],"deny":["read_dir"]}},"deny-read-file":{"identifier":"deny-read-file","description":"Denies the read_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_file"]}},"deny-read-text-file":{"identifier":"deny-read-text-file","description":"Denies the read_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file"]}},"deny-read-text-file-lines":{"identifier":"deny-read-text-file-lines","description":"Denies the read_text_file_lines command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines"]}},"deny-read-text-file-lines-next":{"identifier":"deny-read-text-file-lines-next","description":"Denies the read_text_file_lines_next command without any pre-configured scope.","commands":{"allow":[],"deny":["read_text_file_lines_next"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-rename":{"identifier":"deny-rename","description":"Denies the rename command without any pre-configured scope.","commands":{"allow":[],"deny":["rename"]}},"deny-seek":{"identifier":"deny-seek","description":"Denies the seek command without any pre-configured scope.","commands":{"allow":[],"deny":["seek"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}},"deny-stat":{"identifier":"deny-stat","description":"Denies the stat command without any pre-configured scope.","commands":{"allow":[],"deny":["stat"]}},"deny-truncate":{"identifier":"deny-truncate","description":"Denies the truncate command without any pre-configured scope.","commands":{"allow":[],"deny":["truncate"]}},"deny-unwatch":{"identifier":"deny-unwatch","description":"Denies the unwatch command without any pre-configured scope.","commands":{"allow":[],"deny":["unwatch"]}},"deny-watch":{"identifier":"deny-watch","description":"Denies the watch command without any pre-configured scope.","commands":{"allow":[],"deny":["watch"]}},"deny-webview-data-linux":{"identifier":"deny-webview-data-linux","description":"This denies read access to the\n`$APPLOCALDATA` folder on linux as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-webview-data-windows":{"identifier":"deny-webview-data-windows","description":"This denies read access to the\n`$APPLOCALDATA/EBWebView` folder on windows as the webview data and configuration values are stored here.\nAllowing access can lead to sensitive information disclosure and should be well considered.","commands":{"allow":[],"deny":[]}},"deny-write":{"identifier":"deny-write","description":"Denies the write command without any pre-configured scope.","commands":{"allow":[],"deny":["write"]}},"deny-write-file":{"identifier":"deny-write-file","description":"Denies the write_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_file"]}},"deny-write-text-file":{"identifier":"deny-write-text-file","description":"Denies the write_text_file command without any pre-configured scope.","commands":{"allow":[],"deny":["write_text_file"]}},"read-all":{"identifier":"read-all","description":"This enables all read related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists","watch","unwatch"],"deny":[]}},"read-app-specific-dirs-recursive":{"identifier":"read-app-specific-dirs-recursive","description":"This permission allows recursive read functionality on the application\nspecific base directories. \n","commands":{"allow":["read_dir","read_file","read_text_file","read_text_file_lines","read_text_file_lines_next","exists","scope-app-recursive"],"deny":[]}},"read-dirs":{"identifier":"read-dirs","description":"This enables directory read and file metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists"],"deny":[]}},"read-files":{"identifier":"read-files","description":"This enables file read related commands without any pre-configured accessible paths.","commands":{"allow":["read_file","read","open","read_text_file","read_text_file_lines","read_text_file_lines_next","seek","stat","lstat","fstat","exists"],"deny":[]}},"read-meta":{"identifier":"read-meta","description":"This enables all index or metadata related commands without any pre-configured accessible paths.","commands":{"allow":["read_dir","stat","lstat","fstat","exists","size"],"deny":[]}},"scope":{"identifier":"scope","description":"An empty permission you can use to modify the global scope.\n\n## Example\n\n```json\n{\n \"identifier\": \"read-documents\",\n \"windows\": [\"main\"],\n \"permissions\": [\n \"fs:allow-read\",\n {\n \"identifier\": \"fs:scope\",\n \"allow\": [\n \"$APPDATA/documents/**/*\"\n ],\n \"deny\": [\n \"$APPDATA/documents/secret.txt\"\n ]\n }\n ]\n}\n```\n","commands":{"allow":[],"deny":[]}},"scope-app":{"identifier":"scope-app","description":"This scope permits access to all files and list content of top level directories in the application folders.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"},{"path":"$APPDATA"},{"path":"$APPDATA/*"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"},{"path":"$APPCACHE"},{"path":"$APPCACHE/*"},{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-app-index":{"identifier":"scope-app-index","description":"This scope permits to list all files and folders in the application directories.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPDATA"},{"path":"$APPLOCALDATA"},{"path":"$APPCACHE"},{"path":"$APPLOG"}]}},"scope-app-recursive":{"identifier":"scope-app-recursive","description":"This scope permits recursive access to the complete application folders, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"},{"path":"$APPDATA"},{"path":"$APPDATA/**"},{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"},{"path":"$APPCACHE"},{"path":"$APPCACHE/**"},{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-appcache":{"identifier":"scope-appcache","description":"This scope permits access to all files and list content of top level directories in the `$APPCACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/*"}]}},"scope-appcache-index":{"identifier":"scope-appcache-index","description":"This scope permits to list all files and folders in the `$APPCACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"}]}},"scope-appcache-recursive":{"identifier":"scope-appcache-recursive","description":"This scope permits recursive access to the complete `$APPCACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCACHE"},{"path":"$APPCACHE/**"}]}},"scope-appconfig":{"identifier":"scope-appconfig","description":"This scope permits access to all files and list content of top level directories in the `$APPCONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/*"}]}},"scope-appconfig-index":{"identifier":"scope-appconfig-index","description":"This scope permits to list all files and folders in the `$APPCONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"}]}},"scope-appconfig-recursive":{"identifier":"scope-appconfig-recursive","description":"This scope permits recursive access to the complete `$APPCONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPCONFIG"},{"path":"$APPCONFIG/**"}]}},"scope-appdata":{"identifier":"scope-appdata","description":"This scope permits access to all files and list content of top level directories in the `$APPDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/*"}]}},"scope-appdata-index":{"identifier":"scope-appdata-index","description":"This scope permits to list all files and folders in the `$APPDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"}]}},"scope-appdata-recursive":{"identifier":"scope-appdata-recursive","description":"This scope permits recursive access to the complete `$APPDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPDATA"},{"path":"$APPDATA/**"}]}},"scope-applocaldata":{"identifier":"scope-applocaldata","description":"This scope permits access to all files and list content of top level directories in the `$APPLOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/*"}]}},"scope-applocaldata-index":{"identifier":"scope-applocaldata-index","description":"This scope permits to list all files and folders in the `$APPLOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"}]}},"scope-applocaldata-recursive":{"identifier":"scope-applocaldata-recursive","description":"This scope permits recursive access to the complete `$APPLOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOCALDATA"},{"path":"$APPLOCALDATA/**"}]}},"scope-applog":{"identifier":"scope-applog","description":"This scope permits access to all files and list content of top level directories in the `$APPLOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/*"}]}},"scope-applog-index":{"identifier":"scope-applog-index","description":"This scope permits to list all files and folders in the `$APPLOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"}]}},"scope-applog-recursive":{"identifier":"scope-applog-recursive","description":"This scope permits recursive access to the complete `$APPLOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$APPLOG"},{"path":"$APPLOG/**"}]}},"scope-audio":{"identifier":"scope-audio","description":"This scope permits access to all files and list content of top level directories in the `$AUDIO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/*"}]}},"scope-audio-index":{"identifier":"scope-audio-index","description":"This scope permits to list all files and folders in the `$AUDIO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"}]}},"scope-audio-recursive":{"identifier":"scope-audio-recursive","description":"This scope permits recursive access to the complete `$AUDIO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$AUDIO"},{"path":"$AUDIO/**"}]}},"scope-cache":{"identifier":"scope-cache","description":"This scope permits access to all files and list content of top level directories in the `$CACHE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/*"}]}},"scope-cache-index":{"identifier":"scope-cache-index","description":"This scope permits to list all files and folders in the `$CACHE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"}]}},"scope-cache-recursive":{"identifier":"scope-cache-recursive","description":"This scope permits recursive access to the complete `$CACHE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CACHE"},{"path":"$CACHE/**"}]}},"scope-config":{"identifier":"scope-config","description":"This scope permits access to all files and list content of top level directories in the `$CONFIG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/*"}]}},"scope-config-index":{"identifier":"scope-config-index","description":"This scope permits to list all files and folders in the `$CONFIG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"}]}},"scope-config-recursive":{"identifier":"scope-config-recursive","description":"This scope permits recursive access to the complete `$CONFIG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$CONFIG"},{"path":"$CONFIG/**"}]}},"scope-data":{"identifier":"scope-data","description":"This scope permits access to all files and list content of top level directories in the `$DATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/*"}]}},"scope-data-index":{"identifier":"scope-data-index","description":"This scope permits to list all files and folders in the `$DATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"}]}},"scope-data-recursive":{"identifier":"scope-data-recursive","description":"This scope permits recursive access to the complete `$DATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DATA"},{"path":"$DATA/**"}]}},"scope-desktop":{"identifier":"scope-desktop","description":"This scope permits access to all files and list content of top level directories in the `$DESKTOP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/*"}]}},"scope-desktop-index":{"identifier":"scope-desktop-index","description":"This scope permits to list all files and folders in the `$DESKTOP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"}]}},"scope-desktop-recursive":{"identifier":"scope-desktop-recursive","description":"This scope permits recursive access to the complete `$DESKTOP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DESKTOP"},{"path":"$DESKTOP/**"}]}},"scope-document":{"identifier":"scope-document","description":"This scope permits access to all files and list content of top level directories in the `$DOCUMENT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/*"}]}},"scope-document-index":{"identifier":"scope-document-index","description":"This scope permits to list all files and folders in the `$DOCUMENT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"}]}},"scope-document-recursive":{"identifier":"scope-document-recursive","description":"This scope permits recursive access to the complete `$DOCUMENT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOCUMENT"},{"path":"$DOCUMENT/**"}]}},"scope-download":{"identifier":"scope-download","description":"This scope permits access to all files and list content of top level directories in the `$DOWNLOAD` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/*"}]}},"scope-download-index":{"identifier":"scope-download-index","description":"This scope permits to list all files and folders in the `$DOWNLOAD`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"}]}},"scope-download-recursive":{"identifier":"scope-download-recursive","description":"This scope permits recursive access to the complete `$DOWNLOAD` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$DOWNLOAD"},{"path":"$DOWNLOAD/**"}]}},"scope-exe":{"identifier":"scope-exe","description":"This scope permits access to all files and list content of top level directories in the `$EXE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/*"}]}},"scope-exe-index":{"identifier":"scope-exe-index","description":"This scope permits to list all files and folders in the `$EXE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"}]}},"scope-exe-recursive":{"identifier":"scope-exe-recursive","description":"This scope permits recursive access to the complete `$EXE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$EXE"},{"path":"$EXE/**"}]}},"scope-font":{"identifier":"scope-font","description":"This scope permits access to all files and list content of top level directories in the `$FONT` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/*"}]}},"scope-font-index":{"identifier":"scope-font-index","description":"This scope permits to list all files and folders in the `$FONT`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"}]}},"scope-font-recursive":{"identifier":"scope-font-recursive","description":"This scope permits recursive access to the complete `$FONT` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$FONT"},{"path":"$FONT/**"}]}},"scope-home":{"identifier":"scope-home","description":"This scope permits access to all files and list content of top level directories in the `$HOME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/*"}]}},"scope-home-index":{"identifier":"scope-home-index","description":"This scope permits to list all files and folders in the `$HOME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"}]}},"scope-home-recursive":{"identifier":"scope-home-recursive","description":"This scope permits recursive access to the complete `$HOME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$HOME"},{"path":"$HOME/**"}]}},"scope-localdata":{"identifier":"scope-localdata","description":"This scope permits access to all files and list content of top level directories in the `$LOCALDATA` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/*"}]}},"scope-localdata-index":{"identifier":"scope-localdata-index","description":"This scope permits to list all files and folders in the `$LOCALDATA`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"}]}},"scope-localdata-recursive":{"identifier":"scope-localdata-recursive","description":"This scope permits recursive access to the complete `$LOCALDATA` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOCALDATA"},{"path":"$LOCALDATA/**"}]}},"scope-log":{"identifier":"scope-log","description":"This scope permits access to all files and list content of top level directories in the `$LOG` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/*"}]}},"scope-log-index":{"identifier":"scope-log-index","description":"This scope permits to list all files and folders in the `$LOG`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"}]}},"scope-log-recursive":{"identifier":"scope-log-recursive","description":"This scope permits recursive access to the complete `$LOG` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$LOG"},{"path":"$LOG/**"}]}},"scope-picture":{"identifier":"scope-picture","description":"This scope permits access to all files and list content of top level directories in the `$PICTURE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/*"}]}},"scope-picture-index":{"identifier":"scope-picture-index","description":"This scope permits to list all files and folders in the `$PICTURE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"}]}},"scope-picture-recursive":{"identifier":"scope-picture-recursive","description":"This scope permits recursive access to the complete `$PICTURE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PICTURE"},{"path":"$PICTURE/**"}]}},"scope-public":{"identifier":"scope-public","description":"This scope permits access to all files and list content of top level directories in the `$PUBLIC` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/*"}]}},"scope-public-index":{"identifier":"scope-public-index","description":"This scope permits to list all files and folders in the `$PUBLIC`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"}]}},"scope-public-recursive":{"identifier":"scope-public-recursive","description":"This scope permits recursive access to the complete `$PUBLIC` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$PUBLIC"},{"path":"$PUBLIC/**"}]}},"scope-resource":{"identifier":"scope-resource","description":"This scope permits access to all files and list content of top level directories in the `$RESOURCE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/*"}]}},"scope-resource-index":{"identifier":"scope-resource-index","description":"This scope permits to list all files and folders in the `$RESOURCE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"}]}},"scope-resource-recursive":{"identifier":"scope-resource-recursive","description":"This scope permits recursive access to the complete `$RESOURCE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RESOURCE"},{"path":"$RESOURCE/**"}]}},"scope-runtime":{"identifier":"scope-runtime","description":"This scope permits access to all files and list content of top level directories in the `$RUNTIME` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/*"}]}},"scope-runtime-index":{"identifier":"scope-runtime-index","description":"This scope permits to list all files and folders in the `$RUNTIME`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"}]}},"scope-runtime-recursive":{"identifier":"scope-runtime-recursive","description":"This scope permits recursive access to the complete `$RUNTIME` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$RUNTIME"},{"path":"$RUNTIME/**"}]}},"scope-temp":{"identifier":"scope-temp","description":"This scope permits access to all files and list content of top level directories in the `$TEMP` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/*"}]}},"scope-temp-index":{"identifier":"scope-temp-index","description":"This scope permits to list all files and folders in the `$TEMP`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"}]}},"scope-temp-recursive":{"identifier":"scope-temp-recursive","description":"This scope permits recursive access to the complete `$TEMP` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMP"},{"path":"$TEMP/**"}]}},"scope-template":{"identifier":"scope-template","description":"This scope permits access to all files and list content of top level directories in the `$TEMPLATE` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/*"}]}},"scope-template-index":{"identifier":"scope-template-index","description":"This scope permits to list all files and folders in the `$TEMPLATE`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"}]}},"scope-template-recursive":{"identifier":"scope-template-recursive","description":"This scope permits recursive access to the complete `$TEMPLATE` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$TEMPLATE"},{"path":"$TEMPLATE/**"}]}},"scope-video":{"identifier":"scope-video","description":"This scope permits access to all files and list content of top level directories in the `$VIDEO` folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/*"}]}},"scope-video-index":{"identifier":"scope-video-index","description":"This scope permits to list all files and folders in the `$VIDEO`folder.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"}]}},"scope-video-recursive":{"identifier":"scope-video-recursive","description":"This scope permits recursive access to the complete `$VIDEO` folder, including sub directories and files.","commands":{"allow":[],"deny":[]},"scope":{"allow":[{"path":"$VIDEO"},{"path":"$VIDEO/**"}]}},"write-all":{"identifier":"write-all","description":"This enables all write related commands without any pre-configured accessible paths.","commands":{"allow":["mkdir","create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}},"write-files":{"identifier":"write-files","description":"This enables all file write related commands without any pre-configured accessible paths.","commands":{"allow":["create","copy_file","remove","rename","truncate","ftruncate","write","write_file","write_text_file"],"deny":[]}}},"permission_sets":{"allow-app-meta":{"identifier":"allow-app-meta","description":"This allows non-recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-index"]},"allow-app-meta-recursive":{"identifier":"allow-app-meta-recursive","description":"This allows full recursive read access to metadata of the application folders, including file listing and statistics.","permissions":["read-meta","scope-app-recursive"]},"allow-app-read":{"identifier":"allow-app-read","description":"This allows non-recursive read access to the application folders.","permissions":["read-all","scope-app"]},"allow-app-read-recursive":{"identifier":"allow-app-read-recursive","description":"This allows full recursive read access to the complete application folders, files and subdirectories.","permissions":["read-all","scope-app-recursive"]},"allow-app-write":{"identifier":"allow-app-write","description":"This allows non-recursive write access to the application folders.","permissions":["write-all","scope-app"]},"allow-app-write-recursive":{"identifier":"allow-app-write-recursive","description":"This allows full recursive write access to the complete application folders, files and subdirectories.","permissions":["write-all","scope-app-recursive"]},"allow-appcache-meta":{"identifier":"allow-appcache-meta","description":"This allows non-recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-index"]},"allow-appcache-meta-recursive":{"identifier":"allow-appcache-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-appcache-recursive"]},"allow-appcache-read":{"identifier":"allow-appcache-read","description":"This allows non-recursive read access to the `$APPCACHE` folder.","permissions":["read-all","scope-appcache"]},"allow-appcache-read-recursive":{"identifier":"allow-appcache-read-recursive","description":"This allows full recursive read access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["read-all","scope-appcache-recursive"]},"allow-appcache-write":{"identifier":"allow-appcache-write","description":"This allows non-recursive write access to the `$APPCACHE` folder.","permissions":["write-all","scope-appcache"]},"allow-appcache-write-recursive":{"identifier":"allow-appcache-write-recursive","description":"This allows full recursive write access to the complete `$APPCACHE` folder, files and subdirectories.","permissions":["write-all","scope-appcache-recursive"]},"allow-appconfig-meta":{"identifier":"allow-appconfig-meta","description":"This allows non-recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-index"]},"allow-appconfig-meta-recursive":{"identifier":"allow-appconfig-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPCONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-appconfig-recursive"]},"allow-appconfig-read":{"identifier":"allow-appconfig-read","description":"This allows non-recursive read access to the `$APPCONFIG` folder.","permissions":["read-all","scope-appconfig"]},"allow-appconfig-read-recursive":{"identifier":"allow-appconfig-read-recursive","description":"This allows full recursive read access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["read-all","scope-appconfig-recursive"]},"allow-appconfig-write":{"identifier":"allow-appconfig-write","description":"This allows non-recursive write access to the `$APPCONFIG` folder.","permissions":["write-all","scope-appconfig"]},"allow-appconfig-write-recursive":{"identifier":"allow-appconfig-write-recursive","description":"This allows full recursive write access to the complete `$APPCONFIG` folder, files and subdirectories.","permissions":["write-all","scope-appconfig-recursive"]},"allow-appdata-meta":{"identifier":"allow-appdata-meta","description":"This allows non-recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-index"]},"allow-appdata-meta-recursive":{"identifier":"allow-appdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-appdata-recursive"]},"allow-appdata-read":{"identifier":"allow-appdata-read","description":"This allows non-recursive read access to the `$APPDATA` folder.","permissions":["read-all","scope-appdata"]},"allow-appdata-read-recursive":{"identifier":"allow-appdata-read-recursive","description":"This allows full recursive read access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["read-all","scope-appdata-recursive"]},"allow-appdata-write":{"identifier":"allow-appdata-write","description":"This allows non-recursive write access to the `$APPDATA` folder.","permissions":["write-all","scope-appdata"]},"allow-appdata-write-recursive":{"identifier":"allow-appdata-write-recursive","description":"This allows full recursive write access to the complete `$APPDATA` folder, files and subdirectories.","permissions":["write-all","scope-appdata-recursive"]},"allow-applocaldata-meta":{"identifier":"allow-applocaldata-meta","description":"This allows non-recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-index"]},"allow-applocaldata-meta-recursive":{"identifier":"allow-applocaldata-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-applocaldata-recursive"]},"allow-applocaldata-read":{"identifier":"allow-applocaldata-read","description":"This allows non-recursive read access to the `$APPLOCALDATA` folder.","permissions":["read-all","scope-applocaldata"]},"allow-applocaldata-read-recursive":{"identifier":"allow-applocaldata-read-recursive","description":"This allows full recursive read access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-applocaldata-recursive"]},"allow-applocaldata-write":{"identifier":"allow-applocaldata-write","description":"This allows non-recursive write access to the `$APPLOCALDATA` folder.","permissions":["write-all","scope-applocaldata"]},"allow-applocaldata-write-recursive":{"identifier":"allow-applocaldata-write-recursive","description":"This allows full recursive write access to the complete `$APPLOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-applocaldata-recursive"]},"allow-applog-meta":{"identifier":"allow-applog-meta","description":"This allows non-recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-index"]},"allow-applog-meta-recursive":{"identifier":"allow-applog-meta-recursive","description":"This allows full recursive read access to metadata of the `$APPLOG` folder, including file listing and statistics.","permissions":["read-meta","scope-applog-recursive"]},"allow-applog-read":{"identifier":"allow-applog-read","description":"This allows non-recursive read access to the `$APPLOG` folder.","permissions":["read-all","scope-applog"]},"allow-applog-read-recursive":{"identifier":"allow-applog-read-recursive","description":"This allows full recursive read access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["read-all","scope-applog-recursive"]},"allow-applog-write":{"identifier":"allow-applog-write","description":"This allows non-recursive write access to the `$APPLOG` folder.","permissions":["write-all","scope-applog"]},"allow-applog-write-recursive":{"identifier":"allow-applog-write-recursive","description":"This allows full recursive write access to the complete `$APPLOG` folder, files and subdirectories.","permissions":["write-all","scope-applog-recursive"]},"allow-audio-meta":{"identifier":"allow-audio-meta","description":"This allows non-recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-index"]},"allow-audio-meta-recursive":{"identifier":"allow-audio-meta-recursive","description":"This allows full recursive read access to metadata of the `$AUDIO` folder, including file listing and statistics.","permissions":["read-meta","scope-audio-recursive"]},"allow-audio-read":{"identifier":"allow-audio-read","description":"This allows non-recursive read access to the `$AUDIO` folder.","permissions":["read-all","scope-audio"]},"allow-audio-read-recursive":{"identifier":"allow-audio-read-recursive","description":"This allows full recursive read access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["read-all","scope-audio-recursive"]},"allow-audio-write":{"identifier":"allow-audio-write","description":"This allows non-recursive write access to the `$AUDIO` folder.","permissions":["write-all","scope-audio"]},"allow-audio-write-recursive":{"identifier":"allow-audio-write-recursive","description":"This allows full recursive write access to the complete `$AUDIO` folder, files and subdirectories.","permissions":["write-all","scope-audio-recursive"]},"allow-cache-meta":{"identifier":"allow-cache-meta","description":"This allows non-recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-index"]},"allow-cache-meta-recursive":{"identifier":"allow-cache-meta-recursive","description":"This allows full recursive read access to metadata of the `$CACHE` folder, including file listing and statistics.","permissions":["read-meta","scope-cache-recursive"]},"allow-cache-read":{"identifier":"allow-cache-read","description":"This allows non-recursive read access to the `$CACHE` folder.","permissions":["read-all","scope-cache"]},"allow-cache-read-recursive":{"identifier":"allow-cache-read-recursive","description":"This allows full recursive read access to the complete `$CACHE` folder, files and subdirectories.","permissions":["read-all","scope-cache-recursive"]},"allow-cache-write":{"identifier":"allow-cache-write","description":"This allows non-recursive write access to the `$CACHE` folder.","permissions":["write-all","scope-cache"]},"allow-cache-write-recursive":{"identifier":"allow-cache-write-recursive","description":"This allows full recursive write access to the complete `$CACHE` folder, files and subdirectories.","permissions":["write-all","scope-cache-recursive"]},"allow-config-meta":{"identifier":"allow-config-meta","description":"This allows non-recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-index"]},"allow-config-meta-recursive":{"identifier":"allow-config-meta-recursive","description":"This allows full recursive read access to metadata of the `$CONFIG` folder, including file listing and statistics.","permissions":["read-meta","scope-config-recursive"]},"allow-config-read":{"identifier":"allow-config-read","description":"This allows non-recursive read access to the `$CONFIG` folder.","permissions":["read-all","scope-config"]},"allow-config-read-recursive":{"identifier":"allow-config-read-recursive","description":"This allows full recursive read access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["read-all","scope-config-recursive"]},"allow-config-write":{"identifier":"allow-config-write","description":"This allows non-recursive write access to the `$CONFIG` folder.","permissions":["write-all","scope-config"]},"allow-config-write-recursive":{"identifier":"allow-config-write-recursive","description":"This allows full recursive write access to the complete `$CONFIG` folder, files and subdirectories.","permissions":["write-all","scope-config-recursive"]},"allow-data-meta":{"identifier":"allow-data-meta","description":"This allows non-recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-index"]},"allow-data-meta-recursive":{"identifier":"allow-data-meta-recursive","description":"This allows full recursive read access to metadata of the `$DATA` folder, including file listing and statistics.","permissions":["read-meta","scope-data-recursive"]},"allow-data-read":{"identifier":"allow-data-read","description":"This allows non-recursive read access to the `$DATA` folder.","permissions":["read-all","scope-data"]},"allow-data-read-recursive":{"identifier":"allow-data-read-recursive","description":"This allows full recursive read access to the complete `$DATA` folder, files and subdirectories.","permissions":["read-all","scope-data-recursive"]},"allow-data-write":{"identifier":"allow-data-write","description":"This allows non-recursive write access to the `$DATA` folder.","permissions":["write-all","scope-data"]},"allow-data-write-recursive":{"identifier":"allow-data-write-recursive","description":"This allows full recursive write access to the complete `$DATA` folder, files and subdirectories.","permissions":["write-all","scope-data-recursive"]},"allow-desktop-meta":{"identifier":"allow-desktop-meta","description":"This allows non-recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-index"]},"allow-desktop-meta-recursive":{"identifier":"allow-desktop-meta-recursive","description":"This allows full recursive read access to metadata of the `$DESKTOP` folder, including file listing and statistics.","permissions":["read-meta","scope-desktop-recursive"]},"allow-desktop-read":{"identifier":"allow-desktop-read","description":"This allows non-recursive read access to the `$DESKTOP` folder.","permissions":["read-all","scope-desktop"]},"allow-desktop-read-recursive":{"identifier":"allow-desktop-read-recursive","description":"This allows full recursive read access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["read-all","scope-desktop-recursive"]},"allow-desktop-write":{"identifier":"allow-desktop-write","description":"This allows non-recursive write access to the `$DESKTOP` folder.","permissions":["write-all","scope-desktop"]},"allow-desktop-write-recursive":{"identifier":"allow-desktop-write-recursive","description":"This allows full recursive write access to the complete `$DESKTOP` folder, files and subdirectories.","permissions":["write-all","scope-desktop-recursive"]},"allow-document-meta":{"identifier":"allow-document-meta","description":"This allows non-recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-index"]},"allow-document-meta-recursive":{"identifier":"allow-document-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOCUMENT` folder, including file listing and statistics.","permissions":["read-meta","scope-document-recursive"]},"allow-document-read":{"identifier":"allow-document-read","description":"This allows non-recursive read access to the `$DOCUMENT` folder.","permissions":["read-all","scope-document"]},"allow-document-read-recursive":{"identifier":"allow-document-read-recursive","description":"This allows full recursive read access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["read-all","scope-document-recursive"]},"allow-document-write":{"identifier":"allow-document-write","description":"This allows non-recursive write access to the `$DOCUMENT` folder.","permissions":["write-all","scope-document"]},"allow-document-write-recursive":{"identifier":"allow-document-write-recursive","description":"This allows full recursive write access to the complete `$DOCUMENT` folder, files and subdirectories.","permissions":["write-all","scope-document-recursive"]},"allow-download-meta":{"identifier":"allow-download-meta","description":"This allows non-recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-index"]},"allow-download-meta-recursive":{"identifier":"allow-download-meta-recursive","description":"This allows full recursive read access to metadata of the `$DOWNLOAD` folder, including file listing and statistics.","permissions":["read-meta","scope-download-recursive"]},"allow-download-read":{"identifier":"allow-download-read","description":"This allows non-recursive read access to the `$DOWNLOAD` folder.","permissions":["read-all","scope-download"]},"allow-download-read-recursive":{"identifier":"allow-download-read-recursive","description":"This allows full recursive read access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["read-all","scope-download-recursive"]},"allow-download-write":{"identifier":"allow-download-write","description":"This allows non-recursive write access to the `$DOWNLOAD` folder.","permissions":["write-all","scope-download"]},"allow-download-write-recursive":{"identifier":"allow-download-write-recursive","description":"This allows full recursive write access to the complete `$DOWNLOAD` folder, files and subdirectories.","permissions":["write-all","scope-download-recursive"]},"allow-exe-meta":{"identifier":"allow-exe-meta","description":"This allows non-recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-index"]},"allow-exe-meta-recursive":{"identifier":"allow-exe-meta-recursive","description":"This allows full recursive read access to metadata of the `$EXE` folder, including file listing and statistics.","permissions":["read-meta","scope-exe-recursive"]},"allow-exe-read":{"identifier":"allow-exe-read","description":"This allows non-recursive read access to the `$EXE` folder.","permissions":["read-all","scope-exe"]},"allow-exe-read-recursive":{"identifier":"allow-exe-read-recursive","description":"This allows full recursive read access to the complete `$EXE` folder, files and subdirectories.","permissions":["read-all","scope-exe-recursive"]},"allow-exe-write":{"identifier":"allow-exe-write","description":"This allows non-recursive write access to the `$EXE` folder.","permissions":["write-all","scope-exe"]},"allow-exe-write-recursive":{"identifier":"allow-exe-write-recursive","description":"This allows full recursive write access to the complete `$EXE` folder, files and subdirectories.","permissions":["write-all","scope-exe-recursive"]},"allow-font-meta":{"identifier":"allow-font-meta","description":"This allows non-recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-index"]},"allow-font-meta-recursive":{"identifier":"allow-font-meta-recursive","description":"This allows full recursive read access to metadata of the `$FONT` folder, including file listing and statistics.","permissions":["read-meta","scope-font-recursive"]},"allow-font-read":{"identifier":"allow-font-read","description":"This allows non-recursive read access to the `$FONT` folder.","permissions":["read-all","scope-font"]},"allow-font-read-recursive":{"identifier":"allow-font-read-recursive","description":"This allows full recursive read access to the complete `$FONT` folder, files and subdirectories.","permissions":["read-all","scope-font-recursive"]},"allow-font-write":{"identifier":"allow-font-write","description":"This allows non-recursive write access to the `$FONT` folder.","permissions":["write-all","scope-font"]},"allow-font-write-recursive":{"identifier":"allow-font-write-recursive","description":"This allows full recursive write access to the complete `$FONT` folder, files and subdirectories.","permissions":["write-all","scope-font-recursive"]},"allow-home-meta":{"identifier":"allow-home-meta","description":"This allows non-recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-index"]},"allow-home-meta-recursive":{"identifier":"allow-home-meta-recursive","description":"This allows full recursive read access to metadata of the `$HOME` folder, including file listing and statistics.","permissions":["read-meta","scope-home-recursive"]},"allow-home-read":{"identifier":"allow-home-read","description":"This allows non-recursive read access to the `$HOME` folder.","permissions":["read-all","scope-home"]},"allow-home-read-recursive":{"identifier":"allow-home-read-recursive","description":"This allows full recursive read access to the complete `$HOME` folder, files and subdirectories.","permissions":["read-all","scope-home-recursive"]},"allow-home-write":{"identifier":"allow-home-write","description":"This allows non-recursive write access to the `$HOME` folder.","permissions":["write-all","scope-home"]},"allow-home-write-recursive":{"identifier":"allow-home-write-recursive","description":"This allows full recursive write access to the complete `$HOME` folder, files and subdirectories.","permissions":["write-all","scope-home-recursive"]},"allow-localdata-meta":{"identifier":"allow-localdata-meta","description":"This allows non-recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-index"]},"allow-localdata-meta-recursive":{"identifier":"allow-localdata-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOCALDATA` folder, including file listing and statistics.","permissions":["read-meta","scope-localdata-recursive"]},"allow-localdata-read":{"identifier":"allow-localdata-read","description":"This allows non-recursive read access to the `$LOCALDATA` folder.","permissions":["read-all","scope-localdata"]},"allow-localdata-read-recursive":{"identifier":"allow-localdata-read-recursive","description":"This allows full recursive read access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["read-all","scope-localdata-recursive"]},"allow-localdata-write":{"identifier":"allow-localdata-write","description":"This allows non-recursive write access to the `$LOCALDATA` folder.","permissions":["write-all","scope-localdata"]},"allow-localdata-write-recursive":{"identifier":"allow-localdata-write-recursive","description":"This allows full recursive write access to the complete `$LOCALDATA` folder, files and subdirectories.","permissions":["write-all","scope-localdata-recursive"]},"allow-log-meta":{"identifier":"allow-log-meta","description":"This allows non-recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-index"]},"allow-log-meta-recursive":{"identifier":"allow-log-meta-recursive","description":"This allows full recursive read access to metadata of the `$LOG` folder, including file listing and statistics.","permissions":["read-meta","scope-log-recursive"]},"allow-log-read":{"identifier":"allow-log-read","description":"This allows non-recursive read access to the `$LOG` folder.","permissions":["read-all","scope-log"]},"allow-log-read-recursive":{"identifier":"allow-log-read-recursive","description":"This allows full recursive read access to the complete `$LOG` folder, files and subdirectories.","permissions":["read-all","scope-log-recursive"]},"allow-log-write":{"identifier":"allow-log-write","description":"This allows non-recursive write access to the `$LOG` folder.","permissions":["write-all","scope-log"]},"allow-log-write-recursive":{"identifier":"allow-log-write-recursive","description":"This allows full recursive write access to the complete `$LOG` folder, files and subdirectories.","permissions":["write-all","scope-log-recursive"]},"allow-picture-meta":{"identifier":"allow-picture-meta","description":"This allows non-recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-index"]},"allow-picture-meta-recursive":{"identifier":"allow-picture-meta-recursive","description":"This allows full recursive read access to metadata of the `$PICTURE` folder, including file listing and statistics.","permissions":["read-meta","scope-picture-recursive"]},"allow-picture-read":{"identifier":"allow-picture-read","description":"This allows non-recursive read access to the `$PICTURE` folder.","permissions":["read-all","scope-picture"]},"allow-picture-read-recursive":{"identifier":"allow-picture-read-recursive","description":"This allows full recursive read access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["read-all","scope-picture-recursive"]},"allow-picture-write":{"identifier":"allow-picture-write","description":"This allows non-recursive write access to the `$PICTURE` folder.","permissions":["write-all","scope-picture"]},"allow-picture-write-recursive":{"identifier":"allow-picture-write-recursive","description":"This allows full recursive write access to the complete `$PICTURE` folder, files and subdirectories.","permissions":["write-all","scope-picture-recursive"]},"allow-public-meta":{"identifier":"allow-public-meta","description":"This allows non-recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-index"]},"allow-public-meta-recursive":{"identifier":"allow-public-meta-recursive","description":"This allows full recursive read access to metadata of the `$PUBLIC` folder, including file listing and statistics.","permissions":["read-meta","scope-public-recursive"]},"allow-public-read":{"identifier":"allow-public-read","description":"This allows non-recursive read access to the `$PUBLIC` folder.","permissions":["read-all","scope-public"]},"allow-public-read-recursive":{"identifier":"allow-public-read-recursive","description":"This allows full recursive read access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["read-all","scope-public-recursive"]},"allow-public-write":{"identifier":"allow-public-write","description":"This allows non-recursive write access to the `$PUBLIC` folder.","permissions":["write-all","scope-public"]},"allow-public-write-recursive":{"identifier":"allow-public-write-recursive","description":"This allows full recursive write access to the complete `$PUBLIC` folder, files and subdirectories.","permissions":["write-all","scope-public-recursive"]},"allow-resource-meta":{"identifier":"allow-resource-meta","description":"This allows non-recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-index"]},"allow-resource-meta-recursive":{"identifier":"allow-resource-meta-recursive","description":"This allows full recursive read access to metadata of the `$RESOURCE` folder, including file listing and statistics.","permissions":["read-meta","scope-resource-recursive"]},"allow-resource-read":{"identifier":"allow-resource-read","description":"This allows non-recursive read access to the `$RESOURCE` folder.","permissions":["read-all","scope-resource"]},"allow-resource-read-recursive":{"identifier":"allow-resource-read-recursive","description":"This allows full recursive read access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["read-all","scope-resource-recursive"]},"allow-resource-write":{"identifier":"allow-resource-write","description":"This allows non-recursive write access to the `$RESOURCE` folder.","permissions":["write-all","scope-resource"]},"allow-resource-write-recursive":{"identifier":"allow-resource-write-recursive","description":"This allows full recursive write access to the complete `$RESOURCE` folder, files and subdirectories.","permissions":["write-all","scope-resource-recursive"]},"allow-runtime-meta":{"identifier":"allow-runtime-meta","description":"This allows non-recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-index"]},"allow-runtime-meta-recursive":{"identifier":"allow-runtime-meta-recursive","description":"This allows full recursive read access to metadata of the `$RUNTIME` folder, including file listing and statistics.","permissions":["read-meta","scope-runtime-recursive"]},"allow-runtime-read":{"identifier":"allow-runtime-read","description":"This allows non-recursive read access to the `$RUNTIME` folder.","permissions":["read-all","scope-runtime"]},"allow-runtime-read-recursive":{"identifier":"allow-runtime-read-recursive","description":"This allows full recursive read access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["read-all","scope-runtime-recursive"]},"allow-runtime-write":{"identifier":"allow-runtime-write","description":"This allows non-recursive write access to the `$RUNTIME` folder.","permissions":["write-all","scope-runtime"]},"allow-runtime-write-recursive":{"identifier":"allow-runtime-write-recursive","description":"This allows full recursive write access to the complete `$RUNTIME` folder, files and subdirectories.","permissions":["write-all","scope-runtime-recursive"]},"allow-temp-meta":{"identifier":"allow-temp-meta","description":"This allows non-recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-index"]},"allow-temp-meta-recursive":{"identifier":"allow-temp-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMP` folder, including file listing and statistics.","permissions":["read-meta","scope-temp-recursive"]},"allow-temp-read":{"identifier":"allow-temp-read","description":"This allows non-recursive read access to the `$TEMP` folder.","permissions":["read-all","scope-temp"]},"allow-temp-read-recursive":{"identifier":"allow-temp-read-recursive","description":"This allows full recursive read access to the complete `$TEMP` folder, files and subdirectories.","permissions":["read-all","scope-temp-recursive"]},"allow-temp-write":{"identifier":"allow-temp-write","description":"This allows non-recursive write access to the `$TEMP` folder.","permissions":["write-all","scope-temp"]},"allow-temp-write-recursive":{"identifier":"allow-temp-write-recursive","description":"This allows full recursive write access to the complete `$TEMP` folder, files and subdirectories.","permissions":["write-all","scope-temp-recursive"]},"allow-template-meta":{"identifier":"allow-template-meta","description":"This allows non-recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-index"]},"allow-template-meta-recursive":{"identifier":"allow-template-meta-recursive","description":"This allows full recursive read access to metadata of the `$TEMPLATE` folder, including file listing and statistics.","permissions":["read-meta","scope-template-recursive"]},"allow-template-read":{"identifier":"allow-template-read","description":"This allows non-recursive read access to the `$TEMPLATE` folder.","permissions":["read-all","scope-template"]},"allow-template-read-recursive":{"identifier":"allow-template-read-recursive","description":"This allows full recursive read access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["read-all","scope-template-recursive"]},"allow-template-write":{"identifier":"allow-template-write","description":"This allows non-recursive write access to the `$TEMPLATE` folder.","permissions":["write-all","scope-template"]},"allow-template-write-recursive":{"identifier":"allow-template-write-recursive","description":"This allows full recursive write access to the complete `$TEMPLATE` folder, files and subdirectories.","permissions":["write-all","scope-template-recursive"]},"allow-video-meta":{"identifier":"allow-video-meta","description":"This allows non-recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-index"]},"allow-video-meta-recursive":{"identifier":"allow-video-meta-recursive","description":"This allows full recursive read access to metadata of the `$VIDEO` folder, including file listing and statistics.","permissions":["read-meta","scope-video-recursive"]},"allow-video-read":{"identifier":"allow-video-read","description":"This allows non-recursive read access to the `$VIDEO` folder.","permissions":["read-all","scope-video"]},"allow-video-read-recursive":{"identifier":"allow-video-read-recursive","description":"This allows full recursive read access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["read-all","scope-video-recursive"]},"allow-video-write":{"identifier":"allow-video-write","description":"This allows non-recursive write access to the `$VIDEO` folder.","permissions":["write-all","scope-video"]},"allow-video-write-recursive":{"identifier":"allow-video-write-recursive","description":"This allows full recursive write access to the complete `$VIDEO` folder, files and subdirectories.","permissions":["write-all","scope-video-recursive"]},"deny-default":{"identifier":"deny-default","description":"This denies access to dangerous Tauri relevant files and folders by default.","permissions":["deny-webview-data-linux","deny-webview-data-windows"]}},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"A path that can be accessed by the webview when using the fs APIs. FS scope path pattern.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},{"properties":{"path":{"description":"A path that can be accessed by the webview when using the fs APIs.\n\nThe pattern can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$APP`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"}},"required":["path"],"type":"object"}],"description":"FS scope entry.","title":"FsScopeEntry"}},"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/apps/desktop/src-tauri/gen/schemas/capabilities.json b/apps/desktop/src-tauri/gen/schemas/capabilities.json index 544150e6..a77207e7 100644 --- a/apps/desktop/src-tauri/gen/schemas/capabilities.json +++ b/apps/desktop/src-tauri/gen/schemas/capabilities.json @@ -1 +1 @@ -{"default":{"identifier":"default","description":"Default capability \u2014 grants core API, read access to ~/.claude/, and shell spawn for comparator","local":true,"windows":["main"],"permissions":["allow-acknowledge-drift","allow-add-to-parity-baseline","allow-apply-security-preset","allow-board-server-check-installed","allow-board-server-install","allow-board-server-restart","allow-board-server-start","allow-chat-leave-room","allow-chat-list-rooms","allow-chat-load-messages","allow-chat-local-relay-running","allow-chat-purge-room","allow-chat-save-messages","allow-chat-save-room","allow-chat-start-local-relay","allow-chat-stop-local-relay","allow-check-git-repo","allow-check-plugin-updates","allow-clear-audit-entries","allow-compute-live-stats","allow-create-config-file","allow-create-evaluation-session","allow-create-worktrees","allow-delete-comparison","allow-delete-custom-profile","allow-delete-keychain-secret","allow-delete-pairwise-vote","allow-detect-harnesses","allow-export-comparison-json","allow-export-plugin-as-zip","allow-export-plugin-to-folder","allow-get-comparator-analytics","allow-get-comparison","allow-get-comparison-diffs","allow-get-comparison-setup","allow-get-custom-profile","allow-get-diff-against-commit","allow-get-evaluation-session","allow-get-evaluations","allow-get-history-size","allow-get-pairwise-analytics","allow-get-pairwise-votes","allow-get-parity-drift","allow-get-parity-history","allow-get-parity-snapshot","allow-import-plugin-from-path","allow-import-plugin-from-zip","allow-kill-panel","allow-list-active-sessions","allow-list-audit-entries","allow-list-claude-dir","allow-list-comparisons","allow-list-custom-profiles","allow-list-installed-plugins","allow-list-marketplaces","allow-list-required-env","allow-list-security-presets","allow-list-sessions-summary","allow-membrain-check-installed","allow-membrain-get-port","allow-membrain-start","allow-membrain-stop","allow-push-file-history","allow-read-claude-md","allow-read-env-config","allow-read-file-history","allow-read-harness-file","allow-read-hooks","allow-read-live-activity","allow-read-mcp-config","allow-read-permissions","allow-read-plugin-file","allow-read-plugin-tree","allow-read-session-facet","allow-read-session-transcript","allow-read-stats-cache","allow-remove-worktrees","allow-reveal-evaluation-session","allow-run-parity-scan","allow-save-comparison","allow-save-custom-profile","allow-save-evaluation","allow-save-file-diffs","allow-save-pairwise-vote","allow-save-panel-result","allow-scan-claude-config","allow-set-keychain-secret","allow-start-comparison","allow-sync-create-backup","allow-sync-file-exists","allow-sync-list-backups","allow-sync-read-dir","allow-sync-read-file","allow-sync-restore-backup","allow-sync-write-files","allow-uninstall-plugin","allow-update-evaluation-score","allow-update-permissions","allow-write-config-file","allow-write-env-config","allow-write-harness-file","allow-write-mcp-config","allow-write-plugin-file","core:default","core:event:allow-emit","core:event:allow-listen","core:window:allow-start-dragging","dialog:allow-open","dialog:allow-save","dialog:default","fs:allow-exists","fs:allow-read-dir","fs:allow-read-text-file","fs:allow-write-text-file","shell:allow-kill","shell:allow-open","shell:allow-spawn","shell:allow-stdin-write","shell:default",{"identifier":"fs:scope","allow":[{"path":"$HOME/.claude"},{"path":"$HOME/.claude/**"},{"path":"$HOME/.harness-kit"},{"path":"$HOME/.harness-kit/**"}]},{"identifier":"shell:allow-execute","allow":[{"args":true,"cmd":"claude","name":"claude"},{"args":true,"cmd":"cursor","name":"cursor"},{"args":true,"cmd":"gh","name":"gh"},{"args":true,"cmd":"git","name":"git"},{"args":true,"cmd":"security","name":"security"}]},{"identifier":"shell:allow-execute","allow":[{"args":true,"cmd":"claude","name":"claude"},{"args":true,"cmd":"copilot","name":"copilot"},{"args":true,"cmd":"cursor","name":"cursor"},{"args":true,"cmd":"gh","name":"gh"},{"args":true,"cmd":"git","name":"git"},{"args":true,"cmd":"security","name":"security"}]}]}} \ No newline at end of file +{"default":{"identifier":"default","description":"Default capability — grants core API, read access to ~/.claude/, and shell spawn for comparator","local":true,"windows":["main"],"permissions":["core:default","core:window:allow-start-dragging","core:event:allow-listen","core:event:allow-emit","fs:allow-read-text-file","fs:allow-read-dir","fs:allow-exists","fs:allow-write-text-file",{"identifier":"fs:scope","allow":[{"path":"$HOME/.claude"},{"path":"$HOME/.claude/**"},{"path":"$HOME/.harness-kit"},{"path":"$HOME/.harness-kit/**"}]},"dialog:default","dialog:allow-open","dialog:allow-save","shell:default","shell:allow-spawn","shell:allow-stdin-write","shell:allow-kill","shell:allow-open",{"identifier":"shell:allow-execute","allow":[{"args":true,"cmd":"claude","name":"claude"},{"args":true,"cmd":"agent","name":"agent"},{"args":true,"cmd":"copilot","name":"copilot"},{"args":true,"cmd":"codex","name":"codex"},{"args":true,"cmd":"gh","name":"gh"},{"args":true,"cmd":"git","name":"git"},{"args":true,"cmd":"security","name":"security"}]},"allow-list-installed-plugins","allow-list-marketplaces","allow-check-plugin-updates","allow-uninstall-plugin","allow-read-plugin-tree","allow-read-plugin-file","allow-write-plugin-file","allow-import-plugin-from-path","allow-import-plugin-from-zip","allow-export-plugin-as-zip","allow-export-plugin-to-folder","allow-read-hooks","allow-read-claude-md","allow-write-config-file","allow-read-harness-file","allow-write-harness-file","allow-scan-claude-config","allow-read-mcp-config","allow-write-mcp-config","allow-list-custom-profiles","allow-get-custom-profile","allow-save-custom-profile","allow-delete-custom-profile","allow-list-claude-dir","allow-read-stats-cache","allow-list-sessions-summary","allow-read-session-facet","allow-list-active-sessions","allow-read-live-activity","allow-compute-live-stats","allow-read-session-transcript","allow-get-cwd","allow-create-terminal","allow-destroy-terminal","allow-write-terminal","allow-resize-terminal","allow-detect-harnesses","allow-check-git-repo","allow-create-worktrees","allow-remove-worktrees","allow-get-diff-against-commit","allow-save-evaluation","allow-get-evaluations","allow-update-evaluation-score","allow-create-evaluation-session","allow-get-evaluation-session","allow-reveal-evaluation-session","allow-save-pairwise-vote","allow-get-pairwise-votes","allow-get-pairwise-analytics","allow-delete-pairwise-vote","allow-export-comparison-json","allow-get-comparator-analytics","allow-read-permissions","allow-update-permissions","allow-list-security-presets","allow-apply-security-preset","allow-list-required-env","allow-set-keychain-secret","allow-delete-keychain-secret","allow-read-env-config","allow-write-env-config","allow-list-audit-entries","allow-clear-audit-entries","allow-read-file-history","allow-push-file-history","allow-get-history-size","allow-sync-read-file","allow-sync-file-exists","allow-sync-read-dir","allow-sync-write-files","allow-sync-create-backup","allow-sync-list-backups","allow-sync-restore-backup","allow-board-server-check-installed","allow-board-server-install","allow-board-server-start","allow-board-server-restart","allow-membrain-check-installed","allow-membrain-start","allow-membrain-stop","allow-membrain-get-port","allow-run-parity-scan","allow-get-parity-snapshot","allow-get-parity-drift","allow-acknowledge-drift","allow-get-parity-history","allow-create-config-file","allow-add-to-parity-baseline","allow-chat-save-room","allow-chat-leave-room","allow-chat-list-rooms","allow-chat-save-messages","allow-chat-load-messages","allow-chat-purge-room","allow-chat-start-local-relay","allow-chat-stop-local-relay","allow-chat-local-relay-running"]}} \ No newline at end of file diff --git a/apps/desktop/src-tauri/gen/schemas/desktop-schema.json b/apps/desktop/src-tauri/gen/schemas/desktop-schema.json index 854f5c84..dbf4d6df 100644 --- a/apps/desktop/src-tauri/gen/schemas/desktop-schema.json +++ b/apps/desktop/src-tauri/gen/schemas/desktop-schema.json @@ -2318,6 +2318,12 @@ "const": "allow-create-evaluation-session", "markdownDescription": "Enables the create_evaluation_session command without any pre-configured scope." }, + { + "description": "Enables the create_terminal command without any pre-configured scope.", + "type": "string", + "const": "allow-create-terminal", + "markdownDescription": "Enables the create_terminal command without any pre-configured scope." + }, { "description": "Enables the create_worktrees command without any pre-configured scope.", "type": "string", @@ -2348,6 +2354,12 @@ "const": "allow-delete-pairwise-vote", "markdownDescription": "Enables the delete_pairwise_vote command without any pre-configured scope." }, + { + "description": "Enables the destroy_terminal command without any pre-configured scope.", + "type": "string", + "const": "allow-destroy-terminal", + "markdownDescription": "Enables the destroy_terminal command without any pre-configured scope." + }, { "description": "Enables the detect_harnesses command without any pre-configured scope.", "type": "string", @@ -2402,6 +2414,12 @@ "const": "allow-get-custom-profile", "markdownDescription": "Allows the get_custom_profile command." }, + { + "description": "Enables the get_cwd command without any pre-configured scope.", + "type": "string", + "const": "allow-get-cwd", + "markdownDescription": "Enables the get_cwd command without any pre-configured scope." + }, { "description": "Enables the get_diff_against_commit command without any pre-configured scope.", "type": "string", @@ -2648,6 +2666,12 @@ "const": "allow-remove-worktrees", "markdownDescription": "Enables the remove_worktrees command without any pre-configured scope." }, + { + "description": "Enables the resize_terminal command without any pre-configured scope.", + "type": "string", + "const": "allow-resize-terminal", + "markdownDescription": "Enables the resize_terminal command without any pre-configured scope." + }, { "description": "Enables the reveal_evaluation_session command without any pre-configured scope.", "type": "string", @@ -2804,6 +2828,12 @@ "const": "allow-write-plugin-file", "markdownDescription": "Enables the write_plugin_file command without any pre-configured scope." }, + { + "description": "Enables the write_terminal command without any pre-configured scope.", + "type": "string", + "const": "allow-write-terminal", + "markdownDescription": "Enables the write_terminal command without any pre-configured scope." + }, { "description": "Denies the acknowledge_drift command without any pre-configured scope.", "type": "string", @@ -2936,6 +2966,12 @@ "const": "deny-create-evaluation-session", "markdownDescription": "Denies the create_evaluation_session command without any pre-configured scope." }, + { + "description": "Denies the create_terminal command without any pre-configured scope.", + "type": "string", + "const": "deny-create-terminal", + "markdownDescription": "Denies the create_terminal command without any pre-configured scope." + }, { "description": "Denies the create_worktrees command without any pre-configured scope.", "type": "string", @@ -2966,6 +3002,12 @@ "const": "deny-delete-pairwise-vote", "markdownDescription": "Denies the delete_pairwise_vote command without any pre-configured scope." }, + { + "description": "Denies the destroy_terminal command without any pre-configured scope.", + "type": "string", + "const": "deny-destroy-terminal", + "markdownDescription": "Denies the destroy_terminal command without any pre-configured scope." + }, { "description": "Denies the detect_harnesses command without any pre-configured scope.", "type": "string", @@ -3020,6 +3062,12 @@ "const": "deny-get-custom-profile", "markdownDescription": "Denies the get_custom_profile command." }, + { + "description": "Denies the get_cwd command without any pre-configured scope.", + "type": "string", + "const": "deny-get-cwd", + "markdownDescription": "Denies the get_cwd command without any pre-configured scope." + }, { "description": "Denies the get_diff_against_commit command without any pre-configured scope.", "type": "string", @@ -3266,6 +3314,12 @@ "const": "deny-remove-worktrees", "markdownDescription": "Denies the remove_worktrees command without any pre-configured scope." }, + { + "description": "Denies the resize_terminal command without any pre-configured scope.", + "type": "string", + "const": "deny-resize-terminal", + "markdownDescription": "Denies the resize_terminal command without any pre-configured scope." + }, { "description": "Denies the reveal_evaluation_session command without any pre-configured scope.", "type": "string", @@ -3422,6 +3476,12 @@ "const": "deny-write-plugin-file", "markdownDescription": "Denies the write_plugin_file command without any pre-configured scope." }, + { + "description": "Denies the write_terminal command without any pre-configured scope.", + "type": "string", + "const": "deny-write-terminal", + "markdownDescription": "Denies the write_terminal command without any pre-configured scope." + }, { "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", "type": "string", diff --git a/apps/desktop/src-tauri/gen/schemas/macOS-schema.json b/apps/desktop/src-tauri/gen/schemas/macOS-schema.json index 854f5c84..dbf4d6df 100644 --- a/apps/desktop/src-tauri/gen/schemas/macOS-schema.json +++ b/apps/desktop/src-tauri/gen/schemas/macOS-schema.json @@ -2318,6 +2318,12 @@ "const": "allow-create-evaluation-session", "markdownDescription": "Enables the create_evaluation_session command without any pre-configured scope." }, + { + "description": "Enables the create_terminal command without any pre-configured scope.", + "type": "string", + "const": "allow-create-terminal", + "markdownDescription": "Enables the create_terminal command without any pre-configured scope." + }, { "description": "Enables the create_worktrees command without any pre-configured scope.", "type": "string", @@ -2348,6 +2354,12 @@ "const": "allow-delete-pairwise-vote", "markdownDescription": "Enables the delete_pairwise_vote command without any pre-configured scope." }, + { + "description": "Enables the destroy_terminal command without any pre-configured scope.", + "type": "string", + "const": "allow-destroy-terminal", + "markdownDescription": "Enables the destroy_terminal command without any pre-configured scope." + }, { "description": "Enables the detect_harnesses command without any pre-configured scope.", "type": "string", @@ -2402,6 +2414,12 @@ "const": "allow-get-custom-profile", "markdownDescription": "Allows the get_custom_profile command." }, + { + "description": "Enables the get_cwd command without any pre-configured scope.", + "type": "string", + "const": "allow-get-cwd", + "markdownDescription": "Enables the get_cwd command without any pre-configured scope." + }, { "description": "Enables the get_diff_against_commit command without any pre-configured scope.", "type": "string", @@ -2648,6 +2666,12 @@ "const": "allow-remove-worktrees", "markdownDescription": "Enables the remove_worktrees command without any pre-configured scope." }, + { + "description": "Enables the resize_terminal command without any pre-configured scope.", + "type": "string", + "const": "allow-resize-terminal", + "markdownDescription": "Enables the resize_terminal command without any pre-configured scope." + }, { "description": "Enables the reveal_evaluation_session command without any pre-configured scope.", "type": "string", @@ -2804,6 +2828,12 @@ "const": "allow-write-plugin-file", "markdownDescription": "Enables the write_plugin_file command without any pre-configured scope." }, + { + "description": "Enables the write_terminal command without any pre-configured scope.", + "type": "string", + "const": "allow-write-terminal", + "markdownDescription": "Enables the write_terminal command without any pre-configured scope." + }, { "description": "Denies the acknowledge_drift command without any pre-configured scope.", "type": "string", @@ -2936,6 +2966,12 @@ "const": "deny-create-evaluation-session", "markdownDescription": "Denies the create_evaluation_session command without any pre-configured scope." }, + { + "description": "Denies the create_terminal command without any pre-configured scope.", + "type": "string", + "const": "deny-create-terminal", + "markdownDescription": "Denies the create_terminal command without any pre-configured scope." + }, { "description": "Denies the create_worktrees command without any pre-configured scope.", "type": "string", @@ -2966,6 +3002,12 @@ "const": "deny-delete-pairwise-vote", "markdownDescription": "Denies the delete_pairwise_vote command without any pre-configured scope." }, + { + "description": "Denies the destroy_terminal command without any pre-configured scope.", + "type": "string", + "const": "deny-destroy-terminal", + "markdownDescription": "Denies the destroy_terminal command without any pre-configured scope." + }, { "description": "Denies the detect_harnesses command without any pre-configured scope.", "type": "string", @@ -3020,6 +3062,12 @@ "const": "deny-get-custom-profile", "markdownDescription": "Denies the get_custom_profile command." }, + { + "description": "Denies the get_cwd command without any pre-configured scope.", + "type": "string", + "const": "deny-get-cwd", + "markdownDescription": "Denies the get_cwd command without any pre-configured scope." + }, { "description": "Denies the get_diff_against_commit command without any pre-configured scope.", "type": "string", @@ -3266,6 +3314,12 @@ "const": "deny-remove-worktrees", "markdownDescription": "Denies the remove_worktrees command without any pre-configured scope." }, + { + "description": "Denies the resize_terminal command without any pre-configured scope.", + "type": "string", + "const": "deny-resize-terminal", + "markdownDescription": "Denies the resize_terminal command without any pre-configured scope." + }, { "description": "Denies the reveal_evaluation_session command without any pre-configured scope.", "type": "string", @@ -3422,6 +3476,12 @@ "const": "deny-write-plugin-file", "markdownDescription": "Denies the write_plugin_file command without any pre-configured scope." }, + { + "description": "Denies the write_terminal command without any pre-configured scope.", + "type": "string", + "const": "deny-write-terminal", + "markdownDescription": "Denies the write_terminal command without any pre-configured scope." + }, { "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", "type": "string", diff --git a/apps/desktop/src-tauri/permissions/autogenerated/create_terminal.toml b/apps/desktop/src-tauri/permissions/autogenerated/create_terminal.toml new file mode 100644 index 00000000..0c25fc34 --- /dev/null +++ b/apps/desktop/src-tauri/permissions/autogenerated/create_terminal.toml @@ -0,0 +1,11 @@ +# Automatically generated - DO NOT EDIT! + +[[permission]] +identifier = "allow-create-terminal" +description = "Enables the create_terminal command without any pre-configured scope." +commands.allow = ["create_terminal"] + +[[permission]] +identifier = "deny-create-terminal" +description = "Denies the create_terminal command without any pre-configured scope." +commands.deny = ["create_terminal"] diff --git a/apps/desktop/src-tauri/permissions/autogenerated/destroy_terminal.toml b/apps/desktop/src-tauri/permissions/autogenerated/destroy_terminal.toml new file mode 100644 index 00000000..b2e30c9e --- /dev/null +++ b/apps/desktop/src-tauri/permissions/autogenerated/destroy_terminal.toml @@ -0,0 +1,11 @@ +# Automatically generated - DO NOT EDIT! + +[[permission]] +identifier = "allow-destroy-terminal" +description = "Enables the destroy_terminal command without any pre-configured scope." +commands.allow = ["destroy_terminal"] + +[[permission]] +identifier = "deny-destroy-terminal" +description = "Denies the destroy_terminal command without any pre-configured scope." +commands.deny = ["destroy_terminal"] diff --git a/apps/desktop/src-tauri/permissions/autogenerated/get_cwd.toml b/apps/desktop/src-tauri/permissions/autogenerated/get_cwd.toml new file mode 100644 index 00000000..64752afc --- /dev/null +++ b/apps/desktop/src-tauri/permissions/autogenerated/get_cwd.toml @@ -0,0 +1,11 @@ +# Automatically generated - DO NOT EDIT! + +[[permission]] +identifier = "allow-get-cwd" +description = "Enables the get_cwd command without any pre-configured scope." +commands.allow = ["get_cwd"] + +[[permission]] +identifier = "deny-get-cwd" +description = "Denies the get_cwd command without any pre-configured scope." +commands.deny = ["get_cwd"] diff --git a/apps/desktop/src-tauri/permissions/autogenerated/resize_terminal.toml b/apps/desktop/src-tauri/permissions/autogenerated/resize_terminal.toml new file mode 100644 index 00000000..23372207 --- /dev/null +++ b/apps/desktop/src-tauri/permissions/autogenerated/resize_terminal.toml @@ -0,0 +1,11 @@ +# Automatically generated - DO NOT EDIT! + +[[permission]] +identifier = "allow-resize-terminal" +description = "Enables the resize_terminal command without any pre-configured scope." +commands.allow = ["resize_terminal"] + +[[permission]] +identifier = "deny-resize-terminal" +description = "Denies the resize_terminal command without any pre-configured scope." +commands.deny = ["resize_terminal"] diff --git a/apps/desktop/src-tauri/permissions/autogenerated/write_terminal.toml b/apps/desktop/src-tauri/permissions/autogenerated/write_terminal.toml new file mode 100644 index 00000000..a61dc5da --- /dev/null +++ b/apps/desktop/src-tauri/permissions/autogenerated/write_terminal.toml @@ -0,0 +1,11 @@ +# Automatically generated - DO NOT EDIT! + +[[permission]] +identifier = "allow-write-terminal" +description = "Enables the write_terminal command without any pre-configured scope." +commands.allow = ["write_terminal"] + +[[permission]] +identifier = "deny-write-terminal" +description = "Denies the write_terminal command without any pre-configured scope." +commands.deny = ["write_terminal"] diff --git a/apps/desktop/src-tauri/src/commands/comparator.rs b/apps/desktop/src-tauri/src/commands/comparator.rs deleted file mode 100644 index 38d08b5d..00000000 --- a/apps/desktop/src-tauri/src/commands/comparator.rs +++ /dev/null @@ -1,429 +0,0 @@ -use portable_pty::{CommandBuilder, PtySize, native_pty_system}; -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; -use std::io::Read; -use std::sync::Mutex; -use std::time::Instant; -use tauri::{AppHandle, Emitter, Manager, State}; -use tauri_plugin_shell::ShellExt; - -// ── Types ─────────────────────────────────────────────────── - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct HarnessInfo { - pub id: String, - pub name: String, - pub command: String, - pub available: bool, - pub version: Option, - pub mode: Option, // "supported" | "unsupported" | null - pub authenticated: bool, - pub models: Vec, - pub default_model: Option, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct PanelConfig { - pub panel_id: String, - pub harness_id: String, - pub model: Option, - pub working_dir: Option, -} - -#[derive(Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct ComparisonRequest { - pub comparison_id: String, - pub prompt: String, - pub working_dir: String, - #[allow(dead_code)] - pub pinned_commit: Option, - pub panels: Vec, -} - -#[derive(Debug, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct PanelOutput { - pub comparison_id: String, - pub panel_id: String, - pub stream: String, // "stdout" | "stderr" - pub data: String, -} - -#[derive(Debug, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct PanelComplete { - pub comparison_id: String, - pub panel_id: String, - pub exit_code: Option, - pub duration_ms: u64, -} - -// ── Managed state ─────────────────────────────────────────── - -pub struct ComparatorState { - // Stores a killer per panel so kill_panel can stop the PTY child. - pub killers: Mutex>>, -} - -impl Default for ComparatorState { - fn default() -> Self { - Self { - killers: Mutex::new(HashMap::new()), - } - } -} - -// ── Known harnesses ───────────────────────────────────────── - -struct HarnessDef { - id: &'static str, - name: &'static str, - command: &'static str, - version_args: &'static [&'static str], - models: &'static [&'static str], - default_model: &'static str, -} - -const KNOWN_HARNESSES: &[HarnessDef] = &[ - HarnessDef { - id: "claude", - name: "Claude Code", - command: "claude", - version_args: &["--version"], - models: &["claude-sonnet-4-6", "claude-opus-4-6", "claude-haiku-4-5-20251001"], - default_model: "claude-sonnet-4-6", - }, - HarnessDef { - id: "cursor", - name: "Cursor", - command: "cursor", - version_args: &["--version"], - models: &["claude-sonnet-4-6", "gpt-4o", "gemini-2.5-pro"], - default_model: "claude-sonnet-4-6", - }, - HarnessDef { - id: "gh-copilot", - name: "GitHub Copilot", - command: "copilot", - version_args: &["--version"], - models: &["claude-haiku-4.5", "gpt-5-mini", "gpt-4.1"], - default_model: "claude-haiku-4.5", - }, -]; - -// ── Commands ──────────────────────────────────────────────── - -#[tauri::command] -pub async fn detect_harnesses(app: AppHandle) -> Result, String> { - let mut results = Vec::new(); - - for def in KNOWN_HARNESSES { - let shell = app.shell(); - let output = shell - .command(def.command) - .args(def.version_args) - .output() - .await; - - match output { - Ok(out) if out.status.success() => { - let version = String::from_utf8_lossy(&out.stdout) - .trim() - .to_string(); - - // Check authentication per harness - let authenticated = match def.id { - "cursor" => { - // Try a minimal invocation with a 5s timeout to detect auth errors - let auth_result = tokio::time::timeout( - std::time::Duration::from_secs(5), - app.shell() - .command("cursor") - .args(["agent", "-p", "--trust", "test"]) - .output(), - ) - .await; - - match auth_result { - Ok(Ok(auth_out)) => { - let stderr = - String::from_utf8_lossy(&auth_out.stderr).to_lowercase(); - !stderr.contains("authentication required") - && !stderr.contains("login") - } - // Timeout or error — assume not authenticated - _ => false, - } - } - // Claude and Copilot handle auth at runtime - _ => true, - }; - - results.push(HarnessInfo { - id: def.id.to_string(), - name: def.name.to_string(), - command: def.command.to_string(), - available: true, - version: if version.is_empty() { None } else { Some(version) }, - mode: Some("supported".to_string()), - authenticated, - models: def.models.iter().map(|s| s.to_string()).collect(), - default_model: Some(def.default_model.to_string()), - }); - } - _ => { - results.push(HarnessInfo { - id: def.id.to_string(), - name: def.name.to_string(), - command: def.command.to_string(), - available: false, - version: None, - mode: None, - authenticated: false, - models: vec![], - default_model: None, - }); - } - } - } - - Ok(results) -} - -#[tauri::command] -pub async fn start_comparison( - app: AppHandle, - state: State<'_, ComparatorState>, - request: ComparisonRequest, -) -> Result<(), String> { - let comparison_id = request.comparison_id.clone(); - - for panel in &request.panels { - let panel_id = panel.panel_id.clone(); - let comp_id = comparison_id.clone(); - let key = format!("{}:{}", comp_id, panel_id); - - let (cmd_name, args) = build_command_args( - &panel.harness_id, - &request.prompt, - panel.model.as_deref(), - )?; - - let cwd = panel - .working_dir - .as_deref() - .unwrap_or(&request.working_dir) - .to_string(); - - // Open a PTY pair — the child process sees a real terminal, so output - // is not buffered and ANSI color/progress codes flow through live. - let pty_system = native_pty_system(); - let pair = pty_system - .openpty(PtySize { - rows: 50, - cols: 220, - pixel_width: 0, - pixel_height: 0, - }) - .map_err(|e| format!("openpty: {e}"))?; - - let mut cmd = CommandBuilder::new(cmd_name); - for arg in &args { - cmd.arg(arg); - } - cmd.env("TERM", "xterm-256color"); - cmd.env("FORCE_COLOR", "1"); - cmd.env("CLICOLOR_FORCE", "1"); - if !cwd.is_empty() { - cmd.cwd(&cwd); - } - - let mut child = pair - .slave - .spawn_command(cmd) - .map_err(|e| format!("Failed to spawn {}: {e}", panel.harness_id))?; - drop(pair.slave); - - // Clone the reader BEFORE dropping master. The dup'd fd in `reader` - // keeps the PTY master alive so the child doesn't receive SIGHUP. - let mut reader = pair - .master - .try_clone_reader() - .map_err(|e| format!("clone_reader: {e}"))?; - drop(pair.master); - - // Store a killer handle for kill_panel support. - { - let mut killers = state.killers.lock().map_err(|e| e.to_string())?; - killers.insert(key.clone(), child.clone_killer()); - } - - let app_handle = app.clone(); - let panel_id_clone = panel_id.clone(); - let comp_id_clone = comp_id.clone(); - let key_clone = key.clone(); - let started = Instant::now(); - - // Blocking reader thread — PTY I/O is not async. - std::thread::spawn(move || { - let mut buf = [0u8; 4096]; - - loop { - match reader.read(&mut buf) { - Ok(0) => break, - Ok(n) => { - let text = String::from_utf8_lossy(&buf[..n]).to_string(); - let _ = app_handle.emit( - "comparator://output", - PanelOutput { - comparison_id: comp_id_clone.clone(), - panel_id: panel_id_clone.clone(), - stream: "stdout".to_string(), - data: text, - }, - ); - } - // EIO or other error means the PTY master is gone (child exited). - Err(_) => break, - } - } - - let exit_code = child - .wait() - .ok() - .map(|s| s.exit_code() as i32); - let duration = started.elapsed().as_millis() as u64; - - let _ = app_handle.emit( - "comparator://complete", - PanelComplete { - comparison_id: comp_id_clone.clone(), - panel_id: panel_id_clone.clone(), - exit_code, - duration_ms: duration, - }, - ); - - { - let st = app_handle.state::(); - if let Ok(mut killers) = st.killers.lock() { - killers.remove(&key_clone); - }; - } - }); - } - - Ok(()) -} - -#[tauri::command] -pub async fn kill_panel( - state: State<'_, ComparatorState>, - comparison_id: String, - panel_id: String, -) -> Result<(), String> { - let key = format!("{}:{}", comparison_id, panel_id); - let mut killers = state.killers.lock().map_err(|e| e.to_string())?; - - if let Some(mut killer) = killers.remove(&key) { - killer.kill().map_err(|e| format!("Failed to kill process: {e}"))?; - } - - Ok(()) -} - -// ── Helpers ───────────────────────────────────────────────── - -fn build_command_args( - harness_id: &str, - prompt: &str, - model: Option<&str>, -) -> Result<(&'static str, Vec), String> { - match harness_id { - "claude" => { - let mut args = vec!["-p".to_string(), prompt.to_string()]; - if let Some(m) = model { - args.push("--model".to_string()); - args.push(m.to_string()); - } - Ok(("claude", args)) - } - "cursor" => { - let mut args = vec!["agent".to_string(), "-p".to_string(), "--trust".to_string()]; - if let Some(m) = model { - args.push("--model".to_string()); - args.push(m.to_string()); - } - args.push(prompt.to_string()); // positional — must be last - Ok(("cursor", args)) - } - "gh-copilot" => { - let mut args = vec!["-p".to_string(), prompt.to_string()]; - if let Some(m) = model { - args.push("--model".to_string()); - args.push(m.to_string()); - } - Ok(("copilot", args)) - } - _ => Err(format!("Unknown harness: {}", harness_id)), - } -} - -// ── Tests ──────────────────────────────────────────────────── - -#[cfg(test)] -mod tests { - use super::build_command_args; - - #[test] - fn claude_basic() { - let (cmd, args) = build_command_args("claude", "hello world", None).unwrap(); - assert_eq!(cmd, "claude"); - assert_eq!(args, vec!["-p", "hello world"]); - } - - #[test] - fn claude_with_model() { - let (cmd, args) = build_command_args("claude", "hi", Some("claude-opus-4-6")).unwrap(); - assert_eq!(cmd, "claude"); - assert_eq!(args, vec!["-p", "hi", "--model", "claude-opus-4-6"]); - } - - #[test] - fn copilot_basic() { - let (cmd, args) = build_command_args("gh-copilot", "write a loop", None).unwrap(); - assert_eq!(cmd, "copilot"); - assert_eq!(args, vec!["-p", "write a loop"]); - } - - #[test] - fn copilot_with_model() { - let (cmd, args) = build_command_args("gh-copilot", "refactor", Some("gpt-4o")).unwrap(); - assert_eq!(cmd, "copilot"); - assert_eq!(args, vec!["-p", "refactor", "--model", "gpt-4o"]); - } - - #[test] - fn cursor_basic() { - let (cmd, args) = build_command_args("cursor", "explain this", None).unwrap(); - assert_eq!(cmd, "cursor"); - assert_eq!(args, vec!["agent", "-p", "--trust", "explain this"]); - } - - #[test] - fn cursor_with_model() { - let (cmd, args) = build_command_args("cursor", "test", Some("gpt-4o")).unwrap(); - assert_eq!(cmd, "cursor"); - assert_eq!(args, vec!["agent", "-p", "--trust", "--model", "gpt-4o", "test"]); - } - - #[test] - fn unknown_harness_errors() { - let result = build_command_args("vscode-copilot", "hi", None); - assert!(result.is_err()); - assert!(result.unwrap_err().contains("Unknown harness")); - } -} diff --git a/apps/desktop/src-tauri/src/commands/comparator_db.rs b/apps/desktop/src-tauri/src/commands/comparator_db.rs deleted file mode 100644 index 2255b322..00000000 --- a/apps/desktop/src-tauri/src/commands/comparator_db.rs +++ /dev/null @@ -1,466 +0,0 @@ -use std::collections::HashMap; -use crate::db::Db; -use serde::{Deserialize, Serialize}; -use tauri::State; - -use super::types::{FileDiffEntry, Evaluation}; - -#[derive(Debug, Serialize, Deserialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct SavePanelRequest { - pub id: String, - pub harness_id: String, - pub harness_name: String, - pub model: Option, -} - -#[derive(Debug, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct ComparisonSummary { - pub id: String, - pub prompt: String, - pub working_dir: String, - pub pinned_commit: Option, - pub created_at: String, - pub status: String, - pub panels: Vec, -} - -#[derive(Debug, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct PanelSummary { - pub id: String, - pub harness_id: String, - pub harness_name: String, - pub model: Option, - pub exit_code: Option, - pub duration_ms: Option, - pub status: String, -} - -#[derive(Debug, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct ComparisonDetail { - pub id: String, - pub prompt: String, - pub working_dir: String, - pub pinned_commit: Option, - pub created_at: String, - pub status: String, - pub panels: Vec, -} - -#[derive(Debug, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct PanelDetail { - pub id: String, - pub harness_id: String, - pub harness_name: String, - pub model: Option, - pub exit_code: Option, - pub duration_ms: Option, - pub status: String, - pub output_text: Option, - pub diffs: Vec, - pub evaluation: Option, -} - -#[derive(Debug, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct PanelDiffs { - pub panel_id: String, - pub harness_name: String, - pub diffs: Vec, -} - -#[derive(Debug, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct ReplaySetup { - pub prompt: String, - pub working_dir: String, - pub pinned_commit: Option, - pub panels: Vec, -} - -#[derive(Debug, Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct ReplayPanel { - pub harness_id: String, - pub harness_name: String, - pub model: Option, -} - -#[tauri::command] -pub fn save_comparison( - db: State<'_, Db>, - id: String, - prompt: String, - working_dir: String, - pinned_commit: Option, - panels: Vec, -) -> Result<(), String> { - let conn = db.conn.lock().map_err(|e| e.to_string())?; - let now = chrono::Utc::now().to_rfc3339(); - - conn.execute( - "INSERT OR REPLACE INTO comparisons (id, prompt, working_dir, pinned_commit, created_at, status) VALUES (?1, ?2, ?3, ?4, ?5, 'running')", - rusqlite::params![id, prompt, working_dir, pinned_commit, now], - ) - .map_err(|e| e.to_string())?; - - for panel in &panels { - conn.execute( - "INSERT OR REPLACE INTO panels (id, comparison_id, harness_id, harness_name, model, status) VALUES (?1, ?2, ?3, ?4, ?5, 'running')", - rusqlite::params![panel.id, id, panel.harness_id, panel.harness_name, panel.model], - ) - .map_err(|e| e.to_string())?; - } - - Ok(()) -} - -#[tauri::command] -pub fn save_panel_result( - db: State<'_, Db>, - comparison_id: String, - panel_id: String, - exit_code: Option, - duration_ms: Option, - status: String, - output_text: Option, -) -> Result<(), String> { - let conn = db.conn.lock().map_err(|e| e.to_string())?; - - conn.execute( - "UPDATE panels SET exit_code = ?1, duration_ms = ?2, status = ?3, output_text = ?4 WHERE comparison_id = ?5 AND id = ?6", - rusqlite::params![exit_code, duration_ms, status, output_text, comparison_id, panel_id], - ) - .map_err(|e| e.to_string())?; - - // Check if all panels are done - let running_count: i64 = conn - .query_row( - "SELECT COUNT(*) FROM panels WHERE comparison_id = ?1 AND status = 'running'", - rusqlite::params![comparison_id], - |row| row.get(0), - ) - .map_err(|e| e.to_string())?; - - if running_count == 0 { - conn.execute( - "UPDATE comparisons SET status = 'complete' WHERE id = ?1", - rusqlite::params![comparison_id], - ) - .map_err(|e| e.to_string())?; - } - - Ok(()) -} - -#[tauri::command] -pub fn list_comparisons( - db: State<'_, Db>, - limit: Option, - offset: Option, -) -> Result, String> { - let conn = db.conn.lock().map_err(|e| e.to_string())?; - let limit = limit.unwrap_or(50); - let offset = offset.unwrap_or(0); - - let mut stmt = conn - .prepare("SELECT id, prompt, working_dir, pinned_commit, created_at, status FROM comparisons ORDER BY created_at DESC LIMIT ?1 OFFSET ?2") - .map_err(|e| e.to_string())?; - - let mut comparisons: Vec = stmt - .query_map(rusqlite::params![limit, offset], |row| { - Ok(ComparisonSummary { - id: row.get(0)?, - prompt: row.get(1)?, - working_dir: row.get(2)?, - pinned_commit: row.get(3)?, - created_at: row.get(4)?, - status: row.get(5)?, - panels: vec![], - }) - }) - .map_err(|e| e.to_string())? - .collect::, _>>() - .map_err(|e| e.to_string())?; - - if comparisons.is_empty() { - return Ok(comparisons); - } - - // Load all panels in a single query instead of N+1 - let comp_ids: Vec<&str> = comparisons.iter().map(|c| c.id.as_str()).collect(); - let placeholders = comp_ids.iter().map(|_| "?").collect::>().join(","); - let sql = format!( - "SELECT id, comparison_id, harness_id, harness_name, model, exit_code, duration_ms, status FROM panels WHERE comparison_id IN ({}) ORDER BY comparison_id", - placeholders - ); - let mut panel_stmt = conn.prepare(&sql).map_err(|e| e.to_string())?; - let params = rusqlite::params_from_iter(comp_ids.iter()); - let all_panels: Vec<(String, PanelSummary)> = panel_stmt - .query_map(params, |row| { - Ok(( - row.get::<_, String>(1)?, - PanelSummary { - id: row.get(0)?, - harness_id: row.get(2)?, - harness_name: row.get(3)?, - model: row.get(4)?, - exit_code: row.get(5)?, - duration_ms: row.get(6)?, - status: row.get(7)?, - }, - )) - }) - .map_err(|e| e.to_string())? - .collect::, _>>() - .map_err(|e| e.to_string())?; - - // Group panels by comparison_id - let mut panel_map: HashMap> = HashMap::new(); - for (comp_id, panel) in all_panels { - panel_map.entry(comp_id).or_default().push(panel); - } - - for comp in &mut comparisons { - comp.panels = panel_map.remove(&comp.id).unwrap_or_default(); - } - - Ok(comparisons) -} - -#[tauri::command] -pub fn get_comparison( - db: State<'_, Db>, - comparison_id: String, -) -> Result { - let conn = db.conn.lock().map_err(|e| e.to_string())?; - - let mut comp = conn - .query_row( - "SELECT id, prompt, working_dir, pinned_commit, created_at, status FROM comparisons WHERE id = ?1", - rusqlite::params![comparison_id], - |row| { - Ok(ComparisonDetail { - id: row.get(0)?, - prompt: row.get(1)?, - working_dir: row.get(2)?, - pinned_commit: row.get(3)?, - created_at: row.get(4)?, - status: row.get(5)?, - panels: vec![], - }) - }, - ) - .map_err(|e| format!("Comparison not found: {}", e))?; - - // Load panels with diffs and evaluations - let mut panel_stmt = conn - .prepare("SELECT id, harness_id, harness_name, model, exit_code, duration_ms, status, output_text FROM panels WHERE comparison_id = ?1") - .map_err(|e| e.to_string())?; - - let panels: Vec = panel_stmt - .query_map(rusqlite::params![comparison_id], |row| { - Ok(PanelDetail { - id: row.get(0)?, - harness_id: row.get(1)?, - harness_name: row.get(2)?, - model: row.get(3)?, - exit_code: row.get(4)?, - duration_ms: row.get(5)?, - status: row.get(6)?, - output_text: row.get(7)?, - diffs: vec![], - evaluation: None, - }) - }) - .map_err(|e| e.to_string())? - .collect::, _>>() - .map_err(|e| e.to_string())?; - - for mut panel in panels { - // Load diffs - let mut diff_stmt = conn - .prepare("SELECT file_path, diff_text, change_type FROM file_diffs WHERE comparison_id = ?1 AND panel_id = ?2") - .map_err(|e| e.to_string())?; - - panel.diffs = diff_stmt - .query_map(rusqlite::params![comparison_id, panel.id], |row| { - Ok(FileDiffEntry { - file_path: row.get(0)?, - diff_text: row.get(1)?, - change_type: row.get(2)?, - }) - }) - .map_err(|e| e.to_string())? - .collect::, _>>() - .map_err(|e| e.to_string())?; - - // Load evaluation - let eval = conn.query_row( - "SELECT id, panel_id, correctness, completeness, code_quality, efficiency, reasoning, speed, safety, context_awareness, autonomy, adherence, overall_score, notes FROM evaluations WHERE comparison_id = ?1 AND panel_id = ?2 LIMIT 1", - rusqlite::params![comparison_id, panel.id], - |row| { - Ok(Evaluation { - id: row.get(0)?, - panel_id: row.get(1)?, - correctness: row.get(2)?, - completeness: row.get(3)?, - code_quality: row.get(4)?, - efficiency: row.get(5)?, - reasoning: row.get(6)?, - speed: row.get(7)?, - safety: row.get(8)?, - context_awareness: row.get(9)?, - autonomy: row.get(10)?, - adherence: row.get(11)?, - overall_score: row.get(12)?, - notes: row.get(13)?, - }) - }, - ); - panel.evaluation = eval.ok(); - - comp.panels.push(panel); - } - - Ok(comp) -} - -#[tauri::command] -pub fn delete_comparison(db: State<'_, Db>, comparison_id: String) -> Result<(), String> { - let conn = db.conn.lock().map_err(|e| e.to_string())?; - conn.execute( - "DELETE FROM comparisons WHERE id = ?1", - rusqlite::params![comparison_id], - ) - .map_err(|e| e.to_string())?; - Ok(()) -} - -#[tauri::command] -pub fn save_file_diffs( - db: State<'_, Db>, - comparison_id: String, - panel_id: String, - diffs: Vec, -) -> Result<(), String> { - let conn = db.conn.lock().map_err(|e| e.to_string())?; - conn.execute_batch("BEGIN").map_err(|e| e.to_string())?; - let result = (|| { - for diff in &diffs { - conn.execute( - "INSERT INTO file_diffs (comparison_id, panel_id, file_path, diff_text, change_type) VALUES (?1, ?2, ?3, ?4, ?5)", - rusqlite::params![comparison_id, panel_id, diff.file_path, diff.diff_text, diff.change_type], - ) - .map_err(|e| e.to_string())?; - } - Ok::<(), String>(()) - })(); - match result { - Ok(()) => conn.execute_batch("COMMIT").map_err(|e| e.to_string()), - Err(e) => { - let _ = conn.execute_batch("ROLLBACK"); - Err(e) - } - } -} - -#[tauri::command] -pub fn get_comparison_diffs( - db: State<'_, Db>, - comparison_id: String, -) -> Result, String> { - let conn = db.conn.lock().map_err(|e| e.to_string())?; - - let mut panel_stmt = conn - .prepare( - "SELECT DISTINCT panel_id, harness_name FROM panels WHERE comparison_id = ?1", - ) - .map_err(|e| e.to_string())?; - - let panels: Vec<(String, String)> = panel_stmt - .query_map(rusqlite::params![comparison_id], |row| { - Ok((row.get::<_, String>(0)?, row.get::<_, String>(1)?)) - }) - .map_err(|e| e.to_string())? - .collect::, _>>() - .map_err(|e| e.to_string())?; - - let mut result = Vec::new(); - for (panel_id, harness_name) in panels { - let mut diff_stmt = conn - .prepare("SELECT file_path, diff_text, change_type FROM file_diffs WHERE comparison_id = ?1 AND panel_id = ?2") - .map_err(|e| e.to_string())?; - - let diffs = diff_stmt - .query_map(rusqlite::params![comparison_id, panel_id], |row| { - Ok(FileDiffEntry { - file_path: row.get(0)?, - diff_text: row.get(1)?, - change_type: row.get(2)?, - }) - }) - .map_err(|e| e.to_string())? - .collect::, _>>() - .map_err(|e| e.to_string())?; - - result.push(PanelDiffs { - panel_id, - harness_name, - diffs, - }); - } - - Ok(result) -} - -#[tauri::command] -pub fn get_comparison_setup( - db: State<'_, Db>, - comparison_id: String, -) -> Result { - let conn = db.conn.lock().map_err(|e| e.to_string())?; - - let (prompt, working_dir, pinned_commit) = conn - .query_row( - "SELECT prompt, working_dir, pinned_commit FROM comparisons WHERE id = ?1", - rusqlite::params![comparison_id], - |row| { - Ok(( - row.get::<_, String>(0)?, - row.get::<_, String>(1)?, - row.get::<_, Option>(2)?, - )) - }, - ) - .map_err(|e| format!("Comparison not found: {}", e))?; - - let mut panel_stmt = conn - .prepare( - "SELECT harness_id, harness_name, model FROM panels WHERE comparison_id = ?1", - ) - .map_err(|e| e.to_string())?; - - let panels = panel_stmt - .query_map(rusqlite::params![comparison_id], |row| { - Ok(ReplayPanel { - harness_id: row.get(0)?, - harness_name: row.get(1)?, - model: row.get(2)?, - }) - }) - .map_err(|e| e.to_string())? - .collect::, _>>() - .map_err(|e| e.to_string())?; - - Ok(ReplaySetup { - prompt, - working_dir, - pinned_commit, - panels, - }) -} diff --git a/apps/desktop/src-tauri/src/commands/mod.rs b/apps/desktop/src-tauri/src/commands/mod.rs index 4151dd27..92a41593 100644 --- a/apps/desktop/src-tauri/src/commands/mod.rs +++ b/apps/desktop/src-tauri/src/commands/mod.rs @@ -4,8 +4,7 @@ pub mod hooks; pub mod claude_md; pub mod settings; pub mod observatory; -pub mod comparator; -pub mod comparator_db; +pub mod terminal; pub mod security; pub mod security_db; pub mod git; diff --git a/apps/desktop/src-tauri/src/commands/terminal.rs b/apps/desktop/src-tauri/src/commands/terminal.rs new file mode 100644 index 00000000..e44ae0aa --- /dev/null +++ b/apps/desktop/src-tauri/src/commands/terminal.rs @@ -0,0 +1,375 @@ +use portable_pty::{CommandBuilder, MasterPty, PtySize, native_pty_system}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::io::{Read, Write}; +use std::sync::Mutex; +use tauri::{AppHandle, Emitter, Manager, State}; +use uuid::Uuid; + +// ── State ─────────────────────────────────────────────────── + +pub struct TerminalState { + pub sessions: Mutex>, +} + +pub struct TerminalSession { + pub writer: Box, + pub master: Box, + pub killer: Box, +} + +impl Default for TerminalState { + fn default() -> Self { + Self { + sessions: Mutex::new(HashMap::new()), + } + } +} + +// ── Payloads ──────────────────────────────────────────────── + +#[derive(Clone, Serialize)] +#[serde(rename_all = "camelCase")] +struct TerminalOutputPayload { + terminal_id: String, + data: String, +} + +#[derive(Clone, Serialize)] +#[serde(rename_all = "camelCase")] +struct TerminalExitPayload { + terminal_id: String, + exit_code: Option, +} + +// ── Harness info (returned by detect_harnesses) ───────────── + +#[derive(Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct HarnessInfo { + pub id: String, + pub name: String, + pub command: String, + pub available: bool, + pub version: Option, + pub mode: Option, + pub authenticated: bool, + pub models: Vec, + pub default_model: Option, +} + +// ── Commands ──────────────────────────────────────────────── + +/// Return the current working directory of the Tauri process. +#[tauri::command] +pub async fn get_cwd() -> Result { + std::env::current_dir() + .map(|p| p.to_string_lossy().to_string()) + .map_err(|e| format!("get_cwd: {e}")) +} + +/// Create a new terminal session with the user's login shell. +#[tauri::command] +pub async fn create_terminal( + app: AppHandle, + state: State<'_, TerminalState>, + project_path: String, +) -> Result { + let terminal_id = Uuid::new_v4().to_string(); + + let pty_system = native_pty_system(); + let pair = pty_system + .openpty(PtySize { + rows: 24, + cols: 80, + pixel_width: 0, + pixel_height: 0, + }) + .map_err(|e| format!("openpty: {e}"))?; + + let shell = std::env::var("SHELL").unwrap_or_else(|_| "/bin/zsh".to_string()); + let mut cmd = CommandBuilder::new(&shell); + cmd.arg("-l"); + cmd.env("TERM", "xterm-256color"); + cmd.env("FORCE_COLOR", "1"); + cmd.env("CLICOLOR_FORCE", "1"); + if !project_path.is_empty() { + cmd.cwd(&project_path); + } + + let mut child = pair + .slave + .spawn_command(cmd) + .map_err(|e| format!("spawn: {e}"))?; + drop(pair.slave); + + let mut reader = pair + .master + .try_clone_reader() + .map_err(|e| format!("clone_reader: {e}"))?; + let writer = pair + .master + .take_writer() + .map_err(|e| format!("take_writer: {e}"))?; + + let killer = child.clone_killer(); + + // Store session + { + let mut sessions = state.sessions.lock().map_err(|e| e.to_string())?; + sessions.insert( + terminal_id.clone(), + TerminalSession { + writer, + master: pair.master, + killer, + }, + ); + } + + // Reader thread — emits terminal://output and terminal://exit events + let tid = terminal_id.clone(); + let app_handle = app.clone(); + std::thread::spawn(move || { + let mut buf = [0u8; 4096]; + loop { + match reader.read(&mut buf) { + Ok(0) => break, + Ok(n) => { + let data = String::from_utf8_lossy(&buf[..n]).to_string(); + let _ = app_handle.emit( + "terminal://output", + TerminalOutputPayload { + terminal_id: tid.clone(), + data, + }, + ); + } + Err(_) => break, + } + } + + // Child exited — get exit code + let exit_code = child + .wait() + .ok() + .map(|status| status.exit_code()); + + let _ = app_handle.emit( + "terminal://exit", + TerminalExitPayload { + terminal_id: tid.clone(), + exit_code, + }, + ); + + // Clean up session (state accessed via app handle) + // Clean up: access managed state via the app handle + let maybe: Option> = app_handle.try_state(); + if let Some(st) = maybe { + if let Ok(mut map) = st.sessions.lock() { + let map: &mut HashMap = &mut map; + map.remove(&tid); + } + } + }); + + Ok(terminal_id) +} + +/// Destroy a terminal session. +#[tauri::command] +pub async fn destroy_terminal( + state: State<'_, TerminalState>, + terminal_id: String, +) -> Result<(), String> { + let mut sessions = state.sessions.lock().map_err(|e| e.to_string())?; + if let Some(mut session) = sessions.remove(&terminal_id) { + session.killer.kill().ok(); + } + Ok(()) +} + +/// Write data to a terminal's PTY stdin. +#[tauri::command] +pub async fn write_terminal( + state: State<'_, TerminalState>, + terminal_id: String, + data: String, +) -> Result<(), String> { + let mut sessions = state.sessions.lock().map_err(|e| e.to_string())?; + if let Some(session) = sessions.get_mut(&terminal_id) { + session + .writer + .write_all(data.as_bytes()) + .map_err(|e| format!("write: {e}"))?; + session + .writer + .flush() + .map_err(|e| format!("flush: {e}"))?; + Ok(()) + } else { + Err(format!("No terminal session: {}", terminal_id)) + } +} + +/// Resize a terminal's PTY dimensions. +#[tauri::command] +pub async fn resize_terminal( + state: State<'_, TerminalState>, + terminal_id: String, + rows: u16, + cols: u16, +) -> Result<(), String> { + let sessions = state.sessions.lock().map_err(|e| e.to_string())?; + if let Some(session) = sessions.get(&terminal_id) { + session + .master + .resize(PtySize { + rows, + cols, + pixel_width: 0, + pixel_height: 0, + }) + .map_err(|e| format!("resize: {e}"))?; + Ok(()) + } else { + Err(format!("No terminal session: {}", terminal_id)) + } +} + +/// Detect available CLI harnesses (claude, copilot, cursor agent, codex). +#[tauri::command] +pub async fn detect_harnesses(app: AppHandle) -> Result, String> { + use tauri_plugin_shell::ShellExt; + + // (id, display name, binary name, default models) + let definitions: Vec<(&str, &str, &str, Vec<&str>)> = vec![ + ("claude", "Claude Code", "claude", vec![ + "claude-sonnet-4-6", "claude-opus-4-6", "claude-haiku-4-5", + ]), + ("cursor-agent", "Cursor Agent", "agent", vec![]), + ("copilot", "GitHub Copilot", "copilot", vec![ + "claude-sonnet-4", "gpt-5", + ]), + ("codex", "Codex CLI", "codex", vec![ + "o4-mini", "gpt-4.1", + ]), + ]; + + let mut harnesses = Vec::new(); + + for (id, name, check_cmd, default_models) in &definitions { + let shell = app.shell(); + let output = shell + .command(check_cmd) + .args(vec!["--version"]) + .output() + .await; + + let available = output.as_ref().is_ok_and(|o| o.status.success()); + let version = output + .as_ref() + .ok() + .filter(|o| o.status.success()) + .map(|o| String::from_utf8_lossy(&o.stdout).trim().to_string()); + + let authenticated = available; + + let models: Vec = if available { + default_models.iter().map(|m| m.to_string()).collect() + } else { + vec![] + }; + let default_model = models.first().cloned(); + + harnesses.push(HarnessInfo { + id: id.to_string(), + name: name.to_string(), + command: check_cmd.to_string(), + available, + version, + mode: if available { + Some("supported".to_string()) + } else { + None + }, + authenticated, + models, + default_model, + }); + } + + Ok(harnesses) +} + +// ── Tests ─────────────────────────────────────────────────── + +#[cfg(test)] +mod tests { + use super::*; + + // ── get_cwd ────────────────────────────────────────────────── + + #[tokio::test] + async fn get_cwd_returns_valid_path() { + let result = super::get_cwd().await; + assert!(result.is_ok()); + let path = result.unwrap(); + assert!(!path.is_empty()); + assert!(std::path::Path::new(&path).is_absolute()); + } + + // ── Serde wire-format tests ────────────────────────────────── + // These verify that the JSON field names match what the frontend + // expects. If you rename a Rust field or change serde attributes, + // these will break — preventing silent mismatches with the JS code. + + #[test] + fn output_payload_serializes_camel_case() { + let payload = TerminalOutputPayload { + terminal_id: "t-1".into(), + data: "hello".into(), + }; + let json: serde_json::Value = serde_json::to_value(&payload).unwrap(); + // Frontend reads: event.payload.terminalId, event.payload.data + assert_eq!(json["terminalId"], "t-1"); + assert_eq!(json["data"], "hello"); + // Ensure snake_case keys do NOT exist + assert!(json.get("terminal_id").is_none()); + } + + #[test] + fn exit_payload_serializes_camel_case() { + let payload = TerminalExitPayload { + terminal_id: "t-2".into(), + exit_code: Some(42), + }; + let json: serde_json::Value = serde_json::to_value(&payload).unwrap(); + // Frontend reads: event.payload.terminalId, event.payload.exitCode + assert_eq!(json["terminalId"], "t-2"); + assert_eq!(json["exitCode"], 42); + // Ensure snake_case keys do NOT exist + assert!(json.get("terminal_id").is_none()); + assert!(json.get("exit_code").is_none()); + } + + #[test] + fn harness_info_serializes_camel_case() { + let info = HarnessInfo { + id: "claude".into(), + name: "Claude Code".into(), + command: "claude".into(), + available: true, + version: Some("1.0".into()), + mode: None, + authenticated: true, + models: vec!["claude-sonnet-4-6".into()], + default_model: Some("claude-sonnet-4-6".into()), + }; + let json: serde_json::Value = serde_json::to_value(&info).unwrap(); + // Frontend reads camelCase: defaultModel, not default_model + assert_eq!(json["defaultModel"], "claude-sonnet-4-6"); + assert!(json.get("default_model").is_none()); + } +} diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index de2d4194..220df2da 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -11,7 +11,7 @@ mod membrain_commands; pub static HOME_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(()); use tauri::Manager; -use commands::comparator::ComparatorState; +use commands::terminal::TerminalState; use board_server::BoardServerState; use membrain_commands::MembrainServerState; @@ -27,7 +27,7 @@ pub fn run() { .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_window_state::Builder::default().build()) .plugin(tauri_plugin_dialog::init()) - .manage(ComparatorState::default()) + .manage(TerminalState::default()) .manage(database) .manage(BoardServerState::new()) .manage(commands::relay::LocalRelay(tokio::sync::Mutex::new(None))) @@ -73,19 +73,13 @@ pub fn run() { commands::observatory::read_live_activity, commands::observatory::compute_live_stats, commands::observatory::read_session_transcript, - // Comparator — live - commands::comparator::detect_harnesses, - commands::comparator::start_comparison, - commands::comparator::kill_panel, - // Comparator — persistence - commands::comparator_db::save_comparison, - commands::comparator_db::save_panel_result, - commands::comparator_db::list_comparisons, - commands::comparator_db::get_comparison, - commands::comparator_db::delete_comparison, - commands::comparator_db::save_file_diffs, - commands::comparator_db::get_comparison_diffs, - commands::comparator_db::get_comparison_setup, + // Terminal sessions + commands::terminal::get_cwd, + commands::terminal::create_terminal, + commands::terminal::destroy_terminal, + commands::terminal::write_terminal, + commands::terminal::resize_terminal, + commands::terminal::detect_harnesses, // Git commands::git::check_git_repo, commands::git::create_worktrees, diff --git a/apps/desktop/src/App.tsx b/apps/desktop/src/App.tsx index 1c1d50dc..f9ac17e0 100644 --- a/apps/desktop/src/App.tsx +++ b/apps/desktop/src/App.tsx @@ -15,10 +15,7 @@ import SyncPage from "./pages/harness/SyncPage"; import MarketplacePage from "./pages/marketplace/MarketplacePage"; import DashboardPage from "./pages/observatory/DashboardPage"; import SessionsPage from "./pages/observatory/SessionsPage"; -import ComparatorSetupPage from "./pages/comparator/ComparatorSetupPage"; -import ComparatorRunPage from "./pages/comparator/ComparatorRunPage"; -import ComparatorHistoryPage from "./pages/comparator/ComparatorHistoryPage"; -import ComparatorAnalyticsPage from "./pages/comparator/ComparatorAnalyticsPage"; +import TerminalsPage from "./pages/terminals/TerminalsPage"; import PermissionsPage from "./pages/security/PermissionsPage"; import SecretsPage from "./pages/security/SecretsPage"; import AuditLogPage from "./pages/security/AuditLogPage"; @@ -80,12 +77,8 @@ export default function App() { } /> } /> - {/* Comparator */} - } /> - } /> - } /> - } /> - } /> + {/* Terminals */} + } /> {/* Security */} } /> diff --git a/apps/desktop/src/app.css b/apps/desktop/src/app.css index 8fd961ba..b119207c 100644 --- a/apps/desktop/src/app.css +++ b/apps/desktop/src/app.css @@ -959,492 +959,6 @@ body { font-size: 10px; } -/* ── Comparator panels ── */ -.comparator-panel { - display: flex; - flex-direction: column; - flex: 1; - min-width: 0; - border-radius: 0; - overflow: hidden; -} - -.comparator-output { - flex: 1; - overflow-y: auto; - padding: 12px 14px; - font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace; - font-size: 12px; - line-height: 1.6; - white-space: pre-wrap; - word-break: break-word; - background: #1a1a2e; - color: #e0e0e8; -} - -.dark .comparator-output { - background: #0d0d1a; - color: #d0d0dc; -} - -.comparator-status-bar { - flex-shrink: 0; -} - -/* ── Board scope — aliases desktop vars → board vars ── */ -.board-scope { - /* Text */ - --text-primary: var(--fg-base); - --text-secondary: var(--fg-muted); - --text-muted: var(--fg-subtle); - /* Backgrounds */ - --bg-hover: var(--hover-bg); - --bg-surface: var(--bg-surface); - --bg-elevated: var(--bg-elevated); - /* Borders */ - --border: var(--border-base); - --border-subtle: var(--separator); - /* Accent */ - --accent-dim: var(--accent-light); - /* Status colors */ - --status-backlog: var(--fg-subtle); - --status-planning: var(--fg-subtle); - --status-in-progress: #2563eb; - --status-review: var(--warning); - --status-ai-review: #d97706; - --status-human-review: #f59e0b; - --status-done: var(--success); - --blocked: var(--danger); -} - -/* ── Plugin explorer animations ── */ -@keyframes pulse { - 0%, 100% { opacity: 1; } - 50% { opacity: 0.4; } -} - -@keyframes shimmer { - 0% { opacity: 0.3; } - 50% { opacity: 0.6; } - 100% { opacity: 0.3; } -} - -/* ── Comparator: progress bar ── */ -.comp-progress-bar { - display: flex; - align-items: stretch; - background: var(--bg-surface); - border-bottom: 1px solid var(--border-base); - flex-shrink: 0; -} - -.comp-progress-segment { - flex: 1; - display: flex; - align-items: center; - justify-content: center; - gap: 6px; - padding: 6px 12px; - font-size: 11px; - font-weight: 500; - color: var(--fg-muted); - border-right: 1px solid var(--border-base); -} - -.comp-progress-segment:last-child { - border-right: none; -} - -.comp-progress-dot { - display: inline-block; - width: 7px; - height: 7px; - border-radius: 50%; - flex-shrink: 0; -} - -.comp-progress-dot.running { - background: var(--accent); - animation: comp-pulse 1.2s ease-in-out infinite; -} - -.comp-progress-dot.complete { - background: var(--success); -} - -.comp-progress-dot.killed { - background: var(--danger); -} - -.comp-progress-dot.pending { - background: var(--fg-subtle); - opacity: 0.4; -} - -@keyframes comp-pulse { - 0%, 100% { opacity: 1; transform: scale(1); } - 50% { opacity: 0.4; transform: scale(0.8); } -} - -.comp-progress-summary { - font-size: 10px; - color: var(--fg-subtle); - text-align: center; - padding: 4px 12px; - background: var(--bg-surface); - border-bottom: 1px solid var(--border-base); -} - -/* ── Comparator: mode badge ── */ -.comp-mode-badge { - display: inline-flex; - align-items: center; - font-size: 9px; - font-weight: 700; - letter-spacing: 0.06em; - text-transform: uppercase; - padding: 2px 6px; - border-radius: 10px; - line-height: 1; - flex-shrink: 0; - white-space: nowrap; -} - -.comp-mode-badge-live { - background: rgba(22, 163, 74, 0.12); - color: var(--success); -} - -.comp-mode-badge-review { - background: rgba(91, 80, 232, 0.10); - color: var(--accent-text); -} - -/* ── Comparator: disabled tab ── */ -.tab.comp-tab-disabled { - color: var(--fg-subtle); - opacity: 0.5; - cursor: not-allowed; -} - -.tab.comp-tab-disabled:hover { - color: var(--fg-subtle); -} - -/* ── Comparator: prompt chevron ── */ -.comp-prompt-chevron { - display: inline-block; - color: var(--fg-subtle); - font-size: 10px; - margin-right: 6px; - transition: transform 0.15s ease; - flex-shrink: 0; -} - -.comp-prompt-chevron.expanded { - transform: rotate(90deg); -} - -/* ── DiffView: context fold row ── */ -.diff-fold-row { - cursor: pointer; - user-select: none; -} - -.diff-fold-row:hover .diff-fold-label { - color: var(--fg-muted); - border-color: var(--border-strong); -} - -.diff-fold-label { - text-align: center; - color: var(--fg-subtle); - font-size: 10px; - font-style: italic; - padding: 3px 0; - border-top: 1px dashed var(--border-base); - border-bottom: 1px dashed var(--border-base); - background: var(--bg-surface); - transition: color 0.1s, border-color 0.1s; -} - -/* ── DiffView: summary header ── */ -.diff-summary-header { - padding: 6px 16px; - font-size: 12px; - color: var(--fg-muted); - background: var(--bg-surface); - border-bottom: 1px solid var(--border-base); - flex-shrink: 0; -} - -.diff-summary-header strong { - color: var(--fg-base); - font-weight: 600; -} - -/* ── Confirm dialog ── */ -.confirm-overlay { - position: fixed; - inset: 0; - background: rgba(0, 0, 0, 0.5); - z-index: 1000; - display: flex; - align-items: center; - justify-content: center; -} - -.confirm-card { - max-width: 400px; - width: 100%; - background: var(--bg-surface); - border: 1px solid var(--border-base); - border-radius: 8px; - box-shadow: var(--shadow-lg); - padding: 20px; -} - -.confirm-title { - font-size: 14px; - font-weight: 600; - color: var(--fg-base); - margin-bottom: 8px; -} - -.confirm-message { - font-size: 13px; - color: var(--fg-muted); - margin-bottom: 20px; - line-height: 1.5; -} - -.confirm-actions { - display: flex; - gap: 8px; - justify-content: flex-end; -} - -/* ── Pairwise voting ─────────────────────────────────────────── */ - -.pairwise-loading { - display: flex; - align-items: center; - justify-content: center; - height: 100%; - color: var(--fg-subtle); - font-size: 12px; -} - -.eval-cta-hint { - font-size: 11px; - color: var(--fg-subtle); - margin-top: 6px; - text-align: center; -} - -.pairwise-progress { - display: flex; - align-items: center; - gap: 12px; - padding: 10px 16px; - border-bottom: 1px solid var(--border-base); - background: var(--bg-surface); - flex-shrink: 0; -} - -.pairwise-progress-pill { - font-size: 11px; - color: var(--fg-muted); - background: var(--bg-base); - border: 1px solid var(--border-base); - border-radius: 10px; - padding: 2px 8px; -} - -.pairwise-vote-table { - width: 100%; - border-collapse: collapse; - font-size: 12px; -} - -.pairwise-vote-table thead th { - padding: 6px 12px; - text-align: center; - font-size: 11px; - font-weight: 600; - color: var(--fg-muted); - border-bottom: 1px solid var(--border-base); - background: var(--bg-surface); -} - -.pairwise-vote-table thead th:first-child { - text-align: left; -} - -.pairwise-dim-label { - padding: 8px 12px; - color: var(--fg-muted); - white-space: nowrap; -} - -.pairwise-vote-cell { - text-align: center; - padding: 4px 8px; -} - -.pairwise-vote-row:hover { - background: var(--bg-hover); -} - -.pairwise-vote-btn { - min-width: 40px; - padding: 4px 10px; - border-radius: 4px; - border: 1px solid var(--border-base); - background: var(--bg-base); - color: var(--fg-muted); - font-size: 11px; - cursor: pointer; - transition: background 0.1s, color 0.1s; -} - -.pairwise-vote-btn:hover { - background: var(--bg-hover); - color: var(--fg-base); -} - -.pairwise-vote-btn.selected.left { - background: rgba(59, 130, 246, 0.15); - color: var(--accent-text); - border-color: var(--accent); - font-weight: 600; -} - -.pairwise-vote-btn.selected.right { - background: rgba(168, 85, 247, 0.12); - color: #a855f7; - border-color: #a855f7; - font-weight: 600; -} - -.pairwise-vote-btn.selected.tie { - background: rgba(107, 114, 128, 0.15); - color: var(--fg-base); - border-color: var(--fg-subtle); - font-weight: 600; -} - -.pairwise-results { - display: flex; - flex-direction: column; - height: 100%; - overflow: auto; - padding: 16px; - gap: 16px; -} - -.pairwise-reveal-header { - display: flex; - align-items: center; - gap: 8px; - font-size: 12px; - padding: 10px 12px; - border-radius: 6px; - background: var(--bg-surface); - border: 1px solid var(--border-base); - flex-wrap: wrap; -} - -.pairwise-label-reveal { - font-weight: 600; - color: var(--fg-muted); -} - -.pairwise-label-eq { - color: var(--fg-subtle); -} - -.pairwise-harness-name { - color: var(--fg-base); - font-weight: 500; -} - -.pairwise-model { - color: var(--fg-subtle); - font-size: 10px; -} - -.pairwise-separator { - flex: 0 0 1px; - width: 1px; - height: 14px; - background: var(--border-base); - margin: 0 4px; -} - -.pairwise-results-table { - width: 100%; - border-collapse: collapse; - font-size: 12px; -} - -.pairwise-results-table th { - text-align: left; - padding: 6px 12px; - font-size: 11px; - font-weight: 600; - color: var(--fg-muted); - border-bottom: 1px solid var(--border-base); -} - -.pairwise-results-table td { - padding: 7px 12px; - border-bottom: 1px solid var(--border-subtle); - color: var(--fg-muted); -} - -.pairwise-result-cell.left { color: var(--accent-text); font-weight: 500; } -.pairwise-result-cell.right { color: #a855f7; font-weight: 500; } -.pairwise-result-cell.tie { color: var(--fg-subtle); } -.pairwise-result-cell.unvoted { color: var(--fg-subtle); font-style: italic; } - -.pairwise-tally { - font-size: 12px; - color: var(--fg-muted); - padding: 8px 12px; - background: var(--bg-surface); - border-radius: 6px; - border: 1px solid var(--border-base); -} - -/* Mode toggle */ - -.eval-mode-toggle { - display: flex; - border: 1px solid var(--border-base); - border-radius: 5px; - overflow: hidden; -} - -.eval-mode-btn { - padding: 4px 14px; - font-size: 11px; - background: var(--bg-base); - color: var(--fg-muted); - border: none; - border-right: 1px solid var(--border-base); - cursor: pointer; -} - -.eval-mode-btn:last-child { - border-right: none; -} - -.eval-mode-btn.active { - background: var(--accent); - color: var(--accent-fg); - font-weight: 600; -} /* ── Reduced motion ── */ @media (prefers-reduced-motion: reduce) { diff --git a/apps/desktop/src/components/comparator/DiffCompareView.tsx b/apps/desktop/src/components/comparator/DiffCompareView.tsx deleted file mode 100644 index 276e390a..00000000 --- a/apps/desktop/src/components/comparator/DiffCompareView.tsx +++ /dev/null @@ -1,81 +0,0 @@ -interface FileDiff { - filePath: string; - diffText: string; - changeType: string; -} - -interface DiffCompareViewProps { - filePath: string; - leftLabel: string; - rightLabel: string; - leftDiff: FileDiff | null; - rightDiff: FileDiff | null; - onClose?: () => void; -} - -function renderDiffLines(diffText: string) { - return diffText.split("\n").map((line, i) => { - let bg = "transparent"; - let color = "var(--fg-muted)"; - if (line.startsWith("+") && !line.startsWith("+++")) { - bg = "rgba(22, 163, 74, 0.1)"; - color = "var(--success)"; - } else if (line.startsWith("-") && !line.startsWith("---")) { - bg = "rgba(220, 38, 38, 0.08)"; - color = "var(--danger)"; - } else if (line.startsWith("@@")) { - color = "var(--accent-text)"; - } - return ( -
- {line} -
- ); - }); -} - -export default function DiffCompareView({ - filePath, leftLabel, rightLabel, leftDiff, rightDiff, onClose, -}: DiffCompareViewProps) { - return ( -
-
- {filePath} - {onClose && ( - - )} -
- -
- {[ - { label: leftLabel, diff: leftDiff }, - { label: rightLabel, diff: rightDiff }, - ].map(({ label, diff }) => ( -
-
Panel {label}
-
- {diff ? ( - renderDiffLines(diff.diffText) - ) : ( -
- No changes to this file -
- )} -
-
- ))} -
-
- ); -} diff --git a/apps/desktop/src/components/comparator/DiffView.tsx b/apps/desktop/src/components/comparator/DiffView.tsx deleted file mode 100644 index 887f25e4..00000000 --- a/apps/desktop/src/components/comparator/DiffView.tsx +++ /dev/null @@ -1,576 +0,0 @@ -import { useState, useMemo, useEffect, Fragment } from "react"; - -// ── ANSI strip ────────────────────────────────────────────── - -/** Strip ANSI escape codes (colors, cursor moves, etc.) from terminal output. */ -function stripAnsi(text: string): string { - // Covers SGR, CSI sequences, OSC sequences, and other common escapes - return text.replace( - // eslint-disable-next-line no-control-regex - /[\u001b\u009b][\[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><~]/g, - "", - ); -} - -// ── LCS diff ──────────────────────────────────────────────── - -type DiffOp = "equal" | "insert" | "delete"; - -interface DiffLine { - op: DiffOp; - leftLine: string | null; // null when op === "insert" - rightLine: string | null; // null when op === "delete" - leftNum: number | null; - rightNum: number | null; -} - -/** - * Compute a side-by-side diff of two string arrays using LCS (longest common - * subsequence). Returns an array of DiffLine entries suitable for rendering. - * - * For large inputs we bail out of full O(n*m) LCS and fall back to a simpler - * line-equality scan to keep the UI responsive. - */ -function computeDiff(leftLines: string[], rightLines: string[]): DiffLine[] { - const n = leftLines.length; - const m = rightLines.length; - - // For very large outputs, fall back to a simple equal/delete/insert scan - // to avoid allocating a huge LCS table. - const MAX_CELLS = 2_000_000; - if (n * m > MAX_CELLS) { - return simpleDiff(leftLines, rightLines); - } - - // Build LCS length table - const dp: Uint16Array[] = Array.from({ length: n + 1 }, () => new Uint16Array(m + 1)); - for (let i = 1; i <= n; i++) { - for (let j = 1; j <= m; j++) { - if (leftLines[i - 1] === rightLines[j - 1]) { - dp[i][j] = dp[i - 1][j - 1] + 1; - } else { - dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); - } - } - } - - // Backtrack to produce diff ops - const result: DiffLine[] = []; - let i = n; - let j = m; - while (i > 0 || j > 0) { - if (i > 0 && j > 0 && leftLines[i - 1] === rightLines[j - 1]) { - result.push({ - op: "equal", - leftLine: leftLines[i - 1], - rightLine: rightLines[j - 1], - leftNum: i, - rightNum: j, - }); - i--; - j--; - } else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) { - result.push({ - op: "insert", - leftLine: null, - rightLine: rightLines[j - 1], - leftNum: null, - rightNum: j, - }); - j--; - } else { - result.push({ - op: "delete", - leftLine: leftLines[i - 1], - rightLine: null, - leftNum: i, - rightNum: null, - }); - i--; - } - } - result.reverse(); - return result; -} - -/** Fallback diff for very large inputs — O(n+m) line-pair scan. */ -function simpleDiff(leftLines: string[], rightLines: string[]): DiffLine[] { - const result: DiffLine[] = []; - let li = 0; - let ri = 0; - while (li < leftLines.length && ri < rightLines.length) { - if (leftLines[li] === rightLines[ri]) { - result.push({ - op: "equal", - leftLine: leftLines[li], - rightLine: rightLines[ri], - leftNum: li + 1, - rightNum: ri + 1, - }); - li++; - ri++; - } else { - // Scan ahead in right for a match of the current left line - let foundRight = -1; - for (let k = ri + 1; k < Math.min(ri + 50, rightLines.length); k++) { - if (rightLines[k] === leftLines[li]) { foundRight = k; break; } - } - // Scan ahead in left for a match of the current right line - let foundLeft = -1; - for (let k = li + 1; k < Math.min(li + 50, leftLines.length); k++) { - if (leftLines[k] === rightLines[ri]) { foundLeft = k; break; } - } - - if (foundRight !== -1 && (foundLeft === -1 || (foundRight - ri) <= (foundLeft - li))) { - // Emit right-side insertions up to the match - while (ri < foundRight) { - result.push({ op: "insert", leftLine: null, rightLine: rightLines[ri], leftNum: null, rightNum: ri + 1 }); - ri++; - } - } else if (foundLeft !== -1) { - // Emit left-side deletions up to the match - while (li < foundLeft) { - result.push({ op: "delete", leftLine: leftLines[li], rightLine: null, leftNum: li + 1, rightNum: null }); - li++; - } - } else { - // No nearby match — emit one delete + one insert - result.push({ op: "delete", leftLine: leftLines[li], rightLine: null, leftNum: li + 1, rightNum: null }); - li++; - result.push({ op: "insert", leftLine: null, rightLine: rightLines[ri], leftNum: null, rightNum: ri + 1 }); - ri++; - } - } - } - while (li < leftLines.length) { - result.push({ op: "delete", leftLine: leftLines[li], rightLine: null, leftNum: li + 1, rightNum: null }); - li++; - } - while (ri < rightLines.length) { - result.push({ op: "insert", leftLine: null, rightLine: rightLines[ri], leftNum: null, rightNum: ri + 1 }); - ri++; - } - return result; -} - -// ── Component ─────────────────────────────────────────────── - -export interface OutputPanel { - panelId: string; - harnessName: string; - model?: string; - outputText: string; -} - -interface DiffViewProps { - panels: OutputPanel[]; -} - -const MONO_FAMILY = "ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace"; - -/** Minimum consecutive equal lines before collapsing into a fold. */ -const FOLD_THRESHOLD = 5; - -/** - * Group diff lines into renderable rows, collapsing long runs of equal lines - * into fold markers. - */ -type RenderRow = - | { kind: "line"; line: DiffLine; index: number } - | { kind: "fold"; rangeKey: string; startIndex: number; count: number; lines: DiffLine[] }; - -function buildRenderRows(diffLines: DiffLine[]): RenderRow[] { - const rows: RenderRow[] = []; - let i = 0; - while (i < diffLines.length) { - if (diffLines[i].op === "equal") { - // Count consecutive equal lines - let j = i; - while (j < diffLines.length && diffLines[j].op === "equal") j++; - const count = j - i; - if (count >= FOLD_THRESHOLD) { - rows.push({ - kind: "fold", - rangeKey: `fold-${i}`, - startIndex: i, - count, - lines: diffLines.slice(i, j), - }); - i = j; - } else { - for (; i < j; i++) { - rows.push({ kind: "line", line: diffLines[i], index: i }); - } - } - } else { - rows.push({ kind: "line", line: diffLines[i], index: i }); - i++; - } - } - return rows; -} - -export default function DiffView({ panels }: DiffViewProps) { - const [leftIdx, setLeftIdx] = useState(0); - const [rightIdx, setRightIdx] = useState(Math.min(1, panels.length - 1)); - const [expandedFolds, setExpandedFolds] = useState>(new Set()); - - // Reset expanded folds when panel selection changes - const toggleFold = (key: string) => { - setExpandedFolds((prev) => { - const next = new Set(prev); - if (next.has(key)) next.delete(key); - else next.add(key); - return next; - }); - }; - - // Compute diff between selected panels - const diffLines = useMemo(() => { - if (panels.length < 2) return []; - const leftText = stripAnsi(panels[leftIdx]?.outputText ?? ""); - const rightText = stripAnsi(panels[rightIdx]?.outputText ?? ""); - const left = leftText.split("\n"); - const right = rightText.split("\n"); - return computeDiff(left, right); - }, [panels, leftIdx, rightIdx]); - - // Reset folds when diff changes - useEffect(() => { setExpandedFolds(new Set()); }, [diffLines]); - - // Build render rows with folding - const renderRows = useMemo(() => buildRenderRows(diffLines), [diffLines]); - - // Stats - const stats = useMemo(() => { - let added = 0; - let removed = 0; - let unchanged = 0; - for (const d of diffLines) { - if (d.op === "insert") added++; - else if (d.op === "delete") removed++; - else unchanged++; - } - const totalDiffer = added + removed; - const totalLines = added + removed + unchanged; - return { added, removed, unchanged, totalDiffer, totalLines }; - }, [diffLines]); - - if (panels.length < 2) { - return ( -
-
-

- Need at least 2 panels to compare -

-

- Run a comparison with multiple tools to see how their outputs differ. -

-
-
- ); - } - - const panelLabel = (p: OutputPanel) => - p.model ? `${p.harnessName} (${p.model})` : p.harnessName; - - return ( -
- {/* Summary header */} - {leftIdx !== rightIdx && ( -
- Comparing {panelLabel(panels[leftIdx])} vs{" "} - {panelLabel(panels[rightIdx])} - {" \u2014 "} - {stats.totalDiffer} line{stats.totalDiffer !== 1 ? "s" : ""} differ out of {stats.totalLines} -
- )} - - {/* Selector bar */} -
- - - vs - - - -
- {stats.removed > 0 && ( - -{stats.removed} removed - )} - {stats.added > 0 && ( - +{stats.added} added - )} - - {stats.unchanged} unchanged - -
-
- - {/* Column headers */} -
-
- {panelLabel(panels[leftIdx])} -
-
- {panelLabel(panels[rightIdx])} -
-
- - {/* Same-panel warning */} - {leftIdx === rightIdx && ( -
- Both sides are the same panel. Select different panels to see differences. -
- )} - - {/* Diff content */} -
- {diffLines.length === 0 && leftIdx !== rightIdx ? ( -
- Both panels produced identical output. -
- ) : ( - - - {renderRows.map((row) => { - if (row.kind === "fold") { - const isExpanded = expandedFolds.has(row.rangeKey); - if (isExpanded) { - // Render all the equal lines in this fold - return ( - - {row.lines.map((d, fi) => ( - - ))} - - ); - } - // Render collapsed fold marker - return ( - toggleFold(row.rangeKey)} - > - - - ); - } - return ; - })} - -
- {"\u2014"} {row.count} unchanged lines {"\u2014"} -
- )} -
-
- ); -} - -/** Single diff line row — extracted for reuse in fold expansion. */ -function DiffLineRow({ d }: { d: DiffLine }) { - let leftBg = "transparent"; - let rightBg = "transparent"; - let leftColor = "var(--fg-muted)"; - let rightColor = "var(--fg-muted)"; - - if (d.op === "delete") { - leftBg = "rgba(220, 38, 38, 0.08)"; - leftColor = "var(--danger)"; - } else if (d.op === "insert") { - rightBg = "rgba(22, 163, 74, 0.1)"; - rightColor = "var(--success)"; - } - - return ( - - {/* Left line number */} - - {d.leftNum ?? ""} - - {/* Left content */} - - {d.leftLine ?? ""} - - {/* Right line number */} - - {d.rightNum ?? ""} - - {/* Right content */} - - {d.rightLine ?? ""} - - - ); -} diff --git a/apps/desktop/src/components/comparator/EvaluationPanel.tsx b/apps/desktop/src/components/comparator/EvaluationPanel.tsx deleted file mode 100644 index 1354fabc..00000000 --- a/apps/desktop/src/components/comparator/EvaluationPanel.tsx +++ /dev/null @@ -1,762 +0,0 @@ -import { useState, useEffect, useCallback, useRef } from "react"; -import { Command } from "@tauri-apps/plugin-shell"; -import { saveEvaluation, getEvaluations } from "../../lib/tauri"; -import ScoreRadar from "./ScoreRadar"; -import PairwisePanel from "./PairwisePanel"; - -const DIMENSIONS = [ - { key: "correctness", label: "Correctness" }, - { key: "completeness", label: "Completeness" }, - { key: "codeQuality", label: "Code Quality" }, - { key: "efficiency", label: "Efficiency" }, - { key: "reasoning", label: "Reasoning Quality" }, - { key: "speed", label: "Speed" }, - { key: "safety", label: "Safety & Security" }, - { key: "contextAwareness", label: "Context Awareness" }, - { key: "autonomy", label: "Autonomy & Tool Use" }, - { key: "adherence", label: "Adherence & Polish" }, -] as const; - -type DimensionKey = (typeof DIMENSIONS)[number]["key"]; - -/** Dimensions scored by AI (speed is always auto-calculated). */ -const AI_SCORED_DIMENSIONS = DIMENSIONS.filter((d) => d.key !== "speed"); - -/** Dimension grouping for the evaluation table. */ -const DIMENSION_GROUPS: { label: string; keys: DimensionKey[] }[] = [ - { label: "Quality", keys: ["correctness", "completeness", "codeQuality", "efficiency"] }, - { label: "Reasoning", keys: ["reasoning", "contextAwareness", "autonomy"] }, - { label: "Operational", keys: ["speed", "safety", "adherence"] }, -]; - -const POPOVER_VALUES = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as const; - -interface PanelInfo { - panelId: string; - harnessName: string; - model?: string; - durationMs: number | null; - outputText?: string; -} - -interface EvaluationPanelProps { - comparisonId: string; - panels: PanelInfo[]; - prompt?: string; - readOnly?: boolean; -} - -type ScoreMap = Record>>; - -type AiScoreState = "idle" | "scoring" | "done" | "error"; - -function computeOverall(scores: Partial>): number | null { - const vals = DIMENSIONS.map((d) => scores[d.key]).filter( - (v): v is number => v != null, - ); - if (vals.length === 0) return null; - return Math.round((vals.reduce((a, b) => a + b, 0) / vals.length) * 10) / 10; -} - -/** Compact score number display with click-to-edit popover */ -function ScoreNumber({ - value, - onChange, - disabled, -}: { - value: number | null; - onChange: (v: number | null) => void; - disabled?: boolean; -}) { - const [open, setOpen] = useState(false); - const ref = useRef(null); - - useEffect(() => { - if (!open) return; - const handleClick = (e: MouseEvent) => { - if (ref.current && !ref.current.contains(e.target as Node)) { - setOpen(false); - } - }; - document.addEventListener("mousedown", handleClick); - return () => document.removeEventListener("mousedown", handleClick); - }, [open]); - - return ( -
-
!disabled && setOpen((v) => !v)} - role="button" - tabIndex={0} - aria-label={`Score: ${value ?? "unset"}`} - > - {value != null ? value : "--"} -
- {open && !disabled && ( -
-
- {POPOVER_VALUES.map((n) => ( - - ))} -
-
- Poor - Avg - Excellent -
-
- )} -
- ); -} - -/** Build the scoring prompt sent to Claude for AI evaluation. */ -function buildScoringPrompt( - prompt: string, - panels: PanelInfo[], -): string { - const dimensionList = AI_SCORED_DIMENSIONS.map((d) => `- ${d.key}: ${d.label}`).join("\n"); - - const panelBlocks = panels - .map( - (p) => - `=== ${p.harnessName}${p.model ? ` (${p.model})` : ""} [panelId: ${p.panelId}] ===\n${p.outputText || "(no output)"}`, - ) - .join("\n\n"); - - return `You are evaluating AI coding tool responses. Rate each response on these dimensions using whole numbers 0-10: - -${dimensionList} - -The original prompt was: -${prompt} - -Here are the responses: - -${panelBlocks} - -Return ONLY valid JSON with this exact structure — no markdown fencing, no commentary: -{ - "${panels[0]?.panelId || "panel-0"}": { "correctness": N, "completeness": N, "codeQuality": N, "efficiency": N, "reasoning": N, "safety": N, "contextAwareness": N, "autonomy": N, "adherence": N }, - ...one object per panel... -} - -Every value must be an integer 0-10. Do not include "speed" — it is calculated separately.`; -} - -/** Parse Claude's JSON response into a ScoreMap. */ -function parseAiResponse(raw: string, panelIds: string[]): ScoreMap | null { - try { - // Strip markdown code fences if present - let cleaned = raw.trim(); - if (cleaned.startsWith("```")) { - cleaned = cleaned.replace(/^```(?:json)?\s*/, "").replace(/```\s*$/, ""); - } - const parsed = JSON.parse(cleaned); - if (typeof parsed !== "object" || parsed === null) return null; - - const result: ScoreMap = {}; - for (const pid of panelIds) { - const entry = parsed[pid]; - if (!entry || typeof entry !== "object") continue; - const dims: Partial> = {}; - for (const d of AI_SCORED_DIMENSIONS) { - const v = entry[d.key]; - if (typeof v === "number" && v >= 0 && v <= 10) { - dims[d.key] = Math.round(v); - } - } - result[pid] = dims; - } - return result; - } catch { - return null; - } -} - -export default function EvaluationPanel({ - comparisonId, - panels, - prompt = "", - readOnly = false, -}: EvaluationPanelProps) { - const [scores, setScores] = useState(() => { - const init: ScoreMap = {}; - for (const p of panels) { - const dims: Partial> = {}; - for (const d of DIMENSIONS) { - dims[d.key] = d.key === "speed" && p.durationMs != null - ? Math.max(0, Math.min(10, Math.round((1 - p.durationMs / 600000) * 10))) - : null; - } - init[p.panelId] = dims; - } - return init; - }); - const [savedIds, setSavedIds] = useState>({}); - const [saving, setSaving] = useState(false); - - // Notes state: Record - const [notes, setNotes] = useState>({}); - - // Whether manual scoring table is visible (starts hidden) - const [showManualTable, setShowManualTable] = useState(false); - - // AI scoring state - const [aiScores, setAiScores] = useState({}); - const [aiState, setAiState] = useState("idle"); - const [aiError, setAiError] = useState(null); - const [showAiScores, setShowAiScores] = useState(false); - const [aiElapsed, setAiElapsed] = useState(0); - const aiChildRef = useRef<{ kill: () => Promise } | null>(null); - const aiTimerRef = useRef | null>(null); - const aiTimeoutRef = useRef | null>(null); - - // Undo state after accepting AI scores - const [undoScores, setUndoScores] = useState(null); - const undoTimerRef = useRef | null>(null); - - const [evalMode, setEvalMode] = useState<"score" | "compare">("score"); - - // Check if any scores have been set (for CTA vs table decision) - const hasAnyScores = Object.values(scores).some((panelScores) => - Object.values(panelScores).some((v) => v != null), - ); - - // Load existing evaluations - useEffect(() => { - getEvaluations(comparisonId).then((evals) => { - if (evals.length === 0) return; - const loaded: ScoreMap = { ...scores }; - const ids: Record = {}; - const loadedNotes: Record = {}; - for (const ev of evals) { - ids[ev.panelId] = ev.id; - loaded[ev.panelId] = {}; - for (const d of DIMENSIONS) { - loaded[ev.panelId]![d.key] = ev[d.key] ?? null; - } - if (ev.notes) { - loadedNotes[ev.panelId] = ev.notes; - } - } - setScores(loaded); - setSavedIds(ids); - setNotes(loadedNotes); - // If existing scores loaded, show the table - const anyLoaded = Object.values(loaded).some((ps) => - Object.values(ps).some((v) => v != null), - ); - if (anyLoaded) setShowManualTable(true); - }).catch(() => {}); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [comparisonId]); - - // Cleanup timers on unmount - useEffect(() => { - return () => { - if (aiTimerRef.current) clearInterval(aiTimerRef.current); - if (aiTimeoutRef.current) clearTimeout(aiTimeoutRef.current); - if (undoTimerRef.current) clearTimeout(undoTimerRef.current); - }; - }, []); - - const handleScoreChange = useCallback( - (panelId: string, dim: DimensionKey, value: number | null) => { - setScores((prev) => ({ - ...prev, - [panelId]: { ...prev[panelId], [dim]: value }, - })); - }, - [], - ); - - const handleSave = async () => { - setSaving(true); - try { - for (const panel of panels) { - const panelScores = scores[panel.panelId] || {}; - const overall = computeOverall(panelScores); - const evalId = savedIds[panel.panelId] || crypto.randomUUID(); - await saveEvaluation({ - id: evalId, - comparisonId, - panelId: panel.panelId, - correctness: panelScores.correctness ?? null, - completeness: panelScores.completeness ?? null, - codeQuality: panelScores.codeQuality ?? null, - efficiency: panelScores.efficiency ?? null, - reasoning: panelScores.reasoning ?? null, - speed: panelScores.speed ?? null, - safety: panelScores.safety ?? null, - contextAwareness: panelScores.contextAwareness ?? null, - autonomy: panelScores.autonomy ?? null, - adherence: panelScores.adherence ?? null, - overallScore: overall, - notes: notes[panel.panelId] || null, - }); - setSavedIds((prev) => ({ ...prev, [panel.panelId]: evalId })); - } - } catch (err) { - console.error("Failed to save evaluation:", err); - } finally { - setSaving(false); - } - }; - - /** Cancel an in-progress AI scoring run. */ - const handleCancelAi = useCallback(async () => { - if (aiChildRef.current) { - try { await aiChildRef.current.kill(); } catch { /* already dead */ } - aiChildRef.current = null; - } - if (aiTimerRef.current) { clearInterval(aiTimerRef.current); aiTimerRef.current = null; } - if (aiTimeoutRef.current) { clearTimeout(aiTimeoutRef.current); aiTimeoutRef.current = null; } - setAiState("idle"); - setAiElapsed(0); - }, []); - - /** Run Claude to score all panels and populate AI scores. */ - const handleScoreWithAi = async () => { - const hasOutput = panels.some((p) => p.outputText && p.outputText.trim().length > 0); - if (!hasOutput) { - setAiError("No panel output available to score."); - setAiState("error"); - return; - } - - setAiState("scoring"); - setAiError(null); - setAiElapsed(0); - - // Start elapsed timer - const startTime = Date.now(); - aiTimerRef.current = setInterval(() => { - setAiElapsed(Math.floor((Date.now() - startTime) / 1000)); - }, 1000); - - try { - const scoringPrompt = buildScoringPrompt(prompt, panels); - const command = Command.create("claude", [ - "-p", - scoringPrompt, - "--output-format", - "json", - ]); - - // Collect stdout via events - let stdoutChunks: string[] = []; - let stderrChunks: string[] = []; - - command.stdout.on("data", (line: string) => { - stdoutChunks.push(line); - }); - command.stderr.on("data", (line: string) => { - stderrChunks.push(line); - }); - - const child = await command.spawn(); - aiChildRef.current = child; - - // 90s timeout - aiTimeoutRef.current = setTimeout(async () => { - if (aiChildRef.current) { - try { await aiChildRef.current.kill(); } catch { /* ignore */ } - aiChildRef.current = null; - } - }, 90000); - - // Wait for close - await new Promise((resolve, reject) => { - command.on("close", (data) => { - if (aiTimerRef.current) { clearInterval(aiTimerRef.current); aiTimerRef.current = null; } - if (aiTimeoutRef.current) { clearTimeout(aiTimeoutRef.current); aiTimeoutRef.current = null; } - aiChildRef.current = null; - - if (data.code !== 0) { - reject(new Error(stderrChunks.join("") || `Claude exited with code ${data.code}`)); - } else { - resolve(); - } - }); - command.on("error", (err) => { - if (aiTimerRef.current) { clearInterval(aiTimerRef.current); aiTimerRef.current = null; } - if (aiTimeoutRef.current) { clearTimeout(aiTimeoutRef.current); aiTimeoutRef.current = null; } - aiChildRef.current = null; - reject(new Error(err)); - }); - }); - - let responseText = stdoutChunks.join("").trim(); - - // --output-format json wraps the response in a JSON envelope with a "result" field - try { - const envelope = JSON.parse(responseText); - if (typeof envelope === "object" && envelope !== null && typeof envelope.result === "string") { - responseText = envelope.result; - } - } catch { - // Not an envelope, use raw text - } - - const panelIds = panels.map((p) => p.panelId); - const parsed = parseAiResponse(responseText, panelIds); - - if (!parsed || Object.keys(parsed).length === 0) { - throw new Error("Could not parse AI scoring response."); - } - - // Merge speed scores from auto-calculation - for (const p of panels) { - if (parsed[p.panelId]) { - const speedScore = scores[p.panelId]?.speed ?? null; - parsed[p.panelId]!.speed = speedScore; - } - } - - setAiScores(parsed); - setAiState("done"); - setShowAiScores(true); - setShowManualTable(true); - } catch (err) { - console.error("Score with AI failed:", err); - setAiError(err instanceof Error ? err.message : String(err)); - setAiState("error"); - if (aiTimerRef.current) { clearInterval(aiTimerRef.current); aiTimerRef.current = null; } - if (aiTimeoutRef.current) { clearTimeout(aiTimeoutRef.current); aiTimeoutRef.current = null; } - } - }; - - /** Copy AI scores into the human scores for saving, with undo support. */ - const handleAcceptAiScores = () => { - // Stash current scores for undo - const previousScores: ScoreMap = {}; - for (const [pid, dims] of Object.entries(scores)) { - previousScores[pid] = { ...dims }; - } - setUndoScores(previousScores); - - // Clear any existing undo timer - if (undoTimerRef.current) clearTimeout(undoTimerRef.current); - undoTimerRef.current = setTimeout(() => { - setUndoScores(null); - undoTimerRef.current = null; - }, 10000); - - setScores((prev) => { - const merged = { ...prev }; - for (const [panelId, aiDims] of Object.entries(aiScores)) { - merged[panelId] = { ...merged[panelId] }; - for (const d of DIMENSIONS) { - const aiVal = aiDims[d.key]; - if (aiVal != null) { - merged[panelId]![d.key] = aiVal; - } - } - } - return merged; - }); - setShowAiScores(false); - }; - - /** Undo the accepted AI scores, restoring previous values. */ - const handleUndo = () => { - if (undoScores) { - setScores(undoScores); - setUndoScores(null); - if (undoTimerRef.current) { clearTimeout(undoTimerRef.current); undoTimerRef.current = null; } - } - }; - - // Build radar data — use AI scores overlay if showing - const activeScores = showAiScores ? aiScores : scores; - const radarPanels = panels.map((p) => ({ - panelId: p.panelId, - harnessName: p.harnessName, - scores: activeScores[p.panelId] || {}, - })); - - // Determine if we show the initial CTA or the scoring table - const showCta = !readOnly && !showManualTable && !hasAnyScores && aiState === "idle"; - - return ( -
- {!readOnly && ( -
-
- - -
-
- )} - - {evalMode === "compare" && !readOnly ? ( -
- {panels.length > 2 ? ( -
- Blind comparison supports 2 panels. Re-run with 2 tools to use this mode. -
- ) : ( - - )} -
- ) : ( -
- {/* CTA: default state when no scores exist */} - {showCta && ( -
- - -
- )} - - {/* AI scoring in-progress indicator (shown over CTA area when scoring from CTA) */} - {aiState === "scoring" && !showManualTable && ( -
-
- - Scoring... {aiElapsed}s -
- -
- )} - - {/* Scoring table */} - {(showManualTable || hasAnyScores || readOnly) && ( - <> -
- - - - - {panels.map((p) => ( - - ))} - - - - {DIMENSION_GROUPS.map((group) => ( - <> - {/* Group header row */} - - - - {group.keys.map((dimKey) => { - const dim = DIMENSIONS.find((d) => d.key === dimKey)!; - return ( - - - {panels.map((p) => { - const humanVal = scores[p.panelId]?.[dim.key] ?? null; - const aiVal = aiScores[p.panelId]?.[dim.key] ?? null; - const isAutoSpeed = dim.key === "speed"; - return ( - - ); - })} - - ); - })} - - ))} - {/* Overall score row */} - - - {panels.map((p) => { - const src = showAiScores ? aiScores : scores; - const overall = computeOverall(src[p.panelId] || {}); - return ( - - ); - })} - - {/* Notes rows */} - {panels.map((p) => ( - - -
Dimension - {p.harnessName} - {p.model && ( -
- {p.model} -
- )} -
{group.label}
{dim.label} - {readOnly ? ( - - {humanVal != null ? humanVal : "--"} - - ) : isAutoSpeed ? ( - - {humanVal != null ? humanVal : "--"} - auto - - ) : ( -
- {showAiScores && aiVal != null && ( -
- AI: {aiVal} -
- )} - handleScoreChange(p.panelId, dim.key, v)} - /> -
- )} -
Overall - {overall != null ? overall.toFixed(1) : "--"} -
- {panels.length > 1 ? `Notes (${p.harnessName})` : "Notes"} - -