diff --git a/.gitignore b/.gitignore
index aaa7a68..bc49d95 100644
--- a/.gitignore
+++ b/.gitignore
@@ -61,3 +61,8 @@ result
hermit
.peer_probe.out
reports/
+
+# Tauri desktop
+apps/desktop/node_modules/
+apps/desktop/dist/
+apps/desktop/src-tauri/target/
diff --git a/Makefile b/Makefile
index 8041081..b07fc4f 100644
--- a/Makefile
+++ b/Makefile
@@ -205,6 +205,7 @@ TEST_LIBS = -L$(SD_DIR) -lsashidown $(CURL_LIBS) $(RPATH_LIBS) $(TEST_SYS_LIBS)
# cst_test_util.h has static os_* helpers; gcc drops them when unused, tcc
# keeps them, so the small tests link the OS layer too.
TEST_OS_SRC = src/os_compat.c src/os_win.c src/util.c
+# hermit_getenv is in os_compat.c (HERMIT_/CST_ dual env).
.PHONY: all clean check demo sashidown-lib cmake-gcc cmake-clang asan install \
uninstall install-service help hermit-font cst-agent
@@ -347,11 +348,11 @@ install: hermit
'BIN="$(PREFIX)/bin/hermit"' \
'cmd="$${1:-status}"' \
'case "$$cmd" in' \
- 'status) "$$BIN" --version; if command -v systemctl >/dev/null 2>&1 && systemctl --user is-active cst-agent-parliament.service >/dev/null 2>&1; then systemctl --user status cst-agent-parliament.service --no-pager; else "$$BIN" --service-stop >/dev/null 2>&1 || true; echo "parliament service: not managed by systemd --user"; fi ;;' \
+ 'status) "$$BIN" --version; if command -v systemctl >/dev/null 2>&1 && systemctl --user is-active hermit-parliament.service >/dev/null 2>&1; then systemctl --user status hermit-parliament.service --no-pager; elif command -v systemctl >/dev/null 2>&1 && systemctl --user is-active cst-agent-parliament.service >/dev/null 2>&1; then systemctl --user status cst-agent-parliament.service --no-pager; else "$$BIN" --service-stop >/dev/null 2>&1 || true; echo "parliament service: not managed by systemd --user"; fi ;;' \
'install-unit) make -C "$(HERMIT_SRC)" install-service PREFIX="$(PREFIX)" ;;' \
- 'start) systemctl --user start cst-agent-parliament.service ;;' \
- 'stop) systemctl --user stop cst-agent-parliament.service; "$$BIN" --service-stop || true ;;' \
- 'restart) systemctl --user restart cst-agent-parliament.service ;;' \
+ 'start) systemctl --user start hermit-parliament.service 2>/dev/null || systemctl --user start cst-agent-parliament.service ;;' \
+ 'stop) systemctl --user stop hermit-parliament.service 2>/dev/null || true; systemctl --user stop cst-agent-parliament.service 2>/dev/null || true; "$$BIN" --service-stop || true ;;' \
+ 'restart) systemctl --user restart hermit-parliament.service 2>/dev/null || systemctl --user restart cst-agent-parliament.service ;;' \
'*) echo "usage: hermit-service {status|install-unit|start|stop|restart}" >&2; exit 2 ;;' \
'esac' \
> "$(DESTDIR)$(PREFIX)/bin/hermit-service"
@@ -383,11 +384,15 @@ install: hermit
install-service: install
install -d "$(DESTDIR)$(HOME)/.config/systemd/user"
sed -e 's|@BIN@|$(PREFIX)/bin/hermit|g' \
- scripts/cst-agent-parliament.service.in \
- > "$(DESTDIR)$(HOME)/.config/systemd/user/cst-agent-parliament.service"
+ scripts/hermit-parliament.service.in \
+ > "$(DESTDIR)$(HOME)/.config/systemd/user/hermit-parliament.service"
+ ln -sfr "$(DESTDIR)$(HOME)/.config/systemd/user/hermit-parliament.service" \
+ "$(DESTDIR)$(HOME)/.config/systemd/user/cst-agent-parliament.service" 2>/dev/null || \
+ ln -sf hermit-parliament.service \
+ "$(DESTDIR)$(HOME)/.config/systemd/user/cst-agent-parliament.service"
@echo "Installed user unit. Enable with:"
@echo " systemctl --user daemon-reload"
- @echo " systemctl --user enable --now cst-agent-parliament.service"
+ @echo " systemctl --user enable --now hermit-parliament.service"
@echo "(set HERMIT_/CST_ REALM_PASSWORD / INSTANCE_ID in the drop-in or environment)"
uninstall:
@@ -398,6 +403,7 @@ uninstall:
rm -f "$(DESTDIR)$(PREFIX)/share/fonts/hermit/hermit-icons.ttf"
rm -rf "$(DESTDIR)$(PREFIX)/share/hermit/frames"
rm -f "$(HOME)/.local/share/fonts/hermit-icons.ttf"
+ rm -f "$(HOME)/.config/systemd/user/hermit-parliament.service"
rm -f "$(HOME)/.config/systemd/user/cst-agent-parliament.service"
-include $(DEPFILES)
diff --git a/README.md b/README.md
index 5d13dc7..78389a9 100644
--- a/README.md
+++ b/README.md
@@ -58,7 +58,9 @@ make hermit-font # 烘焙 PNG 帧 + hermit-icons.ttf(Pillow + fonttool
make install PREFIX=$HOME/.local # 同时安装字体到 share/fonts/hermit 与 ~/.local/share/fonts
```
-TUI 图标:`HERMIT_ICONS=auto|mini|font`(默认色块动画帧,状态与 `icons/agent-motion` HTML 套件一致;`font` 输出 PUA `U+E700+`,需终端加载已安装的 Hermit Icons)。
+桌面 GUI(Tauri 2 + React,DeepSeek Harness 风格布局):见 [`apps/desktop`](apps/desktop/) 与 [docs/desktop.md](docs/desktop.md)。旧 Qt App(`app/`)已冻结。
+
+TUI 图标:`HERMIT_ICONS=auto|mini|font`(默认色块动画帧,状态与 `icons/agent-motion` HTML 套件一致;`font` 输出 PUA `U+E700+`,需终端加载已安装的 Hermit Icons)。环境变量 **`HERMIT_*` 优先,`CST_*` 仍接受**。
---
diff --git a/app/DEPRECATED.md b/app/DEPRECATED.md
new file mode 100644
index 0000000..63d68a5
--- /dev/null
+++ b/app/DEPRECATED.md
@@ -0,0 +1,10 @@
+# Deprecated: Qt front end
+
+This directory is the **legacy Qt 6 / QML** Hermit GUI (`cst-agent-app`).
+
+The supported desktop shell is **`apps/desktop`** (Tauri 2 + React), with a
+DeepSeek-Harness-inspired layout and an in-process C engine bridge.
+
+Do not add features here. Once Tauri reaches feature parity, this tree will be
+moved to `archive/qt-app` or removed. Android APK scripts that target this tree
+are transitional.
diff --git a/app/src/core/AgentCore.cpp b/app/src/core/AgentCore.cpp
index d29756c..2accd4b 100644
--- a/app/src/core/AgentCore.cpp
+++ b/app/src/core/AgentCore.cpp
@@ -143,7 +143,9 @@ bool AgentCore::open(const QString &workspace, const QString &provider,
if (m_cfg.api_key[0] == 0 && m_cfg.provider[0]) {
char key[512] = "";
if (cst_creds_resolve(m_cfg.provider, key, sizeof(key), nullptr) != 0) {
- const char *env = getenv("CST_API_KEY");
+ const char *env = getenv("HERMIT_API_KEY");
+ if (!env || !env[0])
+ env = getenv("CST_API_KEY");
if (env && env[0])
snprintf(key, sizeof(key), "%s", env);
}
diff --git a/apps/desktop/.gitignore b/apps/desktop/.gitignore
new file mode 100644
index 0000000..73c51c8
--- /dev/null
+++ b/apps/desktop/.gitignore
@@ -0,0 +1,5 @@
+node_modules/
+dist/
+src-tauri/target/
+.DS_Store
+*.log
diff --git a/apps/desktop/README.md b/apps/desktop/README.md
new file mode 100644
index 0000000..43ac3ff
--- /dev/null
+++ b/apps/desktop/README.md
@@ -0,0 +1,57 @@
+# Hermit Desktop (Tauri 2)
+
+Cross-platform shell for Hermit. Visual layout follows DeepSeek Harness
+(session rail · chat · tool timeline · composer); the agent engine is the
+in-process C core (`libcstcore`), not a Cordis/plugin runtime.
+
+## Stack
+
+- **Tauri 2** + Rust host
+- **React 19** + Vite + TypeScript UI
+- FFI to `libcstcore` (same embed path as the legacy Qt app)
+
+## Dependencies
+
+| Platform | Needs |
+|----------|--------|
+| All | Rust (stable), Node 20+, `pnpm` or `npm` |
+| Linux | `webkit2gtk-4.1`, `libgtk-3`, `librsvg`, `patchelf`, pkg-config, curl |
+| Windows | WebView2 runtime |
+| macOS | Xcode CLT |
+
+Nix example:
+
+```bash
+nix-shell -p rustc cargo nodejs_22 pkg-config webkitgtk_4_1 gtk3 librsvg openssl curl
+```
+
+## Develop
+
+```bash
+cd apps/desktop
+npm install
+npm run tauri dev
+```
+
+Without a full engine link yet, the UI runs against the mock bridge
+(`HERMIT_DESKTOP_MOCK=1` or automatic when FFI is unavailable).
+
+## Build
+
+```bash
+npm run tauri build
+```
+
+Artifacts land in `src-tauri/target/release/bundle/`.
+
+## Layout
+
+```
+apps/desktop/
+ src/ React UI (DSH-like)
+ src-tauri/ Rust + Tauri + FFI
+ README.md
+```
+
+The legacy Qt front end under `/app` is frozen and will be archived once
+desktop feature parity lands.
diff --git a/apps/desktop/index.html b/apps/desktop/index.html
new file mode 100644
index 0000000..5e1f962
--- /dev/null
+++ b/apps/desktop/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ Hermit
+
+
+
+
+
+
diff --git a/apps/desktop/package-lock.json b/apps/desktop/package-lock.json
new file mode 100644
index 0000000..86dfc7b
--- /dev/null
+++ b/apps/desktop/package-lock.json
@@ -0,0 +1,3584 @@
+{
+ "name": "hermit-desktop",
+ "version": "1.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "hermit-desktop",
+ "version": "1.1.0",
+ "dependencies": {
+ "@tauri-apps/api": "^2.1.1",
+ "@tauri-apps/plugin-dialog": "^2.2.0",
+ "@tauri-apps/plugin-shell": "^2.2.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-markdown": "^9.0.3",
+ "remark-gfm": "^4.0.0"
+ },
+ "devDependencies": {
+ "@tauri-apps/cli": "^2.1.0",
+ "@types/react": "^19.0.0",
+ "@types/react-dom": "^19.0.0",
+ "@vitejs/plugin-react": "^4.3.4",
+ "typescript": "^5.7.2",
+ "vite": "^6.0.3"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
+ "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz",
+ "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz",
+ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.7",
+ "@babel/helper-compilation-targets": "^7.29.7",
+ "@babel/helper-module-transforms": "^7.29.7",
+ "@babel/helpers": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/template": "^7.29.7",
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.12",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.12.tgz",
+ "integrity": "sha512-2W76mhjrpQFO1lK5e8IvGYB2D0YZ7S2R1Z2BjO2ZUYuW+amcpK/z60U6ZZmzskwoa7sJ6XohP/Wg8H5KxXI/IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.12",
+ "@babel/types": "^7.29.11",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz",
+ "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.29.7",
+ "@babel/helper-validator-option": "^7.29.7",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz",
+ "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz",
+ "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz",
+ "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7",
+ "@babel/traverse": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz",
+ "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.11.tgz",
+ "integrity": "sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz",
+ "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.29.10",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.10.tgz",
+ "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.8"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.12",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.12.tgz",
+ "integrity": "sha512-WJ7JBp/Q4+z/ImydtI7jS6NVco5++632ExBemSX+Ysb+G1lCwQ5BVo3SY+jGGOcZXI4ZccbZSUSJLNBW6eEpJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.11"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz",
+ "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz",
+ "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz",
+ "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.12",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.12.tgz",
+ "integrity": "sha512-MscXe/NAZcOkYEsRajHZFt3ynsb22PUi6CTrp5U7+RYycR9By84mn9mFN54YgfITiqK4hFx3Ju3tZSyzfpS5ew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.7",
+ "@babel/generator": "^7.29.12",
+ "@babel/helper-globals": "^7.29.7",
+ "@babel/parser": "^7.29.12",
+ "@babel/template": "^7.29.7",
+ "@babel/types": "^7.29.11",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.11",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.11.tgz",
+ "integrity": "sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.11",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
+ "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@napi-rs/lzma-linux-x64-gnu": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz",
+ "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^22.20 || ^24.12 || >=25"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
+ "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.66.0.tgz",
+ "integrity": "sha512-7y4XeoUHPecjfUDRmap8U0q6bjfLAPn7uOGT8BKyqy8uNDOjsGS8rlBhOx6sZLVwwjN6hapvGl2mW9/IS6UNww==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.66.0.tgz",
+ "integrity": "sha512-e8WugYZXpgqrlMXLCudYVRAxAcK7AIY36JxRDwFRD38L9q62G1VsEUW6ijXxzjxYjNB8i1zo3B/ycIQ/qjLC/Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.66.0.tgz",
+ "integrity": "sha512-6vkDCfyDjNLokh+Rt1D2KtNgFFMEPdkWha/mbtP4cSjh9xiN8T/JBS/A7nDYKjmMAXHrvR9J3AzUk2LtFbIBLg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.66.0.tgz",
+ "integrity": "sha512-/mzZAX0+Q6eXxvkR0HB0RZCCrsbmFD8DpsvCQoMYABDfq/DjqkbfytuJ7GvZ4AhR/Mgis2fXbZrGqfbcK2Z5fA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.66.0.tgz",
+ "integrity": "sha512-JQJx9E8tUjGqed1RevDmoHaS3V30ODdV8uyvGxlwd4K5se6bkPrMeltSybqAtpJ+ltDRfo7FORQaJG2Hd5nGog==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.66.0.tgz",
+ "integrity": "sha512-GEaUQQjMaG7X1304qMgqLjzCKv6CdDirzJSS+UqUs3xhJ9X2Kjzu0JDbLoUU42FWxwmZqz+SsgU1SlQv9GNRVA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.66.0.tgz",
+ "integrity": "sha512-DgmAU9N0NhDQDzHgFUocDio7zRO8jR/nY/obDGvCR8zbJ6J77Fg6X49yPuExJUpYPbC82EOaRhG969pWzUSnHQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.66.0.tgz",
+ "integrity": "sha512-zG09YZ+sk/HoHq+P9gYB0EseQ3M20RbDuKGWey6fbiMDV1LxfXvhgSW9jDaCcvFPMgfLXpimzXY+UYvA8R2mLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.66.0.tgz",
+ "integrity": "sha512-vlArhgyXbcVc1D4WZPoiYuqJIaMiSHBj6etRXua0KlfjlZeuiQyVAPYi0/N49O4mSp3u1iGUBLEjNa8ec81XZg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.66.0.tgz",
+ "integrity": "sha512-RxJZtk0G87YPotDaRDvRqStV8cbqLSC5TroHvQHHKsqBg0ok64RxKgtXeFsa7FBcy7mb4crBrG3xK8USWIqWNA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.66.0.tgz",
+ "integrity": "sha512-qlGcw959PrLLkZhiBxF3OZ6SQvj+OKY85mCqGNgSRs4LZlDJ6ICqmz6UdxtINdhcXYwNIbZoapQVBAmZlD2hUQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.66.0.tgz",
+ "integrity": "sha512-TvTI/7Cy0WvRA1SXgwzu6bwXBnMpmeT/ln5q7WvSpqmXy1VbmEnY8HVIDQNBiaHJvoWqRr0M4FNo7qiqtyMaFw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.66.0.tgz",
+ "integrity": "sha512-UZEDkSoDRZ50NyLj70nO6mpIK3dvs2cPTTvQb1bA/PBDmr9fvn5KiESuGfh6srd7Zi6Lt9Sv2sVrFr1QoHLvPQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.66.0.tgz",
+ "integrity": "sha512-VRbxTvagLh3HRcysx1CNq+HHcvJbSebNI6fCbk7jwmmWHkXjrSIV3igXBpRHUTFdg0pagWGu50xoSZXnrZHjVQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.66.0.tgz",
+ "integrity": "sha512-uWdJpvYqh0LE/i+YBL3sMX0a2kUkICENjmrPmyBmMOFc3jMrs6MSQH/pMD+VIpGEoUcr3XkHGLLfymzIqPSRRg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.66.0.tgz",
+ "integrity": "sha512-3FUd88pxgWAjK60OgCrika1AcNG+u8zaCdWjg4TlcZTDkt5TGyci8ZU64l3OJ9ax0MEjw3P80B/3PoSQDCLwJQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.66.0.tgz",
+ "integrity": "sha512-qT2rMmgyej62g5AdwktK+Bt2lBu497pzWZe12TTQ5JmZjOYPnEwcPEAOSLTBxBV+6gIES75rXm219v/QkT397A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.66.0.tgz",
+ "integrity": "sha512-E46rnZgp7J84Qwe8RMlF+rgimnDo/9fuiGbUArGB0ZkMWf97O7yeSCfKls5x/YJOF0RcuSe9RctuKe1hlxICiA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.66.0.tgz",
+ "integrity": "sha512-Uz1HiZe+qBzqgdPsON+z0wRx3WdATuyzwvGT6cr2VZVrqqko0ZJVfkrQJtwDMuDcAfXYdo7XucaxJ7lTLjEcgg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.66.0.tgz",
+ "integrity": "sha512-Ph7TX3Ex5qdfcb7Tc6eEPugVkRfJ501eTovO4T5029YObfpZ7dzn3RiwpFvGp50nk2QUhvBMZ0PFGlEj6pOYTg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.66.0.tgz",
+ "integrity": "sha512-nZYPEya7ZkeNxUEiF7qmNZbyLTyRN3MK5cO22KqsaoneUzXJuzBIQRw+7BEQy9LGj2O5vrCE9V3EpK06FYo1tQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.66.0.tgz",
+ "integrity": "sha512-u7aTfS3R6C4hRsqXSzaO6qLZYLVuMkHMvcWlux4IM8IJif1VCl2cgPBSo5gSNoFoStQypQP+qwq8W1IyFBf1QQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.66.0.tgz",
+ "integrity": "sha512-e+i9ueHrH1Bafb0cf0woAIVJbYcoC8vRaD+vz+Xi8w6jz9cYJSV3vyKO6ELGSZ6g4W4MJOm2WPLN4/nQf77h7w==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.66.0.tgz",
+ "integrity": "sha512-KfTCbrtr2zXTqH2E1F+uYlFTrYibxHKqPAHobpd8Kfg49cEHmuHebOidCTDRgqG1suaPFX7oejFQeGE71zWKfA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.66.0.tgz",
+ "integrity": "sha512-xA+neBh1bqkqaS3b48T2UHZnDsTIpb9B0h+TdBzynjF/ymCpYndhfY10RqW0qSKB1HqqQA83mINVhAdwA+mETg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@tauri-apps/api": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.12.4.tgz",
+ "integrity": "sha512-pVmfis+4zT8H0Qhp3xPZx9Ju7kpzvA6rr/PSJPyuwfvucTQ8sVt61NYU9KMkK703UFlYadFmjKA4HhybOtN0gg==",
+ "license": "Apache-2.0 OR MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/tauri"
+ }
+ },
+ "node_modules/@tauri-apps/cli": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.12.4.tgz",
+ "integrity": "sha512-JI9bHfudSRJikGOrjbXEm6RjzzvmKuLc+JixB1NE8hNzQkNlCCIC3pTES3uypkR9lxHrsbxzcnSwhI2IxBQphw==",
+ "dev": true,
+ "license": "Apache-2.0 OR MIT",
+ "bin": {
+ "tauri": "tauri.js"
+ },
+ "engines": {
+ "node": ">= 10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/tauri"
+ },
+ "optionalDependencies": {
+ "@tauri-apps/cli-darwin-arm64": "2.12.4",
+ "@tauri-apps/cli-darwin-x64": "2.12.4",
+ "@tauri-apps/cli-linux-arm-gnueabihf": "2.12.4",
+ "@tauri-apps/cli-linux-arm64-gnu": "2.12.4",
+ "@tauri-apps/cli-linux-arm64-musl": "2.12.4",
+ "@tauri-apps/cli-linux-riscv64-gnu": "2.12.4",
+ "@tauri-apps/cli-linux-x64-gnu": "2.12.4",
+ "@tauri-apps/cli-linux-x64-musl": "2.12.4",
+ "@tauri-apps/cli-win32-arm64-msvc": "2.12.4",
+ "@tauri-apps/cli-win32-ia32-msvc": "2.12.4",
+ "@tauri-apps/cli-win32-x64-msvc": "2.12.4"
+ }
+ },
+ "node_modules/@tauri-apps/cli-darwin-arm64": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.12.4.tgz",
+ "integrity": "sha512-OxqKSckIkoJ6vX2AjifIJpTasFC0Hbdoo7gEiCmAjauABO3U8m2MRsLWe+QTiBwDx1mIrvgA+rvI7tvDnbnHVg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 OR MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-darwin-x64": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.12.4.tgz",
+ "integrity": "sha512-fz76/77wMMJOaaUN6n3CybRG0P/MTEjjqYk81mGPyhi9m6Ue5T+LWBnJP/AkPooNatBPI2vtulGqomyMJ44lCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 OR MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.12.4.tgz",
+ "integrity": "sha512-K0w8Bof6Lt8QKLAYhRy0yy36ZH5iA/35VuSOvnxyjvCUZ+A3JKsUTlALviH/sVgAlisaPzzmeJSH8XOn4Q2HBA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 OR MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-linux-arm64-gnu": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.12.4.tgz",
+ "integrity": "sha512-j5rOnjmRUwWrm1oosf0zBYl4D+fqydgUROFCk0hvKZxvbTT8SOERes0QB7rBV/XWNy+kM6pCKzb3oSm2sRglzg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 OR MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-linux-arm64-musl": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.12.4.tgz",
+ "integrity": "sha512-aOue3Fy6Jb7+oWcfAVUsVHfeTybSCt2CZoU06aO4jv4d2Ks/KnaTPwMAK3CLEduGOvBLY1lbBBrIyomqLLH5Sg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 OR MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-linux-riscv64-gnu": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.12.4.tgz",
+ "integrity": "sha512-Fx6GShY/RvST+t6LMlTHAwd66+1tEaAAGrnU7cysVfaiRP1BKng5Vl6rVmO6rSLOA1Sp1dRzNYM4f0OWQGb7qA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 OR MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-linux-x64-gnu": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.12.4.tgz",
+ "integrity": "sha512-tNzZSa79Z1nRpHxEpQ38lsAFpKlFlYvoXzjTV+lRRn/zSf3wrdUC3wnLcq2XEadchPu4ttK0zivhYzr+XGD19Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 OR MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-linux-x64-musl": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.12.4.tgz",
+ "integrity": "sha512-jmZ1pr0xEqUhuEusWtt9Yt+GF6lCnGHUmIL+KIknpbjK/XQ2qkhDBhaxK/JMHM2A8dAacVXCxXJk2EXpwhQUfA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 OR MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-win32-arm64-msvc": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.12.4.tgz",
+ "integrity": "sha512-fGo8pgEHZxdSYgZ/J98m1usJ7NHKmKbq7k6uT0x1rpOq6Bg2YVzzpaAblWk710f5LHYBJIL5QIFS5IrD+4gmTg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 OR MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-win32-ia32-msvc": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.12.4.tgz",
+ "integrity": "sha512-ezl8sQIcjYsye3TUnTH5VcWmWzccZASlQm7hlZt0dYyj1XD0qpVW47u2xYVrIKui0F8uQv/7QGZixdWiClBsbg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 OR MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/cli-win32-x64-msvc": {
+ "version": "2.12.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.12.4.tgz",
+ "integrity": "sha512-DJhDeCqjLDNMWYFy7ZS8cfeAHX2RK0RbQMLiA3bMVVkXRDJ4NBYiHriGqsUhsr9iG41aTb+dJGkFPmPw1gWwVw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 OR MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tauri-apps/plugin-dialog": {
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-dialog/-/plugin-dialog-2.8.4.tgz",
+ "integrity": "sha512-+6ZOiXenOaxXwb8qCbBPdT2jX2cFPaVVHGIskrpmJLpmWj+qKRTD6X/z9x7hTdSQn7NedcoXCkWGej4a7dC4lw==",
+ "license": "MIT OR Apache-2.0",
+ "dependencies": {
+ "@tauri-apps/api": "^2.12.0"
+ }
+ },
+ "node_modules/@tauri-apps/plugin-shell": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-shell/-/plugin-shell-2.6.0.tgz",
+ "integrity": "sha512-z9LZGSr8jfD0FWWJ+CdD99i2FQcmJ26ebNJlYJdrlFdMLcggUS29BYrfS4hJlXO1UAI6A6r084vJUAG5734Y6w==",
+ "license": "MIT OR Apache-2.0",
+ "dependencies": {
+ "@tauri-apps/api": "^2.12.0"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
+ "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.10.tgz",
+ "integrity": "sha512-lTyOMnOcmRBzdCv6/4zUZCrEhV0xrqQiUZBZtVcbmLHBXKLnN8q89v/wKRF/Q0HbwVsqbIG3o5HDoFl9sduM+g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/hast": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz",
+ "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "19.3.0",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz",
+ "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==",
+ "license": "MIT",
+ "dependencies": {
+ "csstype": "^3.2.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "19.3.0",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz",
+ "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.3.0"
+ }
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz",
+ "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==",
+ "license": "ISC"
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
+ "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.28.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+ "@rolldown/pluginutils": "1.0.0-beta.27",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.17.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.11.34",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.34.tgz",
+ "integrity": "sha512-Aqr8mA1kIvyJ3UY5YAY7ib8LSo1DmDMbMnVqGPtsKW1LxaFQFwn9Eb3yvq2fUKJsRvaXjnAV7R5osqETapzNiA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.29.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.5.tgz",
+ "integrity": "sha512-khTmKu5NGYTotqcYo8Bew2k4RAE9PuXRSFRXG2lQBrCEQHyeQ/vX6gKMxfokwywBsLiXZMnHsmWMG1pnO8J7uQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.11.33",
+ "caniuse-lite": "^1.0.30001819",
+ "electron-to-chromium": "^1.5.464",
+ "node-releases": "^2.0.60",
+ "update-browserslist-db": "^1.3.4"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001820",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001820.tgz",
+ "integrity": "sha512-gfWD6MxqVCqAOwmODfZf7DchWvlrA+SRdNX7ceLfg3xRqe5ssjjpF7EgslC/0tiLiNTajdaNN/q8c/5u/7Gz8w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
+ "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.468",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.468.tgz",
+ "integrity": "sha512-8XdEp3sIqO+PzmVPxhzqHq/3+yCxp44m27cm2WY1sRn3ZhwKyKmqSi2hx6gEhmnOXmh8NUuYE00z6Onzn5m6DA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/esbuild": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.12",
+ "@esbuild/android-arm": "0.25.12",
+ "@esbuild/android-arm64": "0.25.12",
+ "@esbuild/android-x64": "0.25.12",
+ "@esbuild/darwin-arm64": "0.25.12",
+ "@esbuild/darwin-x64": "0.25.12",
+ "@esbuild/freebsd-arm64": "0.25.12",
+ "@esbuild/freebsd-x64": "0.25.12",
+ "@esbuild/linux-arm": "0.25.12",
+ "@esbuild/linux-arm64": "0.25.12",
+ "@esbuild/linux-ia32": "0.25.12",
+ "@esbuild/linux-loong64": "0.25.12",
+ "@esbuild/linux-mips64el": "0.25.12",
+ "@esbuild/linux-ppc64": "0.25.12",
+ "@esbuild/linux-riscv64": "0.25.12",
+ "@esbuild/linux-s390x": "0.25.12",
+ "@esbuild/linux-x64": "0.25.12",
+ "@esbuild/netbsd-arm64": "0.25.12",
+ "@esbuild/netbsd-x64": "0.25.12",
+ "@esbuild/openbsd-arm64": "0.25.12",
+ "@esbuild/openbsd-x64": "0.25.12",
+ "@esbuild/openharmony-arm64": "0.25.12",
+ "@esbuild/sunos-x64": "0.25.12",
+ "@esbuild/win32-arm64": "0.25.12",
+ "@esbuild/win32-ia32": "0.25.12",
+ "@esbuild/win32-x64": "0.25.12"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/estree-util-is-identifier-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/hast-util-to-jsx-runtime": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz",
+ "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-js": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/html-url-attributes": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz",
+ "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/inline-style-parser": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
+ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
+ "license": "MIT"
+ },
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/markdown-table": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
+ "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdast-util-find-and-replace": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.4.tgz",
+ "integrity": "sha512-z4B5c6jrnJ1ltOQemhWYPBSAo6y42Z8Gt2yEgfgNTMcLSU59B8bfj8Z8AnAlJrBGLnqkdAUZ7jdDEqQw3KuipQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "escape-string-regexp": "^5.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.1.0.tgz",
+ "integrity": "sha512-KRLgmPaP2H1ul2bpoJkOS+9pAcDAAj9Nu1mqLnh8NLeJG5tlvj42TH80PIGBpROWlRXLk0lDrWNuZCFy/tsB4A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz",
+ "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-gfm-autolink-literal": "^2.0.0",
+ "mdast-util-gfm-footnote": "^2.0.0",
+ "mdast-util-gfm-strikethrough": "^2.0.0",
+ "mdast-util-gfm-table": "^2.0.0",
+ "mdast-util-gfm-task-list-item": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-autolink-literal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz",
+ "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-find-and-replace": "^3.0.0",
+ "micromark-util-character": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-strikethrough": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.1.tgz",
+ "integrity": "sha512-OuJHqvr455pwu2OaOrir7dbzqs4jlWKOtlu9L6GjcIjjQwNyw02VntQsr/Ek6/A13vgnXfUhBekWRUP1OkNivw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-table": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
+ "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "markdown-table": "^3.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-gfm-task-list-item": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
+ "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz",
+ "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz",
+ "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-phrasing": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.2.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz",
+ "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.2.1.tgz",
+ "integrity": "sha512-ThatlCBxG2GE+mljhNSfZPv56d3QrGiRh97jjYgIk80IzS4uU6d7cHAaexCYSAmUCCcOs3grJ07kX3oTGsFUOw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.3.tgz",
+ "integrity": "sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-edit-map": "^1.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.4.tgz",
+ "integrity": "sha512-wxEeE8v8XVvOrxn1TZj74qYhAtTQsSqufHVS3uNVyT1MupXxhyaHk8/9xDNPh9BmL77QNDgWTkZ3RsYHB2ry7w==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.1.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-edit-map": "^1.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.3"
+ }
+ },
+ "node_modules/micromark-extension-gfm": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
+ "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-extension-gfm-autolink-literal": "^2.0.0",
+ "micromark-extension-gfm-footnote": "^2.0.0",
+ "micromark-extension-gfm-strikethrough": "^2.0.0",
+ "micromark-extension-gfm-table": "^2.0.0",
+ "micromark-extension-gfm-tagfilter": "^2.0.0",
+ "micromark-extension-gfm-task-list-item": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-strikethrough": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
+ "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.2.tgz",
+ "integrity": "sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-tagfilter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
+ "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-task-list-item": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz",
+ "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==",
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.1.0.tgz",
+ "integrity": "sha512-fS8hnLIjnjvdQIj39Geug8wWsR0HrYZ43KShKxNfwT7t2LOHo/LbWZEzEaSOjwtjdCsjoE6syHhonEzW0zv0+Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
+ "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-edit-map": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-edit-map/-/micromark-util-edit-map-1.0.0.tgz",
+ "integrity": "sha512-Pa2ljlsEL6sVwFaYeyrOLSYbQt73JvGbPOYFq+9AElXiSnfI5Q4465RRZ1sHv7lDjDOnGRDDaqPXqClqWK/q1Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
+ "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.3.tgz",
+ "integrity": "sha512-oxB2Ik03hI0gv+VNn9tnh1t1YEe9MDPptViAEgfdf3YQHsn0pzGTgCdlSCJXcwhqm8phaEuM7zeEu3QQzVBrPg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.20",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz",
+ "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.61",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.61.tgz",
+ "integrity": "sha512-5NUN6QCxNFrS9oEA9RPS+d0AP+ooGBzzovY2JhIpDRHacPvOhHjXjUsUMX9qp4nLHZ+5jVgXB2jj/P4arGOE/g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.32",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.32.tgz",
+ "integrity": "sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.20",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz",
+ "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz",
+ "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.1.tgz",
+ "integrity": "sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.28.0"
+ },
+ "peerDependencies": {
+ "react": "^19.3.1"
+ }
+ },
+ "node_modules/react-markdown": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz",
+ "integrity": "sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "html-url-attributes": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "unified": "^11.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=18",
+ "react": ">=18"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/remark-gfm": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz",
+ "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-gfm": "^3.0.0",
+ "micromark-extension-gfm": "^3.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-stringify": "^11.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz",
+ "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-stringify": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
+ "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.66.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.66.0.tgz",
+ "integrity": "sha512-Onq6/qO4ARhxIs+jYiHE0pYehadLyMECAiGEqQ+0/aWND3+2PmifJIIqBLYtuBODqHTlOUEQFtIVPyCy0Lck7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.9"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@napi-rs/lzma-linux-x64-gnu": "1.5.1",
+ "@rollup/rollup-android-arm-eabi": "4.66.0",
+ "@rollup/rollup-android-arm64": "4.66.0",
+ "@rollup/rollup-darwin-arm64": "4.66.0",
+ "@rollup/rollup-darwin-x64": "4.66.0",
+ "@rollup/rollup-freebsd-arm64": "4.66.0",
+ "@rollup/rollup-freebsd-x64": "4.66.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.66.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.66.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.66.0",
+ "@rollup/rollup-linux-arm64-musl": "4.66.0",
+ "@rollup/rollup-linux-loong64-gnu": "4.66.0",
+ "@rollup/rollup-linux-loong64-musl": "4.66.0",
+ "@rollup/rollup-linux-ppc64-gnu": "4.66.0",
+ "@rollup/rollup-linux-ppc64-musl": "4.66.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.66.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.66.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.66.0",
+ "@rollup/rollup-linux-x64-gnu": "4.66.0",
+ "@rollup/rollup-linux-x64-musl": "4.66.0",
+ "@rollup/rollup-openbsd-x64": "4.66.0",
+ "@rollup/rollup-openharmony-arm64": "4.66.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.66.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.66.0",
+ "@rollup/rollup-win32-x64-gnu": "4.66.0",
+ "@rollup/rollup-win32-x64-msvc": "4.66.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/rollup/node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/scheduler": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz",
+ "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz",
+ "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/style-to-js": {
+ "version": "1.1.21",
+ "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz",
+ "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "style-to-object": "1.0.14"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
+ "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.7"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.2.0.tgz",
+ "integrity": "sha512-fpsYs/VVoZxfGY9/j3FQpZmN8wdLJaV1Pt38AaJNZu9uKIHcFU3halCdBveEq1HGKO1OEfJY65w1zvoFV1b3qQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.1.0.tgz",
+ "integrity": "sha512-vKXxz6O38sKDj1mtx/k2cWvkkFBuYGx6uGrlzBkVeWCRF/F8sdI0j3Wbkz/5rVNRRuVc8UrgRdbCxNhmYXgP3w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz",
+ "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz",
+ "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vite": {
+ "version": "6.4.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.5.tgz",
+ "integrity": "sha512-4enwjFfi4IwtEh0w+jPzpLVOFQiPHmmzPxcHXQOyEur47o6u0jE573DmGpjA+7irXoMLYRZD5ZaFUEneS3abPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.13"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
+ "jiti": ">=1.21.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ }
+ }
+}
diff --git a/apps/desktop/package.json b/apps/desktop/package.json
new file mode 100644
index 0000000..4f0aa54
--- /dev/null
+++ b/apps/desktop/package.json
@@ -0,0 +1,29 @@
+{
+ "name": "hermit-desktop",
+ "private": true,
+ "version": "1.1.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc -b && vite build",
+ "preview": "vite preview",
+ "tauri": "tauri"
+ },
+ "dependencies": {
+ "@tauri-apps/api": "^2.1.1",
+ "@tauri-apps/plugin-dialog": "^2.2.0",
+ "@tauri-apps/plugin-shell": "^2.2.0",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-markdown": "^9.0.3",
+ "remark-gfm": "^4.0.0"
+ },
+ "devDependencies": {
+ "@tauri-apps/cli": "^2.1.0",
+ "@types/react": "^19.0.0",
+ "@types/react-dom": "^19.0.0",
+ "@vitejs/plugin-react": "^4.3.4",
+ "typescript": "^5.7.2",
+ "vite": "^6.0.3"
+ }
+}
diff --git a/apps/desktop/src-tauri/Cargo.lock b/apps/desktop/src-tauri/Cargo.lock
new file mode 100644
index 0000000..9cce38b
--- /dev/null
+++ b/apps/desktop/src-tauri/Cargo.lock
@@ -0,0 +1,4515 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "adler2"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "alloc-no-stdlib"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2fb6cfd47bf496ff64095c20eaba0c201404ee38714d4142fcfa1dc334fcc7a"
+
+[[package]]
+name = "alloc-stdlib"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b5c1865780388bfa186411ab5f247819487fc4864c6e9c3106611fa347586e1"
+dependencies = [
+ "alloc-no-stdlib",
+]
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.104"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470"
+
+[[package]]
+name = "atk"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b"
+dependencies = [
+ "atk-sys",
+ "glib",
+ "libc",
+]
+
+[[package]]
+name = "atk-sys"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "atomic-waker"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+
+[[package]]
+name = "autocfg"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53"
+
+[[package]]
+name = "base64"
+version = "0.21.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+
+[[package]]
+name = "base64"
+version = "0.23.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5"
+
+[[package]]
+name = "bit-set"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3"
+dependencies = [
+ "bit-vec",
+]
+
+[[package]]
+name = "bit-vec"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "block2"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
+dependencies = [
+ "objc2",
+]
+
+[[package]]
+name = "brotli"
+version = "9.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "627b7cfb0578f0eafce087a90fcd40add1231900b69e4d4de2d456260a4f5d81"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+ "brotli-decompressor",
+]
+
+[[package]]
+name = "brotli-decompressor"
+version = "6.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34c6783f42c21c952ad7112b354f0ba2f10760e9decea5b1b60523d6e270faaf"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+]
+
+[[package]]
+name = "bs58"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.20.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
+
+[[package]]
+name = "bytemuck"
+version = "1.25.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797"
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
+[[package]]
+name = "bytes"
+version = "1.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "cairo-rs"
+version = "0.18.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2"
+dependencies = [
+ "bitflags 2.13.2",
+ "cairo-sys-rs",
+ "glib",
+ "libc",
+ "once_cell",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "cairo-sys-rs"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51"
+dependencies = [
+ "glib-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "camino"
+version = "1.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbbad30e4b4c14a39e3cc8aed085a12a327257c316619c93581e017bc52be591"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "cargo-platform"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "cargo_metadata"
+version = "0.19.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba"
+dependencies = [
+ "camino",
+ "cargo-platform",
+ "semver",
+ "serde",
+ "serde_json",
+ "thiserror 2.0.21",
+]
+
+[[package]]
+name = "cargo_toml"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82f4b26e751e711a5302649417f2da046dce6391b2ea30a4820f37462314f0b9"
+dependencies = [
+ "semver",
+ "serde",
+ "toml 1.1.8+spec-1.1.0",
+]
+
+[[package]]
+name = "cc"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86e055fa6e3e40ad6187ba25b6855eeb635d5271f8e0f0e1e9a5826b8d75bea0"
+dependencies = [
+ "find-msvc-tools",
+ "shlex",
+]
+
+[[package]]
+name = "cesu8"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
+
+[[package]]
+name = "cfb"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a347dcabdae9c31b0825fd6a8bed285ec9c2acb89c47827126d52fa4f59cece3"
+dependencies = [
+ "fnv",
+ "uuid",
+ "web-time",
+]
+
+[[package]]
+name = "cfg-expr"
+version = "0.15.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02"
+dependencies = [
+ "smallvec",
+ "target-lexicon",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600"
+
+[[package]]
+name = "chrono"
+version = "0.4.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
+dependencies = [
+ "iana-time-zone",
+ "num-traits",
+ "serde",
+ "windows-link",
+]
+
+[[package]]
+name = "combine"
+version = "4.6.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4356eba6976435498d05a311ee9fc486da3bc81c200d3f0d7dd9703b41913f92"
+dependencies = [
+ "bytes",
+ "memchr",
+]
+
+[[package]]
+name = "cookie"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a373e3602691c3cdea496d2f0ee5935151e6168fe87739483c463db1b2f2f87"
+dependencies = [
+ "time",
+ "version_check",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
+[[package]]
+name = "core-graphics"
+version = "0.25.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97"
+dependencies = [
+ "bitflags 2.13.2",
+ "core-foundation",
+ "core-graphics-types",
+ "foreign-types",
+ "libc",
+]
+
+[[package]]
+name = "core-graphics-types"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb"
+dependencies = [
+ "bitflags 2.13.2",
+ "core-foundation",
+ "libc",
+]
+
+[[package]]
+name = "core_detect"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crc32fast"
+version = "1.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ba106e844045ddc02c20768ac4b0b7cb45f2cc2ecbd833ac9f5dacb183c2055"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6"
+
+[[package]]
+name = "crypto-common"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "cssparser"
+version = "0.37.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c9cdaae01d5ed7882b04d795e7f752f46ff52d2fa3b50a20d28c464510bba98"
+dependencies = [
+ "cssparser-macros",
+ "dtoa-short",
+ "itoa",
+ "phf",
+ "smallvec",
+]
+
+[[package]]
+name = "cssparser-macros"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d045de693cb712d0b22c6a64be5b953f67b3ce00ab5ad3dd5d8b441886ab8e1a"
+dependencies = [
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "ctor"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "914a755b7c2d4af2bdcff7ce1739e2db9a1b81a9b07123d8015786ae03c0980d"
+
+[[package]]
+name = "darling"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed17f5901b6630b993ca003def43f2f8ef4014fc13b047b57aad617ff32bc2ec"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6837e2cf7485aaae18f86181d2f0e9a7ed297a025e220aeabf63fdebd3a2ddff"
+dependencies = [
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ac7135c3ef02b2f7833bbeb1be5ba7f966dcde8a87c6b87f65a778d71a02785"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "dbus"
+version = "0.9.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ab69f03cc8c4340c9c8e315114e1658e6775a9b16a04357973aa21cec22b32e"
+dependencies = [
+ "libc",
+ "libdbus-sys",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "defmt"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4a0795ac740cb54d7b3775c9c17345f6aaecf884c01733b39d6017738e0e3e1"
+dependencies = [
+ "bitflags 1.3.2",
+ "defmt-macros",
+]
+
+[[package]]
+name = "defmt-macros"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "840bb056bd99c495c9188198a258ab787c79f306d864db3e6e8451442d6d8366"
+dependencies = [
+ "defmt-parser",
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "defmt-parser"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71958f69fb2de856c5dd51ac9377e986ca1aa5919f931bf5395a807277f889a0"
+dependencies = [
+ "thiserror 2.0.21",
+]
+
+[[package]]
+name = "deranged"
+version = "0.5.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e9de72ce2ad1f90dc62fa25f0f430ef85eb4b0d8fa0be4f30373bc40a21d28e"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "derive_more"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134"
+dependencies = [
+ "derive_more-impl",
+]
+
+[[package]]
+name = "derive_more-impl"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "rustc_version",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "dirs"
+version = "7.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d57d423b3c82e89b9a24ca3091fee61f456a26edbd28d26c65906f4bc1dcd8f"
+dependencies = [
+ "dirs-sys",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
+dependencies = [
+ "libc",
+ "option-ext",
+ "redox_users",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "dispatch2"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38"
+dependencies = [
+ "bitflags 2.13.2",
+ "block2",
+ "libc",
+ "objc2",
+]
+
+[[package]]
+name = "displaydoc"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "dlopen2"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e2c5bd4158e66d1e215c49b837e11d62f3267b30c92f1d171c4d3105e3dc4d4"
+dependencies = [
+ "dlopen2_derive",
+ "libc",
+ "once_cell",
+ "winapi",
+]
+
+[[package]]
+name = "dlopen2_derive"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fbbb781877580993a8707ec48672673ec7b81eeba04cfd2310bd28c08e47c8f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "dom_query"
+version = "0.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fac5fca71e65e94cc718a6e2af65d6e0f9c6027751c2aa562fbb5087fda639bc"
+dependencies = [
+ "bit-set",
+ "cssparser",
+ "foldhash",
+ "html5ever",
+ "precomputed-hash",
+ "selectors",
+ "tendril",
+]
+
+[[package]]
+name = "dpi"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "dtoa"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590"
+
+[[package]]
+name = "dtoa-short"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87"
+dependencies = [
+ "dtoa",
+]
+
+[[package]]
+name = "dunce"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
+
+[[package]]
+name = "dyn-clone"
+version = "1.0.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555"
+
+[[package]]
+name = "embed-resource"
+version = "3.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6168487b5e7eb2673e6efe1200b1848016e436a6ca0b8031bf04bd9d493a249f"
+dependencies = [
+ "cc",
+ "memchr",
+ "rustc_version",
+ "toml 1.1.8+spec-1.1.0",
+ "vswhom",
+ "winreg",
+]
+
+[[package]]
+name = "embed_plist"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e985e0451871ad22fb8d2b6b076e2028a502a0d3950998c2c5c0a4f9b5d9679"
+dependencies = [
+ "cfg-if",
+ "core_detect",
+ "multiversion_no_op",
+ "rustversion",
+ "scopeguard",
+ "simdutf8",
+]
+
+[[package]]
+name = "equivalent"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826"
+
+[[package]]
+name = "erased-serde"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e59b668157f32d3459d4bd634861a06ffa2503a461ca5f0916b9f0252605e66"
+dependencies = [
+ "serde",
+ "serde_core",
+ "typeid",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223"
+
+[[package]]
+name = "fdeflate"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c"
+dependencies = [
+ "simd-adler32",
+]
+
+[[package]]
+name = "field-offset"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f"
+dependencies = [
+ "memoffset",
+ "rustc_version",
+]
+
+[[package]]
+name = "find-msvc-tools"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c66915cc5391097de7a2b0b972e8505aa33c0df401fd3a6811dbdb32881ba48"
+
+[[package]]
+name = "flate2"
+version = "1.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb"
+dependencies = [
+ "crc32fast",
+ "miniz_oxide 0.9.1",
+ "zlib-rs",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "foldhash"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb"
+
+[[package]]
+name = "foreign-types"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965"
+dependencies = [
+ "foreign-types-macros",
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-macros"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e"
+
+[[package]]
+name = "futures-executor"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed"
+
+[[package]]
+name = "futures-macro"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d"
+
+[[package]]
+name = "futures-task"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd"
+
+[[package]]
+name = "futures-util"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc"
+dependencies = [
+ "futures-core",
+ "futures-io",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "memchr",
+ "pin-project-lite",
+ "slab",
+]
+
+[[package]]
+name = "gdk"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691"
+dependencies = [
+ "cairo-rs",
+ "gdk-pixbuf",
+ "gdk-sys",
+ "gio",
+ "glib",
+ "libc",
+ "pango",
+]
+
+[[package]]
+name = "gdk-pixbuf"
+version = "0.18.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec"
+dependencies = [
+ "gdk-pixbuf-sys",
+ "gio",
+ "glib",
+ "libc",
+ "once_cell",
+]
+
+[[package]]
+name = "gdk-pixbuf-sys"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7"
+dependencies = [
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "gdk-sys"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7"
+dependencies = [
+ "cairo-sys-rs",
+ "gdk-pixbuf-sys",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "pango-sys",
+ "pkg-config",
+ "system-deps",
+]
+
+[[package]]
+name = "gdkwayland-sys"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69"
+dependencies = [
+ "gdk-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "pkg-config",
+ "system-deps",
+]
+
+[[package]]
+name = "gdkx11"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe"
+dependencies = [
+ "gdk",
+ "gdkx11-sys",
+ "gio",
+ "glib",
+ "libc",
+ "x11",
+]
+
+[[package]]
+name = "gdkx11-sys"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d"
+dependencies = [
+ "gdk-sys",
+ "glib-sys",
+ "libc",
+ "system-deps",
+ "x11",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi 5.3.0",
+ "wasip2",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi 6.0.0",
+]
+
+[[package]]
+name = "gio"
+version = "0.18.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-util",
+ "gio-sys",
+ "glib",
+ "libc",
+ "once_cell",
+ "pin-project-lite",
+ "smallvec",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "gio-sys"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+ "winapi",
+]
+
+[[package]]
+name = "glib"
+version = "0.18.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5"
+dependencies = [
+ "bitflags 2.13.2",
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-task",
+ "futures-util",
+ "gio-sys",
+ "glib-macros",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "memchr",
+ "once_cell",
+ "smallvec",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "glib-macros"
+version = "0.18.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc"
+dependencies = [
+ "heck 0.4.1",
+ "proc-macro-crate 2.0.2",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "glib-sys"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898"
+dependencies = [
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b"
+
+[[package]]
+name = "gobject-sys"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44"
+dependencies = [
+ "glib-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "gtk"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a"
+dependencies = [
+ "atk",
+ "cairo-rs",
+ "field-offset",
+ "futures-channel",
+ "gdk",
+ "gdk-pixbuf",
+ "gio",
+ "glib",
+ "gtk-sys",
+ "gtk3-macros",
+ "libc",
+ "pango",
+ "pkg-config",
+]
+
+[[package]]
+name = "gtk-sys"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414"
+dependencies = [
+ "atk-sys",
+ "cairo-sys-rs",
+ "gdk-pixbuf-sys",
+ "gdk-sys",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "pango-sys",
+ "system-deps",
+]
+
+[[package]]
+name = "gtk3-macros"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d"
+dependencies = [
+ "proc-macro-crate 1.3.1",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
+name = "hashbrown"
+version = "0.17.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "hermit-desktop"
+version = "1.1.0"
+dependencies = [
+ "cc",
+ "once_cell",
+ "serde",
+ "serde_json",
+ "tauri",
+ "tauri-build",
+ "tauri-plugin-shell",
+ "tokio",
+]
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "html5ever"
+version = "0.39.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8"
+dependencies = [
+ "log",
+ "markup5ever",
+]
+
+[[package]]
+name = "http"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0"
+dependencies = [
+ "bytes",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c"
+dependencies = [
+ "bytes",
+ "http",
+]
+
+[[package]]
+name = "http-body-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "http",
+ "http-body",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
+
+[[package]]
+name = "hyper"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c"
+dependencies = [
+ "atomic-waker",
+ "bytes",
+ "futures-core",
+ "http",
+ "http-body",
+ "httparse",
+ "itoa",
+ "pin-project-lite",
+ "smallvec",
+ "tokio",
+ "want",
+]
+
+[[package]]
+name = "hyper-util"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff"
+dependencies = [
+ "base64 0.23.1",
+ "bytes",
+ "futures-channel",
+ "futures-util",
+ "http",
+ "http-body",
+ "httparse",
+ "hyper",
+ "ipnet",
+ "libc",
+ "percent-encoding",
+ "pin-project-lite",
+ "socket2",
+ "tokio",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.65"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "log",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "ico"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d75e94d66081e4d8dcd098bd8dc5254800fea14a26389b298410158d834de167"
+dependencies = [
+ "byteorder",
+ "png",
+]
+
+[[package]]
+name = "icu_collections"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe090a42a0d3140fed8c63263ed1fecc02422cb2f4bfe55cd8de2de1b8e105dd"
+dependencies = [
+ "displaydoc",
+ "potential_utf",
+ "utf8_iter",
+ "yoke",
+ "zerofrom",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locale_core"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25d29b57c17c6528d0dc4c2141cfa2d08200465acb537a3909c8b9b8a4a984c0"
+dependencies = [
+ "displaydoc",
+ "litemap",
+ "tinystr",
+ "writeable",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "404a3b8c486f205c87fe7f23ab6894d84a4ad76d6e4671ae1981ba7def87c599"
+dependencies = [
+ "icu_collections",
+ "icu_normalizer_data",
+ "icu_properties",
+ "icu_provider",
+ "smallvec",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer_data"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20f0088bfb7441f7a37fa0c9e20cb1e9cba1cac6b9ce8cd2a6dc44294f8e8cbc"
+
+[[package]]
+name = "icu_properties"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ea83d991c56158f7cf898bf86436c1dfe7c07ee82fe88951f2695c9f37a379f"
+dependencies = [
+ "displaydoc",
+ "icu_collections",
+ "icu_locale_core",
+ "icu_properties_data",
+ "icu_provider",
+ "zerotrie",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_properties_data"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b98f29af82d02b163fe50161388350e743bb3107cc8e8c2f7314cb505faddfcf"
+
+[[package]]
+name = "icu_provider"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "413099315636c588ee8f011190b329b971a09a8fae9d157e01dcae8379468514"
+dependencies = [
+ "displaydoc",
+ "icu_locale_core",
+ "writeable",
+ "yoke",
+ "zerofrom",
+ "zerotrie",
+ "zerovec",
+]
+
+[[package]]
+name = "ident_case"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+[[package]]
+name = "idna"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
+dependencies = [
+ "idna_adapter",
+ "smallvec",
+ "utf8_iter",
+]
+
+[[package]]
+name = "idna_adapter"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714"
+dependencies = [
+ "icu_normalizer",
+ "icu_properties",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg",
+ "hashbrown 0.12.3",
+ "serde",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.14.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.17.1",
+ "serde",
+ "serde_core",
+]
+
+[[package]]
+name = "infer"
+version = "0.22.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4200d433cbd5178df7797c9c2e75b348b728e39631cf14520d1e2fc424201f4"
+dependencies = [
+ "cfb",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.12.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0"
+
+[[package]]
+name = "is-docker"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "is-wsl"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5"
+dependencies = [
+ "is-docker",
+ "once_cell",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
+
+[[package]]
+name = "javascriptcore-rs"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc"
+dependencies = [
+ "bitflags 1.3.2",
+ "glib",
+ "javascriptcore-rs-sys",
+]
+
+[[package]]
+name = "javascriptcore-rs-sys"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "jiff"
+version = "0.2.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b005715dcbeb0089a3c0dab99f2ff1cc3b2525323552703d648585d342a383"
+dependencies = [
+ "defmt",
+ "jiff-core",
+ "jiff-static",
+ "jiff-tzdb-platform",
+ "log",
+ "portable-atomic",
+ "portable-atomic-util",
+ "serde_core",
+ "windows-link",
+]
+
+[[package]]
+name = "jiff-core"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e52fe76043ccecc9005d2305ebaadf7d7fc0cc89ca6baa10a94d6bc68c7128c"
+dependencies = [
+ "defmt",
+ "log",
+]
+
+[[package]]
+name = "jiff-static"
+version = "0.2.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2cc9817253cf7c7ee4684451bd327e88d6f3658014e54a29198625590650695c"
+dependencies = [
+ "jiff-core",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "jiff-tzdb"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa8377070c6bae868759445e5a77f66d84f0b72f3a054bfb00e6d038b8282da7"
+
+[[package]]
+name = "jiff-tzdb-platform"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8"
+dependencies = [
+ "jiff-tzdb",
+]
+
+[[package]]
+name = "jni"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97"
+dependencies = [
+ "cesu8",
+ "cfg-if",
+ "combine",
+ "jni-sys 0.3.1",
+ "log",
+ "thiserror 1.0.69",
+ "walkdir",
+ "windows-sys 0.45.0",
+]
+
+[[package]]
+name = "jni-sys"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258"
+dependencies = [
+ "jni-sys 0.4.1",
+]
+
+[[package]]
+name = "jni-sys"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2"
+dependencies = [
+ "jni-sys-macros",
+]
+
+[[package]]
+name = "jni-sys-macros"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264"
+dependencies = [
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "js-sys"
+version = "0.3.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5"
+dependencies = [
+ "cfg-if",
+ "futures-util",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "json-patch"
+version = "4.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7421438de105a0827e44fadd05377727847d717c80ce29a229f85fd04c427b72"
+dependencies = [
+ "jsonptr",
+ "serde",
+ "serde_json",
+ "thiserror 2.0.21",
+]
+
+[[package]]
+name = "jsonptr"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5a3cc660ba5d72bce0b3bb295bf20847ccbb40fd423f3f05b61273672e561fe"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "keyboard-types"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d"
+dependencies = [
+ "bitflags 2.13.2",
+ "serde",
+]
+
+[[package]]
+name = "libappindicator"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a"
+dependencies = [
+ "glib",
+ "gtk",
+ "gtk-sys",
+ "libappindicator-sys",
+ "log",
+]
+
+[[package]]
+name = "libappindicator-sys"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf"
+dependencies = [
+ "gtk-sys",
+ "libloading",
+ "once_cell",
+]
+
+[[package]]
+name = "libc"
+version = "0.2.191"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a"
+
+[[package]]
+name = "libdbus-sys"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "328c4789d42200f1eeec05bd86c9c13c7f091d2ba9a6ea35acdf51f31bc0f043"
+dependencies = [
+ "pkg-config",
+]
+
+[[package]]
+name = "libloading"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
+dependencies = [
+ "cfg-if",
+ "winapi",
+]
+
+[[package]]
+name = "libredox"
+version = "0.1.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "litemap"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae"
+
+[[package]]
+name = "lock_api"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
+dependencies = [
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6"
+
+[[package]]
+name = "markup5ever"
+version = "0.39.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de"
+dependencies = [
+ "log",
+ "tendril",
+ "web_atoms",
+]
+
+[[package]]
+name = "memchr"
+version = "2.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
+
+[[package]]
+name = "memoffset"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "miniz_oxide"
+version = "0.8.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
+dependencies = [
+ "adler2",
+ "simd-adler32",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c"
+dependencies = [
+ "adler2",
+ "simd-adler32",
+]
+
+[[package]]
+name = "mio"
+version = "1.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee"
+dependencies = [
+ "libc",
+ "wasi",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "muda"
+version = "0.20.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cca139e57da4383727f189e43e66e84fa372347027fc996f9f1a007ec0a37996"
+dependencies = [
+ "crossbeam-channel",
+ "dpi",
+ "gtk",
+ "keyboard-types",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
+ "once_cell",
+ "png",
+ "serde",
+ "thiserror 2.0.21",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "multiversion_no_op"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d"
+
+[[package]]
+name = "ndk"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4"
+dependencies = [
+ "bitflags 2.13.2",
+ "jni-sys 0.3.1",
+ "log",
+ "ndk-sys",
+ "num_enum",
+ "raw-window-handle",
+ "thiserror 1.0.69",
+]
+
+[[package]]
+name = "ndk-context"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
+
+[[package]]
+name = "ndk-sys"
+version = "0.6.0+11769913"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873"
+dependencies = [
+ "jni-sys 0.3.1",
+]
+
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
+
+[[package]]
+name = "num-conv"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441"
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_enum"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26"
+dependencies = [
+ "num_enum_derive",
+ "rustversion",
+]
+
+[[package]]
+name = "num_enum_derive"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8"
+dependencies = [
+ "proc-macro-crate 3.5.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "objc2"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08849bbd4767dfae9457696856ae1c84fe4e0281bbe4a7abff2d0e06fb7981f8"
+dependencies = [
+ "objc2-encode",
+ "objc2-exception-helper",
+]
+
+[[package]]
+name = "objc2-app-kit"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c"
+dependencies = [
+ "bitflags 2.13.2",
+ "block2",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-foundation",
+ "objc2-quartz-core",
+]
+
+[[package]]
+name = "objc2-cloud-kit"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c"
+dependencies = [
+ "bitflags 2.13.2",
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-data"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa"
+dependencies = [
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-foundation"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
+dependencies = [
+ "bitflags 2.13.2",
+ "dispatch2",
+ "objc2",
+]
+
+[[package]]
+name = "objc2-core-graphics"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807"
+dependencies = [
+ "bitflags 2.13.2",
+ "dispatch2",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-io-surface",
+]
+
+[[package]]
+name = "objc2-core-image"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006"
+dependencies = [
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-location"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009"
+dependencies = [
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-core-text"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d"
+dependencies = [
+ "bitflags 2.13.2",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+]
+
+[[package]]
+name = "objc2-encode"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
+
+[[package]]
+name = "objc2-exception-helper"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "objc2-foundation"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272"
+dependencies = [
+ "bitflags 2.13.2",
+ "block2",
+ "objc2",
+ "objc2-core-foundation",
+]
+
+[[package]]
+name = "objc2-io-surface"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d"
+dependencies = [
+ "bitflags 2.13.2",
+ "objc2",
+ "objc2-core-foundation",
+]
+
+[[package]]
+name = "objc2-quartz-core"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f"
+dependencies = [
+ "bitflags 2.13.2",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-ui-kit"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22"
+dependencies = [
+ "bitflags 2.13.2",
+ "block2",
+ "objc2",
+ "objc2-cloud-kit",
+ "objc2-core-data",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-core-image",
+ "objc2-core-location",
+ "objc2-core-text",
+ "objc2-foundation",
+ "objc2-quartz-core",
+ "objc2-user-notifications",
+]
+
+[[package]]
+name = "objc2-user-notifications"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e"
+dependencies = [
+ "objc2",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "objc2-web-kit"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f"
+dependencies = [
+ "bitflags 2.13.2",
+ "block2",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.21.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
+
+[[package]]
+name = "open"
+version = "5.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d8c8b8e725ad26404d6896eb2f064294a0a7b4f1d9120210d85544684c4ca95"
+dependencies = [
+ "dunce",
+ "is-wsl",
+ "libc",
+]
+
+[[package]]
+name = "option-ext"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
+
+[[package]]
+name = "os_pipe"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967"
+dependencies = [
+ "libc",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "pango"
+version = "0.18.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4"
+dependencies = [
+ "gio",
+ "glib",
+ "libc",
+ "once_cell",
+ "pango-sys",
+]
+
+[[package]]
+name = "pango-sys"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5"
+dependencies = [
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.12.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-link",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
+
+[[package]]
+name = "phf"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf"
+dependencies = [
+ "phf_macros",
+ "phf_shared",
+ "serde",
+]
+
+[[package]]
+name = "phf_codegen"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1"
+dependencies = [
+ "phf_generator",
+ "phf_shared",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737"
+dependencies = [
+ "fastrand",
+ "phf_shared",
+]
+
+[[package]]
+name = "phf_macros"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef"
+dependencies = [
+ "phf_generator",
+ "phf_shared",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266"
+dependencies = [
+ "siphasher",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
+
+[[package]]
+name = "pkg-config"
+version = "0.3.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548"
+
+[[package]]
+name = "plist"
+version = "1.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "327a4cb2ad49dc48adfdc9da89e22c64d488b508c67a044d71ba729e4521a285"
+dependencies = [
+ "base64 0.23.1",
+ "indexmap 2.14.2",
+ "quick-xml",
+ "serde",
+ "time",
+]
+
+[[package]]
+name = "png"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61"
+dependencies = [
+ "bitflags 2.13.2",
+ "crc32fast",
+ "fdeflate",
+ "flate2",
+ "miniz_oxide 0.8.9",
+]
+
+[[package]]
+name = "portable-atomic"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85"
+
+[[package]]
+name = "portable-atomic-util"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715"
+dependencies = [
+ "portable-atomic",
+]
+
+[[package]]
+name = "potential_utf"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661"
+dependencies = [
+ "zerovec",
+]
+
+[[package]]
+name = "powerfmt"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958"
+
+[[package]]
+name = "precomputed-hash"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+
+[[package]]
+name = "proc-macro-crate"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
+dependencies = [
+ "once_cell",
+ "toml_edit 0.19.15",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24"
+dependencies = [
+ "toml_datetime 0.6.3",
+ "toml_edit 0.20.2",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "3.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f"
+dependencies = [
+ "toml_edit 0.25.17+spec-1.1.0",
+]
+
+[[package]]
+name = "proc-macro-error"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
+dependencies = [
+ "proc-macro-error-attr",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro-error-attr"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "version_check",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.107"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quick-xml"
+version = "0.42.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41b1177fdf999d2321d3fb46ff47159d9c1fb9ad66a4879f8c50a0b504615e9b"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.47"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "r-efi"
+version = "5.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+
+[[package]]
+name = "r-efi"
+version = "6.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
+
+[[package]]
+name = "raw-window-handle"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539"
+
+[[package]]
+name = "redox_syscall"
+version = "0.5.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
+dependencies = [
+ "bitflags 2.13.2",
+]
+
+[[package]]
+name = "redox_users"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0"
+dependencies = [
+ "libredox",
+ "thiserror 2.0.21",
+]
+
+[[package]]
+name = "ref-cast"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3"
+dependencies = [
+ "ref-cast-impl",
+]
+
+[[package]]
+name = "ref-cast-impl"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "regex"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
+
+[[package]]
+name = "reqwest"
+version = "0.13.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16a1cfa75cc186dd73d5818e510e042e40927bccc9c236b061cea97e1eb08029"
+dependencies = [
+ "base64 0.23.1",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-body-util",
+ "hyper",
+ "hyper-util",
+ "js-sys",
+ "log",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "serde_json",
+ "sync_wrapper",
+ "tokio",
+ "tokio-util",
+ "tower",
+ "tower-http",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "wasm-streams",
+ "web-sys",
+]
+
+[[package]]
+name = "rustc-hash"
+version = "2.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
+
+[[package]]
+name = "rustc_version"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "schemars"
+version = "0.8.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615"
+dependencies = [
+ "dyn-clone",
+ "indexmap 1.9.3",
+ "schemars_derive",
+ "serde",
+ "serde_json",
+ "url",
+ "uuid",
+]
+
+[[package]]
+name = "schemars"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f"
+dependencies = [
+ "dyn-clone",
+ "ref-cast",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "schemars"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab508826f74a77ca9d5aba6ff19b522583ee3eaf28a19384ff3d0e5835fadf6e"
+dependencies = [
+ "dyn-clone",
+ "ref-cast",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "schemars_derive"
+version = "0.8.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde_derive_internals",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "selectors"
+version = "0.38.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8adfa1c298912827b8a28b223b3b874357397ae706e6190acd9bf28cee99114d"
+dependencies = [
+ "bitflags 2.13.2",
+ "cssparser",
+ "derive_more",
+ "log",
+ "new_debug_unreachable",
+ "phf",
+ "phf_codegen",
+ "precomputed-hash",
+ "rustc-hash",
+ "servo_arc",
+ "smallvec",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd"
+dependencies = [
+ "serde",
+ "serde_core",
+]
+
+[[package]]
+name = "serde"
+version = "1.0.229"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
+dependencies = [
+ "serde_core",
+ "serde_derive",
+]
+
+[[package]]
+name = "serde-untagged"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058"
+dependencies = [
+ "erased-serde",
+ "serde",
+ "serde_core",
+ "typeid",
+]
+
+[[package]]
+name = "serde_core"
+version = "1.0.229"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.229"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "serde_derive_internals"
+version = "0.29.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.154"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6"
+dependencies = [
+ "itoa",
+ "memchr",
+ "serde",
+ "serde_core",
+ "zmij",
+]
+
+[[package]]
+name = "serde_repr"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "0.6.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e7523beb55eece201a2356bee0bbca0d1ab466c14c07703b2e0ee6d42cb0c2c"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "serde_with"
+version = "3.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df9adc193c780ef8f159aee8b61e2d5801aaa555e6eb0947fe45530ec506296f"
+dependencies = [
+ "base64 0.23.1",
+ "bs58",
+ "chrono",
+ "hex",
+ "indexmap 1.9.3",
+ "indexmap 2.14.2",
+ "jiff",
+ "schemars 0.9.0",
+ "schemars 1.2.3",
+ "serde_core",
+ "serde_json",
+ "serde_with_macros",
+ "time",
+]
+
+[[package]]
+name = "serde_with_macros"
+version = "3.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3e17bbc68e28663bbbb90df47e058aa7eda4fb445b89fe70457bb94fbccf6e49"
+dependencies = [
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "serialize-to-javascript"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5"
+dependencies = [
+ "serde",
+ "serde_json",
+ "serialize-to-javascript-impl",
+]
+
+[[package]]
+name = "serialize-to-javascript-impl"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "servo_arc"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930"
+dependencies = [
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "shared_child"
+version = "1.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "607549934f6cc26b89cfecfdc46fa90f1e5d1536a68349b0c3a4f9d1c0d37959"
+dependencies = [
+ "libc",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "shlex"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
+
+[[package]]
+name = "simd-adler32"
+version = "0.3.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea"
+
+[[package]]
+name = "simdutf8"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
+
+[[package]]
+name = "siphasher"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256"
+
+[[package]]
+name = "slab"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
+
+[[package]]
+name = "smallvec"
+version = "1.16.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0d5d4b1981b8bbbb7aed204cae5726d683d5d6ac7e74ec54122ea28f315e7c8"
+
+[[package]]
+name = "socket2"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4"
+dependencies = [
+ "libc",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "softbuffer"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3"
+dependencies = [
+ "bytemuck",
+ "js-sys",
+ "ndk",
+ "objc2",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-foundation",
+ "objc2-quartz-core",
+ "raw-window-handle",
+ "redox_syscall",
+ "tracing",
+ "wasm-bindgen",
+ "web-sys",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "soup3"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f"
+dependencies = [
+ "futures-channel",
+ "gio",
+ "glib",
+ "libc",
+ "soup3-sys",
+]
+
+[[package]]
+name = "soup3-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27"
+dependencies = [
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "libc",
+ "system-deps",
+]
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+
+[[package]]
+name = "static_vcruntime"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff7589a1859b09232522bb9edf076ca7fcf14ded96685d3fa629db73023ffbb7"
+
+[[package]]
+name = "string_cache"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901"
+dependencies = [
+ "new_debug_unreachable",
+ "parking_lot",
+ "phf_shared",
+ "precomputed-hash",
+]
+
+[[package]]
+name = "string_cache_codegen"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69"
+dependencies = [
+ "phf_generator",
+ "phf_shared",
+ "proc-macro2",
+ "quote",
+]
+
+[[package]]
+name = "strsim"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
+[[package]]
+name = "swift-rs"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cefd87076fd385308ee4aff597256c902f1fbb4d031de1558efc12f8ffefadd9"
+dependencies = [
+ "base64 0.21.7",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.109"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
+dependencies = [
+ "proc-macro2",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.119"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn"
+version = "3.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sync_wrapper"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "synstructure"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "system-deps"
+version = "6.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349"
+dependencies = [
+ "cfg-expr",
+ "heck 0.5.0",
+ "pkg-config",
+ "toml 0.8.2",
+ "version-compare",
+]
+
+[[package]]
+name = "tao"
+version = "0.37.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d5777b06fe6435126ae8d816eba269e050e1e10d302cf5461e9c49eccabc3548"
+dependencies = [
+ "bitflags 2.13.2",
+ "block2",
+ "core-foundation",
+ "core-graphics",
+ "crossbeam-channel",
+ "dbus",
+ "dispatch2",
+ "dlopen2",
+ "dpi",
+ "gdkwayland-sys",
+ "gdkx11-sys",
+ "gtk",
+ "jni",
+ "libc",
+ "log",
+ "ndk",
+ "ndk-context",
+ "ndk-sys",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "objc2-ui-kit",
+ "parking_lot",
+ "percent-encoding",
+ "raw-window-handle",
+ "tao-macros",
+ "unicode-segmentation",
+ "url",
+ "windows",
+ "windows-core",
+ "windows-version",
+ "x11-dl",
+]
+
+[[package]]
+name = "tao-macros"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f7eeb6d99155545da6150a1795945f16ac9c178deb2a5f2e74d776107bd5849"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "target-lexicon"
+version = "0.12.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
+
+[[package]]
+name = "tauri"
+version = "2.12.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fb0244332cfb9cee7e2a568bf5da29a36ed8fdbd717f6f47a66b6b7b358c072"
+dependencies = [
+ "anyhow",
+ "bytes",
+ "cookie",
+ "dirs",
+ "dunce",
+ "embed_plist",
+ "getrandom 0.3.4",
+ "glob",
+ "gtk",
+ "heck 0.5.0",
+ "http",
+ "jni",
+ "libc",
+ "log",
+ "mime",
+ "muda",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-foundation",
+ "objc2-ui-kit",
+ "objc2-web-kit",
+ "percent-encoding",
+ "plist",
+ "raw-window-handle",
+ "reqwest",
+ "serde",
+ "serde_json",
+ "serde_repr",
+ "serialize-to-javascript",
+ "swift-rs",
+ "tauri-build",
+ "tauri-macros",
+ "tauri-runtime",
+ "tauri-runtime-wry",
+ "tauri-utils",
+ "thiserror 2.0.21",
+ "tokio",
+ "tray-icon",
+ "url",
+ "webkit2gtk",
+ "webview2-com",
+ "window-vibrancy",
+ "windows",
+]
+
+[[package]]
+name = "tauri-build"
+version = "2.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adddb0e648752aaac5da9c3c3c6a68e1e87cab55e3b757b18a9441ef8c3ac614"
+dependencies = [
+ "anyhow",
+ "cargo_toml",
+ "dirs",
+ "glob",
+ "heck 0.5.0",
+ "json-patch",
+ "schemars 0.8.22",
+ "semver",
+ "serde",
+ "serde_json",
+ "static_vcruntime",
+ "strsim",
+ "tauri-utils",
+ "tauri-winres",
+ "walkdir",
+]
+
+[[package]]
+name = "tauri-codegen"
+version = "2.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb37631cf71dab5e8ab55e1bdd701e18a52653d90b78e71d0e5598b1e0a61316"
+dependencies = [
+ "base64 0.23.1",
+ "brotli",
+ "ico",
+ "json-patch",
+ "plist",
+ "png",
+ "proc-macro2",
+ "quote",
+ "semver",
+ "serde",
+ "serde_json",
+ "sha2",
+ "syn 2.0.119",
+ "tauri-utils",
+ "thiserror 2.0.21",
+ "time",
+ "url",
+ "uuid",
+ "walkdir",
+]
+
+[[package]]
+name = "tauri-macros"
+version = "2.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0cc38db58854c10fb5f91a887ed8bf82d3239bb92b5d8db86eda09e96d9963d1"
+dependencies = [
+ "heck 0.5.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+ "tauri-codegen",
+ "tauri-utils",
+]
+
+[[package]]
+name = "tauri-plugin"
+version = "2.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67fb21a77e8f94e8beb3325e583102488659365af0a3948b7ea244c5b779c291"
+dependencies = [
+ "anyhow",
+ "glob",
+ "plist",
+ "schemars 0.8.22",
+ "serde",
+ "serde_json",
+ "tauri-utils",
+ "walkdir",
+]
+
+[[package]]
+name = "tauri-plugin-shell"
+version = "2.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7375b25f72f70f6168f27f1ba3a413e30eaa0a2098cff53a4046ebfe9e2f142d"
+dependencies = [
+ "encoding_rs",
+ "libc",
+ "log",
+ "open",
+ "os_pipe",
+ "regex",
+ "schemars 0.8.22",
+ "serde",
+ "serde_json",
+ "shared_child",
+ "tauri",
+ "tauri-plugin",
+ "thiserror 2.0.21",
+ "tokio",
+ "windows-sys 0.60.2",
+]
+
+[[package]]
+name = "tauri-runtime"
+version = "2.12.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c55766d99cea69055904d1735b93c2049302b2e09effd462120deb5581d78e9"
+dependencies = [
+ "cookie",
+ "dpi",
+ "gtk",
+ "http",
+ "jni",
+ "objc2",
+ "objc2-ui-kit",
+ "objc2-web-kit",
+ "raw-window-handle",
+ "serde",
+ "serde_json",
+ "tauri-utils",
+ "thiserror 2.0.21",
+ "url",
+ "webkit2gtk",
+ "webview2-com",
+ "windows",
+]
+
+[[package]]
+name = "tauri-runtime-wry"
+version = "2.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1aa9d8b7a120f879f44fdc1053f7b7dbf416bf0bbc6a72b714dec46b782b52f"
+dependencies = [
+ "gtk",
+ "http",
+ "jni",
+ "log",
+ "objc2",
+ "objc2-app-kit",
+ "percent-encoding",
+ "raw-window-handle",
+ "softbuffer",
+ "tao",
+ "tauri-runtime",
+ "tauri-utils",
+ "url",
+ "webkit2gtk",
+ "webview2-com",
+ "windows",
+ "wry",
+]
+
+[[package]]
+name = "tauri-utils"
+version = "2.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "362ab21cd4cc713f2a02b1a9b5688198b1541cfb6907c4281e9190e0f0ef4aa3"
+dependencies = [
+ "anyhow",
+ "brotli",
+ "cargo_metadata",
+ "ctor",
+ "dom_query",
+ "dunce",
+ "glob",
+ "http",
+ "infer",
+ "json-patch",
+ "log",
+ "memchr",
+ "phf",
+ "plist",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "schemars 0.8.22",
+ "semver",
+ "serde",
+ "serde-untagged",
+ "serde_json",
+ "serde_with",
+ "swift-rs",
+ "thiserror 2.0.21",
+ "toml 1.1.8+spec-1.1.0",
+ "url",
+ "urlpattern",
+ "uuid",
+ "walkdir",
+]
+
+[[package]]
+name = "tauri-winres"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c52bb6904475a6ca662f15ef787f18ade61d5740a1ee12c45d3b748efdb6f796"
+dependencies = [
+ "dunce",
+ "embed-resource",
+ "toml 1.1.8+spec-1.1.0",
+]
+
+[[package]]
+name = "tendril"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fed54709c5b3a53d09bb1c113ea4f5ceafd1e772ddcb0030a82e1d56c087b08"
+dependencies = [
+ "new_debug_unreachable",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
+dependencies = [
+ "thiserror-impl 1.0.69",
+]
+
+[[package]]
+name = "thiserror"
+version = "2.0.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e"
+dependencies = [
+ "thiserror-impl 2.0.21",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "2.0.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "time"
+version = "0.3.55"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb87b95ec50ddfa440816d227a17b2ccbdda963a316a727fda0fc4334f7d134"
+dependencies = [
+ "deranged",
+ "num-conv",
+ "powerfmt",
+ "serde_core",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109"
+
+[[package]]
+name = "time-macros"
+version = "0.2.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e689342a48d2ea927c87ea50cabf8594854bf940e9310208848d680d668ed85"
+dependencies = [
+ "num-conv",
+ "time-core",
+]
+
+[[package]]
+name = "tinystr"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abc840c238154d58f9e86b2792261edfde565a17696e1cda1a449de27979801a"
+dependencies = [
+ "displaydoc",
+ "zerovec",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.13.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee"
+
+[[package]]
+name = "tokio"
+version = "1.54.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b52fd3255258d26fac7264ab5a76b53c13367136dc011d3d6ad4f8ed070396a3"
+dependencies = [
+ "bytes",
+ "libc",
+ "mio",
+ "pin-project-lite",
+ "socket2",
+ "tokio-macros",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e464cf451ba96ebfc6f9b6542f17ee8b8956e33f1e40d9690624e59d7a7f8a4b"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "toml"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d"
+dependencies = [
+ "serde",
+ "serde_spanned 0.6.9",
+ "toml_datetime 0.6.3",
+ "toml_edit 0.20.2",
+]
+
+[[package]]
+name = "toml"
+version = "1.1.8+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "20489e00e4d8741d6be680764cc12e270655e375a20d1011e844a9c3379e678d"
+dependencies = [
+ "indexmap 2.14.2",
+ "serde_core",
+ "serde_spanned 1.1.2",
+ "toml_datetime 1.1.2+spec-1.1.0",
+ "toml_parser",
+ "toml_writer",
+ "winnow 1.0.4",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "1.1.2+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.19.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+dependencies = [
+ "indexmap 2.14.2",
+ "toml_datetime 0.6.3",
+ "winnow 0.5.40",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.20.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
+dependencies = [
+ "indexmap 2.14.2",
+ "serde",
+ "serde_spanned 0.6.9",
+ "toml_datetime 0.6.3",
+ "winnow 0.5.40",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.25.17+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3641d5bbb5349a79e1020a242d251efbc546ad8048d133958323ce9c40a9c9c"
+dependencies = [
+ "indexmap 2.14.2",
+ "toml_datetime 1.1.2+spec-1.1.0",
+ "toml_parser",
+ "winnow 1.0.4",
+]
+
+[[package]]
+name = "toml_parser"
+version = "1.1.5+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c"
+dependencies = [
+ "winnow 1.0.4",
+]
+
+[[package]]
+name = "toml_writer"
+version = "1.1.3+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06bdbd8cfc056b8d2e2e85f29b56a3bdbecb527cef81eb39e3e7b98af4652770"
+
+[[package]]
+name = "tower"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "pin-project-lite",
+ "sync_wrapper",
+ "tokio",
+ "tower-layer",
+ "tower-service",
+]
+
+[[package]]
+name = "tower-http"
+version = "0.6.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840"
+dependencies = [
+ "bitflags 2.13.2",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "pin-project-lite",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "url",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
+
+[[package]]
+name = "tower-service"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
+
+[[package]]
+name = "tracing"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
+dependencies = [
+ "pin-project-lite",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "tray-icon"
+version = "0.25.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2b9c52859a94554803ccd4a24b98f74148ebc73b90676d783f3490b1bff9d72"
+dependencies = [
+ "crossbeam-channel",
+ "dirs",
+ "libappindicator",
+ "muda",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-core-graphics",
+ "objc2-foundation",
+ "once_cell",
+ "png",
+ "serde",
+ "thiserror 2.0.21",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+
+[[package]]
+name = "typeid"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"
+
+[[package]]
+name = "typenum"
+version = "1.20.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563"
+
+[[package]]
+name = "unicode-segmentation"
+version = "1.13.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8"
+
+[[package]]
+name = "url"
+version = "2.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+ "serde",
+ "serde_derive",
+]
+
+[[package]]
+name = "urlpattern"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df16f50ef4cc145211879a3867ba757076b25dfee812040dcb0658bd9ae7904b"
+dependencies = [
+ "icu_properties",
+ "regex",
+ "serde",
+ "url",
+]
+
+[[package]]
+name = "utf8_iter"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "af3bd9d3e571c26fcce9d033b87ea5ab061b8d2ffe9b7a5675d810d68f03edf0"
+dependencies = [
+ "utf_types",
+]
+
+[[package]]
+name = "utf_types"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a3b425286980a367278453f3b6d28cdcb134b574e5a35824a6ff5eebad50bb6"
+
+[[package]]
+name = "uuid"
+version = "1.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a0e2d11620c50695fe12bbbfde96b3477fe606e7284c22d505c12ce51214514"
+dependencies = [
+ "getrandom 0.4.3",
+ "js-sys",
+ "serde_core",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "version-compare"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03c2856837ef78f57382f06b2b8563a2f512f7185d732608fd9176cb3b8edf0e"
+
+[[package]]
+name = "version_check"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+
+[[package]]
+name = "vswhom"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b"
+dependencies = [
+ "libc",
+ "vswhom-sys",
+]
+
+[[package]]
+name = "vswhom-sys"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "walkdir"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "want"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b"
+dependencies = [
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.1+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+
+[[package]]
+name = "wasip2"
+version = "1.0.4+wasi-0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
+dependencies = [
+ "wit-bindgen",
+]
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.129"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.79"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e"
+dependencies = [
+ "js-sys",
+ "tokio",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.129"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.129"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7"
+dependencies = [
+ "bumpalo",
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.129"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "wasm-streams"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d1ec4f6517c9e11ae630e200b2b65d193279042e28edd4a2cda233e46670bbb"
+dependencies = [
+ "futures-util",
+ "js-sys",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "web-time"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "web_atoms"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba8b815c1b593dc0baf78dd0f4fc8fdb2de53198fb1163738093e9a311c33fb3"
+dependencies = [
+ "phf",
+ "phf_codegen",
+ "string_cache",
+ "string_cache_codegen",
+]
+
+[[package]]
+name = "webkit2gtk"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1027150013530fb2eaf806408df88461ae4815a45c541c8975e61d6f2fc4793"
+dependencies = [
+ "bitflags 1.3.2",
+ "cairo-rs",
+ "gdk",
+ "gdk-sys",
+ "gio",
+ "gio-sys",
+ "glib",
+ "glib-sys",
+ "gobject-sys",
+ "gtk",
+ "gtk-sys",
+ "javascriptcore-rs",
+ "libc",
+ "once_cell",
+ "soup3",
+ "webkit2gtk-sys",
+]
+
+[[package]]
+name = "webkit2gtk-sys"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "916a5f65c2ef0dfe12fff695960a2ec3d4565359fdbb2e9943c974e06c734ea5"
+dependencies = [
+ "bitflags 1.3.2",
+ "cairo-sys-rs",
+ "gdk-sys",
+ "gio-sys",
+ "glib-sys",
+ "gobject-sys",
+ "gtk-sys",
+ "javascriptcore-rs-sys",
+ "libc",
+ "pkg-config",
+ "soup3-sys",
+ "system-deps",
+]
+
+[[package]]
+name = "webview2-com"
+version = "0.39.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f89fca7a704cee10dcb3654c1dbb8941d1783132f1917358af75bec37a7d7e6"
+dependencies = [
+ "webview2-com-macros",
+ "webview2-com-sys",
+ "windows",
+ "windows-core",
+]
+
+[[package]]
+name = "webview2-com-macros"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "webview2-com-sys"
+version = "0.39.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3a07132775117d6065853d9d1178157b8c90e228de47129d6bce2c7edebedfb"
+dependencies = [
+ "thiserror 2.0.21",
+ "windows",
+ "windows-core",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
+dependencies = [
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "window-vibrancy"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "111e51caca442cafd9bab396628ac4d814880eaea4e63dfd76a12e9f342b5580"
+dependencies = [
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
+ "objc2-quartz-core",
+ "raw-window-handle",
+ "windows-sys 0.61.2",
+ "windows-version",
+]
+
+[[package]]
+name = "windows"
+version = "0.62.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580"
+dependencies = [
+ "windows-collections",
+ "windows-core",
+ "windows-future",
+ "windows-numerics",
+]
+
+[[package]]
+name = "windows-collections"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610"
+dependencies = [
+ "windows-core",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.62.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-link",
+ "windows-result",
+ "windows-strings",
+]
+
+[[package]]
+name = "windows-future"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb"
+dependencies = [
+ "windows-core",
+ "windows-link",
+ "windows-threading",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.60.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.59.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.119",
+]
+
+[[package]]
+name = "windows-link"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+
+[[package]]
+name = "windows-numerics"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26"
+dependencies = [
+ "windows-core",
+ "windows-link",
+]
+
+[[package]]
+name = "windows-result"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.45.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
+dependencies = [
+ "windows-targets 0.42.2",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.60.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+dependencies = [
+ "windows-targets 0.53.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.61.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
+dependencies = [
+ "windows_aarch64_gnullvm 0.42.2",
+ "windows_aarch64_msvc 0.42.2",
+ "windows_i686_gnu 0.42.2",
+ "windows_i686_msvc 0.42.2",
+ "windows_x86_64_gnu 0.42.2",
+ "windows_x86_64_gnullvm 0.42.2",
+ "windows_x86_64_msvc 0.42.2",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.53.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
+dependencies = [
+ "windows-link",
+ "windows_aarch64_gnullvm 0.53.1",
+ "windows_aarch64_msvc 0.53.1",
+ "windows_i686_gnu 0.53.1",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.53.1",
+ "windows_x86_64_gnu 0.53.1",
+ "windows_x86_64_gnullvm 0.53.1",
+ "windows_x86_64_msvc 0.53.1",
+]
+
+[[package]]
+name = "windows-threading"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-version"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
+
+[[package]]
+name = "winnow"
+version = "0.5.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winnow"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.56.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d6f32a0ff4a9f6f01231eb2059cc85479330739333e0e58cadf03b6af2cca10"
+dependencies = [
+ "cfg-if",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "wit-bindgen"
+version = "0.57.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
+
+[[package]]
+name = "writeable"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc"
+
+[[package]]
+name = "wry"
+version = "0.57.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "759c50ddad0ef9913bb5496cb9d509a50433a3b78cb0238d61105526589cf0e9"
+dependencies = [
+ "base64 0.23.1",
+ "block2",
+ "cookie",
+ "crossbeam-channel",
+ "dirs",
+ "dom_query",
+ "dpi",
+ "dunce",
+ "gdkx11",
+ "gtk",
+ "http",
+ "javascriptcore-rs",
+ "jni",
+ "libc",
+ "ndk",
+ "objc2",
+ "objc2-app-kit",
+ "objc2-core-foundation",
+ "objc2-foundation",
+ "objc2-ui-kit",
+ "objc2-web-kit",
+ "percent-encoding",
+ "raw-window-handle",
+ "sha2",
+ "soup3",
+ "tao-macros",
+ "thiserror 2.0.21",
+ "url",
+ "webkit2gtk",
+ "webkit2gtk-sys",
+ "webview2-com",
+ "windows",
+ "windows-core",
+ "windows-version",
+ "x11-dl",
+]
+
+[[package]]
+name = "x11"
+version = "2.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e"
+dependencies = [
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "x11-dl"
+version = "2.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f"
+dependencies = [
+ "libc",
+ "once_cell",
+ "pkg-config",
+]
+
+[[package]]
+name = "yoke"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "417ef3fcf6c300b7dbd25c85531a746931c02ad536f3cf4786ed1e88223340b3"
+dependencies = [
+ "stable_deref_trait",
+ "yoke-derive",
+ "zerofrom",
+]
+
+[[package]]
+name = "yoke-derive"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+ "synstructure",
+]
+
+[[package]]
+name = "zerofrom"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272"
+dependencies = [
+ "zerofrom-derive",
+]
+
+[[package]]
+name = "zerofrom-derive"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+ "synstructure",
+]
+
+[[package]]
+name = "zerotrie"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f"
+dependencies = [
+ "displaydoc",
+ "yoke",
+ "zerofrom",
+]
+
+[[package]]
+name = "zerovec"
+version = "0.11.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f58a2799cfe9a1670c7ea8edbd52ef8edb93cb37a7f83bf31ba9e35d9dae6a40"
+dependencies = [
+ "yoke",
+ "zerofrom",
+ "zerovec-derive",
+]
+
+[[package]]
+name = "zerovec-derive"
+version = "0.11.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3743ddbf47738d929cd1ae2e199d40d0162979dfe31aef8ae646d2bf00bf97a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 3.0.9",
+]
+
+[[package]]
+name = "zlib-rs"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112"
+
+[[package]]
+name = "zmij"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml
new file mode 100644
index 0000000..3d8e4c7
--- /dev/null
+++ b/apps/desktop/src-tauri/Cargo.toml
@@ -0,0 +1,28 @@
+[package]
+name = "hermit-desktop"
+version = "1.1.0"
+description = "Hermit desktop shell (Tauri 2)"
+authors = ["WHC"]
+edition = "2021"
+
+[lib]
+name = "hermit_desktop_lib"
+crate-type = ["staticlib", "cdylib", "rlib"]
+
+[build-dependencies]
+tauri-build = { version = "2", features = [] }
+cc = "1.2"
+
+[dependencies]
+tauri = { version = "2", features = [] }
+tauri-plugin-shell = "2"
+serde = { version = "1", features = ["derive"] }
+serde_json = "1"
+tokio = { version = "1", features = ["rt-multi-thread", "sync", "macros", "time"] }
+once_cell = "1"
+
+[features]
+default = ["custom-protocol"]
+custom-protocol = ["tauri/custom-protocol"]
+# Link libcstcore from the repo (requires curl + built archive).
+engine = []
diff --git a/apps/desktop/src-tauri/build.rs b/apps/desktop/src-tauri/build.rs
new file mode 100644
index 0000000..605b374
--- /dev/null
+++ b/apps/desktop/src-tauri/build.rs
@@ -0,0 +1,29 @@
+fn main() {
+ // Optional: link a prebuilt libcstcore when HERMIT_CORE_LIB is set.
+ // Example:
+ // HERMIT_CORE_LIB=/path/to/libcstcore.a HERMIT_CORE_INCLUDE=/path/to/include
+ // cargo build --features engine
+ if std::env::var("CARGO_FEATURE_ENGINE").is_ok() {
+ if let Ok(lib) = std::env::var("HERMIT_CORE_LIB") {
+ let path = std::path::PathBuf::from(&lib);
+ if let Some(dir) = path.parent() {
+ println!("cargo:rustc-link-search=native={}", dir.display());
+ }
+ let stem = path
+ .file_stem()
+ .and_then(|s| s.to_str())
+ .unwrap_or("cstcore")
+ .trim_start_matches("lib");
+ println!("cargo:rustc-link-lib=static={}", stem);
+ println!("cargo:rustc-link-lib=curl");
+ println!("cargo:rustc-link-lib=pthread");
+ println!("cargo:rustc-link-lib=m");
+ println!("cargo:rerun-if-changed={}", lib);
+ }
+ if let Ok(inc) = std::env::var("HERMIT_CORE_INCLUDE") {
+ println!("cargo:rerun-if-env-changed=HERMIT_CORE_INCLUDE");
+ println!("cargo:rustc-env=HERMIT_CORE_INCLUDE={}", inc);
+ }
+ }
+ tauri_build::build()
+}
diff --git a/apps/desktop/src-tauri/capabilities/default.json b/apps/desktop/src-tauri/capabilities/default.json
new file mode 100644
index 0000000..d9f6eb6
--- /dev/null
+++ b/apps/desktop/src-tauri/capabilities/default.json
@@ -0,0 +1,10 @@
+{
+ "$schema": "../gen/schemas/desktop-schema.json",
+ "identifier": "default",
+ "description": "Default Hermit desktop capabilities",
+ "windows": ["main"],
+ "permissions": [
+ "core:default",
+ "shell:allow-open"
+ ]
+}
diff --git a/apps/desktop/src-tauri/gen/schemas/acl-manifests.json b/apps/desktop/src-tauri/gen/schemas/acl-manifests.json
new file mode 100644
index 0000000..cb7b5b6
--- /dev/null
+++ b/apps/desktop/src-tauri/gen/schemas/acl-manifests.json
@@ -0,0 +1 @@
+{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier","allow-bundle-type","allow-register-listener","allow-remove-listener","allow-supports-multiple-windows"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-bundle-type":{"identifier":"allow-bundle-type","description":"Enables the bundle_type command without any pre-configured scope.","commands":{"allow":["bundle_type"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-exit":{"identifier":"allow-exit","description":"Enables the exit command without any pre-configured scope.","commands":{"allow":["exit"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-register-listener":{"identifier":"allow-register-listener","description":"Enables the register_listener command without any pre-configured scope.","commands":{"allow":["register_listener"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-remove-listener":{"identifier":"allow-remove-listener","description":"Enables the remove_listener command without any pre-configured scope.","commands":{"allow":["remove_listener"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-set-dock-visibility":{"identifier":"allow-set-dock-visibility","description":"Enables the set_dock_visibility command without any pre-configured scope.","commands":{"allow":["set_dock_visibility"],"deny":[]}},"allow-supports-multiple-windows":{"identifier":"allow-supports-multiple-windows","description":"Enables the supports_multiple_windows command without any pre-configured scope.","commands":{"allow":["supports_multiple_windows"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-bundle-type":{"identifier":"deny-bundle-type","description":"Denies the bundle_type command without any pre-configured scope.","commands":{"allow":[],"deny":["bundle_type"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-exit":{"identifier":"deny-exit","description":"Denies the exit command without any pre-configured scope.","commands":{"allow":[],"deny":["exit"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"Denies the identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["identifier"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-register-listener":{"identifier":"deny-register-listener","description":"Denies the register_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["register_listener"]}},"deny-remove-data-store":{"identifier":"deny-remove-data-store","description":"Denies the remove_data_store command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_data_store"]}},"deny-remove-listener":{"identifier":"deny-remove-listener","description":"Denies the remove_listener command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_listener"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-set-dock-visibility":{"identifier":"deny-set-dock-visibility","description":"Denies the set_dock_visibility command without any pre-configured scope.","commands":{"allow":[],"deny":["set_dock_visibility"]}},"deny-supports-multiple-windows":{"identifier":"deny-supports-multiple-windows","description":"Denies the supports_multiple_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["supports_multiple_windows"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-icon-with-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-icon-with-as-template":{"identifier":"allow-set-icon-with-as-template","description":"Enables the set_icon_with_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_with_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-icon-with-as-template":{"identifier":"deny-set-icon-with-as-template","description":"Denies the set_icon_with_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_with_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-auto-resize":{"identifier":"allow-set-webview-auto-resize","description":"Enables the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":["set_webview_auto_resize"],"deny":[]}},"allow-set-webview-background-color":{"identifier":"allow-set-webview-background-color","description":"Enables the set_webview_background_color command without any pre-configured scope.","commands":{"allow":["set_webview_background_color"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-auto-resize":{"identifier":"deny-set-webview-auto-resize","description":"Denies the set_webview_auto_resize command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_auto_resize"]}},"deny-set-webview-background-color":{"identifier":"deny-set-webview-background-color","description":"Denies the set_webview_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_background_color"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-is-always-on-top","allow-activity-name","allow-scene-identifier","allow-internal-toggle-maximize"]},"permissions":{"allow-activity-name":{"identifier":"allow-activity-name","description":"Enables the activity_name command without any pre-configured scope.","commands":{"allow":["activity_name"],"deny":[]}},"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-always-on-top":{"identifier":"allow-is-always-on-top","description":"Enables the is_always_on_top command without any pre-configured scope.","commands":{"allow":["is_always_on_top"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-scene-identifier":{"identifier":"allow-scene-identifier","description":"Enables the scene_identifier command without any pre-configured scope.","commands":{"allow":["scene_identifier"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-background-color":{"identifier":"allow-set-background-color","description":"Enables the set_background_color command without any pre-configured scope.","commands":{"allow":["set_background_color"],"deny":[]}},"allow-set-badge-count":{"identifier":"allow-set-badge-count","description":"Enables the set_badge_count command without any pre-configured scope.","commands":{"allow":["set_badge_count"],"deny":[]}},"allow-set-badge-label":{"identifier":"allow-set-badge-label","description":"Enables the set_badge_label command without any pre-configured scope.","commands":{"allow":["set_badge_label"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-focusable":{"identifier":"allow-set-focusable","description":"Enables the set_focusable command without any pre-configured scope.","commands":{"allow":["set_focusable"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-fullscreen-on-monitor":{"identifier":"allow-set-fullscreen-on-monitor","description":"Enables the set_fullscreen_on_monitor command without any pre-configured scope.","commands":{"allow":["set_fullscreen_on_monitor"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-overlay-icon":{"identifier":"allow-set-overlay-icon","description":"Enables the set_overlay_icon command without any pre-configured scope.","commands":{"allow":["set_overlay_icon"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-simple-fullscreen":{"identifier":"allow-set-simple-fullscreen","description":"Enables the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":["set_simple_fullscreen"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-activity-name":{"identifier":"deny-activity-name","description":"Denies the activity_name command without any pre-configured scope.","commands":{"allow":[],"deny":["activity_name"]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-always-on-top":{"identifier":"deny-is-always-on-top","description":"Denies the is_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["is_always_on_top"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-scene-identifier":{"identifier":"deny-scene-identifier","description":"Denies the scene_identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["scene_identifier"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-background-color":{"identifier":"deny-set-background-color","description":"Denies the set_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_background_color"]}},"deny-set-badge-count":{"identifier":"deny-set-badge-count","description":"Denies the set_badge_count command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_count"]}},"deny-set-badge-label":{"identifier":"deny-set-badge-label","description":"Denies the set_badge_label command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_label"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-focusable":{"identifier":"deny-set-focusable","description":"Denies the set_focusable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focusable"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-fullscreen-on-monitor":{"identifier":"deny-set-fullscreen-on-monitor","description":"Denies the set_fullscreen_on_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen_on_monitor"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-overlay-icon":{"identifier":"deny-set-overlay-icon","description":"Denies the set_overlay_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_overlay_icon"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-simple-fullscreen":{"identifier":"deny-set-simple-fullscreen","description":"Denies the set_simple_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_simple_fullscreen"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"}},"required":["cmd","name"],"type":"object"},{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["name","sidecar"],"type":"object"}],"definitions":{"ShellScopeEntryAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ","type":"string"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellScopeEntryAllowedArgs":{"anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.","items":{"$ref":"#/definitions/ShellScopeEntryAllowedArg"},"type":"array"}],"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration."}},"description":"Shell scope entry.","title":"ShellScopeEntry"}}}
\ 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
new file mode 100644
index 0000000..2af6d48
--- /dev/null
+++ b/apps/desktop/src-tauri/gen/schemas/capabilities.json
@@ -0,0 +1 @@
+{"default":{"identifier":"default","description":"Default Hermit desktop capabilities","local":true,"windows":["main"],"permissions":["core:default","shell:allow-open"]}}
\ 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
new file mode 100644
index 0000000..5625606
--- /dev/null
+++ b/apps/desktop/src-tauri/gen/schemas/desktop-schema.json
@@ -0,0 +1,2636 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "CapabilityFile",
+ "description": "Capability formats accepted in a capability file.",
+ "anyOf": [
+ {
+ "description": "A single capability.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Capability"
+ }
+ ]
+ },
+ {
+ "description": "A list of capabilities.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Capability"
+ }
+ },
+ {
+ "description": "A list of capabilities.",
+ "type": "object",
+ "required": [
+ "capabilities"
+ ],
+ "properties": {
+ "capabilities": {
+ "description": "The list of capabilities.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Capability"
+ }
+ }
+ }
+ }
+ ],
+ "definitions": {
+ "Capability": {
+ "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```",
+ "type": "object",
+ "required": [
+ "identifier",
+ "permissions"
+ ],
+ "properties": {
+ "identifier": {
+ "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`",
+ "type": "string"
+ },
+ "description": {
+ "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.",
+ "default": "",
+ "type": "string"
+ },
+ "remote": {
+ "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```",
+ "anyOf": [
+ {
+ "$ref": "#/definitions/CapabilityRemote"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "local": {
+ "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.",
+ "default": true,
+ "type": "boolean"
+ },
+ "windows": {
+ "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "webviews": {
+ "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "permissions": {
+ "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/PermissionEntry"
+ },
+ "uniqueItems": true
+ },
+ "platforms": {
+ "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`",
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "$ref": "#/definitions/Target"
+ }
+ }
+ }
+ },
+ "CapabilityRemote": {
+ "description": "Configuration for remote URLs that are associated with the capability.",
+ "type": "object",
+ "required": [
+ "urls"
+ ],
+ "properties": {
+ "urls": {
+ "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "PermissionEntry": {
+ "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.",
+ "anyOf": [
+ {
+ "description": "Reference a permission or permission set by identifier.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Identifier"
+ }
+ ]
+ },
+ {
+ "description": "Reference a permission or permission set by identifier and extends its scope.",
+ "type": "object",
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "identifier": {
+ "anyOf": [
+ {
+ "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`",
+ "type": "string",
+ "const": "shell:default",
+ "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`"
+ },
+ {
+ "description": "Enables the execute command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-execute",
+ "markdownDescription": "Enables the execute command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the kill command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-kill",
+ "markdownDescription": "Enables the kill command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the open command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-open",
+ "markdownDescription": "Enables the open command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the spawn command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-spawn",
+ "markdownDescription": "Enables the spawn command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the stdin_write command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-stdin-write",
+ "markdownDescription": "Enables the stdin_write command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the execute command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-execute",
+ "markdownDescription": "Denies the execute command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the kill command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-kill",
+ "markdownDescription": "Denies the kill command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the open command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-open",
+ "markdownDescription": "Denies the open command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the spawn command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-spawn",
+ "markdownDescription": "Denies the spawn command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the stdin_write command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-stdin-write",
+ "markdownDescription": "Denies the stdin_write command without any pre-configured scope."
+ }
+ ]
+ }
+ }
+ },
+ "then": {
+ "properties": {
+ "allow": {
+ "items": {
+ "title": "ShellScopeEntry",
+ "description": "Shell scope entry.",
+ "anyOf": [
+ {
+ "type": "object",
+ "required": [
+ "cmd",
+ "name"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+ }
+ ]
+ },
+ "cmd": {
+ "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+ "type": "string"
+ },
+ "name": {
+ "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "required": [
+ "name",
+ "sidecar"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+ }
+ ]
+ },
+ "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"
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ }
+ },
+ "deny": {
+ "items": {
+ "title": "ShellScopeEntry",
+ "description": "Shell scope entry.",
+ "anyOf": [
+ {
+ "type": "object",
+ "required": [
+ "cmd",
+ "name"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+ }
+ ]
+ },
+ "cmd": {
+ "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+ "type": "string"
+ },
+ "name": {
+ "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "required": [
+ "name",
+ "sidecar"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+ }
+ ]
+ },
+ "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"
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ }
+ }
+ }
+ },
+ "properties": {
+ "identifier": {
+ "description": "Identifier of the permission or permission set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Identifier"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "properties": {
+ "identifier": {
+ "description": "Identifier of the permission or permission set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Identifier"
+ }
+ ]
+ },
+ "allow": {
+ "description": "Data that defines what is allowed by the scope.",
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "$ref": "#/definitions/Value"
+ }
+ },
+ "deny": {
+ "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.",
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "$ref": "#/definitions/Value"
+ }
+ }
+ }
+ }
+ ],
+ "required": [
+ "identifier"
+ ]
+ }
+ ]
+ },
+ "Identifier": {
+ "description": "Permission identifier",
+ "oneOf": [
+ {
+ "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`",
+ "type": "string",
+ "const": "core:default",
+ "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`"
+ },
+ {
+ "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`",
+ "type": "string",
+ "const": "core:app:default",
+ "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`"
+ },
+ {
+ "description": "Enables the app_hide command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-app-hide",
+ "markdownDescription": "Enables the app_hide command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the app_show command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-app-show",
+ "markdownDescription": "Enables the app_show command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the bundle_type command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-bundle-type",
+ "markdownDescription": "Enables the bundle_type command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the default_window_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-default-window-icon",
+ "markdownDescription": "Enables the default_window_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the exit command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-exit",
+ "markdownDescription": "Enables the exit command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-fetch-data-store-identifiers",
+ "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the identifier command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-identifier",
+ "markdownDescription": "Enables the identifier command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the name command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-name",
+ "markdownDescription": "Enables the name command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the register_listener command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-register-listener",
+ "markdownDescription": "Enables the register_listener command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the remove_data_store command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-remove-data-store",
+ "markdownDescription": "Enables the remove_data_store command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the remove_listener command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-remove-listener",
+ "markdownDescription": "Enables the remove_listener command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_app_theme command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-set-app-theme",
+ "markdownDescription": "Enables the set_app_theme command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_dock_visibility command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-set-dock-visibility",
+ "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the supports_multiple_windows command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-supports-multiple-windows",
+ "markdownDescription": "Enables the supports_multiple_windows command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the tauri_version command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-tauri-version",
+ "markdownDescription": "Enables the tauri_version command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the version command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-version",
+ "markdownDescription": "Enables the version command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the app_hide command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-app-hide",
+ "markdownDescription": "Denies the app_hide command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the app_show command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-app-show",
+ "markdownDescription": "Denies the app_show command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the bundle_type command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-bundle-type",
+ "markdownDescription": "Denies the bundle_type command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the default_window_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-default-window-icon",
+ "markdownDescription": "Denies the default_window_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the exit command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-exit",
+ "markdownDescription": "Denies the exit command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-fetch-data-store-identifiers",
+ "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the identifier command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-identifier",
+ "markdownDescription": "Denies the identifier command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the name command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-name",
+ "markdownDescription": "Denies the name command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the register_listener command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-register-listener",
+ "markdownDescription": "Denies the register_listener command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the remove_data_store command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-remove-data-store",
+ "markdownDescription": "Denies the remove_data_store command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the remove_listener command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-remove-listener",
+ "markdownDescription": "Denies the remove_listener command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_app_theme command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-set-app-theme",
+ "markdownDescription": "Denies the set_app_theme command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_dock_visibility command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-set-dock-visibility",
+ "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the supports_multiple_windows command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-supports-multiple-windows",
+ "markdownDescription": "Denies the supports_multiple_windows command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the tauri_version command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-tauri-version",
+ "markdownDescription": "Denies the tauri_version command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the version command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-version",
+ "markdownDescription": "Denies the version command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`",
+ "type": "string",
+ "const": "core:event:default",
+ "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`"
+ },
+ {
+ "description": "Enables the emit command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:allow-emit",
+ "markdownDescription": "Enables the emit command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the emit_to command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:allow-emit-to",
+ "markdownDescription": "Enables the emit_to command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the listen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:allow-listen",
+ "markdownDescription": "Enables the listen command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the unlisten command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:allow-unlisten",
+ "markdownDescription": "Enables the unlisten command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the emit command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:deny-emit",
+ "markdownDescription": "Denies the emit command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the emit_to command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:deny-emit-to",
+ "markdownDescription": "Denies the emit_to command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the listen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:deny-listen",
+ "markdownDescription": "Denies the listen command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the unlisten command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:deny-unlisten",
+ "markdownDescription": "Denies the unlisten command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`",
+ "type": "string",
+ "const": "core:image:default",
+ "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`"
+ },
+ {
+ "description": "Enables the from_bytes command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:allow-from-bytes",
+ "markdownDescription": "Enables the from_bytes command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the from_path command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:allow-from-path",
+ "markdownDescription": "Enables the from_path command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:allow-new",
+ "markdownDescription": "Enables the new command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the rgba command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:allow-rgba",
+ "markdownDescription": "Enables the rgba command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:allow-size",
+ "markdownDescription": "Enables the size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the from_bytes command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:deny-from-bytes",
+ "markdownDescription": "Denies the from_bytes command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the from_path command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:deny-from-path",
+ "markdownDescription": "Denies the from_path command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:deny-new",
+ "markdownDescription": "Denies the new command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the rgba command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:deny-rgba",
+ "markdownDescription": "Denies the rgba command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:deny-size",
+ "markdownDescription": "Denies the size command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`",
+ "type": "string",
+ "const": "core:menu:default",
+ "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`"
+ },
+ {
+ "description": "Enables the append command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-append",
+ "markdownDescription": "Enables the append command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the create_default command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-create-default",
+ "markdownDescription": "Enables the create_default command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the get command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-get",
+ "markdownDescription": "Enables the get command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the insert command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-insert",
+ "markdownDescription": "Enables the insert command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_checked command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-is-checked",
+ "markdownDescription": "Enables the is_checked command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-is-enabled",
+ "markdownDescription": "Enables the is_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the items command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-items",
+ "markdownDescription": "Enables the items command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-new",
+ "markdownDescription": "Enables the new command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the popup command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-popup",
+ "markdownDescription": "Enables the popup command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the prepend command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-prepend",
+ "markdownDescription": "Enables the prepend command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the remove command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-remove",
+ "markdownDescription": "Enables the remove command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the remove_at command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-remove-at",
+ "markdownDescription": "Enables the remove_at command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_accelerator command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-accelerator",
+ "markdownDescription": "Enables the set_accelerator command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_as_app_menu command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-as-app-menu",
+ "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-as-help-menu-for-nsapp",
+ "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_as_window_menu command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-as-window-menu",
+ "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-as-windows-menu-for-nsapp",
+ "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_checked command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-checked",
+ "markdownDescription": "Enables the set_checked command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-enabled",
+ "markdownDescription": "Enables the set_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-icon",
+ "markdownDescription": "Enables the set_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_text command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-text",
+ "markdownDescription": "Enables the set_text command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the text command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-text",
+ "markdownDescription": "Enables the text command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the append command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-append",
+ "markdownDescription": "Denies the append command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the create_default command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-create-default",
+ "markdownDescription": "Denies the create_default command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the get command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-get",
+ "markdownDescription": "Denies the get command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the insert command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-insert",
+ "markdownDescription": "Denies the insert command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_checked command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-is-checked",
+ "markdownDescription": "Denies the is_checked command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-is-enabled",
+ "markdownDescription": "Denies the is_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the items command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-items",
+ "markdownDescription": "Denies the items command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-new",
+ "markdownDescription": "Denies the new command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the popup command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-popup",
+ "markdownDescription": "Denies the popup command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the prepend command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-prepend",
+ "markdownDescription": "Denies the prepend command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the remove command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-remove",
+ "markdownDescription": "Denies the remove command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the remove_at command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-remove-at",
+ "markdownDescription": "Denies the remove_at command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_accelerator command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-accelerator",
+ "markdownDescription": "Denies the set_accelerator command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_as_app_menu command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-as-app-menu",
+ "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-as-help-menu-for-nsapp",
+ "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_as_window_menu command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-as-window-menu",
+ "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-as-windows-menu-for-nsapp",
+ "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_checked command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-checked",
+ "markdownDescription": "Denies the set_checked command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-enabled",
+ "markdownDescription": "Denies the set_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-icon",
+ "markdownDescription": "Denies the set_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_text command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-text",
+ "markdownDescription": "Denies the set_text command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the text command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-text",
+ "markdownDescription": "Denies the text command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`",
+ "type": "string",
+ "const": "core:path:default",
+ "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`"
+ },
+ {
+ "description": "Enables the basename command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-basename",
+ "markdownDescription": "Enables the basename command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the dirname command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-dirname",
+ "markdownDescription": "Enables the dirname command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the extname command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-extname",
+ "markdownDescription": "Enables the extname command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_absolute command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-is-absolute",
+ "markdownDescription": "Enables the is_absolute command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the join command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-join",
+ "markdownDescription": "Enables the join command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the normalize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-normalize",
+ "markdownDescription": "Enables the normalize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the resolve command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-resolve",
+ "markdownDescription": "Enables the resolve command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the resolve_directory command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-resolve-directory",
+ "markdownDescription": "Enables the resolve_directory command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the basename command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-basename",
+ "markdownDescription": "Denies the basename command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the dirname command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-dirname",
+ "markdownDescription": "Denies the dirname command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the extname command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-extname",
+ "markdownDescription": "Denies the extname command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_absolute command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-is-absolute",
+ "markdownDescription": "Denies the is_absolute command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the join command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-join",
+ "markdownDescription": "Denies the join command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the normalize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-normalize",
+ "markdownDescription": "Denies the normalize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the resolve command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-resolve",
+ "markdownDescription": "Denies the resolve command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the resolve_directory command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-resolve-directory",
+ "markdownDescription": "Denies the resolve_directory command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`",
+ "type": "string",
+ "const": "core:resources:default",
+ "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`"
+ },
+ {
+ "description": "Enables the close command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:resources:allow-close",
+ "markdownDescription": "Enables the close command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the close command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:resources:deny-close",
+ "markdownDescription": "Denies the close command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`",
+ "type": "string",
+ "const": "core:tray:default",
+ "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`"
+ },
+ {
+ "description": "Enables the get_by_id command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-get-by-id",
+ "markdownDescription": "Enables the get_by_id command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-new",
+ "markdownDescription": "Enables the new command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the remove_by_id command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-remove-by-id",
+ "markdownDescription": "Enables the remove_by_id command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-icon",
+ "markdownDescription": "Enables the set_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_icon_as_template command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-icon-as-template",
+ "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_icon_with_as_template command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-icon-with-as-template",
+ "markdownDescription": "Enables the set_icon_with_as_template command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_menu command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-menu",
+ "markdownDescription": "Enables the set_menu command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-show-menu-on-left-click",
+ "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_temp_dir_path command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-temp-dir-path",
+ "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_title command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-title",
+ "markdownDescription": "Enables the set_title command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_tooltip command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-tooltip",
+ "markdownDescription": "Enables the set_tooltip command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_visible command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-visible",
+ "markdownDescription": "Enables the set_visible command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the get_by_id command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-get-by-id",
+ "markdownDescription": "Denies the get_by_id command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-new",
+ "markdownDescription": "Denies the new command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the remove_by_id command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-remove-by-id",
+ "markdownDescription": "Denies the remove_by_id command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-icon",
+ "markdownDescription": "Denies the set_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_icon_as_template command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-icon-as-template",
+ "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_icon_with_as_template command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-icon-with-as-template",
+ "markdownDescription": "Denies the set_icon_with_as_template command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_menu command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-menu",
+ "markdownDescription": "Denies the set_menu command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-show-menu-on-left-click",
+ "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_temp_dir_path command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-temp-dir-path",
+ "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_title command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-title",
+ "markdownDescription": "Denies the set_title command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_tooltip command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-tooltip",
+ "markdownDescription": "Denies the set_tooltip command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_visible command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-visible",
+ "markdownDescription": "Denies the set_visible command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`",
+ "type": "string",
+ "const": "core:webview:default",
+ "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`"
+ },
+ {
+ "description": "Enables the clear_all_browsing_data command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-clear-all-browsing-data",
+ "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the create_webview command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-create-webview",
+ "markdownDescription": "Enables the create_webview command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the create_webview_window command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-create-webview-window",
+ "markdownDescription": "Enables the create_webview_window command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the get_all_webviews command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-get-all-webviews",
+ "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the internal_toggle_devtools command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-internal-toggle-devtools",
+ "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the print command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-print",
+ "markdownDescription": "Enables the print command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the reparent command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-reparent",
+ "markdownDescription": "Enables the reparent command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_webview_auto_resize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-set-webview-auto-resize",
+ "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_webview_background_color command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-set-webview-background-color",
+ "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_webview_focus command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-set-webview-focus",
+ "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_webview_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-set-webview-position",
+ "markdownDescription": "Enables the set_webview_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_webview_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-set-webview-size",
+ "markdownDescription": "Enables the set_webview_size command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_webview_zoom command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-set-webview-zoom",
+ "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the webview_close command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-webview-close",
+ "markdownDescription": "Enables the webview_close command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the webview_hide command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-webview-hide",
+ "markdownDescription": "Enables the webview_hide command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the webview_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-webview-position",
+ "markdownDescription": "Enables the webview_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the webview_show command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-webview-show",
+ "markdownDescription": "Enables the webview_show command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the webview_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-webview-size",
+ "markdownDescription": "Enables the webview_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the clear_all_browsing_data command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-clear-all-browsing-data",
+ "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the create_webview command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-create-webview",
+ "markdownDescription": "Denies the create_webview command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the create_webview_window command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-create-webview-window",
+ "markdownDescription": "Denies the create_webview_window command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the get_all_webviews command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-get-all-webviews",
+ "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the internal_toggle_devtools command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-internal-toggle-devtools",
+ "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the print command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-print",
+ "markdownDescription": "Denies the print command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the reparent command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-reparent",
+ "markdownDescription": "Denies the reparent command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_webview_auto_resize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-set-webview-auto-resize",
+ "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_webview_background_color command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-set-webview-background-color",
+ "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_webview_focus command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-set-webview-focus",
+ "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_webview_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-set-webview-position",
+ "markdownDescription": "Denies the set_webview_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_webview_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-set-webview-size",
+ "markdownDescription": "Denies the set_webview_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_webview_zoom command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-set-webview-zoom",
+ "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the webview_close command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-webview-close",
+ "markdownDescription": "Denies the webview_close command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the webview_hide command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-webview-hide",
+ "markdownDescription": "Denies the webview_hide command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the webview_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-webview-position",
+ "markdownDescription": "Denies the webview_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the webview_show command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-webview-show",
+ "markdownDescription": "Denies the webview_show command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the webview_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-webview-size",
+ "markdownDescription": "Denies the webview_size command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`",
+ "type": "string",
+ "const": "core:window:default",
+ "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`"
+ },
+ {
+ "description": "Enables the activity_name command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-activity-name",
+ "markdownDescription": "Enables the activity_name command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the available_monitors command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-available-monitors",
+ "markdownDescription": "Enables the available_monitors command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the center command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-center",
+ "markdownDescription": "Enables the center command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the close command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-close",
+ "markdownDescription": "Enables the close command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the create command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-create",
+ "markdownDescription": "Enables the create command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the current_monitor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-current-monitor",
+ "markdownDescription": "Enables the current_monitor command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-cursor-position",
+ "markdownDescription": "Enables the cursor_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the destroy command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-destroy",
+ "markdownDescription": "Enables the destroy command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the get_all_windows command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-get-all-windows",
+ "markdownDescription": "Enables the get_all_windows command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the hide command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-hide",
+ "markdownDescription": "Enables the hide command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the inner_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-inner-position",
+ "markdownDescription": "Enables the inner_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the inner_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-inner-size",
+ "markdownDescription": "Enables the inner_size command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the internal_toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-internal-toggle-maximize",
+ "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-always-on-top",
+ "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_closable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-closable",
+ "markdownDescription": "Enables the is_closable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_decorated command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-decorated",
+ "markdownDescription": "Enables the is_decorated command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-enabled",
+ "markdownDescription": "Enables the is_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_focused command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-focused",
+ "markdownDescription": "Enables the is_focused command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-fullscreen",
+ "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-maximizable",
+ "markdownDescription": "Enables the is_maximizable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_maximized command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-maximized",
+ "markdownDescription": "Enables the is_maximized command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-minimizable",
+ "markdownDescription": "Enables the is_minimizable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_minimized command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-minimized",
+ "markdownDescription": "Enables the is_minimized command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_resizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-resizable",
+ "markdownDescription": "Enables the is_resizable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_visible command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-visible",
+ "markdownDescription": "Enables the is_visible command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the maximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-maximize",
+ "markdownDescription": "Enables the maximize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the minimize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-minimize",
+ "markdownDescription": "Enables the minimize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the monitor_from_point command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-monitor-from-point",
+ "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the outer_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-outer-position",
+ "markdownDescription": "Enables the outer_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the outer_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-outer-size",
+ "markdownDescription": "Enables the outer_size command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the primary_monitor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-primary-monitor",
+ "markdownDescription": "Enables the primary_monitor command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the request_user_attention command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-request-user-attention",
+ "markdownDescription": "Enables the request_user_attention command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the scale_factor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-scale-factor",
+ "markdownDescription": "Enables the scale_factor command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the scene_identifier command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-scene-identifier",
+ "markdownDescription": "Enables the scene_identifier command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_always_on_bottom command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-always-on-bottom",
+ "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-always-on-top",
+ "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_background_color command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-background-color",
+ "markdownDescription": "Enables the set_background_color command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_badge_count command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-badge-count",
+ "markdownDescription": "Enables the set_badge_count command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_badge_label command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-badge-label",
+ "markdownDescription": "Enables the set_badge_label command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_closable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-closable",
+ "markdownDescription": "Enables the set_closable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_content_protected command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-content-protected",
+ "markdownDescription": "Enables the set_content_protected command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_cursor_grab command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-cursor-grab",
+ "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_cursor_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-cursor-icon",
+ "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-cursor-position",
+ "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_cursor_visible command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-cursor-visible",
+ "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_decorations command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-decorations",
+ "markdownDescription": "Enables the set_decorations command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_effects command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-effects",
+ "markdownDescription": "Enables the set_effects command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-enabled",
+ "markdownDescription": "Enables the set_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_focus command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-focus",
+ "markdownDescription": "Enables the set_focus command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_focusable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-focusable",
+ "markdownDescription": "Enables the set_focusable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-fullscreen",
+ "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_fullscreen_on_monitor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-fullscreen-on-monitor",
+ "markdownDescription": "Enables the set_fullscreen_on_monitor command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-icon",
+ "markdownDescription": "Enables the set_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-ignore-cursor-events",
+ "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_max_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-max-size",
+ "markdownDescription": "Enables the set_max_size command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-maximizable",
+ "markdownDescription": "Enables the set_maximizable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_min_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-min-size",
+ "markdownDescription": "Enables the set_min_size command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-minimizable",
+ "markdownDescription": "Enables the set_minimizable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_overlay_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-overlay-icon",
+ "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-position",
+ "markdownDescription": "Enables the set_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_progress_bar command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-progress-bar",
+ "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_resizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-resizable",
+ "markdownDescription": "Enables the set_resizable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_shadow command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-shadow",
+ "markdownDescription": "Enables the set_shadow command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_simple_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-simple-fullscreen",
+ "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-size",
+ "markdownDescription": "Enables the set_size command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_size_constraints command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-size-constraints",
+ "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_skip_taskbar command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-skip-taskbar",
+ "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_theme command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-theme",
+ "markdownDescription": "Enables the set_theme command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_title command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-title",
+ "markdownDescription": "Enables the set_title command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_title_bar_style command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-title-bar-style",
+ "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-visible-on-all-workspaces",
+ "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the show command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-show",
+ "markdownDescription": "Enables the show command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the start_dragging command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-start-dragging",
+ "markdownDescription": "Enables the start_dragging command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the start_resize_dragging command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-start-resize-dragging",
+ "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the theme command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-theme",
+ "markdownDescription": "Enables the theme command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the title command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-title",
+ "markdownDescription": "Enables the title command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-toggle-maximize",
+ "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the unmaximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-unmaximize",
+ "markdownDescription": "Enables the unmaximize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the unminimize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-unminimize",
+ "markdownDescription": "Enables the unminimize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the activity_name command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-activity-name",
+ "markdownDescription": "Denies the activity_name command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the available_monitors command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-available-monitors",
+ "markdownDescription": "Denies the available_monitors command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the center command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-center",
+ "markdownDescription": "Denies the center command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the close command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-close",
+ "markdownDescription": "Denies the close command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the create command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-create",
+ "markdownDescription": "Denies the create command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the current_monitor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-current-monitor",
+ "markdownDescription": "Denies the current_monitor command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-cursor-position",
+ "markdownDescription": "Denies the cursor_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the destroy command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-destroy",
+ "markdownDescription": "Denies the destroy command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the get_all_windows command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-get-all-windows",
+ "markdownDescription": "Denies the get_all_windows command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the hide command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-hide",
+ "markdownDescription": "Denies the hide command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the inner_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-inner-position",
+ "markdownDescription": "Denies the inner_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the inner_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-inner-size",
+ "markdownDescription": "Denies the inner_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the internal_toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-internal-toggle-maximize",
+ "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-always-on-top",
+ "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_closable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-closable",
+ "markdownDescription": "Denies the is_closable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_decorated command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-decorated",
+ "markdownDescription": "Denies the is_decorated command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-enabled",
+ "markdownDescription": "Denies the is_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_focused command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-focused",
+ "markdownDescription": "Denies the is_focused command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-fullscreen",
+ "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-maximizable",
+ "markdownDescription": "Denies the is_maximizable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_maximized command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-maximized",
+ "markdownDescription": "Denies the is_maximized command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-minimizable",
+ "markdownDescription": "Denies the is_minimizable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_minimized command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-minimized",
+ "markdownDescription": "Denies the is_minimized command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_resizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-resizable",
+ "markdownDescription": "Denies the is_resizable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_visible command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-visible",
+ "markdownDescription": "Denies the is_visible command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the maximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-maximize",
+ "markdownDescription": "Denies the maximize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the minimize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-minimize",
+ "markdownDescription": "Denies the minimize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the monitor_from_point command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-monitor-from-point",
+ "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the outer_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-outer-position",
+ "markdownDescription": "Denies the outer_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the outer_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-outer-size",
+ "markdownDescription": "Denies the outer_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the primary_monitor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-primary-monitor",
+ "markdownDescription": "Denies the primary_monitor command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the request_user_attention command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-request-user-attention",
+ "markdownDescription": "Denies the request_user_attention command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the scale_factor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-scale-factor",
+ "markdownDescription": "Denies the scale_factor command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the scene_identifier command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-scene-identifier",
+ "markdownDescription": "Denies the scene_identifier command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_always_on_bottom command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-always-on-bottom",
+ "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-always-on-top",
+ "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_background_color command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-background-color",
+ "markdownDescription": "Denies the set_background_color command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_badge_count command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-badge-count",
+ "markdownDescription": "Denies the set_badge_count command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_badge_label command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-badge-label",
+ "markdownDescription": "Denies the set_badge_label command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_closable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-closable",
+ "markdownDescription": "Denies the set_closable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_content_protected command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-content-protected",
+ "markdownDescription": "Denies the set_content_protected command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_cursor_grab command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-cursor-grab",
+ "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_cursor_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-cursor-icon",
+ "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-cursor-position",
+ "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_cursor_visible command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-cursor-visible",
+ "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_decorations command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-decorations",
+ "markdownDescription": "Denies the set_decorations command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_effects command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-effects",
+ "markdownDescription": "Denies the set_effects command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-enabled",
+ "markdownDescription": "Denies the set_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_focus command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-focus",
+ "markdownDescription": "Denies the set_focus command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_focusable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-focusable",
+ "markdownDescription": "Denies the set_focusable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-fullscreen",
+ "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_fullscreen_on_monitor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-fullscreen-on-monitor",
+ "markdownDescription": "Denies the set_fullscreen_on_monitor command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-icon",
+ "markdownDescription": "Denies the set_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-ignore-cursor-events",
+ "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_max_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-max-size",
+ "markdownDescription": "Denies the set_max_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-maximizable",
+ "markdownDescription": "Denies the set_maximizable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_min_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-min-size",
+ "markdownDescription": "Denies the set_min_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-minimizable",
+ "markdownDescription": "Denies the set_minimizable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_overlay_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-overlay-icon",
+ "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-position",
+ "markdownDescription": "Denies the set_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_progress_bar command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-progress-bar",
+ "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_resizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-resizable",
+ "markdownDescription": "Denies the set_resizable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_shadow command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-shadow",
+ "markdownDescription": "Denies the set_shadow command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_simple_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-simple-fullscreen",
+ "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-size",
+ "markdownDescription": "Denies the set_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_size_constraints command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-size-constraints",
+ "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_skip_taskbar command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-skip-taskbar",
+ "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_theme command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-theme",
+ "markdownDescription": "Denies the set_theme command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_title command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-title",
+ "markdownDescription": "Denies the set_title command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_title_bar_style command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-title-bar-style",
+ "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-visible-on-all-workspaces",
+ "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the show command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-show",
+ "markdownDescription": "Denies the show command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the start_dragging command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-start-dragging",
+ "markdownDescription": "Denies the start_dragging command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the start_resize_dragging command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-start-resize-dragging",
+ "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the theme command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-theme",
+ "markdownDescription": "Denies the theme command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the title command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-title",
+ "markdownDescription": "Denies the title command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-toggle-maximize",
+ "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the unmaximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-unmaximize",
+ "markdownDescription": "Denies the unmaximize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the unminimize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-unminimize",
+ "markdownDescription": "Denies the unminimize command without any pre-configured scope."
+ },
+ {
+ "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`",
+ "type": "string",
+ "const": "shell:default",
+ "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`"
+ },
+ {
+ "description": "Enables the execute command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-execute",
+ "markdownDescription": "Enables the execute command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the kill command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-kill",
+ "markdownDescription": "Enables the kill command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the open command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-open",
+ "markdownDescription": "Enables the open command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the spawn command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-spawn",
+ "markdownDescription": "Enables the spawn command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the stdin_write command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-stdin-write",
+ "markdownDescription": "Enables the stdin_write command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the execute command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-execute",
+ "markdownDescription": "Denies the execute command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the kill command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-kill",
+ "markdownDescription": "Denies the kill command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the open command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-open",
+ "markdownDescription": "Denies the open command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the spawn command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-spawn",
+ "markdownDescription": "Denies the spawn command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the stdin_write command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-stdin-write",
+ "markdownDescription": "Denies the stdin_write command without any pre-configured scope."
+ }
+ ]
+ },
+ "Value": {
+ "description": "All supported ACL values.",
+ "anyOf": [
+ {
+ "description": "Represents a null JSON value.",
+ "type": "null"
+ },
+ {
+ "description": "Represents a [`bool`].",
+ "type": "boolean"
+ },
+ {
+ "description": "Represents a valid ACL [`Number`].",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Number"
+ }
+ ]
+ },
+ {
+ "description": "Represents a [`String`].",
+ "type": "string"
+ },
+ {
+ "description": "Represents a list of other [`Value`]s.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Value"
+ }
+ },
+ {
+ "description": "Represents a map of [`String`] keys to [`Value`]s.",
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/definitions/Value"
+ }
+ }
+ ]
+ },
+ "Number": {
+ "description": "A valid ACL number.",
+ "anyOf": [
+ {
+ "description": "Represents an [`i64`].",
+ "type": "integer",
+ "format": "int64"
+ },
+ {
+ "description": "Represents a [`f64`].",
+ "type": "number",
+ "format": "double"
+ }
+ ]
+ },
+ "Target": {
+ "description": "Platform target.",
+ "oneOf": [
+ {
+ "description": "MacOS.",
+ "type": "string",
+ "enum": [
+ "macOS"
+ ]
+ },
+ {
+ "description": "Windows.",
+ "type": "string",
+ "enum": [
+ "windows"
+ ]
+ },
+ {
+ "description": "Linux.",
+ "type": "string",
+ "enum": [
+ "linux"
+ ]
+ },
+ {
+ "description": "Android.",
+ "type": "string",
+ "enum": [
+ "android"
+ ]
+ },
+ {
+ "description": "iOS.",
+ "type": "string",
+ "enum": [
+ "iOS"
+ ]
+ }
+ ]
+ },
+ "ShellScopeEntryAllowedArg": {
+ "description": "A command argument allowed to be executed by the webview API.",
+ "anyOf": [
+ {
+ "description": "A non-configurable argument that is passed to the command in the order it was specified.",
+ "type": "string"
+ },
+ {
+ "description": "A variable that is set while calling the command from the webview API.",
+ "type": "object",
+ "required": [
+ "validator"
+ ],
+ "properties": {
+ "raw": {
+ "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.",
+ "default": false,
+ "type": "boolean"
+ },
+ "validator": {
+ "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ",
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ },
+ "ShellScopeEntryAllowedArgs": {
+ "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.",
+ "anyOf": [
+ {
+ "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.",
+ "type": "boolean"
+ },
+ {
+ "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ShellScopeEntryAllowedArg"
+ }
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/apps/desktop/src-tauri/gen/schemas/linux-schema.json b/apps/desktop/src-tauri/gen/schemas/linux-schema.json
new file mode 100644
index 0000000..5625606
--- /dev/null
+++ b/apps/desktop/src-tauri/gen/schemas/linux-schema.json
@@ -0,0 +1,2636 @@
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "title": "CapabilityFile",
+ "description": "Capability formats accepted in a capability file.",
+ "anyOf": [
+ {
+ "description": "A single capability.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Capability"
+ }
+ ]
+ },
+ {
+ "description": "A list of capabilities.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Capability"
+ }
+ },
+ {
+ "description": "A list of capabilities.",
+ "type": "object",
+ "required": [
+ "capabilities"
+ ],
+ "properties": {
+ "capabilities": {
+ "description": "The list of capabilities.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Capability"
+ }
+ }
+ }
+ }
+ ],
+ "definitions": {
+ "Capability": {
+ "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```",
+ "type": "object",
+ "required": [
+ "identifier",
+ "permissions"
+ ],
+ "properties": {
+ "identifier": {
+ "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`",
+ "type": "string"
+ },
+ "description": {
+ "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programmatic access to files selected by the user.",
+ "default": "",
+ "type": "string"
+ },
+ "remote": {
+ "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```",
+ "anyOf": [
+ {
+ "$ref": "#/definitions/CapabilityRemote"
+ },
+ {
+ "type": "null"
+ }
+ ]
+ },
+ "local": {
+ "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.",
+ "default": true,
+ "type": "boolean"
+ },
+ "windows": {
+ "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "webviews": {
+ "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "permissions": {
+ "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/PermissionEntry"
+ },
+ "uniqueItems": true
+ },
+ "platforms": {
+ "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`",
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "$ref": "#/definitions/Target"
+ }
+ }
+ }
+ },
+ "CapabilityRemote": {
+ "description": "Configuration for remote URLs that are associated with the capability.",
+ "type": "object",
+ "required": [
+ "urls"
+ ],
+ "properties": {
+ "urls": {
+ "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "PermissionEntry": {
+ "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.",
+ "anyOf": [
+ {
+ "description": "Reference a permission or permission set by identifier.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Identifier"
+ }
+ ]
+ },
+ {
+ "description": "Reference a permission or permission set by identifier and extends its scope.",
+ "type": "object",
+ "allOf": [
+ {
+ "if": {
+ "properties": {
+ "identifier": {
+ "anyOf": [
+ {
+ "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`",
+ "type": "string",
+ "const": "shell:default",
+ "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`"
+ },
+ {
+ "description": "Enables the execute command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-execute",
+ "markdownDescription": "Enables the execute command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the kill command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-kill",
+ "markdownDescription": "Enables the kill command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the open command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-open",
+ "markdownDescription": "Enables the open command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the spawn command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-spawn",
+ "markdownDescription": "Enables the spawn command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the stdin_write command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-stdin-write",
+ "markdownDescription": "Enables the stdin_write command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the execute command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-execute",
+ "markdownDescription": "Denies the execute command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the kill command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-kill",
+ "markdownDescription": "Denies the kill command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the open command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-open",
+ "markdownDescription": "Denies the open command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the spawn command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-spawn",
+ "markdownDescription": "Denies the spawn command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the stdin_write command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-stdin-write",
+ "markdownDescription": "Denies the stdin_write command without any pre-configured scope."
+ }
+ ]
+ }
+ }
+ },
+ "then": {
+ "properties": {
+ "allow": {
+ "items": {
+ "title": "ShellScopeEntry",
+ "description": "Shell scope entry.",
+ "anyOf": [
+ {
+ "type": "object",
+ "required": [
+ "cmd",
+ "name"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+ }
+ ]
+ },
+ "cmd": {
+ "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+ "type": "string"
+ },
+ "name": {
+ "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "required": [
+ "name",
+ "sidecar"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+ }
+ ]
+ },
+ "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"
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ }
+ },
+ "deny": {
+ "items": {
+ "title": "ShellScopeEntry",
+ "description": "Shell scope entry.",
+ "anyOf": [
+ {
+ "type": "object",
+ "required": [
+ "cmd",
+ "name"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+ }
+ ]
+ },
+ "cmd": {
+ "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.",
+ "type": "string"
+ },
+ "name": {
+ "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.",
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "required": [
+ "name",
+ "sidecar"
+ ],
+ "properties": {
+ "args": {
+ "description": "The allowed arguments for the command execution.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/ShellScopeEntryAllowedArgs"
+ }
+ ]
+ },
+ "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"
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ }
+ }
+ }
+ },
+ "properties": {
+ "identifier": {
+ "description": "Identifier of the permission or permission set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Identifier"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "properties": {
+ "identifier": {
+ "description": "Identifier of the permission or permission set.",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Identifier"
+ }
+ ]
+ },
+ "allow": {
+ "description": "Data that defines what is allowed by the scope.",
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "$ref": "#/definitions/Value"
+ }
+ },
+ "deny": {
+ "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.",
+ "type": [
+ "array",
+ "null"
+ ],
+ "items": {
+ "$ref": "#/definitions/Value"
+ }
+ }
+ }
+ }
+ ],
+ "required": [
+ "identifier"
+ ]
+ }
+ ]
+ },
+ "Identifier": {
+ "description": "Permission identifier",
+ "oneOf": [
+ {
+ "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`",
+ "type": "string",
+ "const": "core:default",
+ "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`"
+ },
+ {
+ "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`",
+ "type": "string",
+ "const": "core:app:default",
+ "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`\n- `allow-bundle-type`\n- `allow-register-listener`\n- `allow-remove-listener`\n- `allow-supports-multiple-windows`"
+ },
+ {
+ "description": "Enables the app_hide command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-app-hide",
+ "markdownDescription": "Enables the app_hide command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the app_show command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-app-show",
+ "markdownDescription": "Enables the app_show command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the bundle_type command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-bundle-type",
+ "markdownDescription": "Enables the bundle_type command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the default_window_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-default-window-icon",
+ "markdownDescription": "Enables the default_window_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the exit command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-exit",
+ "markdownDescription": "Enables the exit command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-fetch-data-store-identifiers",
+ "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the identifier command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-identifier",
+ "markdownDescription": "Enables the identifier command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the name command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-name",
+ "markdownDescription": "Enables the name command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the register_listener command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-register-listener",
+ "markdownDescription": "Enables the register_listener command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the remove_data_store command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-remove-data-store",
+ "markdownDescription": "Enables the remove_data_store command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the remove_listener command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-remove-listener",
+ "markdownDescription": "Enables the remove_listener command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_app_theme command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-set-app-theme",
+ "markdownDescription": "Enables the set_app_theme command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_dock_visibility command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-set-dock-visibility",
+ "markdownDescription": "Enables the set_dock_visibility command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the supports_multiple_windows command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-supports-multiple-windows",
+ "markdownDescription": "Enables the supports_multiple_windows command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the tauri_version command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-tauri-version",
+ "markdownDescription": "Enables the tauri_version command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the version command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:allow-version",
+ "markdownDescription": "Enables the version command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the app_hide command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-app-hide",
+ "markdownDescription": "Denies the app_hide command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the app_show command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-app-show",
+ "markdownDescription": "Denies the app_show command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the bundle_type command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-bundle-type",
+ "markdownDescription": "Denies the bundle_type command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the default_window_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-default-window-icon",
+ "markdownDescription": "Denies the default_window_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the exit command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-exit",
+ "markdownDescription": "Denies the exit command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-fetch-data-store-identifiers",
+ "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the identifier command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-identifier",
+ "markdownDescription": "Denies the identifier command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the name command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-name",
+ "markdownDescription": "Denies the name command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the register_listener command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-register-listener",
+ "markdownDescription": "Denies the register_listener command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the remove_data_store command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-remove-data-store",
+ "markdownDescription": "Denies the remove_data_store command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the remove_listener command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-remove-listener",
+ "markdownDescription": "Denies the remove_listener command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_app_theme command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-set-app-theme",
+ "markdownDescription": "Denies the set_app_theme command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_dock_visibility command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-set-dock-visibility",
+ "markdownDescription": "Denies the set_dock_visibility command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the supports_multiple_windows command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-supports-multiple-windows",
+ "markdownDescription": "Denies the supports_multiple_windows command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the tauri_version command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-tauri-version",
+ "markdownDescription": "Denies the tauri_version command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the version command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:app:deny-version",
+ "markdownDescription": "Denies the version command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`",
+ "type": "string",
+ "const": "core:event:default",
+ "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`"
+ },
+ {
+ "description": "Enables the emit command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:allow-emit",
+ "markdownDescription": "Enables the emit command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the emit_to command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:allow-emit-to",
+ "markdownDescription": "Enables the emit_to command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the listen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:allow-listen",
+ "markdownDescription": "Enables the listen command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the unlisten command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:allow-unlisten",
+ "markdownDescription": "Enables the unlisten command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the emit command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:deny-emit",
+ "markdownDescription": "Denies the emit command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the emit_to command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:deny-emit-to",
+ "markdownDescription": "Denies the emit_to command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the listen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:deny-listen",
+ "markdownDescription": "Denies the listen command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the unlisten command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:event:deny-unlisten",
+ "markdownDescription": "Denies the unlisten command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`",
+ "type": "string",
+ "const": "core:image:default",
+ "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`"
+ },
+ {
+ "description": "Enables the from_bytes command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:allow-from-bytes",
+ "markdownDescription": "Enables the from_bytes command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the from_path command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:allow-from-path",
+ "markdownDescription": "Enables the from_path command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:allow-new",
+ "markdownDescription": "Enables the new command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the rgba command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:allow-rgba",
+ "markdownDescription": "Enables the rgba command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:allow-size",
+ "markdownDescription": "Enables the size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the from_bytes command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:deny-from-bytes",
+ "markdownDescription": "Denies the from_bytes command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the from_path command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:deny-from-path",
+ "markdownDescription": "Denies the from_path command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:deny-new",
+ "markdownDescription": "Denies the new command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the rgba command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:deny-rgba",
+ "markdownDescription": "Denies the rgba command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:image:deny-size",
+ "markdownDescription": "Denies the size command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`",
+ "type": "string",
+ "const": "core:menu:default",
+ "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`"
+ },
+ {
+ "description": "Enables the append command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-append",
+ "markdownDescription": "Enables the append command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the create_default command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-create-default",
+ "markdownDescription": "Enables the create_default command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the get command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-get",
+ "markdownDescription": "Enables the get command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the insert command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-insert",
+ "markdownDescription": "Enables the insert command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_checked command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-is-checked",
+ "markdownDescription": "Enables the is_checked command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-is-enabled",
+ "markdownDescription": "Enables the is_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the items command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-items",
+ "markdownDescription": "Enables the items command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-new",
+ "markdownDescription": "Enables the new command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the popup command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-popup",
+ "markdownDescription": "Enables the popup command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the prepend command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-prepend",
+ "markdownDescription": "Enables the prepend command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the remove command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-remove",
+ "markdownDescription": "Enables the remove command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the remove_at command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-remove-at",
+ "markdownDescription": "Enables the remove_at command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_accelerator command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-accelerator",
+ "markdownDescription": "Enables the set_accelerator command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_as_app_menu command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-as-app-menu",
+ "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-as-help-menu-for-nsapp",
+ "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_as_window_menu command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-as-window-menu",
+ "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-as-windows-menu-for-nsapp",
+ "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_checked command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-checked",
+ "markdownDescription": "Enables the set_checked command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-enabled",
+ "markdownDescription": "Enables the set_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-icon",
+ "markdownDescription": "Enables the set_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_text command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-set-text",
+ "markdownDescription": "Enables the set_text command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the text command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:allow-text",
+ "markdownDescription": "Enables the text command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the append command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-append",
+ "markdownDescription": "Denies the append command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the create_default command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-create-default",
+ "markdownDescription": "Denies the create_default command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the get command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-get",
+ "markdownDescription": "Denies the get command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the insert command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-insert",
+ "markdownDescription": "Denies the insert command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_checked command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-is-checked",
+ "markdownDescription": "Denies the is_checked command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-is-enabled",
+ "markdownDescription": "Denies the is_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the items command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-items",
+ "markdownDescription": "Denies the items command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-new",
+ "markdownDescription": "Denies the new command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the popup command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-popup",
+ "markdownDescription": "Denies the popup command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the prepend command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-prepend",
+ "markdownDescription": "Denies the prepend command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the remove command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-remove",
+ "markdownDescription": "Denies the remove command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the remove_at command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-remove-at",
+ "markdownDescription": "Denies the remove_at command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_accelerator command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-accelerator",
+ "markdownDescription": "Denies the set_accelerator command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_as_app_menu command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-as-app-menu",
+ "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-as-help-menu-for-nsapp",
+ "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_as_window_menu command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-as-window-menu",
+ "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-as-windows-menu-for-nsapp",
+ "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_checked command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-checked",
+ "markdownDescription": "Denies the set_checked command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-enabled",
+ "markdownDescription": "Denies the set_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-icon",
+ "markdownDescription": "Denies the set_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_text command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-set-text",
+ "markdownDescription": "Denies the set_text command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the text command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:menu:deny-text",
+ "markdownDescription": "Denies the text command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`",
+ "type": "string",
+ "const": "core:path:default",
+ "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`"
+ },
+ {
+ "description": "Enables the basename command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-basename",
+ "markdownDescription": "Enables the basename command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the dirname command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-dirname",
+ "markdownDescription": "Enables the dirname command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the extname command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-extname",
+ "markdownDescription": "Enables the extname command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_absolute command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-is-absolute",
+ "markdownDescription": "Enables the is_absolute command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the join command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-join",
+ "markdownDescription": "Enables the join command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the normalize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-normalize",
+ "markdownDescription": "Enables the normalize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the resolve command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-resolve",
+ "markdownDescription": "Enables the resolve command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the resolve_directory command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:allow-resolve-directory",
+ "markdownDescription": "Enables the resolve_directory command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the basename command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-basename",
+ "markdownDescription": "Denies the basename command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the dirname command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-dirname",
+ "markdownDescription": "Denies the dirname command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the extname command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-extname",
+ "markdownDescription": "Denies the extname command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_absolute command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-is-absolute",
+ "markdownDescription": "Denies the is_absolute command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the join command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-join",
+ "markdownDescription": "Denies the join command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the normalize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-normalize",
+ "markdownDescription": "Denies the normalize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the resolve command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-resolve",
+ "markdownDescription": "Denies the resolve command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the resolve_directory command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:path:deny-resolve-directory",
+ "markdownDescription": "Denies the resolve_directory command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`",
+ "type": "string",
+ "const": "core:resources:default",
+ "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`"
+ },
+ {
+ "description": "Enables the close command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:resources:allow-close",
+ "markdownDescription": "Enables the close command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the close command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:resources:deny-close",
+ "markdownDescription": "Denies the close command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`",
+ "type": "string",
+ "const": "core:tray:default",
+ "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-icon-with-as-template`\n- `allow-set-show-menu-on-left-click`"
+ },
+ {
+ "description": "Enables the get_by_id command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-get-by-id",
+ "markdownDescription": "Enables the get_by_id command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the new command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-new",
+ "markdownDescription": "Enables the new command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the remove_by_id command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-remove-by-id",
+ "markdownDescription": "Enables the remove_by_id command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-icon",
+ "markdownDescription": "Enables the set_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_icon_as_template command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-icon-as-template",
+ "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_icon_with_as_template command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-icon-with-as-template",
+ "markdownDescription": "Enables the set_icon_with_as_template command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_menu command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-menu",
+ "markdownDescription": "Enables the set_menu command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-show-menu-on-left-click",
+ "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_temp_dir_path command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-temp-dir-path",
+ "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_title command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-title",
+ "markdownDescription": "Enables the set_title command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_tooltip command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-tooltip",
+ "markdownDescription": "Enables the set_tooltip command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_visible command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:allow-set-visible",
+ "markdownDescription": "Enables the set_visible command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the get_by_id command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-get-by-id",
+ "markdownDescription": "Denies the get_by_id command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the new command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-new",
+ "markdownDescription": "Denies the new command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the remove_by_id command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-remove-by-id",
+ "markdownDescription": "Denies the remove_by_id command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-icon",
+ "markdownDescription": "Denies the set_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_icon_as_template command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-icon-as-template",
+ "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_icon_with_as_template command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-icon-with-as-template",
+ "markdownDescription": "Denies the set_icon_with_as_template command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_menu command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-menu",
+ "markdownDescription": "Denies the set_menu command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-show-menu-on-left-click",
+ "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_temp_dir_path command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-temp-dir-path",
+ "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_title command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-title",
+ "markdownDescription": "Denies the set_title command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_tooltip command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-tooltip",
+ "markdownDescription": "Denies the set_tooltip command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_visible command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:tray:deny-set-visible",
+ "markdownDescription": "Denies the set_visible command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`",
+ "type": "string",
+ "const": "core:webview:default",
+ "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`"
+ },
+ {
+ "description": "Enables the clear_all_browsing_data command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-clear-all-browsing-data",
+ "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the create_webview command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-create-webview",
+ "markdownDescription": "Enables the create_webview command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the create_webview_window command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-create-webview-window",
+ "markdownDescription": "Enables the create_webview_window command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the get_all_webviews command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-get-all-webviews",
+ "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the internal_toggle_devtools command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-internal-toggle-devtools",
+ "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the print command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-print",
+ "markdownDescription": "Enables the print command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the reparent command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-reparent",
+ "markdownDescription": "Enables the reparent command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_webview_auto_resize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-set-webview-auto-resize",
+ "markdownDescription": "Enables the set_webview_auto_resize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_webview_background_color command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-set-webview-background-color",
+ "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_webview_focus command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-set-webview-focus",
+ "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_webview_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-set-webview-position",
+ "markdownDescription": "Enables the set_webview_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_webview_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-set-webview-size",
+ "markdownDescription": "Enables the set_webview_size command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_webview_zoom command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-set-webview-zoom",
+ "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the webview_close command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-webview-close",
+ "markdownDescription": "Enables the webview_close command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the webview_hide command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-webview-hide",
+ "markdownDescription": "Enables the webview_hide command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the webview_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-webview-position",
+ "markdownDescription": "Enables the webview_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the webview_show command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-webview-show",
+ "markdownDescription": "Enables the webview_show command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the webview_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:allow-webview-size",
+ "markdownDescription": "Enables the webview_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the clear_all_browsing_data command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-clear-all-browsing-data",
+ "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the create_webview command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-create-webview",
+ "markdownDescription": "Denies the create_webview command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the create_webview_window command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-create-webview-window",
+ "markdownDescription": "Denies the create_webview_window command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the get_all_webviews command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-get-all-webviews",
+ "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the internal_toggle_devtools command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-internal-toggle-devtools",
+ "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the print command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-print",
+ "markdownDescription": "Denies the print command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the reparent command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-reparent",
+ "markdownDescription": "Denies the reparent command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_webview_auto_resize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-set-webview-auto-resize",
+ "markdownDescription": "Denies the set_webview_auto_resize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_webview_background_color command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-set-webview-background-color",
+ "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_webview_focus command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-set-webview-focus",
+ "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_webview_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-set-webview-position",
+ "markdownDescription": "Denies the set_webview_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_webview_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-set-webview-size",
+ "markdownDescription": "Denies the set_webview_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_webview_zoom command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-set-webview-zoom",
+ "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the webview_close command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-webview-close",
+ "markdownDescription": "Denies the webview_close command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the webview_hide command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-webview-hide",
+ "markdownDescription": "Denies the webview_hide command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the webview_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-webview-position",
+ "markdownDescription": "Denies the webview_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the webview_show command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-webview-show",
+ "markdownDescription": "Denies the webview_show command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the webview_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:webview:deny-webview-size",
+ "markdownDescription": "Denies the webview_size command without any pre-configured scope."
+ },
+ {
+ "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`",
+ "type": "string",
+ "const": "core:window:default",
+ "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-activity-name`\n- `allow-scene-identifier`\n- `allow-internal-toggle-maximize`"
+ },
+ {
+ "description": "Enables the activity_name command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-activity-name",
+ "markdownDescription": "Enables the activity_name command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the available_monitors command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-available-monitors",
+ "markdownDescription": "Enables the available_monitors command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the center command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-center",
+ "markdownDescription": "Enables the center command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the close command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-close",
+ "markdownDescription": "Enables the close command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the create command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-create",
+ "markdownDescription": "Enables the create command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the current_monitor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-current-monitor",
+ "markdownDescription": "Enables the current_monitor command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-cursor-position",
+ "markdownDescription": "Enables the cursor_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the destroy command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-destroy",
+ "markdownDescription": "Enables the destroy command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the get_all_windows command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-get-all-windows",
+ "markdownDescription": "Enables the get_all_windows command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the hide command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-hide",
+ "markdownDescription": "Enables the hide command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the inner_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-inner-position",
+ "markdownDescription": "Enables the inner_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the inner_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-inner-size",
+ "markdownDescription": "Enables the inner_size command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the internal_toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-internal-toggle-maximize",
+ "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-always-on-top",
+ "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_closable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-closable",
+ "markdownDescription": "Enables the is_closable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_decorated command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-decorated",
+ "markdownDescription": "Enables the is_decorated command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-enabled",
+ "markdownDescription": "Enables the is_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_focused command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-focused",
+ "markdownDescription": "Enables the is_focused command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-fullscreen",
+ "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-maximizable",
+ "markdownDescription": "Enables the is_maximizable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_maximized command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-maximized",
+ "markdownDescription": "Enables the is_maximized command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-minimizable",
+ "markdownDescription": "Enables the is_minimizable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_minimized command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-minimized",
+ "markdownDescription": "Enables the is_minimized command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_resizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-resizable",
+ "markdownDescription": "Enables the is_resizable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the is_visible command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-is-visible",
+ "markdownDescription": "Enables the is_visible command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the maximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-maximize",
+ "markdownDescription": "Enables the maximize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the minimize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-minimize",
+ "markdownDescription": "Enables the minimize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the monitor_from_point command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-monitor-from-point",
+ "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the outer_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-outer-position",
+ "markdownDescription": "Enables the outer_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the outer_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-outer-size",
+ "markdownDescription": "Enables the outer_size command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the primary_monitor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-primary-monitor",
+ "markdownDescription": "Enables the primary_monitor command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the request_user_attention command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-request-user-attention",
+ "markdownDescription": "Enables the request_user_attention command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the scale_factor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-scale-factor",
+ "markdownDescription": "Enables the scale_factor command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the scene_identifier command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-scene-identifier",
+ "markdownDescription": "Enables the scene_identifier command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_always_on_bottom command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-always-on-bottom",
+ "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-always-on-top",
+ "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_background_color command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-background-color",
+ "markdownDescription": "Enables the set_background_color command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_badge_count command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-badge-count",
+ "markdownDescription": "Enables the set_badge_count command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_badge_label command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-badge-label",
+ "markdownDescription": "Enables the set_badge_label command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_closable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-closable",
+ "markdownDescription": "Enables the set_closable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_content_protected command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-content-protected",
+ "markdownDescription": "Enables the set_content_protected command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_cursor_grab command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-cursor-grab",
+ "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_cursor_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-cursor-icon",
+ "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-cursor-position",
+ "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_cursor_visible command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-cursor-visible",
+ "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_decorations command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-decorations",
+ "markdownDescription": "Enables the set_decorations command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_effects command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-effects",
+ "markdownDescription": "Enables the set_effects command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-enabled",
+ "markdownDescription": "Enables the set_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_focus command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-focus",
+ "markdownDescription": "Enables the set_focus command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_focusable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-focusable",
+ "markdownDescription": "Enables the set_focusable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-fullscreen",
+ "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_fullscreen_on_monitor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-fullscreen-on-monitor",
+ "markdownDescription": "Enables the set_fullscreen_on_monitor command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-icon",
+ "markdownDescription": "Enables the set_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-ignore-cursor-events",
+ "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_max_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-max-size",
+ "markdownDescription": "Enables the set_max_size command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-maximizable",
+ "markdownDescription": "Enables the set_maximizable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_min_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-min-size",
+ "markdownDescription": "Enables the set_min_size command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-minimizable",
+ "markdownDescription": "Enables the set_minimizable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_overlay_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-overlay-icon",
+ "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-position",
+ "markdownDescription": "Enables the set_position command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_progress_bar command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-progress-bar",
+ "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_resizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-resizable",
+ "markdownDescription": "Enables the set_resizable command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_shadow command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-shadow",
+ "markdownDescription": "Enables the set_shadow command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_simple_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-simple-fullscreen",
+ "markdownDescription": "Enables the set_simple_fullscreen command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-size",
+ "markdownDescription": "Enables the set_size command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_size_constraints command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-size-constraints",
+ "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_skip_taskbar command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-skip-taskbar",
+ "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_theme command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-theme",
+ "markdownDescription": "Enables the set_theme command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_title command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-title",
+ "markdownDescription": "Enables the set_title command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_title_bar_style command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-title-bar-style",
+ "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-set-visible-on-all-workspaces",
+ "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the show command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-show",
+ "markdownDescription": "Enables the show command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the start_dragging command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-start-dragging",
+ "markdownDescription": "Enables the start_dragging command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the start_resize_dragging command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-start-resize-dragging",
+ "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the theme command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-theme",
+ "markdownDescription": "Enables the theme command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the title command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-title",
+ "markdownDescription": "Enables the title command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-toggle-maximize",
+ "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the unmaximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-unmaximize",
+ "markdownDescription": "Enables the unmaximize command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the unminimize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:allow-unminimize",
+ "markdownDescription": "Enables the unminimize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the activity_name command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-activity-name",
+ "markdownDescription": "Denies the activity_name command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the available_monitors command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-available-monitors",
+ "markdownDescription": "Denies the available_monitors command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the center command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-center",
+ "markdownDescription": "Denies the center command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the close command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-close",
+ "markdownDescription": "Denies the close command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the create command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-create",
+ "markdownDescription": "Denies the create command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the current_monitor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-current-monitor",
+ "markdownDescription": "Denies the current_monitor command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-cursor-position",
+ "markdownDescription": "Denies the cursor_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the destroy command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-destroy",
+ "markdownDescription": "Denies the destroy command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the get_all_windows command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-get-all-windows",
+ "markdownDescription": "Denies the get_all_windows command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the hide command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-hide",
+ "markdownDescription": "Denies the hide command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the inner_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-inner-position",
+ "markdownDescription": "Denies the inner_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the inner_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-inner-size",
+ "markdownDescription": "Denies the inner_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the internal_toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-internal-toggle-maximize",
+ "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-always-on-top",
+ "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_closable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-closable",
+ "markdownDescription": "Denies the is_closable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_decorated command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-decorated",
+ "markdownDescription": "Denies the is_decorated command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-enabled",
+ "markdownDescription": "Denies the is_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_focused command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-focused",
+ "markdownDescription": "Denies the is_focused command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-fullscreen",
+ "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-maximizable",
+ "markdownDescription": "Denies the is_maximizable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_maximized command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-maximized",
+ "markdownDescription": "Denies the is_maximized command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-minimizable",
+ "markdownDescription": "Denies the is_minimizable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_minimized command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-minimized",
+ "markdownDescription": "Denies the is_minimized command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_resizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-resizable",
+ "markdownDescription": "Denies the is_resizable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the is_visible command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-is-visible",
+ "markdownDescription": "Denies the is_visible command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the maximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-maximize",
+ "markdownDescription": "Denies the maximize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the minimize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-minimize",
+ "markdownDescription": "Denies the minimize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the monitor_from_point command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-monitor-from-point",
+ "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the outer_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-outer-position",
+ "markdownDescription": "Denies the outer_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the outer_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-outer-size",
+ "markdownDescription": "Denies the outer_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the primary_monitor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-primary-monitor",
+ "markdownDescription": "Denies the primary_monitor command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the request_user_attention command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-request-user-attention",
+ "markdownDescription": "Denies the request_user_attention command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the scale_factor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-scale-factor",
+ "markdownDescription": "Denies the scale_factor command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the scene_identifier command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-scene-identifier",
+ "markdownDescription": "Denies the scene_identifier command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_always_on_bottom command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-always-on-bottom",
+ "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_always_on_top command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-always-on-top",
+ "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_background_color command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-background-color",
+ "markdownDescription": "Denies the set_background_color command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_badge_count command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-badge-count",
+ "markdownDescription": "Denies the set_badge_count command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_badge_label command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-badge-label",
+ "markdownDescription": "Denies the set_badge_label command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_closable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-closable",
+ "markdownDescription": "Denies the set_closable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_content_protected command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-content-protected",
+ "markdownDescription": "Denies the set_content_protected command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_cursor_grab command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-cursor-grab",
+ "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_cursor_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-cursor-icon",
+ "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_cursor_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-cursor-position",
+ "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_cursor_visible command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-cursor-visible",
+ "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_decorations command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-decorations",
+ "markdownDescription": "Denies the set_decorations command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_effects command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-effects",
+ "markdownDescription": "Denies the set_effects command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_enabled command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-enabled",
+ "markdownDescription": "Denies the set_enabled command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_focus command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-focus",
+ "markdownDescription": "Denies the set_focus command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_focusable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-focusable",
+ "markdownDescription": "Denies the set_focusable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-fullscreen",
+ "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_fullscreen_on_monitor command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-fullscreen-on-monitor",
+ "markdownDescription": "Denies the set_fullscreen_on_monitor command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-icon",
+ "markdownDescription": "Denies the set_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-ignore-cursor-events",
+ "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_max_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-max-size",
+ "markdownDescription": "Denies the set_max_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_maximizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-maximizable",
+ "markdownDescription": "Denies the set_maximizable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_min_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-min-size",
+ "markdownDescription": "Denies the set_min_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_minimizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-minimizable",
+ "markdownDescription": "Denies the set_minimizable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_overlay_icon command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-overlay-icon",
+ "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_position command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-position",
+ "markdownDescription": "Denies the set_position command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_progress_bar command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-progress-bar",
+ "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_resizable command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-resizable",
+ "markdownDescription": "Denies the set_resizable command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_shadow command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-shadow",
+ "markdownDescription": "Denies the set_shadow command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_simple_fullscreen command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-simple-fullscreen",
+ "markdownDescription": "Denies the set_simple_fullscreen command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_size command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-size",
+ "markdownDescription": "Denies the set_size command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_size_constraints command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-size-constraints",
+ "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_skip_taskbar command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-skip-taskbar",
+ "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_theme command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-theme",
+ "markdownDescription": "Denies the set_theme command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_title command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-title",
+ "markdownDescription": "Denies the set_title command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_title_bar_style command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-title-bar-style",
+ "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-set-visible-on-all-workspaces",
+ "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the show command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-show",
+ "markdownDescription": "Denies the show command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the start_dragging command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-start-dragging",
+ "markdownDescription": "Denies the start_dragging command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the start_resize_dragging command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-start-resize-dragging",
+ "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the theme command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-theme",
+ "markdownDescription": "Denies the theme command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the title command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-title",
+ "markdownDescription": "Denies the title command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the toggle_maximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-toggle-maximize",
+ "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the unmaximize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-unmaximize",
+ "markdownDescription": "Denies the unmaximize command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the unminimize command without any pre-configured scope.",
+ "type": "string",
+ "const": "core:window:deny-unminimize",
+ "markdownDescription": "Denies the unminimize command without any pre-configured scope."
+ },
+ {
+ "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`",
+ "type": "string",
+ "const": "shell:default",
+ "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`"
+ },
+ {
+ "description": "Enables the execute command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-execute",
+ "markdownDescription": "Enables the execute command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the kill command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-kill",
+ "markdownDescription": "Enables the kill command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the open command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-open",
+ "markdownDescription": "Enables the open command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the spawn command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-spawn",
+ "markdownDescription": "Enables the spawn command without any pre-configured scope."
+ },
+ {
+ "description": "Enables the stdin_write command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:allow-stdin-write",
+ "markdownDescription": "Enables the stdin_write command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the execute command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-execute",
+ "markdownDescription": "Denies the execute command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the kill command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-kill",
+ "markdownDescription": "Denies the kill command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the open command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-open",
+ "markdownDescription": "Denies the open command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the spawn command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-spawn",
+ "markdownDescription": "Denies the spawn command without any pre-configured scope."
+ },
+ {
+ "description": "Denies the stdin_write command without any pre-configured scope.",
+ "type": "string",
+ "const": "shell:deny-stdin-write",
+ "markdownDescription": "Denies the stdin_write command without any pre-configured scope."
+ }
+ ]
+ },
+ "Value": {
+ "description": "All supported ACL values.",
+ "anyOf": [
+ {
+ "description": "Represents a null JSON value.",
+ "type": "null"
+ },
+ {
+ "description": "Represents a [`bool`].",
+ "type": "boolean"
+ },
+ {
+ "description": "Represents a valid ACL [`Number`].",
+ "allOf": [
+ {
+ "$ref": "#/definitions/Number"
+ }
+ ]
+ },
+ {
+ "description": "Represents a [`String`].",
+ "type": "string"
+ },
+ {
+ "description": "Represents a list of other [`Value`]s.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Value"
+ }
+ },
+ {
+ "description": "Represents a map of [`String`] keys to [`Value`]s.",
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/definitions/Value"
+ }
+ }
+ ]
+ },
+ "Number": {
+ "description": "A valid ACL number.",
+ "anyOf": [
+ {
+ "description": "Represents an [`i64`].",
+ "type": "integer",
+ "format": "int64"
+ },
+ {
+ "description": "Represents a [`f64`].",
+ "type": "number",
+ "format": "double"
+ }
+ ]
+ },
+ "Target": {
+ "description": "Platform target.",
+ "oneOf": [
+ {
+ "description": "MacOS.",
+ "type": "string",
+ "enum": [
+ "macOS"
+ ]
+ },
+ {
+ "description": "Windows.",
+ "type": "string",
+ "enum": [
+ "windows"
+ ]
+ },
+ {
+ "description": "Linux.",
+ "type": "string",
+ "enum": [
+ "linux"
+ ]
+ },
+ {
+ "description": "Android.",
+ "type": "string",
+ "enum": [
+ "android"
+ ]
+ },
+ {
+ "description": "iOS.",
+ "type": "string",
+ "enum": [
+ "iOS"
+ ]
+ }
+ ]
+ },
+ "ShellScopeEntryAllowedArg": {
+ "description": "A command argument allowed to be executed by the webview API.",
+ "anyOf": [
+ {
+ "description": "A non-configurable argument that is passed to the command in the order it was specified.",
+ "type": "string"
+ },
+ {
+ "description": "A variable that is set while calling the command from the webview API.",
+ "type": "object",
+ "required": [
+ "validator"
+ ],
+ "properties": {
+ "raw": {
+ "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.",
+ "default": false,
+ "type": "boolean"
+ },
+ "validator": {
+ "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ",
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ ]
+ },
+ "ShellScopeEntryAllowedArgs": {
+ "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.",
+ "anyOf": [
+ {
+ "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.",
+ "type": "boolean"
+ },
+ {
+ "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ShellScopeEntryAllowedArg"
+ }
+ }
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/apps/desktop/src-tauri/icons/128x128.png b/apps/desktop/src-tauri/icons/128x128.png
new file mode 100644
index 0000000..2e9aea9
Binary files /dev/null and b/apps/desktop/src-tauri/icons/128x128.png differ
diff --git a/apps/desktop/src-tauri/icons/128x128@2x.png b/apps/desktop/src-tauri/icons/128x128@2x.png
new file mode 100644
index 0000000..4279868
Binary files /dev/null and b/apps/desktop/src-tauri/icons/128x128@2x.png differ
diff --git a/apps/desktop/src-tauri/icons/32x32.png b/apps/desktop/src-tauri/icons/32x32.png
new file mode 100644
index 0000000..331cb4f
Binary files /dev/null and b/apps/desktop/src-tauri/icons/32x32.png differ
diff --git a/apps/desktop/src-tauri/icons/icon.icns b/apps/desktop/src-tauri/icons/icon.icns
new file mode 100644
index 0000000..4089d5c
Binary files /dev/null and b/apps/desktop/src-tauri/icons/icon.icns differ
diff --git a/apps/desktop/src-tauri/icons/icon.ico b/apps/desktop/src-tauri/icons/icon.ico
new file mode 100644
index 0000000..3299968
Binary files /dev/null and b/apps/desktop/src-tauri/icons/icon.ico differ
diff --git a/apps/desktop/src-tauri/icons/icon.png b/apps/desktop/src-tauri/icons/icon.png
new file mode 100644
index 0000000..4279868
Binary files /dev/null and b/apps/desktop/src-tauri/icons/icon.png differ
diff --git a/apps/desktop/src-tauri/src/engine.rs b/apps/desktop/src-tauri/src/engine.rs
new file mode 100644
index 0000000..338e790
--- /dev/null
+++ b/apps/desktop/src-tauri/src/engine.rs
@@ -0,0 +1,173 @@
+//! Engine façade: mock by default; with `--features engine` + HERMIT_CORE_LIB
+//! this module will grow real FFI around `cst_agent.h` (AgentCore parity).
+
+use serde::{Deserialize, Serialize};
+use std::sync::Mutex;
+use tauri::{AppHandle, Emitter};
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct SessionInfo {
+ pub id: String,
+ pub title: String,
+ pub updated_at: i64,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+#[serde(tag = "kind")]
+pub enum ChatItem {
+ #[serde(rename = "user")]
+ User { id: String, text: String },
+ #[serde(rename = "assistant")]
+ Assistant { id: String, text: String },
+ #[serde(rename = "thought")]
+ Thought { id: String, text: String },
+ #[serde(rename = "tool")]
+ Tool {
+ id: String,
+ name: String,
+ status: String,
+ detail: String,
+ },
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct Settings {
+ pub provider: String,
+ pub model: String,
+ pub approval: String,
+ pub workspace: String,
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+#[serde(tag = "type")]
+pub enum EngineEvent {
+ #[serde(rename = "assistant_delta")]
+ AssistantDelta { text: String },
+ #[serde(rename = "thought_delta")]
+ ThoughtDelta { text: String },
+ #[serde(rename = "tool_start")]
+ ToolStart {
+ id: String,
+ name: String,
+ detail: String,
+ },
+ #[serde(rename = "tool_end")]
+ ToolEnd {
+ id: String,
+ status: String,
+ detail: String,
+ },
+ #[serde(rename = "consent")]
+ Consent {
+ req: ConsentRequest,
+ },
+ #[serde(rename = "turn_end")]
+ TurnEnd { ok: bool },
+ #[serde(rename = "error")]
+ Error { message: String },
+}
+
+#[derive(Debug, Clone, Serialize, Deserialize)]
+pub struct ConsentRequest {
+ pub id: String,
+ pub tool: String,
+ pub detail: String,
+}
+
+pub struct EngineState {
+ pub settings: Settings,
+ pub sessions: Vec,
+ busy: bool,
+}
+
+impl Default for EngineState {
+ fn default() -> Self {
+ let workspace = std::env::current_dir()
+ .ok()
+ .and_then(|p| p.to_str().map(|s| s.to_string()))
+ .unwrap_or_else(|| ".".into());
+ Self {
+ settings: Settings {
+ provider: "deepseek".into(),
+ model: "deepseek-flash".into(),
+ approval: "auto".into(),
+ workspace,
+ },
+ sessions: vec![SessionInfo {
+ id: "welcome".into(),
+ title: "Welcome".into(),
+ updated_at: chrono_now(),
+ }],
+ busy: false,
+ }
+ }
+}
+
+fn chrono_now() -> i64 {
+ std::time::SystemTime::now()
+ .duration_since(std::time::UNIX_EPOCH)
+ .map(|d| d.as_millis() as i64)
+ .unwrap_or(0)
+}
+
+pub type SharedEngine = Mutex;
+
+pub fn list_sessions(state: &SharedEngine) -> Vec {
+ state.lock().unwrap().sessions.clone()
+}
+
+pub fn new_session(state: &SharedEngine) -> SessionInfo {
+ let mut g = state.lock().unwrap();
+ let s = SessionInfo {
+ id: format!("s{}", chrono_now()),
+ title: "New session".into(),
+ updated_at: chrono_now(),
+ };
+ g.sessions.insert(0, s.clone());
+ s
+}
+
+pub fn open_session(_state: &SharedEngine, _id: &str) -> Vec {
+ // Real FFI will replay transcript from cst_agent_store_*.
+ Vec::new()
+}
+
+pub fn settings_get(state: &SharedEngine) -> Settings {
+ state.lock().unwrap().settings.clone()
+}
+
+pub async fn send_turn(app: AppHandle, state: &SharedEngine, text: String) {
+ {
+ let mut g = state.lock().unwrap();
+ if g.busy {
+ return;
+ }
+ g.busy = true;
+ }
+
+ // Placeholder stream until libcstcore FFI is wired (feature = "engine").
+ let _ = app.emit(
+ "hermit://event",
+ EngineEvent::ThoughtDelta {
+ text: "Rust host received turn; FFI bridge pending full AgentCore port."
+ .into(),
+ },
+ );
+ tokio::time::sleep(std::time::Duration::from_millis(200)).await;
+ let _ = app.emit(
+ "hermit://event",
+ EngineEvent::AssistantDelta {
+ text: format!("Echo (host): {}", text),
+ },
+ );
+ let _ = app.emit("hermit://event", EngineEvent::TurnEnd { ok: true });
+ state.lock().unwrap().busy = false;
+}
+
+pub fn cancel_turn(state: &SharedEngine) {
+ state.lock().unwrap().busy = false;
+}
+
+pub fn consent_answer(_id: &str, _answer: &str) {
+ // Real path: wake the worker blocked in consent hook.
+}
diff --git a/apps/desktop/src-tauri/src/ffi.rs b/apps/desktop/src-tauri/src/ffi.rs
new file mode 100644
index 0000000..5446f7c
--- /dev/null
+++ b/apps/desktop/src-tauri/src/ffi.rs
@@ -0,0 +1,31 @@
+//! Future FFI surface against `include/cst_agent.h` (AgentCore parity).
+//!
+//! Enable with:
+//! make -C ../.. libcstcore.a # or cmake cstcore
+//! HERMIT_CORE_LIB=$PWD/../../libcstcore.a \
+//! HERMIT_CORE_INCLUDE=$PWD/../../include \
+//! cargo build --features engine
+//!
+//! Mapping (Qt AgentCore → Tauri commands/events):
+//! open / send / cancel → session_* / send_turn / cancel_turn
+//! hooks.assistant_delta → hermit://event AssistantDelta
+//! hooks.tool_* → ToolStart / ToolEnd
+//! hooks.consent (blocking) → Consent event + consent_answer wakes waiter
+//! settings / creds → settings_get (+ later settings_set)
+
+#![allow(dead_code)]
+
+#[cfg(feature = "engine")]
+mod live {
+ // Bindings land here (cbindgen or manual extern "C").
+}
+
+#[cfg(not(feature = "engine"))]
+pub fn engine_linked() -> bool {
+ false
+}
+
+#[cfg(feature = "engine")]
+pub fn engine_linked() -> bool {
+ true
+}
diff --git a/apps/desktop/src-tauri/src/ffi_stub.h b/apps/desktop/src-tauri/src/ffi_stub.h
new file mode 100644
index 0000000..03acc68
--- /dev/null
+++ b/apps/desktop/src-tauri/src/ffi_stub.h
@@ -0,0 +1,14 @@
+/* Placeholder for future cbindgen / manual FFI against include/cst_agent.h.
+ * Build with --features engine and HERMIT_CORE_LIB pointing at libcstcore.a.
+ */
+#pragma once
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Mirrors the subset AgentCore used; real symbols come from libcstcore. */
+typedef struct cst_agent cst_agent_t;
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs
new file mode 100644
index 0000000..fbb8f1b
--- /dev/null
+++ b/apps/desktop/src-tauri/src/lib.rs
@@ -0,0 +1,73 @@
+mod engine;
+mod ffi;
+
+use engine::{SharedEngine, EngineState};
+use std::sync::Mutex;
+use tauri::Manager;
+
+#[tauri::command]
+fn session_list(state: tauri::State<'_, SharedEngine>) -> Vec {
+ engine::list_sessions(&state)
+}
+
+#[tauri::command]
+fn session_new(state: tauri::State<'_, SharedEngine>) -> engine::SessionInfo {
+ engine::new_session(&state)
+}
+
+#[tauri::command]
+fn session_open(
+ state: tauri::State<'_, SharedEngine>,
+ id: String,
+) -> Vec {
+ engine::open_session(&state, &id)
+}
+
+#[tauri::command]
+fn settings_get(state: tauri::State<'_, SharedEngine>) -> engine::Settings {
+ engine::settings_get(&state)
+}
+
+#[tauri::command]
+async fn send_turn(
+ app: tauri::AppHandle,
+ state: tauri::State<'_, SharedEngine>,
+ text: String,
+) -> Result<(), String> {
+ engine::send_turn(app, &state, text).await;
+ Ok(())
+}
+
+#[tauri::command]
+fn cancel_turn(state: tauri::State<'_, SharedEngine>) {
+ engine::cancel_turn(&state);
+}
+
+#[tauri::command]
+fn consent_answer(id: String, answer: String) {
+ engine::consent_answer(&id, &answer);
+}
+
+#[cfg_attr(mobile, tauri::mobile_entry_point)]
+pub fn run() {
+ tauri::Builder::default()
+ .plugin(tauri_plugin_shell::init())
+ .manage(Mutex::new(EngineState::default()))
+ .invoke_handler(tauri::generate_handler![
+ session_list,
+ session_new,
+ session_open,
+ settings_get,
+ send_turn,
+ cancel_turn,
+ consent_answer
+ ])
+ .setup(|app| {
+ if let Some(w) = app.get_webview_window("main") {
+ let _ = w.set_title("Hermit");
+ }
+ Ok(())
+ })
+ .run(tauri::generate_context!())
+ .expect("error while running Hermit desktop");
+}
diff --git a/apps/desktop/src-tauri/src/main.rs b/apps/desktop/src-tauri/src/main.rs
new file mode 100644
index 0000000..20ac28d
--- /dev/null
+++ b/apps/desktop/src-tauri/src/main.rs
@@ -0,0 +1,5 @@
+#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
+
+fn main() {
+ hermit_desktop_lib::run();
+}
diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json
new file mode 100644
index 0000000..acc78cd
--- /dev/null
+++ b/apps/desktop/src-tauri/tauri.conf.json
@@ -0,0 +1,53 @@
+{
+ "$schema": "https://schema.tauri.app/config/2",
+ "productName": "Hermit",
+ "version": "1.1.0",
+ "identifier": "xyz.whcself.hermit",
+ "build": {
+ "beforeDevCommand": "npm run dev",
+ "devUrl": "http://localhost:1420",
+ "beforeBuildCommand": "npm run build",
+ "frontendDist": "../dist"
+ },
+ "app": {
+ "windows": [
+ {
+ "label": "main",
+ "title": "Hermit",
+ "width": 1280,
+ "height": 840,
+ "minWidth": 880,
+ "minHeight": 560,
+ "resizable": true,
+ "fullscreen": false
+ }
+ ],
+ "security": {
+ "csp": null
+ }
+ },
+ "bundle": {
+ "active": true,
+ "targets": "all",
+ "icon": [
+ "icons/32x32.png",
+ "icons/128x128.png",
+ "icons/128x128@2x.png",
+ "icons/icon.icns",
+ "icons/icon.ico"
+ ],
+ "linux": {
+ "deb": {
+ "depends": []
+ }
+ },
+ "macOS": {
+ "minimumSystemVersion": "12.0"
+ },
+ "windows": {
+ "nsis": {
+ "installMode": "currentUser"
+ }
+ }
+ }
+}
diff --git a/apps/desktop/src/App.tsx b/apps/desktop/src/App.tsx
new file mode 100644
index 0000000..dc3f52c
--- /dev/null
+++ b/apps/desktop/src/App.tsx
@@ -0,0 +1,209 @@
+import { useCallback, useEffect, useState } from "react";
+import { Rail } from "@/components/Rail";
+import { Transcript } from "@/components/Transcript";
+import { Composer } from "@/components/Composer";
+import { ConsentModal } from "@/components/ConsentModal";
+import {
+ answerConsent,
+ cancelTurn,
+ getSettings,
+ listSessions,
+ newSession,
+ onEngineEvent,
+ openSession,
+ sendTurn,
+ type ChatItem,
+ type ConsentRequest,
+ type SessionInfo,
+ type Settings,
+} from "@/lib/bridge";
+import "@/styles/app.css";
+
+export default function App() {
+ const [sessions, setSessions] = useState([]);
+ const [activeId, setActiveId] = useState(null);
+ const [items, setItems] = useState([]);
+ const [draft, setDraft] = useState("");
+ const [busy, setBusy] = useState(false);
+ const [query, setQuery] = useState("");
+ const [settings, setSettings] = useState({
+ provider: "deepseek",
+ model: "deepseek-flash",
+ approval: "auto",
+ workspace: ".",
+ });
+ const [consent, setConsent] = useState(null);
+ const [showSettings, setShowSettings] = useState(false);
+
+ const refreshSessions = useCallback(async () => {
+ setSessions(await listSessions());
+ }, []);
+
+ useEffect(() => {
+ void (async () => {
+ setSettings(await getSettings());
+ await refreshSessions();
+ })();
+ }, [refreshSessions]);
+
+ useEffect(() => {
+ let un: (() => void) | undefined;
+ void onEngineEvent((ev) => {
+ if (ev.type === "assistant_delta") {
+ setItems((prev) => {
+ const last = prev[prev.length - 1];
+ if (last && last.kind === "assistant") {
+ return [
+ ...prev.slice(0, -1),
+ { ...last, text: last.text + ev.text },
+ ];
+ }
+ return [
+ ...prev,
+ { kind: "assistant", id: `a${Date.now()}`, text: ev.text },
+ ];
+ });
+ } else if (ev.type === "thought_delta") {
+ setItems((prev) => {
+ const last = prev[prev.length - 1];
+ if (last && last.kind === "thought") {
+ return [
+ ...prev.slice(0, -1),
+ { ...last, text: last.text + "\n" + ev.text },
+ ];
+ }
+ return [
+ ...prev,
+ { kind: "thought", id: `th${Date.now()}`, text: ev.text },
+ ];
+ });
+ } else if (ev.type === "tool_start") {
+ setItems((prev) => [
+ ...prev,
+ {
+ kind: "tool",
+ id: ev.id,
+ name: ev.name,
+ status: "running",
+ detail: ev.detail,
+ },
+ ]);
+ } else if (ev.type === "tool_end") {
+ setItems((prev) =>
+ prev.map((it) =>
+ it.kind === "tool" && it.id === ev.id
+ ? { ...it, status: ev.status, detail: ev.detail || it.detail }
+ : it,
+ ),
+ );
+ } else if (ev.type === "consent") {
+ setConsent(ev.req);
+ } else if (ev.type === "turn_end") {
+ setBusy(false);
+ } else if (ev.type === "error") {
+ setBusy(false);
+ setItems((prev) => [
+ ...prev,
+ {
+ kind: "assistant",
+ id: `err${Date.now()}`,
+ text: `Error: ${ev.message}`,
+ },
+ ]);
+ }
+ }).then((u) => {
+ un = u;
+ });
+ return () => un?.();
+ }, []);
+
+ const open = async (id: string) => {
+ setActiveId(id);
+ setItems(await openSession(id));
+ };
+
+ const onNew = async () => {
+ const s = await newSession();
+ await refreshSessions();
+ setActiveId(s.id);
+ setItems([]);
+ };
+
+ const onSend = async () => {
+ const text = draft.trim();
+ if (!text || busy) return;
+ setDraft("");
+ setBusy(true);
+ setItems((prev) => [
+ ...prev,
+ { kind: "user", id: `u${Date.now()}`, text },
+ ]);
+ await sendTurn(text);
+ };
+
+ return (
+
+
void onNew()}
+ onOpen={(id) => void open(id)}
+ onSettings={() => setShowSettings(true)}
+ />
+
+
+
+ void onSend()}
+ onStop={() => void cancelTurn()}
+ />
+
+ {consent ? (
+ {
+ void answerConsent(consent.id, a);
+ setConsent(null);
+ }}
+ />
+ ) : null}
+ {showSettings ? (
+ setShowSettings(false)}>
+
e.stopPropagation()}
+ >
+
Settings
+
{JSON.stringify(settings, null, 2)}
+
+
+
+
+
+ ) : null}
+
+ );
+}
diff --git a/apps/desktop/src/components/Composer.tsx b/apps/desktop/src/components/Composer.tsx
new file mode 100644
index 0000000..9fbea66
--- /dev/null
+++ b/apps/desktop/src/components/Composer.tsx
@@ -0,0 +1,72 @@
+import { useEffect, useRef } from "react";
+import type { Settings } from "@/lib/bridge";
+
+type Props = {
+ value: string;
+ busy: boolean;
+ settings: Settings;
+ onChange: (v: string) => void;
+ onSend: () => void;
+ onStop: () => void;
+};
+
+export function Composer({
+ value,
+ busy,
+ settings,
+ onChange,
+ onSend,
+ onStop,
+}: Props) {
+ const ref = useRef(null);
+ useEffect(() => {
+ const el = ref.current;
+ if (!el) return;
+ el.style.height = "0px";
+ el.style.height = Math.min(200, el.scrollHeight) + "px";
+ }, [value]);
+
+ return (
+
+ );
+}
diff --git a/apps/desktop/src/components/ConsentModal.tsx b/apps/desktop/src/components/ConsentModal.tsx
new file mode 100644
index 0000000..52b4e1a
--- /dev/null
+++ b/apps/desktop/src/components/ConsentModal.tsx
@@ -0,0 +1,31 @@
+import type { ConsentRequest } from "@/lib/bridge";
+
+type Props = {
+ req: ConsentRequest;
+ onAnswer: (a: "deny" | "once" | "always_tool" | "always_prefix") => void;
+};
+
+export function ConsentModal({ req, onAnswer }: Props) {
+ return (
+
+
+
Allow {req.tool}?
+
{req.detail}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/desktop/src/components/Rail.tsx b/apps/desktop/src/components/Rail.tsx
new file mode 100644
index 0000000..9194a3a
--- /dev/null
+++ b/apps/desktop/src/components/Rail.tsx
@@ -0,0 +1,79 @@
+import type { SessionInfo } from "@/lib/bridge";
+
+type Props = {
+ sessions: SessionInfo[];
+ activeId: string | null;
+ workspace: string;
+ query: string;
+ onQuery: (q: string) => void;
+ onNew: () => void;
+ onOpen: (id: string) => void;
+ onSettings: () => void;
+};
+
+export function Rail({
+ sessions,
+ activeId,
+ workspace,
+ query,
+ onQuery,
+ onNew,
+ onOpen,
+ onSettings,
+}: Props) {
+ const filtered = sessions.filter(
+ (s) => !query || s.title.toLowerCase().includes(query.toLowerCase()),
+ );
+ return (
+
+ );
+}
diff --git a/apps/desktop/src/components/Transcript.tsx b/apps/desktop/src/components/Transcript.tsx
new file mode 100644
index 0000000..4046124
--- /dev/null
+++ b/apps/desktop/src/components/Transcript.tsx
@@ -0,0 +1,63 @@
+import type { ChatItem } from "@/lib/bridge";
+import ReactMarkdown from "react-markdown";
+import remarkGfm from "remark-gfm";
+
+type Props = { items: ChatItem[] };
+
+export function Transcript({ items }: Props) {
+ if (items.length === 0) {
+ return (
+
+
+
Meet Hermit
+
+ Local coding agent — read and edit your workspace, run commands with
+ approval, keep sessions on disk. Describe a task to begin.
+
+
+
+ );
+ }
+ return (
+
+ {items.map((it) => {
+ if (it.kind === "user") {
+ return (
+
+ );
+ }
+ if (it.kind === "assistant") {
+ return (
+
+
Hermit
+
+ {it.text}
+
+
+ );
+ }
+ if (it.kind === "thought") {
+ return (
+
+ Thought for a while
+ {it.text}
+
+ );
+ }
+ return (
+
+
+
+ {it.name}
+ {it.status}
+
+ {it.detail ?
{it.detail}
: null}
+
+ );
+ })}
+
+ );
+}
diff --git a/apps/desktop/src/lib/bridge.ts b/apps/desktop/src/lib/bridge.ts
new file mode 100644
index 0000000..5582030
--- /dev/null
+++ b/apps/desktop/src/lib/bridge.ts
@@ -0,0 +1,191 @@
+/** IPC / mock bridge for Hermit desktop. */
+
+export type SessionInfo = {
+ id: string;
+ title: string;
+ updated_at: number;
+};
+
+export type ConsentRequest = {
+ id: string;
+ tool: string;
+ detail: string;
+};
+
+export type ChatItem =
+ | { kind: "user"; id: string; text: string }
+ | { kind: "assistant"; id: string; text: string }
+ | { kind: "thought"; id: string; text: string }
+ | {
+ kind: "tool";
+ id: string;
+ name: string;
+ status: "running" | "ok" | "denied" | "error";
+ detail: string;
+ };
+
+export type EngineEvent =
+ | { type: "assistant_delta"; text: string }
+ | { type: "thought_delta"; text: string }
+ | { type: "tool_start"; id: string; name: string; detail: string }
+ | { type: "tool_end"; id: string; status: "ok" | "denied" | "error"; detail: string }
+ | { type: "consent"; req: ConsentRequest }
+ | { type: "turn_end"; ok: boolean }
+ | { type: "error"; message: string };
+
+export type Settings = {
+ provider: string;
+ model: string;
+ approval: "ask" | "auto" | "yolo";
+ workspace: string;
+};
+
+type Unlisten = () => void;
+
+async function tryInvoke(cmd: string, args?: Record): Promise {
+ try {
+ const { invoke } = await import("@tauri-apps/api/core");
+ return await invoke(cmd, args);
+ } catch {
+ return null;
+ }
+}
+
+const mockSessions: SessionInfo[] = [
+ {
+ id: "s1",
+ title: "Fix home TUI layout",
+ updated_at: Date.now() - 3600_000,
+ },
+ {
+ id: "s2",
+ title: "Ship hermit-update",
+ updated_at: Date.now() - 86400_000,
+ },
+];
+
+let mockBusy = false;
+const mockListeners = new Set<(e: EngineEvent) => void>();
+
+function emitMock(e: EngineEvent) {
+ mockListeners.forEach((fn) => fn(e));
+}
+
+export async function listSessions(): Promise {
+ const real = await tryInvoke("session_list");
+ return real ?? mockSessions;
+}
+
+export async function newSession(): Promise {
+ const real = await tryInvoke("session_new");
+ if (real) return real;
+ const s: SessionInfo = {
+ id: `s${Date.now()}`,
+ title: "New session",
+ updated_at: Date.now(),
+ };
+ mockSessions.unshift(s);
+ return s;
+}
+
+export async function openSession(id: string): Promise {
+ const real = await tryInvoke("session_open", { id });
+ if (real) return real;
+ if (id === "s1") {
+ return [
+ { kind: "user", id: "u1", text: "右上角布局不对,帮我看看。" },
+ {
+ kind: "thought",
+ id: "t1",
+ text: "Sidebar starts at row 0 while topbar only covers the main pane…",
+ },
+ {
+ kind: "tool",
+ id: "tool1",
+ name: "read_file",
+ status: "ok",
+ detail: "src/tui.c · draw_side / layout",
+ },
+ {
+ kind: "assistant",
+ id: "a1",
+ text: "顶栏只盖主区、侧栏从第 0 行铺满,右上角会空出一块。已把 topbar 拉满并把 seat deck 对齐到顶栏下方。",
+ },
+ ];
+ }
+ return [];
+}
+
+export async function getSettings(): Promise {
+ const real = await tryInvoke("settings_get");
+ return (
+ real ?? {
+ provider: "deepseek",
+ model: "deepseek-flash",
+ approval: "auto",
+ workspace: "~/hermit",
+ }
+ );
+}
+
+export async function sendTurn(text: string): Promise {
+ const real = await tryInvoke("send_turn", { text });
+ if (real !== null) return;
+ if (mockBusy) return;
+ mockBusy = true;
+ emitMock({ type: "thought_delta", text: "Planning a short reply…" });
+ await delay(400);
+ emitMock({
+ type: "tool_start",
+ id: "m1",
+ name: "shell",
+ detail: "hermit --version",
+ });
+ await delay(500);
+ emitMock({
+ type: "tool_end",
+ id: "m1",
+ status: "ok",
+ detail: "hermit 1.1.0",
+ });
+ const reply =
+ "这是桌面壳的本地演示流(未链上引擎时)。接上 libcstcore 后,这里会变成真实 turn。";
+ for (const ch of reply) {
+ emitMock({ type: "assistant_delta", text: ch });
+ await delay(12);
+ }
+ emitMock({ type: "turn_end", ok: true });
+ mockBusy = false;
+}
+
+export async function cancelTurn(): Promise {
+ await tryInvoke("cancel_turn");
+ mockBusy = false;
+ emitMock({ type: "turn_end", ok: false });
+}
+
+export async function answerConsent(
+ id: string,
+ answer: "deny" | "once" | "always_tool" | "always_prefix",
+): Promise {
+ await tryInvoke("consent_answer", { id, answer });
+}
+
+export async function onEngineEvent(fn: (e: EngineEvent) => void): Promise {
+ try {
+ const { listen } = await import("@tauri-apps/api/event");
+ const un = await listen("hermit://event", (ev) => fn(ev.payload));
+ return () => {
+ un();
+ };
+ } catch {
+ mockListeners.add(fn);
+ return () => {
+ mockListeners.delete(fn);
+ };
+ }
+}
+
+function delay(ms: number) {
+ return new Promise((r) => setTimeout(r, ms));
+}
diff --git a/apps/desktop/src/main.tsx b/apps/desktop/src/main.tsx
new file mode 100644
index 0000000..f8fc6f5
--- /dev/null
+++ b/apps/desktop/src/main.tsx
@@ -0,0 +1,9 @@
+import { StrictMode } from "react";
+import { createRoot } from "react-dom/client";
+import App from "./App";
+
+createRoot(document.getElementById("root")!).render(
+
+
+ ,
+);
diff --git a/apps/desktop/src/styles/app.css b/apps/desktop/src/styles/app.css
new file mode 100644
index 0000000..1d7b2d0
--- /dev/null
+++ b/apps/desktop/src/styles/app.css
@@ -0,0 +1,425 @@
+@import "./theme.css";
+
+.app {
+ display: grid;
+ grid-template-columns: var(--rail-w) 1fr;
+ height: 100%;
+ overflow: hidden;
+}
+
+/* —— left rail (DSH-like) —— */
+.rail {
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ padding: 14px 12px;
+ background: var(--bg-elev);
+ border-right: 1px solid var(--border);
+}
+
+.brand {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 4px 6px;
+}
+.brand-mark {
+ width: 28px;
+ height: 28px;
+ border-radius: 8px;
+ background: linear-gradient(145deg, var(--brand), var(--brand-dim));
+ box-shadow: inset 0 0 0 1px rgba(169, 217, 215, 0.25);
+ display: grid;
+ place-items: center;
+ color: var(--accent-text);
+ font-weight: 700;
+ font-size: 13px;
+}
+.brand-name {
+ font-weight: 650;
+ letter-spacing: 0.02em;
+}
+.brand-sub {
+ color: var(--text-faint);
+ font-size: 11px;
+}
+
+.btn-new {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ height: 40px;
+ border-radius: var(--radius-sm);
+ background: var(--brand);
+ color: #fff;
+ font-weight: 600;
+ transition: background 0.15s ease;
+}
+.btn-new:hover {
+ background: #2f94ab;
+}
+
+.rail-sec {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 4px 6px 0;
+ color: var(--text-faint);
+ font-size: 11px;
+ text-transform: uppercase;
+ letter-spacing: 0.06em;
+}
+
+.sess-search {
+ width: 100%;
+ height: 34px;
+ padding: 0 10px;
+ border-radius: var(--radius-sm);
+ border: 1px solid var(--border);
+ background: var(--bg);
+ outline: none;
+}
+.sess-search:focus {
+ border-color: var(--brand);
+}
+
+.sessions {
+ flex: 1;
+ overflow: auto;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ padding-right: 2px;
+}
+
+.sess {
+ text-align: left;
+ padding: 10px 10px;
+ border-radius: var(--radius-sm);
+ color: var(--text-muted);
+ border: 1px solid transparent;
+}
+.sess:hover {
+ background: var(--bg-hover);
+ color: var(--text);
+}
+.sess.active {
+ background: var(--bg-card);
+ border-color: var(--border-strong);
+ color: var(--text);
+}
+.sess-title {
+ font-weight: 550;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.sess-meta {
+ font-size: 11px;
+ color: var(--text-faint);
+ margin-top: 2px;
+}
+
+.rail-foot {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ padding-top: 8px;
+ border-top: 1px solid var(--border);
+}
+.workspace {
+ padding: 8px 10px;
+ border-radius: var(--radius-sm);
+ background: var(--bg);
+ border: 1px solid var(--border);
+ color: var(--text-muted);
+ font-size: 12px;
+ font-family: var(--mono);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.rail-actions {
+ display: flex;
+ gap: 6px;
+}
+.icon-btn {
+ flex: 1;
+ height: 34px;
+ border-radius: var(--radius-sm);
+ border: 1px solid var(--border);
+ color: var(--text-muted);
+}
+.icon-btn:hover {
+ background: var(--bg-hover);
+ color: var(--text);
+}
+
+/* —— main column —— */
+.main {
+ display: flex;
+ flex-direction: column;
+ min-width: 0;
+ background: var(--bg);
+}
+
+.topbar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ padding: 12px var(--pad);
+ border-bottom: 1px solid var(--border);
+}
+.topbar h1 {
+ margin: 0;
+ font-size: 15px;
+ font-weight: 600;
+}
+.chips {
+ display: flex;
+ gap: 8px;
+ flex-wrap: wrap;
+}
+.chip {
+ height: 28px;
+ padding: 0 10px;
+ border-radius: 999px;
+ border: 1px solid var(--border);
+ background: var(--bg-elev);
+ color: var(--text-muted);
+ font-size: 12px;
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+}
+.chip strong {
+ color: var(--text);
+ font-weight: 550;
+}
+.chip.ok {
+ border-color: rgba(61, 154, 106, 0.35);
+ color: var(--ok);
+}
+
+.transcript {
+ flex: 1;
+ overflow: auto;
+ padding: 20px var(--pad) 8px;
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+
+.empty {
+ margin: auto;
+ max-width: 420px;
+ text-align: center;
+ color: var(--text-muted);
+}
+.empty h2 {
+ margin: 0 0 8px;
+ color: var(--text);
+ font-weight: 600;
+ font-size: 20px;
+}
+.empty p {
+ margin: 0;
+ color: var(--text-faint);
+}
+
+.msg {
+ max-width: 820px;
+ width: 100%;
+ margin: 0 auto;
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+.msg.user {
+ align-items: flex-end;
+}
+.msg-role {
+ font-size: 11px;
+ color: var(--text-faint);
+ letter-spacing: 0.04em;
+ text-transform: uppercase;
+}
+.bubble {
+ padding: 12px 14px;
+ border-radius: var(--radius);
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ box-shadow: var(--shadow);
+ white-space: pre-wrap;
+ word-break: break-word;
+}
+.msg.user .bubble {
+ background: linear-gradient(160deg, var(--brand-dim), #1a4a56);
+ border-color: transparent;
+}
+.msg.assistant .bubble {
+ background: var(--bg-elev);
+}
+
+.thought,
+.tool-card {
+ max-width: 820px;
+ width: 100%;
+ margin: 0 auto;
+ border-radius: var(--radius);
+ border: 1px solid var(--border);
+ background: var(--bg-elev);
+ overflow: hidden;
+}
+.thought summary,
+.tool-head {
+ list-style: none;
+ cursor: pointer;
+ padding: 10px 12px;
+ color: var(--text-muted);
+ font-size: 12px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+.thought summary::-webkit-details-marker {
+ display: none;
+}
+.thought[open] summary {
+ border-bottom: 1px solid var(--border);
+}
+.thought-body,
+.tool-body {
+ padding: 10px 12px;
+ font-family: var(--mono);
+ font-size: 12px;
+ color: var(--text-muted);
+ white-space: pre-wrap;
+}
+.tool-head .dot {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background: var(--crab);
+}
+.tool-head .name {
+ color: var(--text);
+ font-weight: 550;
+}
+.tool-head .status {
+ margin-left: auto;
+ color: var(--text-faint);
+}
+
+.composer-wrap {
+ padding: 10px var(--pad) 16px;
+}
+.composer {
+ max-width: 820px;
+ margin: 0 auto;
+ border: 1px solid var(--border-strong);
+ background: var(--bg-card);
+ border-radius: 16px;
+ padding: 10px 12px 8px;
+ box-shadow: var(--shadow);
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+.composer textarea {
+ width: 100%;
+ min-height: 56px;
+ max-height: 200px;
+ resize: none;
+ border: none;
+ outline: none;
+ background: transparent;
+ padding: 4px 2px;
+}
+.composer-bar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+}
+.composer-left {
+ display: flex;
+ gap: 6px;
+ flex-wrap: wrap;
+}
+.send {
+ height: 34px;
+ min-width: 72px;
+ padding: 0 14px;
+ border-radius: 999px;
+ background: var(--crab);
+ color: #1a100c;
+ font-weight: 650;
+}
+.send:disabled {
+ opacity: 0.45;
+ cursor: default;
+}
+.send.stop {
+ background: var(--danger);
+ color: #fff;
+}
+
+.consent {
+ position: fixed;
+ inset: 0;
+ background: rgba(0, 0, 0, 0.55);
+ display: grid;
+ place-items: center;
+ z-index: 40;
+}
+.consent-card {
+ width: min(480px, calc(100% - 32px));
+ background: var(--bg-card);
+ border: 1px solid var(--border-strong);
+ border-radius: var(--radius);
+ padding: 18px;
+ box-shadow: var(--shadow);
+}
+.consent-card h3 {
+ margin: 0 0 8px;
+}
+.consent-card pre {
+ margin: 0 0 14px;
+ padding: 10px;
+ background: var(--bg);
+ border-radius: var(--radius-sm);
+ font-family: var(--mono);
+ font-size: 12px;
+ color: var(--text-muted);
+ max-height: 180px;
+ overflow: auto;
+}
+.consent-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ justify-content: flex-end;
+}
+.consent-actions button {
+ height: 34px;
+ padding: 0 12px;
+ border-radius: var(--radius-sm);
+ border: 1px solid var(--border);
+}
+.consent-actions .primary {
+ background: var(--brand);
+ border-color: transparent;
+ color: #fff;
+}
+
+@media (max-width: 880px) {
+ .app {
+ grid-template-columns: 1fr;
+ }
+ .rail {
+ display: none;
+ }
+}
diff --git a/apps/desktop/src/styles/theme.css b/apps/desktop/src/styles/theme.css
new file mode 100644
index 0000000..6b50bdd
--- /dev/null
+++ b/apps/desktop/src/styles/theme.css
@@ -0,0 +1,72 @@
+:root {
+ /* Hermit brand + DSH-like rhythm */
+ --brand: #277f94;
+ --brand-dim: #1d5f6e;
+ --crab: #f68042;
+ --eye: #9957ad;
+ --ok: #3d9a6a;
+ --warn: #e9ba47;
+ --danger: #c45c4a;
+
+ --bg: #0f1114;
+ --bg-elev: #161a1f;
+ --bg-card: #1b2128;
+ --bg-hover: #222933;
+ --border: rgba(255, 255, 255, 0.06);
+ --border-strong: rgba(255, 255, 255, 0.12);
+ --text: #e8ecf0;
+ --text-muted: #8b949e;
+ --text-faint: #5c6570;
+ --accent-text: #a9d9d7;
+
+ --radius: 12px;
+ --radius-sm: 8px;
+ --pad: 16px;
+ --rail-w: 260px;
+ --font: "IBM Plex Sans", "Segoe UI", "Noto Sans SC", system-ui, sans-serif;
+ --mono: "IBM Plex Mono", "JetBrains Mono", ui-monospace, monospace;
+ --shadow: 0 8px 28px rgba(0, 0, 0, 0.35);
+}
+
+* {
+ box-sizing: border-box;
+}
+
+html,
+body,
+#root {
+ height: 100%;
+ margin: 0;
+ background: var(--bg);
+ color: var(--text);
+ font-family: var(--font);
+ font-size: 14px;
+ line-height: 1.45;
+ -webkit-font-smoothing: antialiased;
+}
+
+button,
+input,
+textarea {
+ font: inherit;
+ color: inherit;
+}
+
+button {
+ cursor: pointer;
+ border: none;
+ background: none;
+}
+
+a {
+ color: var(--accent-text);
+}
+
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+}
+::-webkit-scrollbar-thumb {
+ background: rgba(255, 255, 255, 0.12);
+ border-radius: 8px;
+}
diff --git a/apps/desktop/src/vite-env.d.ts b/apps/desktop/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/apps/desktop/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/apps/desktop/tsconfig.json b/apps/desktop/tsconfig.json
new file mode 100644
index 0000000..95e9682
--- /dev/null
+++ b/apps/desktop/tsconfig.json
@@ -0,0 +1,23 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "useDefineForClassFields": true,
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+ "jsx": "react-jsx",
+ "strict": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noFallthroughCasesInSwitch": true,
+ "noUncheckedSideEffectImports": true,
+ "baseUrl": ".",
+ "paths": { "@/*": ["src/*"] }
+ },
+ "include": ["src"]
+}
diff --git a/apps/desktop/tsconfig.node.json b/apps/desktop/tsconfig.node.json
new file mode 100644
index 0000000..2ab3f37
--- /dev/null
+++ b/apps/desktop/tsconfig.node.json
@@ -0,0 +1,12 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "lib": ["ES2023"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "moduleResolution": "bundler",
+ "strict": true,
+ "noEmit": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/apps/desktop/tsconfig.tsbuildinfo b/apps/desktop/tsconfig.tsbuildinfo
new file mode 100644
index 0000000..413b90c
--- /dev/null
+++ b/apps/desktop/tsconfig.tsbuildinfo
@@ -0,0 +1 @@
+{"root":["./src/App.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/components/Composer.tsx","./src/components/ConsentModal.tsx","./src/components/Rail.tsx","./src/components/Transcript.tsx","./src/lib/bridge.ts"],"version":"5.9.3"}
\ No newline at end of file
diff --git a/apps/desktop/vite.config.ts b/apps/desktop/vite.config.ts
new file mode 100644
index 0000000..58c809a
--- /dev/null
+++ b/apps/desktop/vite.config.ts
@@ -0,0 +1,26 @@
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
+import path from "node:path";
+
+const host = process.env.TAURI_DEV_HOST;
+
+export default defineConfig({
+ plugins: [react()],
+ resolve: {
+ alias: { "@": path.resolve(__dirname, "src") },
+ },
+ clearScreen: false,
+ server: {
+ port: 1420,
+ strictPort: true,
+ host: host || false,
+ hmr: host ? { protocol: "ws", host, port: 1421 } : undefined,
+ watch: { ignored: ["**/src-tauri/**"] },
+ },
+ envPrefix: ["VITE_", "TAURI_"],
+ build: {
+ target: process.env.TAURI_ENV_PLATFORM === "windows" ? "chrome105" : "safari13",
+ minify: !process.env.TAURI_ENV_DEBUG ? "esbuild" : false,
+ sourcemap: !!process.env.TAURI_ENV_DEBUG,
+ },
+});
diff --git a/default.nix b/default.nix
index 1ed9de7..9012cc2 100644
--- a/default.nix
+++ b/default.nix
@@ -1,13 +1,8 @@
-# NixOS and other nix users: the desktop front end (Qt Quick) with the engine
-# it embeds, built and installed the nix way.
+# NixOS and other nix users: legacy Qt Quick front end (frozen; Tauri app is
+# apps/desktop). CLI remains scripts/bootstrap_linux.sh.
#
-# nix-build # ./result/bin/cst-agent-app, run it in place
-# nix-env -f . -i cst-agent # into the user profile: PATH, menu entry, icon
-#
-# The Qt apps hook is what makes the installed binary find Qt's plugins and
-# QML modules outside a nix-shell (this is also what keeps them out of
-# nix-collect-garbage's reach). Only the window is installed: the CLI has its
-# own installer, scripts/bootstrap_linux.sh.
+# nix-build # ./result/bin/hermit-app (Qt, transitional)
+# nix-env -f . -i hermit
{ pkgs ? import { } }:
let
@@ -21,7 +16,7 @@ let
builtins.head (builtins.match "#define ${re} ([0-9]+)" hit);
in
pkgs.stdenv.mkDerivation {
- pname = "cst-agent";
+ pname = "hermit";
version =
"${vLine "CST_VERSION_MAJOR"}.${vLine "CST_VERSION_MINOR"}.${vLine "CST_VERSION_PATCH"}";
@@ -91,8 +86,8 @@ pkgs.stdenv.mkDerivation {
meta = {
description =
- "Local coding agent: Qt Quick front end with the engine in-process";
- homepage = "https://git.whcself.xyz/WHC/CST-agent";
+ "Hermit: local coding agent (legacy Qt Quick front end; prefer apps/desktop)";
+ homepage = "https://git.whcself.xyz/WHC/Hermit";
platforms = pkgs.lib.platforms.linux;
mainProgram = "cst-agent-app";
};
diff --git a/docs/desktop.md b/docs/desktop.md
new file mode 100644
index 0000000..46f2af2
--- /dev/null
+++ b/docs/desktop.md
@@ -0,0 +1,20 @@
+# Hermit Desktop (Tauri)
+
+Canonical GUI: [`apps/desktop`](../apps/desktop/). Qt under [`app/`](../app/) is frozen ([DEPRECATED](../app/DEPRECATED.md)).
+
+## Shape
+
+- **Shell**: Tauri 2 (Linux / Windows / macOS)
+- **UI**: React 19 — session rail, chat, tool cards, composer (DeepSeek Harness–like IA)
+- **Engine**: in-process `libcstcore` via Rust FFI (feature `engine`); without it the host uses a mock / echo path so the UI is developable
+
+## Dev
+
+```bash
+nix-shell -p rustc cargo nodejs_22 pkg-config webkitgtk_4_1 gtk3 librsvg openssl curl
+cd apps/desktop && npm install && npm run tauri dev
+```
+
+## Product env
+
+`HERMIT_*` preferred, `CST_*` accepted (see `hermit_getenv`). Config dir `~/.config/hermit`.
diff --git a/include/cst_version.h b/include/cst_version.h
index d515a16..d805fa4 100644
--- a/include/cst_version.h
+++ b/include/cst_version.h
@@ -2,8 +2,8 @@
#define CST_VERSION_H
#define CST_VERSION_MAJOR 1
-#define CST_VERSION_MINOR 0
-#define CST_VERSION_PATCH 2
+#define CST_VERSION_MINOR 1
+#define CST_VERSION_PATCH 0
#define CST_VERSION_STR_(x) #x
#define CST_VERSION_STR(x) CST_VERSION_STR_(x)
diff --git a/include/os_compat.h b/include/os_compat.h
index f0633a5..48a61fa 100644
--- a/include/os_compat.h
+++ b/include/os_compat.h
@@ -213,6 +213,9 @@ int os_utf8_encode(unsigned long cp, char out[4]);
* text as GBK and the screen would show mojibake. */
int os_utf8_decode(const char *s, size_t avail, unsigned long *cp);
+/* HERMIT_ then CST_. Never NULL (may be ""). */
+const char *hermit_getenv(const char *suffix);
+
/* --- libc gaps on Windows ------------------------------------------------
* MinGW-w64 provides neither strcasestr() (a GNU extension) nor
* setenv()/unsetenv() (POSIX): they are simply absent from its headers.
diff --git a/scripts/bootstrap_linux.sh b/scripts/bootstrap_linux.sh
index 48d1297..639996b 100755
--- a/scripts/bootstrap_linux.sh
+++ b/scripts/bootstrap_linux.sh
@@ -106,7 +106,9 @@ cmd="\${1:-status}"
case "\$cmd" in
status)
"\$BIN" --version
- if command -v systemctl >/dev/null 2>&1 && systemctl --user is-active cst-agent-parliament.service >/dev/null 2>&1; then
+ if command -v systemctl >/dev/null 2>&1 && systemctl --user is-active hermit-parliament.service >/dev/null 2>&1; then
+ systemctl --user status hermit-parliament.service --no-pager
+ elif command -v systemctl >/dev/null 2>&1 && systemctl --user is-active cst-agent-parliament.service >/dev/null 2>&1; then
systemctl --user status cst-agent-parliament.service --no-pager
else
"\$BIN" --service-stop >/dev/null 2>&1 || true
@@ -116,9 +118,9 @@ status)
install-unit)
make -C "$dir" install-service PREFIX="$prefix"
;;
-start) systemctl --user start cst-agent-parliament.service ;;
-stop) systemctl --user stop cst-agent-parliament.service; "\$BIN" --service-stop || true ;;
-restart) systemctl --user restart cst-agent-parliament.service ;;
+start) systemctl --user start hermit-parliament.service 2>/dev/null || systemctl --user start cst-agent-parliament.service ;;
+stop) systemctl --user stop hermit-parliament.service 2>/dev/null || true; systemctl --user stop cst-agent-parliament.service 2>/dev/null || true; "\$BIN" --service-stop || true ;;
+restart) systemctl --user restart hermit-parliament.service 2>/dev/null || systemctl --user restart cst-agent-parliament.service ;;
*)
echo "usage: hermit-service {status|install-unit|start|stop|restart}" >&2
exit 2
diff --git a/scripts/bootstrap_termux.sh b/scripts/bootstrap_termux.sh
index 6c8bb7c..0f0d679 100755
--- a/scripts/bootstrap_termux.sh
+++ b/scripts/bootstrap_termux.sh
@@ -1,13 +1,13 @@
#!/data/data/com.termux/files/usr/bin/bash
-# Install or upgrade CST-Agent on Android Termux. Safe to rerun: an existing
+# Install or upgrade Hermit on Android Termux. Safe to rerun: an existing
# checkout is fast-forwarded, rebuilt and reinstalled.
#
# bootstrap_termux.sh [DIR] [--no-pull]
-# cst-agent-update (installed by this script; same as rerunning it)
+# hermit-update (installed by this script; same as rerunning it)
set -euo pipefail
main() {
- local repo_url="${CST_AGENT_REPO:-https://git.whcself.xyz/WHC/CST-agent.git}"
+ local repo_url="${HERMIT_REPO:-${CST_AGENT_REPO:-https://git.whcself.xyz/WHC/Hermit.git}}"
local dir="" pull=1 changed=0 arg
for arg in "$@"; do
case "$arg" in
@@ -21,10 +21,12 @@ main() {
esac
done
if [[ -z "$dir" ]]; then
- if [[ -n "${CST_AGENT_DIR:-}" ]]; then
- dir="$CST_AGENT_DIR"
+ if [[ -n "${HERMIT_DIR:-${CST_AGENT_DIR:-}}" ]]; then
+ dir="${HERMIT_DIR:-$CST_AGENT_DIR}"
elif [[ -f Makefile && -f src/main.c && -d .git ]]; then
dir="$(pwd)"
+ elif [[ -d "$HOME/Hermit/.git" ]]; then
+ dir="$HOME/Hermit"
else
dir="$HOME/CST-agent"
fi
diff --git a/scripts/hermit-parliament.service.in b/scripts/hermit-parliament.service.in
new file mode 100644
index 0000000..245aa85
--- /dev/null
+++ b/scripts/hermit-parliament.service.in
@@ -0,0 +1,23 @@
+[Unit]
+Description=Hermit parliament seat service
+Documentation=https://git.whcself.xyz/WHC/Hermit
+After=network-online.target
+Wants=network-online.target
+
+[Service]
+Type=simple
+# Prefer --service-fg under systemd so the unit tracks the real process.
+ExecStart=@BIN@ --service-fg --peer-port ${HERMIT_PEER_PORT:-${CST_PEER_PORT:-9100}}
+Restart=on-failure
+RestartSec=3
+Environment=HERMIT_INSTANCE_ID=%H
+# Put the Realm password in a drop-in, e.g.:
+# ~/.config/systemd/user/hermit-parliament.service.d/override.conf
+# [Service]
+# Environment=HERMIT_REALM_PASSWORD=…
+# CST_* still accepted. Config under ~/.config/hermit/ (legacy cst-agent/).
+EnvironmentFile=-%h/.config/hermit/parliament.env
+EnvironmentFile=-%h/.config/cst-agent/parliament.env
+
+[Install]
+WantedBy=default.target
diff --git a/scripts/windows/cst-agent.nsi b/scripts/windows/cst-agent.nsi
index 4673237..41898b7 100644
--- a/scripts/windows/cst-agent.nsi
+++ b/scripts/windows/cst-agent.nsi
@@ -16,8 +16,8 @@ RequestExecutionLevel user
!define OUTFILE "cst-agent-${VERSION}-windows-x86_64-setup.exe"
!endif
-!define APP "CST-Agent"
-!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\cst-agent"
+!define APP "Hermit"
+!define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\hermit"
!include "MUI2.nsh"
!include "LogicLib.nsh"
diff --git a/src/agent_loop.c b/src/agent_loop.c
index b6922a7..8aa18dd 100644
--- a/src/agent_loop.c
+++ b/src/agent_loop.c
@@ -20,6 +20,7 @@
#include "cst_util.h"
#include "mm_tool.h"
#include "os_compat.h"
+#include "cst_hermit_glyph.h"
#include
#include
@@ -695,7 +696,7 @@ static const char NUDGE_FINAL[] =
#define MAX_CTL_RETRIES 3
static int par_max_cap(void) {
- const char *e = getenv("CST_PAR_MAX");
+ const char *e = hermit_getenv("PAR_MAX");
int n = e && e[0] ? atoi(e) : PAR_MAX_DEFAULT;
if (n < 1)
n = 1;
@@ -1844,7 +1845,7 @@ int cst_message_is_note(const cst_message_t *m) {
* request filled 85% of the context window the oldest half is dropped. */
static int window_start(cst_agent_t *a, int n) {
int start = a->win_start > 0 && a->win_start < n ? a->win_start : 0;
- const char *e = getenv("CST_CTX_WINDOW");
+ const char *e = hermit_getenv("CTX_WINDOW");
int win = e ? atoi(e) : 0;
int count = 0;
for (int i = start; i < n; i++)
@@ -2048,7 +2049,7 @@ static const char *agent_tools_json(cst_agent_t *a) {
if (a->tools_json && sig == a->tools_sig)
return a->tools_json;
if (!a->tools_json) {
- const char *e = getenv("CST_MCP_WAIT_MS");
+ const char *e = hermit_getenv("MCP_WAIT_MS");
cst_mcp_wait_ready(e && atoi(e) >= 0 ? atoi(e) : 3000);
}
cst_agent_config_t c = a->cfg;
@@ -2123,7 +2124,7 @@ static void fill_request(cst_agent_t *a, cst_llm_request_t *req,
(unsigned long long)h);
req->cache_key = a->cache_key;
}
- req->cache_ttl = getenv("CST_CACHE_TTL");
+ req->cache_ttl = hermit_getenv("CACHE_TTL");
}
}
@@ -2482,7 +2483,7 @@ void cst_agent_reload_notes(cst_agent_t *a) {
return;
free(a->notes);
a->notes = NULL;
- const char *e = getenv("CST_NO_PROJECT_NOTES");
+ const char *e = hermit_getenv("NO_PROJECT_NOTES");
if (e && e[0] == '1')
return;
static const char *const names[] = {"AGENTS.md", "CST.md"};
@@ -3056,7 +3057,7 @@ static int can_continue(const cst_agent_t *a, const turn_t *t,
* the context window, capped at 256K tokens. Even a cached prompt is billed on
* every step, so a 1M-token window is not worth filling. */
static long ctx_budget(const cst_agent_t *a) {
- const char *e = getenv("CST_CTX_BUDGET");
+ const char *e = hermit_getenv("CTX_BUDGET");
if (e && atol(e) > 0)
return atol(e);
long win = cst_model_context_tokens(a->cfg.model);
@@ -3070,7 +3071,7 @@ static long ctx_budget(const cst_agent_t *a) {
/* Compact before a turn when the last request crossed the budget. */
static void maybe_auto_compact(cst_agent_t *a, const cst_agent_hooks_t *hooks) {
- const char *e = getenv("CST_AUTO_COMPACT");
+ const char *e = hermit_getenv("AUTO_COMPACT");
if (e && e[0] == '0')
return;
long budget = ctx_budget(a);
@@ -3473,7 +3474,7 @@ static int run_turn_once(cst_agent_t *a, const char *user_text,
* flaky gateway does not end the turn blank. CST_EMPTY_RETRIES overrides. */
{
int empty_cap = a->cfg.headless ? 4 : 2;
- const char *env_er = getenv("CST_EMPTY_RETRIES");
+ const char *env_er = hermit_getenv("EMPTY_RETRIES");
if (env_er && atoi(env_er) > 0)
empty_cap = atoi(env_er);
if (empty_retries < empty_cap && step + 1 < a->cfg.max_steps) {
diff --git a/src/extensions.c b/src/extensions.c
index 713232a..d5b5802 100644
--- a/src/extensions.c
+++ b/src/extensions.c
@@ -1,4 +1,5 @@
#include "cst_ext.h"
+#include "cst_hermit_glyph.h"
#include
#include
@@ -21,7 +22,7 @@ void cst_extensions_wait(FILE *log) {
if (total == 0)
return;
/* Default 8s (was 30s); override with CST_MCP_WAIT_MS. */
- const char *e = getenv("CST_MCP_WAIT_MS");
+ const char *e = hermit_getenv("MCP_WAIT_MS");
int ms = e && atoi(e) >= 0 ? atoi(e) : 8000;
if (ms > 60000)
ms = 60000;
diff --git a/src/hermit_glyph.c b/src/hermit_glyph.c
index 14274ad..4b9befc 100644
--- a/src/hermit_glyph.c
+++ b/src/hermit_glyph.c
@@ -6,18 +6,8 @@
#include
#include
-const char *hermit_getenv(const char *suffix) {
- char hk[96], ck[96];
- if (!suffix || !suffix[0])
- return "";
- snprintf(hk, sizeof(hk), "HERMIT_%s", suffix);
- const char *e = getenv(hk);
- if (e && e[0])
- return e;
- snprintf(ck, sizeof(ck), "CST_%s", suffix);
- e = getenv(ck);
- return e ? e : "";
-}
+/* hermit_getenv lives in os_compat.c so light test binaries that link
+ * os_compat without hermit_glyph still resolve HERMIT_/CST_ dual env. */
static int file_ok(const char *path) {
os_stat_t st;
diff --git a/src/llm_openai.c b/src/llm_openai.c
index 04da334..01f3c5f 100644
--- a/src/llm_openai.c
+++ b/src/llm_openai.c
@@ -7,6 +7,7 @@
#include "cst_tools.h"
#include "cst_util.h"
#include "os_compat.h"
+#include "cst_hermit_glyph.h"
#include
#include
@@ -68,7 +69,7 @@ void cst_curl_apply_ca(void *curl) {
static atomic_int state; /* 0 unchecked, 1 checking, 2 done */
int expect = 0;
if (atomic_compare_exchange_strong(&state, &expect, 1)) {
- const char *env = getenv("CST_CA_BUNDLE");
+ const char *env = hermit_getenv("CA_BUNDLE");
if (ca_file_ok(env)) {
snprintf(ca, sizeof(ca), "%s", env);
} else {
@@ -120,7 +121,7 @@ void cst_curl_apply_ca(void *curl) {
static size_t wire_tool_cap(const cst_llm_request_t *req) {
if (req->tool_out_cap)
return req->tool_out_cap;
- const char *e = getenv("CST_TOOL_OUT_CAP");
+ const char *e = hermit_getenv("TOOL_OUT_CAP");
if (e && atol(e) > 256)
return (size_t)atol(e);
return CST_DEFAULT_TOOL_OUT_CAP;
@@ -484,21 +485,22 @@ char *cst_llm_build_body(const cst_llm_request_t *req) {
if (req->send_reasoning || is_kimi_k27(req->model))
cJSON_AddStringToObject(thinking, "keep", "all");
}
- if (kimi && (!getenv("CST_NO_CACHE_HINTS") ||
- !getenv("CST_NO_CACHE_HINTS")[0] ||
- getenv("CST_NO_CACHE_HINTS")[0] == '0')) {
- /* Kimi's implicit cache defaults to 5m. Agent sessions commonly pause
- * longer than that, so opt into the 1h tier; users can select 5m/1h. */
- const char *ttl = getenv("CST_KIMI_CACHE_TTL");
- if (!ttl || (strcmp(ttl, "5m") != 0 && strcmp(ttl, "1h") != 0))
- ttl = "1h";
- cJSON *cache = cJSON_AddObjectToObject(root, "prompt_cache_options");
- cJSON_AddStringToObject(cache, "mode", "implicit");
- cJSON_AddStringToObject(cache, "ttl", ttl);
+ {
+ const char *noch = hermit_getenv("NO_CACHE_HINTS");
+ if (kimi && (!noch[0] || noch[0] == '0')) {
+ /* Kimi's implicit cache defaults to 5m. Agent sessions commonly pause
+ * longer than that, so opt into the 1h tier; users can select 5m/1h. */
+ const char *ttl = hermit_getenv("KIMI_CACHE_TTL");
+ if (!ttl || (strcmp(ttl, "5m") != 0 && strcmp(ttl, "1h") != 0))
+ ttl = "1h";
+ cJSON *cache = cJSON_AddObjectToObject(root, "prompt_cache_options");
+ cJSON_AddStringToObject(cache, "mode", "implicit");
+ cJSON_AddStringToObject(cache, "ttl", ttl);
+ }
}
cJSON_AddTrueToObject(root, "stream");
- const char *nousage = getenv("CST_NO_STREAM_USAGE");
- if (!nousage || !nousage[0] || nousage[0] == '0') {
+ const char *nousage = hermit_getenv("NO_STREAM_USAGE");
+ if (!nousage[0] || nousage[0] == '0') {
cJSON *so = cJSON_AddObjectToObject(root, "stream_options");
cJSON_AddTrueToObject(so, "include_usage");
}
@@ -517,7 +519,7 @@ char *cst_llm_build_body(const cst_llm_request_t *req) {
cJSON *pending = NULL; /* images from tool results, waiting for a break */
size_t img_budget = CST_ATTACH_MAX_TOTAL;
size_t doc_budget = CST_ATTACH_MAX_TOTAL;
- const char *noimg = getenv("CST_NO_IMAGES");
+ const char *noimg = hermit_getenv("NO_IMAGES");
const char *img_off =
noimg && noimg[0] && noimg[0] != '0'
? "image sending is disabled (CST_NO_IMAGES)"
@@ -653,7 +655,7 @@ char *cst_llm_build_body(const cst_llm_request_t *req) {
if (req->cache_style == CST_CACHE_OPENAI && req->cache_key &&
req->cache_key[0]) {
cJSON_AddStringToObject(root, "prompt_cache_key", req->cache_key);
- const char *ret = getenv("CST_CACHE_RETENTION");
+ const char *ret = hermit_getenv("CACHE_RETENTION");
if (ret && ret[0])
cJSON_AddStringToObject(root, "prompt_cache_retention", ret);
} else if (req->cache_style == CST_CACHE_ANTHROPIC) {
@@ -1034,7 +1036,7 @@ static int replay_run(sse_t *s, const char *dir, int seq, char *err,
return -1;
}
size_t chunk = 16;
- const char *e = getenv("CST_REPLAY_CHUNK");
+ const char *e = hermit_getenv("REPLAY_CHUNK");
if (e && atoi(e) > 0)
chunk = (size_t)atoi(e);
char buf[4096];
@@ -1114,8 +1116,8 @@ int cst_llm_chat_stream(const cst_llm_request_t *req, char *err,
}
int seq = atomic_fetch_add(&g_trace_seq, 1);
- const char *rec_dir = getenv("CST_RECORD_SSE");
- const char *rep_dir = getenv("CST_REPLAY_SSE");
+ const char *rec_dir = hermit_getenv("RECORD_SSE");
+ const char *rep_dir = hermit_getenv("REPLAY_SSE");
if (rec_dir && rec_dir[0]) {
os_mkdir_p(rec_dir, 0755);
char p[OS_PATH_MAX];
diff --git a/src/main.c b/src/main.c
index ab47b6b..5c07a3c 100644
--- a/src/main.c
+++ b/src/main.c
@@ -8,6 +8,7 @@
#include "cst_version.h"
#include "cst_webui.h"
#include "os_compat.h"
+#include "cst_hermit_glyph.h"
#include
#include
@@ -67,7 +68,7 @@ static void usage(const char *argv0) {
" --no-orchestrate override workspace orchestration setting\n"
" --realm-new create Realm file keys (legacy/dev)\n"
" --realm-password-init create password-derived Realm (no sk on disk)\n"
- " --login unlock (CST_REALM_PASSWORD or prompt); claim chair\n"
+ " --login unlock (HERMIT_REALM_PASSWORD / CST_… or prompt); claim chair\n"
" --join unlock; join as member seat (no chair steal)\n"
" --service run parliament service (discover+context sync)\n"
" --service-fg same as --service, stay in foreground\n"
@@ -95,15 +96,14 @@ static void usage(const char *argv0) {
"\n"
"API keys: the TUI asks for a missing key and saves it per provider\n"
" in the config dir (credentials, mode 0600); /key changes it.\n"
- " Fallbacks: (DEEPSEEK_API_KEY, ...), CST_API_KEY.\n"
+ " Fallbacks: (DEEPSEEK_API_KEY, ...), HERMIT_API_KEY / CST_API_KEY.\n"
"Settings: provider, models, effort and mode are remembered in\n"
- " settings.json next to the credentials.\n"
- "Env: CST_PROVIDER CST_MODEL CST_EFFORT CST_MODE CST_PROTOCOL\n"
- " CST_TOOLS CST_CONFIRM CST_MAX_STEPS CST_TOOL_OUT_CAP\n"
- " CST_CTX_WINDOW CST_CTX_TOKENS CST_AUTO_COMPACT=0\n"
- " CST_SHELL_TIMEOUT CST_METRICS=0 CST_RECORD_SSE CST_REPLAY_SSE\n"
- " CST_MODELS CST_APPROVAL=ask|auto|yolo CST_AUTO_APPROVE=1 (=yolo)\n"
- " CST_SANDBOX=off CST_SHELL CST_NO_PROJECT_NOTES=1 NO_COLOR\n"
+ " settings.json next to the credentials (~/.config/hermit).\n"
+ "Env: HERMIT_* preferred, CST_* accepted. Common:\n"
+ " PROVIDER MODEL EFFORT MODE PROTOCOL TOOLS CONFIRM APPROVAL\n"
+ " MAX_STEPS TOOL_OUT_CAP CTX_WINDOW AUTO_COMPACT=0 SANDBOX=off\n"
+ " REALM_PASSWORD INSTANCE_ID WEB_PORT WEB_HOST WEB_TOKEN\n"
+ " SHELL_TIMEOUT METRICS=0 RECORD_SSE REPLAY_SSE MODELS NO_COLOR\n"
"TUI: type /help inside for commands and keys\n",
argv0);
}
@@ -342,36 +342,36 @@ int main(int argc, char **argv) {
cfg.api_key[0] = 0;
cfg.model[0] = 0;
cfg.protocol = CST_PROTO_NATIVE_EOS;
- const char *env_proto = getenv("CST_PROTOCOL");
+ const char *env_proto = hermit_getenv("PROTOCOL");
if (env_proto && env_proto[0] &&
cst_protocol_parse(env_proto, &cfg.protocol) != 0) {
fprintf(stderr, "unknown CST_PROTOCOL=%s\n", env_proto);
return 1;
}
cfg.max_steps = CST_DEFAULT_MAX_STEPS;
- const char *env_steps = getenv("CST_MAX_STEPS");
+ const char *env_steps = hermit_getenv("MAX_STEPS");
if (env_steps && atoi(env_steps) > 0)
cfg.max_steps = atoi(env_steps);
cfg.tool_out_cap = CST_DEFAULT_TOOL_OUT_CAP;
- const char *env_cap = getenv("CST_TOOL_OUT_CAP");
+ const char *env_cap = hermit_getenv("TOOL_OUT_CAP");
if (env_cap && atol(env_cap) > 0)
cfg.tool_out_cap = (size_t)atol(env_cap);
- const char *provider_name = getenv("CST_PROVIDER");
+ const char *provider_name = hermit_getenv("PROVIDER");
cfg.headless = 0;
cfg.confirm_shell = 1;
cfg.confirm_write = 1;
cfg.confirm_net = 1;
cfg.auto_approve = 0;
cfg.tool_profile = CST_TOOLS_DEFAULT;
- const char *env_tools = getenv("CST_TOOLS");
+ const char *env_tools = hermit_getenv("TOOLS");
if (env_tools && env_tools[0] &&
cst_tool_profile_parse(env_tools, &cfg.tool_profile) != 0) {
fprintf(stderr, "unknown CST_TOOLS=%s (default | minimal)\n", env_tools);
return 1;
}
- if (getenv("CST_AUTO_APPROVE"))
+ if (hermit_getenv("AUTO_APPROVE")[0])
cfg.auto_approve = 1;
- const char *env_confirm = getenv("CST_CONFIRM");
+ const char *env_confirm = hermit_getenv("CONFIRM");
if (env_confirm && parse_confirm(env_confirm, &cfg) != 0) {
fprintf(stderr, "bad CST_CONFIRM=%s (shell,write,net | none)\n",
env_confirm);
@@ -379,7 +379,7 @@ int main(int argc, char **argv) {
}
int approval = -1;
- const char *env_appr = getenv("CST_APPROVAL");
+ const char *env_appr = hermit_getenv("APPROVAL");
if (env_appr && env_appr[0] && cst_approval_parse(env_appr, &approval) != 0) {
fprintf(stderr, "bad CST_APPROVAL=%s (ask | auto | yolo)\n", env_appr);
return 1;
@@ -405,14 +405,14 @@ int main(int argc, char **argv) {
cst_webui_opts_t web;
memset(&web, 0, sizeof(web));
web.port = CST_WEBUI_DEFAULT_PORT; /* 0 would mean "pick a free one" */
- const char *env = getenv("CST_WEB_PORT");
+ const char *env = hermit_getenv("WEB_PORT");
if (env && env[0] && parse_port(env, &web.port) != 0) {
fprintf(stderr, "CST_WEB_PORT=%s is not a port (0-65535)\n", env);
return 1;
}
- web.host = getenv("CST_WEB_HOST");
- web.token = getenv("CST_WEB_TOKEN");
- web.root = getenv("CST_WEB_ROOT");
+ web.host = hermit_getenv("WEB_HOST");
+ web.token = hermit_getenv("WEB_TOKEN");
+ web.root = hermit_getenv("WEB_ROOT");
static struct option opts[] = {
{"workspace", required_argument, 0, 'w'},
@@ -693,13 +693,13 @@ int main(int argc, char **argv) {
return rc;
}
if (do_realm_pw_init) {
- const char *pw = getenv("CST_REALM_PASSWORD");
+ const char *pw = hermit_getenv("REALM_PASSWORD");
int rc = cst_parliament_cli_realm_password_init(pw);
cst_curl_cleanup();
return rc;
}
if (do_login) {
- const char *pw = getenv("CST_REALM_PASSWORD");
+ const char *pw = hermit_getenv("REALM_PASSWORD");
char iidbuf[64];
const char *iid = parliament_instance;
if (!iid || !iid[0]) {
@@ -711,7 +711,7 @@ int main(int argc, char **argv) {
return rc;
}
if (do_join) {
- const char *pw = getenv("CST_REALM_PASSWORD");
+ const char *pw = hermit_getenv("REALM_PASSWORD");
char iidbuf[64];
const char *iid = parliament_instance;
if (!iid || !iid[0]) {
@@ -734,7 +734,7 @@ int main(int argc, char **argv) {
return rc;
}
if (do_service || do_service_fg) {
- const char *pw = getenv("CST_REALM_PASSWORD");
+ const char *pw = hermit_getenv("REALM_PASSWORD");
char iidbuf[64];
const char *iid = parliament_instance;
if (!iid || !iid[0]) {
@@ -754,13 +754,13 @@ int main(int argc, char **argv) {
if (do_peer_listen) {
const char *iid = parliament_instance ? parliament_instance : realm_enroll_id;
if (!iid)
- iid = getenv("CST_INSTANCE_ID");
+ iid = hermit_getenv("INSTANCE_ID");
int rc = cst_parliament_cli_peer_listen(peer_listen_port, iid);
cst_curl_cleanup();
return rc;
}
if (do_peer_dial) {
- const char *iid = parliament_instance ? parliament_instance : getenv("CST_INSTANCE_ID");
+ const char *iid = parliament_instance ? parliament_instance : hermit_getenv("INSTANCE_ID");
char host[256];
int port = 0;
host[0] = 0;
@@ -780,7 +780,7 @@ int main(int argc, char **argv) {
return rc;
}
if (do_discover) {
- const char *iid = parliament_instance ? parliament_instance : getenv("CST_INSTANCE_ID");
+ const char *iid = parliament_instance ? parliament_instance : hermit_getenv("INSTANCE_ID");
int rc = cst_parliament_cli_discover(iid, discover_peer_port, discover_wait_ms);
cst_curl_cleanup();
return rc;
@@ -795,7 +795,7 @@ int main(int argc, char **argv) {
cst_realm_dir(rdir, sizeof(rdir)) == 0 &&
cst_realm_is_password_mode(rdir) && !cst_parliament_session_ok(NULL, 0)) {
char pwbuf[256];
- const char *pw = getenv("CST_REALM_PASSWORD");
+ const char *pw = hermit_getenv("REALM_PASSWORD");
if ((!pw || !pw[0]) && isatty(0) &&
cst_prompt_secret("Realm password to open agent (hidden): ", pwbuf,
sizeof(pwbuf)) == 0)
@@ -861,20 +861,20 @@ int main(int argc, char **argv) {
}
snprintf(cfg.provider, sizeof(cfg.provider), "%s", prov->name);
if (!cfg.effort[0]) {
- const char *e = getenv("CST_EFFORT");
+ const char *e = hermit_getenv("EFFORT");
if (!cst_effort_valid(e))
e = saved.effort;
snprintf(cfg.effort, sizeof(cfg.effort), "%s",
cst_effort_valid(e) ? e : CST_DEFAULT_EFFORT);
}
if (!cfg.mode[0]) {
- const char *m = getenv("CST_MODE");
+ const char *m = hermit_getenv("MODE");
if (!cst_mode_valid(m))
m = saved.mode;
snprintf(cfg.mode, sizeof(cfg.mode), "%s", cst_mode_name(m));
}
if (!cfg.api_base[0]) {
- const char *env_base = getenv("CST_API_BASE");
+ const char *env_base = hermit_getenv("API_BASE");
if (!env_base || !env_base[0])
env_base = getenv("OPENAI_BASE_URL");
if (!env_base || !env_base[0])
@@ -883,7 +883,7 @@ int main(int argc, char **argv) {
env_base && env_base[0] ? env_base : prov->api_base);
}
if (!cfg.model[0]) {
- const char *env_model = getenv("CST_MODEL");
+ const char *env_model = hermit_getenv("MODEL");
if (!env_model || !env_model[0])
env_model = getenv("OPENAI_MODEL");
if (!env_model || !env_model[0])
@@ -896,7 +896,7 @@ int main(int argc, char **argv) {
if (!cfg.api_key[0] && !force_ask_key &&
cst_creds_resolve(prov->name, cfg.api_key, sizeof(cfg.api_key), NULL) !=
0) {
- const char *k = getenv("CST_API_KEY");
+ const char *k = hermit_getenv("API_KEY");
if (k && k[0])
snprintf(cfg.api_key, sizeof(cfg.api_key), "%s", k);
}
@@ -983,7 +983,7 @@ int main(int argc, char **argv) {
if (!cfg.api_key[0] && (cfg.headless || web_mode)) {
fprintf(stderr,
"no API key for %s: start cst-agent once to enter it, or run "
- "cst-agent --ask-key --provider %s\n",
+ "hermit --ask-key --provider %s\n",
cfg.provider, cfg.provider);
cst_curl_cleanup();
return 1;
diff --git a/src/metrics.c b/src/metrics.c
index 3a072f1..2198381 100644
--- a/src/metrics.c
+++ b/src/metrics.c
@@ -1,4 +1,5 @@
#include "cst_metrics.h"
+#include "cst_hermit_glyph.h"
#include "cJSON.h"
#include "cst_agent.h"
@@ -15,13 +16,13 @@ struct cst_metrics {
};
cst_metrics_t *cst_metrics_open(const char *workspace, const char *session_path) {
- const char *off = getenv("CST_METRICS");
+ const char *off = hermit_getenv("METRICS");
if (off && strcmp(off, "0") == 0)
return NULL;
cst_metrics_t *m = calloc(1, sizeof(*m));
if (!m)
return NULL;
- const char *override = getenv("CST_METRICS_PATH");
+ const char *override = hermit_getenv("METRICS_PATH");
if (override && override[0]) {
snprintf(m->path, sizeof(m->path), "%s", override);
} else {
diff --git a/src/model_registry.c b/src/model_registry.c
index 15647c0..68a6de5 100644
--- a/src/model_registry.c
+++ b/src/model_registry.c
@@ -1,5 +1,6 @@
#include "cst_models.h"
#include "cst_util.h"
+#include "cst_hermit_glyph.h"
#include "cJSON.h"
#include "os_compat.h"
@@ -552,7 +553,7 @@ const cst_provider_t *cst_provider_find(const char *name) {
}
const cst_provider_t *cst_provider_default(void) {
- const cst_provider_t *p = cst_provider_find(getenv("CST_PROVIDER"));
+ const cst_provider_t *p = cst_provider_find(hermit_getenv("PROVIDER"));
return p ? p : cst_provider_at(0);
}
@@ -606,7 +607,7 @@ int cst_models_list(const char *current, char out[][128], int max_out) {
if (!out || max_out <= 0)
return 0;
int n = 0;
- const char *env = getenv("CST_MODELS");
+ const char *env = hermit_getenv("MODELS");
if (env && env[0]) {
char buf[1024];
snprintf(buf, sizeof(buf), "%s", env);
@@ -745,7 +746,7 @@ static void apply_cache(const char *provider, const char *model,
}
static int env_price(cst_price_t *out) {
- const char *e = getenv("CST_PRICE");
+ const char *e = hermit_getenv("PRICE");
if (!e || !e[0])
return -1;
memset(out, 0, sizeof(*out));
@@ -765,7 +766,7 @@ void cst_model_info(const char *provider, const char *model,
memset(out, 0, sizeof(*out));
out->vision = -1;
unsigned have = 0;
- const char *e = getenv("CST_CTX_TOKENS");
+ const char *e = hermit_getenv("CTX_TOKENS");
if (e && atol(e) > 0) {
out->context = atol(e);
have |= F_CONTEXT;
@@ -857,7 +858,7 @@ void cst_model_caps(const char *provider, const char *api_base,
cst_model_info_t mi;
cst_model_info(provider, model, &mi);
out->vision = mi.vision;
- const char *e = getenv("CST_NO_CACHE_HINTS");
+ const char *e = hermit_getenv("NO_CACHE_HINTS");
if ((e && e[0] == '1') || !model)
return;
out->cache_style = mi.cache_style;
diff --git a/src/os_compat.c b/src/os_compat.c
index c68b17e..697f558 100644
--- a/src/os_compat.c
+++ b/src/os_compat.c
@@ -11,6 +11,7 @@
#endif
#include "os_compat.h"
#include "os_internal.h"
+#include "cst_hermit_glyph.h"
#include
#include
@@ -40,6 +41,19 @@
#include
#endif
+const char *hermit_getenv(const char *suffix) {
+ char hk[96], ck[96];
+ if (!suffix || !suffix[0])
+ return "";
+ snprintf(hk, sizeof(hk), "HERMIT_%s", suffix);
+ const char *e = getenv(hk);
+ if (e && e[0])
+ return e;
+ snprintf(ck, sizeof(ck), "CST_%s", suffix);
+ e = getenv(ck);
+ return e ? e : "";
+}
+
void os_run_result_free(os_run_result_t *r) {
if (!r)
return;
@@ -421,7 +435,7 @@ void os_set_prog_path(const char *argv0) {
int os_exe_dir(char *out, size_t out_sz) {
if (!out || out_sz < 2)
return -1;
- const char *env = getenv("CST_EXE_DIR");
+ const char *env = hermit_getenv("EXE_DIR");
if (env && env[0]) {
snprintf(out, out_sz, "%s", env);
return 0;
@@ -480,7 +494,7 @@ static int file_exists(const char *p) {
int os_resolve_shell(char *out, size_t out_sz) {
if (!out || out_sz < 2)
return -1;
- const char *env = getenv("CST_SHELL");
+ const char *env = hermit_getenv("SHELL");
if (env && env[0]) {
snprintf(out, out_sz, "%s", env);
return 0;
@@ -608,7 +622,7 @@ int os_run_timeout_effective(void) {
int t = run_timeout();
if (t > 0)
return t;
- const char *e = getenv("CST_SHELL_TIMEOUT");
+ const char *e = hermit_getenv("SHELL_TIMEOUT");
if (e && atoi(e) > 0)
return atoi(e);
return 0; /* no limit: a build, a test suite or a long clone must finish */
diff --git a/src/parliament.c b/src/parliament.c
index 9c34e47..53d650f 100644
--- a/src/parliament.c
+++ b/src/parliament.c
@@ -8,6 +8,7 @@
#include "cst_util.h"
#include "monocypher.h"
#include "os_compat.h"
+#include "cst_hermit_glyph.h"
#include
#include
@@ -61,7 +62,7 @@ void cst_parliament_sync_ack(void) {
int cst_parliament_default_instance(char *out, size_t n) {
if (!out || n < 2)
return -1;
- const char *env = getenv("CST_INSTANCE_ID");
+ const char *env = hermit_getenv("INSTANCE_ID");
if (env && env[0]) {
snprintf(out, n, "%s", env);
return 0;
@@ -647,7 +648,7 @@ int cst_parliament_is_active(void) {
* Password Realm alone no longer forces parliament — that starved task /
* worker_* / runtime tools. Opt in via CST_COLLABORATION / settings, or
* when an open parliament meta already exists. */
- const char *mode = getenv("CST_COLLABORATION");
+ const char *mode = hermit_getenv("COLLABORATION");
if (mode && mode[0])
return strcmp(mode, "parliament") == 0;
cst_settings_t s;
diff --git a/src/parliament_cli.c b/src/parliament_cli.c
index ed49162..c20233c 100644
--- a/src/parliament_cli.c
+++ b/src/parliament_cli.c
@@ -9,6 +9,7 @@
#include "cst_peer.h"
#include "cst_realm.h"
#include "os_compat.h"
+#include "cst_hermit_glyph.h"
#include
#include
@@ -32,7 +33,7 @@ static void sleep_ms(int ms) {
/* Prefer CST_REALM_PASSWORD; otherwise prompt on a TTY. */
static int resolve_password(char *buf, size_t n, const char **out) {
- const char *env = getenv("CST_REALM_PASSWORD");
+ const char *env = hermit_getenv("REALM_PASSWORD");
if (env && env[0]) {
*out = env;
return 0;
@@ -239,7 +240,7 @@ static int load_realm_for_cli(cst_realm_keys_t *realm) {
if (cst_realm_dir(dir, sizeof(dir)) != 0)
return -1;
if (cst_realm_is_password_mode(dir)) {
- const char *pw = getenv("CST_REALM_PASSWORD");
+ const char *pw = hermit_getenv("REALM_PASSWORD");
if (!pw || !pw[0])
return -1;
return cst_realm_unlock_password(dir, pw, realm);
diff --git a/src/sandbox_exec.c b/src/sandbox_exec.c
index 3d827e7..377890b 100644
--- a/src/sandbox_exec.c
+++ b/src/sandbox_exec.c
@@ -3,6 +3,7 @@
#endif
#include "cst_sandbox.h"
+#include "cst_hermit_glyph.h"
#include
#include
@@ -1244,7 +1245,7 @@ int cst_sandbox_probe(void) {
if (g_kind >= 0)
return g_kind;
int kind = CST_SANDBOX_NONE;
- const char *e = getenv("CST_SANDBOX");
+ const char *e = hermit_getenv("SANDBOX");
if (e && (strcmp(e, "0") == 0 || strcmp(e, "off") == 0 ||
strcmp(e, "none") == 0)) {
g_kind = kind;
diff --git a/src/tools/fs_tools.c b/src/tools/fs_tools.c
index deacb9e..dbfeb54 100644
--- a/src/tools/fs_tools.c
+++ b/src/tools/fs_tools.c
@@ -11,6 +11,7 @@
#include
#include
#include
+#include "cst_hermit_glyph.h"
#include
@@ -31,7 +32,7 @@
#define GREP_LINE_MAX 300
static int glob_max_hits(void) {
- const char *e = getenv("CST_GLOB_MAX");
+ const char *e = hermit_getenv("GLOB_MAX");
int n = e && e[0] ? atoi(e) : GLOB_MAX_DEFAULT;
if (n < 50)
n = 50;
@@ -40,7 +41,7 @@ static int glob_max_hits(void) {
return n;
}
static int grep_max_matches(void) {
- const char *e = getenv("CST_GREP_MAX");
+ const char *e = hermit_getenv("GREP_MAX");
int n = e && e[0] ? atoi(e) : GREP_MAX_MATCHES_DEFAULT;
if (n < 50)
n = 50;
diff --git a/src/tools/registry.c b/src/tools/registry.c
index 7a6e0d4..a718588 100644
--- a/src/tools/registry.c
+++ b/src/tools/registry.c
@@ -7,6 +7,7 @@
#include
#include
#include
+#include "cst_hermit_glyph.h"
#include "cJSON.h"
#include "cst_clipboard.h"
@@ -342,7 +343,7 @@ int cst_tool_known(const char *name) { return cst_tool_find(name) != NULL; }
const char *const CST_PLAT_DESKTOP[] = {"desktop", NULL};
const char *cst_platform_name(void) {
- const char *over = getenv("CST_PLATFORM");
+ const char *over = hermit_getenv("PLATFORM");
if (over && over[0])
return over; /* tests, cross checks, a launcher that knows better */
#if defined(_WIN32)
diff --git a/src/tui.c b/src/tui.c
index 5ee0a08..eb0bba3 100644
--- a/src/tui.c
+++ b/src/tui.c
@@ -24,9 +24,9 @@
#include "cst_tools.h"
#include "cst_util.h"
#include "cst_version.h"
-#include "cst_hermit_glyph.h"
#include "os_compat.h"
#include "sashidown.h"
+#include "cst_hermit_glyph.h"
#include
#include
@@ -5467,7 +5467,7 @@ static void cmd_realm(tui_t *t, char *arg, int *quit) {
if (cst_realm_dir(dir, sizeof(dir)) != 0 ||
!cst_realm_is_password_mode(dir)) {
push_system_line(t, "No password Realm yet. Outside TUI run:");
- push_system_line(t, " cst-agent --realm-password-init");
+ push_system_line(t, " hermit --realm-password-init");
return;
}
char pw[256];
@@ -5621,7 +5621,7 @@ static void cmd_status(tui_t *t, char *arg, int *quit) {
}
free(pst);
if (cst_parliament_is_active() && !cst_parliament_session_ok(NULL, 0))
- push_system_line(t, " tip cst-agent --login (CST_REALM_PASSWORD)");
+ push_system_line(t, " tip hermit --login (HERMIT_REALM_PASSWORD)");
}
cst_usage_t u;
cst_agent_usage(t->agent, &u, NULL);
@@ -6363,7 +6363,7 @@ static void cmd_web(tui_t *t, char *arg, int *quit) {
(void)arg;
(void)quit;
#ifdef _WIN32
- push_system_line(t, "open another terminal and run: cst-agent --web");
+ push_system_line(t, "open another terminal and run: hermit --web");
#else
static pid_t spawned = 0;
if (spawned > 0) { /* collect the one we started last time */
@@ -6372,7 +6372,7 @@ static void cmd_web(tui_t *t, char *arg, int *quit) {
}
char dir[4096], exe[4096 + 16];
if (os_exe_dir(dir, sizeof(dir)) != 0) {
- push_system_line(t, "cannot locate this binary: run cst-agent --web yourself");
+ push_system_line(t, "cannot locate this binary: run hermit --web yourself");
return;
}
snprintf(exe, sizeof(exe), "%s/cst-agent", dir);
@@ -7897,7 +7897,7 @@ int cst_tui_run(cst_agent_t *agent) {
t.show_todo = 1;
t.show_side = 1; /* Seat Deck; narrow terminals auto-hide in layout() */
{
- const char *mo = getenv("CST_ASCII_MOTION");
+ const char *mo = hermit_getenv("ASCII_MOTION");
t.motion_on = !(mo && mo[0] == '0');
}
{
diff --git a/tests/test_llm_body.c b/tests/test_llm_body.c
index 6159f87..5e02ead 100644
--- a/tests/test_llm_body.c
+++ b/tests/test_llm_body.c
@@ -2,6 +2,7 @@
#include "cst_agent.h"
#include "cst_attach.h"
#include "cst_test_util.h"
+#include "cst_hermit_glyph.h"
#include
#include
@@ -299,8 +300,8 @@ static void test_cache_hints(void) {
}
static void test_kimi_wire_format(void) {
- const char *old_no_cache = getenv("CST_NO_CACHE_HINTS");
- const char *old_ttl = getenv("CST_KIMI_CACHE_TTL");
+ const char *old_no_cache = hermit_getenv("NO_CACHE_HINTS");
+ const char *old_ttl = hermit_getenv("KIMI_CACHE_TTL");
char *saved_no_cache = old_no_cache ? strdup(old_no_cache) : NULL;
char *saved_ttl = old_ttl ? strdup(old_ttl) : NULL;
setenv("CST_NO_CACHE_HINTS", "0", 1);
diff --git a/tests/test_sandbox.c b/tests/test_sandbox.c
index 9e56578..24cb0be 100644
--- a/tests/test_sandbox.c
+++ b/tests/test_sandbox.c
@@ -4,6 +4,7 @@
#include "cst_perms.h"
#include "cst_sandbox.h"
+#include "cst_hermit_glyph.h"
#include
#include
@@ -353,7 +354,7 @@ int main(void) {
if (kind == CST_SANDBOX_LANDLOCK || kind == CST_SANDBOX_SECCOMP)
test_confined(kind);
if (kind != CST_SANDBOX_SECCOMP) {
- const char *was = getenv("CST_SANDBOX");
+ const char *was = hermit_getenv("SANDBOX");
char saved[32] = "";
if (was)
snprintf(saved, sizeof(saved), "%s", was);
diff --git a/web/app.js b/web/app.js
index d249e4b..6eed9f6 100644
--- a/web/app.js
+++ b/web/app.js
@@ -1,4 +1,4 @@
-/* CST-Agent WebUI client: HTTP + SSE against the engine in the same binary.
+/* Hermit WebUI client: HTTP + SSE against the engine in the same binary.
* No build step, no dependencies. The server renders Markdown to sanitized
* HTML; this file lays out the conversation, the tool lines, the approval
* gate and the anchored popovers. Protocol: docs/webui.md. */
@@ -562,7 +562,7 @@ async function loadSession() {
}
showEmpty(log.children.length === 0);
const last = [...(data.messages || [])].reverse().find((m) => m.role === 'user' && !m.note && !m.tool_result);
- document.title = (last && last.content ? last.content.slice(0, 40) + ' · ' : '') + 'CST-Agent';
+ document.title = (last && last.content ? last.content.slice(0, 40) + ' · ' : '') + 'Hermit';
scrollDown(true);
updateJump();
}
diff --git a/web/index.html b/web/index.html
index a1b440e..52b5f82 100644
--- a/web/index.html
+++ b/web/index.html
@@ -4,7 +4,7 @@
-CST-Agent
+Hermit
@@ -56,7 +56,7 @@
- CST-Agent
+ Hermit